@kernel.chat/kbot 1.0.0

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.
Files changed (54) hide show
  1. package/dist/agent.d.ts +36 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +211 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/auth.d.ts +43 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +108 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/cli.d.ts +3 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +240 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/context.d.ts +15 -0
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/context.js +128 -0
  16. package/dist/context.js.map +1 -0
  17. package/dist/memory.d.ts +25 -0
  18. package/dist/memory.d.ts.map +1 -0
  19. package/dist/memory.js +75 -0
  20. package/dist/memory.js.map +1 -0
  21. package/dist/tools/bash.d.ts +2 -0
  22. package/dist/tools/bash.d.ts.map +1 -0
  23. package/dist/tools/bash.js +63 -0
  24. package/dist/tools/bash.js.map +1 -0
  25. package/dist/tools/browser.d.ts +2 -0
  26. package/dist/tools/browser.d.ts.map +1 -0
  27. package/dist/tools/browser.js +116 -0
  28. package/dist/tools/browser.js.map +1 -0
  29. package/dist/tools/computer.d.ts +2 -0
  30. package/dist/tools/computer.d.ts.map +1 -0
  31. package/dist/tools/computer.js +176 -0
  32. package/dist/tools/computer.js.map +1 -0
  33. package/dist/tools/files.d.ts +2 -0
  34. package/dist/tools/files.d.ts.map +1 -0
  35. package/dist/tools/files.js +147 -0
  36. package/dist/tools/files.js.map +1 -0
  37. package/dist/tools/git.d.ts +2 -0
  38. package/dist/tools/git.d.ts.map +1 -0
  39. package/dist/tools/git.js +102 -0
  40. package/dist/tools/git.js.map +1 -0
  41. package/dist/tools/index.d.ts +37 -0
  42. package/dist/tools/index.d.ts.map +1 -0
  43. package/dist/tools/index.js +57 -0
  44. package/dist/tools/index.js.map +1 -0
  45. package/dist/tools/search.d.ts +2 -0
  46. package/dist/tools/search.d.ts.map +1 -0
  47. package/dist/tools/search.js +46 -0
  48. package/dist/tools/search.js.map +1 -0
  49. package/dist/ui.d.ts +44 -0
  50. package/dist/ui.d.ts.map +1 -0
  51. package/dist/ui.js +242 -0
  52. package/dist/ui.js.map +1 -0
  53. package/install.sh +76 -0
  54. package/package.json +38 -0
@@ -0,0 +1,36 @@
1
+ import { type ProjectContext } from './context.js';
2
+ export interface AgentOptions {
3
+ agent?: string;
4
+ model?: string;
5
+ stream?: boolean;
6
+ context?: ProjectContext;
7
+ tier?: string;
8
+ }
9
+ export interface AgentResponse {
10
+ content: string;
11
+ agent: string;
12
+ model: string;
13
+ toolCalls: number;
14
+ usage?: {
15
+ input_tokens: number;
16
+ output_tokens: number;
17
+ cost_usd: number;
18
+ };
19
+ }
20
+ /**
21
+ * Run the agent loop for a single user message.
22
+ * Returns the final text response.
23
+ *
24
+ * Flow:
25
+ * 1. Try local-first (free, instant) — handles file reads, git, ls
26
+ * 2. If needs reasoning, send to Kernel API with rich context
27
+ * 3. Execute any tool calls locally (free)
28
+ * 4. Send results back to API if needed (costs 1 more message)
29
+ */
30
+ export declare function runAgent(message: string, options?: AgentOptions): Promise<AgentResponse>;
31
+ /**
32
+ * One-shot: run agent and print the response.
33
+ * Used for `kbot "do something"` inline mode.
34
+ */
35
+ export declare function runAndPrint(message: string, options?: AgentOptions): Promise<void>;
36
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAO1E,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1E;AA2DD;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,aAAa,CAAC,CAmIxB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAef"}
package/dist/agent.js ADDED
@@ -0,0 +1,211 @@
1
+ // K:BOT Agent Loop — ReAct reasoning cycle
2
+ // Message → API → Tool Calls → Execute Locally → Continue or Return
3
+ //
4
+ // EFFICIENCY-FIRST DESIGN:
5
+ // 1. Local-first: handle simple tasks (file reads, git, ls) without any API call
6
+ // 2. Context batching: gather all relevant context before the first API call
7
+ // 3. One-shot prompting: send rich context so the agent gets it right in one try
8
+ // 4. Tool execution is always local and free — only reasoning burns tokens
9
+ // 5. Smart model selection: use Haiku for simple tasks, Sonnet for complex ones
10
+ import { getApiKey, getApiBase } from './auth.js';
11
+ import { executeTool, getTool, getToolDefinitionsForApi, } from './tools/index.js';
12
+ import { formatContextForPrompt } from './context.js';
13
+ import { getMemoryPrompt, addTurn, getPreviousMessages } from './memory.js';
14
+ import { createSpinner, printToolCall, printToolResult, printResponse, printError, printInfo } from './ui.js';
15
+ const MAX_TOOL_LOOPS = 15; // Safety: prevent infinite tool loops
16
+ const KBOT_VERSION = '1.0.0';
17
+ /**
18
+ * LOCAL-FIRST: Try to handle the request without hitting the API at all.
19
+ * This saves tokens and messages for things that don't need AI reasoning.
20
+ */
21
+ async function tryLocalFirst(message) {
22
+ const lower = message.toLowerCase().trim();
23
+ // Direct file read requests
24
+ const readMatch = lower.match(/^(?:read|show|cat|view|open)\s+(.+)$/i);
25
+ if (readMatch) {
26
+ const tool = getTool('read_file');
27
+ if (tool) {
28
+ const result = await tool.execute({ path: readMatch[1].trim() });
29
+ return result;
30
+ }
31
+ }
32
+ // ls / list directory
33
+ if (/^(?:ls|list|dir)\s*(.*)$/i.test(lower)) {
34
+ const match = lower.match(/^(?:ls|list|dir)\s*(.*)$/i);
35
+ const tool = getTool('list_directory');
36
+ if (tool)
37
+ return tool.execute({ path: match?.[1]?.trim() || '.' });
38
+ }
39
+ // git status
40
+ if (/^(?:git\s+)?status$/i.test(lower)) {
41
+ const tool = getTool('git_status');
42
+ if (tool)
43
+ return tool.execute({});
44
+ }
45
+ // git diff
46
+ if (/^(?:git\s+)?diff$/i.test(lower)) {
47
+ const tool = getTool('git_diff');
48
+ if (tool)
49
+ return tool.execute({});
50
+ }
51
+ // git log
52
+ if (/^(?:git\s+)?log$/i.test(lower)) {
53
+ const tool = getTool('git_log');
54
+ if (tool)
55
+ return tool.execute({});
56
+ }
57
+ // Simple grep/search
58
+ const grepMatch = lower.match(/^(?:grep|search|find)\s+['""]?(.+?)['""]?\s+(?:in\s+)?(.+)$/i);
59
+ if (grepMatch) {
60
+ const tool = getTool('grep');
61
+ if (tool)
62
+ return tool.execute({ pattern: grepMatch[1], path: grepMatch[2].trim() });
63
+ }
64
+ // pwd
65
+ if (lower === 'pwd' || lower === 'where am i') {
66
+ return process.cwd();
67
+ }
68
+ return null; // Not a local-only request — needs API
69
+ }
70
+ /**
71
+ * Run the agent loop for a single user message.
72
+ * Returns the final text response.
73
+ *
74
+ * Flow:
75
+ * 1. Try local-first (free, instant) — handles file reads, git, ls
76
+ * 2. If needs reasoning, send to Kernel API with rich context
77
+ * 3. Execute any tool calls locally (free)
78
+ * 4. Send results back to API if needed (costs 1 more message)
79
+ */
80
+ export async function runAgent(message, options = {}) {
81
+ const apiKey = getApiKey();
82
+ if (!apiKey) {
83
+ throw new Error('No API key configured. Run `kbot auth` to set up.');
84
+ }
85
+ // Step 1: Try local-first — handle without API if possible
86
+ const localResult = await tryLocalFirst(message);
87
+ if (localResult !== null) {
88
+ addTurn({ role: 'user', content: message });
89
+ addTurn({ role: 'assistant', content: localResult });
90
+ printInfo('(handled locally — 0 API tokens used)');
91
+ return {
92
+ content: localResult,
93
+ agent: 'local',
94
+ model: 'none',
95
+ toolCalls: 0,
96
+ };
97
+ }
98
+ const apiBase = getApiBase();
99
+ const tier = options.tier || 'starter';
100
+ const tools = getToolDefinitionsForApi(tier);
101
+ // Step 2: Build rich context for one-shot success
102
+ // The more context we send upfront, the more likely the agent gets it right
103
+ // in a single API call — saving messages and tokens.
104
+ const contextSnippet = options.context ? formatContextForPrompt(options.context) : '';
105
+ const memorySnippet = getMemoryPrompt();
106
+ const efficiencyNote = `[K:BOT Efficiency Note]
107
+ You have local tools (file read/write/edit, grep, git, bash) that execute for FREE on the user's machine.
108
+ Prefer local tools over asking the user to do things manually.
109
+ Be thorough in your FIRST response — aim to solve the task in one shot.
110
+ Only use web_search when the user explicitly asks for current information.`;
111
+ const systemContext = [contextSnippet, memorySnippet, efficiencyNote].filter(Boolean).join('\n');
112
+ let toolCallCount = 0;
113
+ let lastResponse = null;
114
+ let pendingToolResults = [];
115
+ // The loop: send message → get response → if tool_calls, execute and loop
116
+ for (let i = 0; i < MAX_TOOL_LOOPS; i++) {
117
+ const spinner = createSpinner(i === 0 ? 'Thinking...' : `Running tools (${toolCallCount})...`);
118
+ spinner.start();
119
+ try {
120
+ const body = {
121
+ message: i === 0 ? (systemContext ? `${systemContext}\n\n${message}` : message) : message,
122
+ mode: 'json',
123
+ max_tokens: 8192,
124
+ previous_messages: getPreviousMessages(),
125
+ tools: tools.length > 0 ? tools : undefined,
126
+ };
127
+ if (options.agent && options.agent !== 'auto') {
128
+ body.agent = options.agent;
129
+ }
130
+ // If we have tool results from a previous iteration, send them
131
+ if (pendingToolResults.length > 0) {
132
+ body.tool_results = pendingToolResults;
133
+ pendingToolResults = [];
134
+ }
135
+ const res = await fetch(`${apiBase}/chat`, {
136
+ method: 'POST',
137
+ headers: {
138
+ 'Content-Type': 'application/json',
139
+ Authorization: `Bearer ${apiKey}`,
140
+ 'X-Kbot-Version': KBOT_VERSION,
141
+ },
142
+ body: JSON.stringify(body),
143
+ });
144
+ spinner.stop();
145
+ if (!res.ok) {
146
+ const err = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
147
+ throw new Error(err.error || `API error: ${res.status}`);
148
+ }
149
+ lastResponse = await res.json();
150
+ // If it's a text response, we're done
151
+ if (lastResponse.type === 'text' || !lastResponse.tool_calls || lastResponse.tool_calls.length === 0) {
152
+ const content = lastResponse.content || '';
153
+ addTurn({ role: 'user', content: message });
154
+ addTurn({ role: 'assistant', content });
155
+ return {
156
+ content,
157
+ agent: lastResponse.agent || 'kernel',
158
+ model: lastResponse.model || 'unknown',
159
+ toolCalls: toolCallCount,
160
+ usage: lastResponse.usage,
161
+ };
162
+ }
163
+ // Tool calls — execute them locally
164
+ const toolCalls = lastResponse.tool_calls;
165
+ const results = [];
166
+ for (const call of toolCalls) {
167
+ toolCallCount++;
168
+ printToolCall(call.name, call.arguments || {});
169
+ const result = await executeTool(call);
170
+ results.push(result);
171
+ printToolResult(result.result, result.error);
172
+ }
173
+ // Set up for next iteration with tool results
174
+ pendingToolResults = results;
175
+ // Update message to continue the conversation
176
+ message = `Here are the tool results:\n${results.map(r => `[${r.tool_call_id}]: ${r.result}`).join('\n\n')}\n\nContinue based on these results.`;
177
+ }
178
+ catch (err) {
179
+ spinner.stop();
180
+ throw err;
181
+ }
182
+ }
183
+ // If we hit the loop limit, return whatever we have
184
+ const content = lastResponse?.content || 'Reached maximum tool iterations.';
185
+ return {
186
+ content,
187
+ agent: lastResponse?.agent || 'kernel',
188
+ model: lastResponse?.model || 'unknown',
189
+ toolCalls: toolCallCount,
190
+ usage: lastResponse?.usage,
191
+ };
192
+ }
193
+ /**
194
+ * One-shot: run agent and print the response.
195
+ * Used for `kbot "do something"` inline mode.
196
+ */
197
+ export async function runAndPrint(message, options = {}) {
198
+ try {
199
+ const response = await runAgent(message, options);
200
+ printResponse(response.agent, response.content);
201
+ if (response.usage) {
202
+ const { input_tokens, output_tokens, cost_usd } = response.usage;
203
+ process.stdout.write(` \x1b[2m${response.agent} · ${response.model} · ${input_tokens + output_tokens} tokens · $${cost_usd.toFixed(4)}\x1b[0m\n`);
204
+ }
205
+ }
206
+ catch (err) {
207
+ printError(err instanceof Error ? err.message : String(err));
208
+ process.exit(1);
209
+ }
210
+ }
211
+ //# 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/auth.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ declare const KBOT_DIR: string;
2
+ declare const CONFIG_PATH: string;
3
+ declare const API_BASE = "https://eoxxpyixdieprsxlpwcs.supabase.co/functions/v1/kernel-api";
4
+ export interface KbotConfig {
5
+ api_key: string;
6
+ default_model: 'auto' | 'sonnet' | 'haiku';
7
+ default_agent: 'auto' | string;
8
+ api_base: string;
9
+ tier?: string;
10
+ monthly_limit?: number;
11
+ }
12
+ export declare function loadConfig(): KbotConfig | null;
13
+ export declare function saveConfig(config: KbotConfig): void;
14
+ export declare function getApiKey(): string | null;
15
+ export declare function getApiBase(): string;
16
+ export declare function getDefaultModel(): string;
17
+ export declare function getDefaultAgent(): string;
18
+ /** Verify an API key against the Kernel API. Returns tier info or error. */
19
+ export declare function verifyApiKey(key: string): Promise<{
20
+ valid: boolean;
21
+ tier?: string;
22
+ agents?: Array<{
23
+ id: string;
24
+ name: string;
25
+ role: string;
26
+ }>;
27
+ error?: string;
28
+ }>;
29
+ /** Get usage stats for current key */
30
+ export declare function getUsageStats(): Promise<{
31
+ tier: string;
32
+ monthly_messages: {
33
+ count: number;
34
+ limit: number;
35
+ };
36
+ per_agent: Record<string, {
37
+ messages: number;
38
+ }>;
39
+ } | null>;
40
+ /** First-run setup flow (called by CLI) */
41
+ export declare function setupAuth(apiKey: string): Promise<boolean>;
42
+ export { KBOT_DIR, CONFIG_PATH, API_BASE };
43
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,QAAQ,QAA2B,CAAA;AACzC,QAAA,MAAM,WAAW,QAAgC,CAAA;AACjD,QAAA,MAAM,QAAQ,qEAAqE,CAAA;AAEnF,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC1C,aAAa,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAaD,wBAAgB,UAAU,IAAI,UAAU,GAAG,IAAI,CAQ9C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAGnD;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAOzC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED,4EAA4E;AAC5E,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvD,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAcD;AAED,sCAAsC;AACtC,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChD,GAAG,IAAI,CAAC,CAaR;AAED,2CAA2C;AAC3C,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBhE;AAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA"}
package/dist/auth.js ADDED
@@ -0,0 +1,108 @@
1
+ // K:BOT Auth — API key management and configuration
2
+ // Stores config in ~/.kbot/config.json
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
6
+ const KBOT_DIR = join(homedir(), '.kbot');
7
+ const CONFIG_PATH = join(KBOT_DIR, 'config.json');
8
+ const API_BASE = 'https://eoxxpyixdieprsxlpwcs.supabase.co/functions/v1/kernel-api';
9
+ function ensureDir() {
10
+ if (!existsSync(KBOT_DIR)) {
11
+ mkdirSync(KBOT_DIR, { recursive: true });
12
+ }
13
+ // Also ensure memory and history dirs
14
+ const memDir = join(KBOT_DIR, 'memory');
15
+ const histDir = join(KBOT_DIR, 'history');
16
+ if (!existsSync(memDir))
17
+ mkdirSync(memDir, { recursive: true });
18
+ if (!existsSync(histDir))
19
+ mkdirSync(histDir, { recursive: true });
20
+ }
21
+ export function loadConfig() {
22
+ try {
23
+ if (!existsSync(CONFIG_PATH))
24
+ return null;
25
+ const raw = readFileSync(CONFIG_PATH, 'utf-8');
26
+ return JSON.parse(raw);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ export function saveConfig(config) {
33
+ ensureDir();
34
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
35
+ }
36
+ export function getApiKey() {
37
+ // Env var takes precedence
38
+ const envKey = process.env.KBOT_API_KEY;
39
+ if (envKey)
40
+ return envKey;
41
+ const config = loadConfig();
42
+ return config?.api_key || null;
43
+ }
44
+ export function getApiBase() {
45
+ const config = loadConfig();
46
+ return config?.api_base || API_BASE;
47
+ }
48
+ export function getDefaultModel() {
49
+ const config = loadConfig();
50
+ return config?.default_model || 'auto';
51
+ }
52
+ export function getDefaultAgent() {
53
+ const config = loadConfig();
54
+ return config?.default_agent || 'auto';
55
+ }
56
+ /** Verify an API key against the Kernel API. Returns tier info or error. */
57
+ export async function verifyApiKey(key) {
58
+ try {
59
+ const res = await fetch(`${API_BASE}/agents`, {
60
+ headers: { Authorization: `Bearer ${key}` },
61
+ });
62
+ if (!res.ok) {
63
+ const body = await res.json().catch(() => ({ error: 'Unknown error' }));
64
+ return { valid: false, error: body.error || `HTTP ${res.status}` };
65
+ }
66
+ const data = await res.json();
67
+ return { valid: true, tier: data.tier, agents: data.agents };
68
+ }
69
+ catch (err) {
70
+ return { valid: false, error: `Connection failed: ${err}` };
71
+ }
72
+ }
73
+ /** Get usage stats for current key */
74
+ export async function getUsageStats() {
75
+ const key = getApiKey();
76
+ if (!key)
77
+ return null;
78
+ try {
79
+ const res = await fetch(`${getApiBase()}/usage`, {
80
+ headers: { Authorization: `Bearer ${key}` },
81
+ });
82
+ if (!res.ok)
83
+ return null;
84
+ return await res.json();
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /** First-run setup flow (called by CLI) */
91
+ export async function setupAuth(apiKey) {
92
+ const result = await verifyApiKey(apiKey);
93
+ if (!result.valid) {
94
+ return false;
95
+ }
96
+ const config = {
97
+ api_key: apiKey,
98
+ default_model: 'auto',
99
+ default_agent: 'auto',
100
+ api_base: API_BASE,
101
+ tier: result.tier,
102
+ monthly_limit: undefined,
103
+ };
104
+ saveConfig(config);
105
+ return true;
106
+ }
107
+ export { KBOT_DIR, CONFIG_PATH, API_BASE };
108
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}