@kernel.chat/kbot 1.3.1 → 2.3.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 +94 -0
- package/dist/agent.d.ts +9 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +576 -119
- package/dist/agent.js.map +1 -1
- package/dist/auth.d.ts +20 -35
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +224 -66
- package/dist/auth.js.map +1 -1
- package/dist/auth.test.d.ts +2 -0
- package/dist/auth.test.d.ts.map +1 -0
- package/dist/auth.test.js +89 -0
- package/dist/auth.test.js.map +1 -0
- package/dist/build-targets.d.ts +37 -0
- package/dist/build-targets.d.ts.map +1 -0
- package/dist/build-targets.js +507 -0
- package/dist/build-targets.js.map +1 -0
- package/dist/cli.js +1210 -130
- package/dist/cli.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +72 -22
- package/dist/context.js.map +1 -1
- package/dist/hooks.d.ts +27 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +145 -0
- package/dist/hooks.js.map +1 -0
- package/dist/ide/acp-server.d.ts +6 -0
- package/dist/ide/acp-server.d.ts.map +1 -0
- package/dist/ide/acp-server.js +319 -0
- package/dist/ide/acp-server.js.map +1 -0
- package/dist/ide/bridge.d.ts +128 -0
- package/dist/ide/bridge.d.ts.map +1 -0
- package/dist/ide/bridge.js +185 -0
- package/dist/ide/bridge.js.map +1 -0
- package/dist/ide/index.d.ts +5 -0
- package/dist/ide/index.d.ts.map +1 -0
- package/dist/ide/index.js +11 -0
- package/dist/ide/index.js.map +1 -0
- package/dist/ide/lsp-bridge.d.ts +27 -0
- package/dist/ide/lsp-bridge.d.ts.map +1 -0
- package/dist/ide/lsp-bridge.js +267 -0
- package/dist/ide/lsp-bridge.js.map +1 -0
- package/dist/ide/mcp-server.d.ts +7 -0
- package/dist/ide/mcp-server.d.ts.map +1 -0
- package/dist/ide/mcp-server.js +451 -0
- package/dist/ide/mcp-server.js.map +1 -0
- package/dist/learning.d.ts +179 -0
- package/dist/learning.d.ts.map +1 -0
- package/dist/learning.js +829 -0
- package/dist/learning.js.map +1 -0
- package/dist/learning.test.d.ts +2 -0
- package/dist/learning.test.d.ts.map +1 -0
- package/dist/learning.test.js +115 -0
- package/dist/learning.test.js.map +1 -0
- package/dist/matrix.d.ts +49 -0
- package/dist/matrix.d.ts.map +1 -0
- package/dist/matrix.js +302 -0
- package/dist/matrix.js.map +1 -0
- package/dist/memory.d.ts +11 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +54 -2
- package/dist/memory.js.map +1 -1
- package/dist/multimodal.d.ts +57 -0
- package/dist/multimodal.d.ts.map +1 -0
- package/dist/multimodal.js +206 -0
- package/dist/multimodal.js.map +1 -0
- package/dist/permissions.d.ts +21 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +122 -0
- package/dist/permissions.js.map +1 -0
- package/dist/planner.d.ts +54 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +298 -0
- package/dist/planner.js.map +1 -0
- package/dist/plugins.d.ts +30 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +135 -0
- package/dist/plugins.js.map +1 -0
- package/dist/sessions.d.ts +38 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +177 -0
- package/dist/sessions.js.map +1 -0
- package/dist/streaming.d.ts +88 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +317 -0
- package/dist/streaming.js.map +1 -0
- package/dist/tools/background.d.ts +2 -0
- package/dist/tools/background.d.ts.map +1 -0
- package/dist/tools/background.js +163 -0
- package/dist/tools/background.js.map +1 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +26 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/browser.js +7 -7
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/build-matrix.d.ts +2 -0
- package/dist/tools/build-matrix.d.ts.map +1 -0
- package/dist/tools/build-matrix.js +463 -0
- package/dist/tools/build-matrix.js.map +1 -0
- package/dist/tools/computer.js +5 -5
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/fetch.d.ts +2 -0
- package/dist/tools/fetch.d.ts.map +1 -0
- package/dist/tools/fetch.js +106 -0
- package/dist/tools/fetch.js.map +1 -0
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +112 -6
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/git.js +3 -3
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/github.d.ts +2 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +196 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/index.d.ts +29 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +136 -20
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +162 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/matrix.d.ts +2 -0
- package/dist/tools/matrix.d.ts.map +1 -0
- package/dist/tools/matrix.js +79 -0
- package/dist/tools/matrix.js.map +1 -0
- package/dist/tools/mcp-client.d.ts +2 -0
- package/dist/tools/mcp-client.d.ts.map +1 -0
- package/dist/tools/mcp-client.js +295 -0
- package/dist/tools/mcp-client.js.map +1 -0
- package/dist/tools/notebook.d.ts +2 -0
- package/dist/tools/notebook.d.ts.map +1 -0
- package/dist/tools/notebook.js +207 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/openclaw.d.ts +2 -0
- package/dist/tools/openclaw.d.ts.map +1 -0
- package/dist/tools/openclaw.js +187 -0
- package/dist/tools/openclaw.js.map +1 -0
- package/dist/tools/parallel.d.ts +2 -0
- package/dist/tools/parallel.d.ts.map +1 -0
- package/dist/tools/parallel.js +60 -0
- package/dist/tools/parallel.js.map +1 -0
- package/dist/tools/sandbox.d.ts +2 -0
- package/dist/tools/sandbox.d.ts.map +1 -0
- package/dist/tools/sandbox.js +352 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +135 -28
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/subagent.d.ts +4 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +260 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/tasks.d.ts +14 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +210 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/worktree.d.ts +2 -0
- package/dist/tools/worktree.d.ts.map +1 -0
- package/dist/tools/worktree.js +223 -0
- package/dist/tools/worktree.js.map +1 -0
- package/dist/tui.d.ts +73 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +257 -0
- package/dist/tui.js.map +1 -0
- package/dist/ui.d.ts +11 -19
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +143 -171
- package/dist/ui.js.map +1 -1
- package/dist/updater.d.ts +3 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +70 -0
- package/dist/updater.js.map +1 -0
- package/install.sh +5 -7
- package/package.json +9 -5
package/dist/sessions.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// K:BOT Session Persistence — Save, Resume, and List Conversations
|
|
2
|
+
//
|
|
3
|
+
// Like Gemini CLI's /chat save/resume and Claude Code's session history.
|
|
4
|
+
// Sessions store conversation history + metadata so users can:
|
|
5
|
+
// /save [name] — Save current conversation with optional name
|
|
6
|
+
// /resume [name] — Resume a saved conversation
|
|
7
|
+
// /sessions — List all saved sessions
|
|
8
|
+
//
|
|
9
|
+
// Stored at ~/.kbot/sessions/
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, } from 'node:fs';
|
|
13
|
+
import { getHistory } from './memory.js';
|
|
14
|
+
const SESSIONS_DIR = join(homedir(), '.kbot', 'sessions');
|
|
15
|
+
const MAX_SESSIONS = 50;
|
|
16
|
+
function ensureDir() {
|
|
17
|
+
if (!existsSync(SESSIONS_DIR))
|
|
18
|
+
mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
function sessionPath(id) {
|
|
21
|
+
return join(SESSIONS_DIR, `${id}.json`);
|
|
22
|
+
}
|
|
23
|
+
function generateId() {
|
|
24
|
+
const now = new Date();
|
|
25
|
+
const date = now.toISOString().split('T')[0].replace(/-/g, '');
|
|
26
|
+
const rand = Math.random().toString(36).slice(2, 6);
|
|
27
|
+
return `${date}-${rand}`;
|
|
28
|
+
}
|
|
29
|
+
function slugify(name) {
|
|
30
|
+
return name.toLowerCase()
|
|
31
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
32
|
+
.replace(/\s+/g, '-')
|
|
33
|
+
.slice(0, 40);
|
|
34
|
+
}
|
|
35
|
+
/** Save the current conversation as a session */
|
|
36
|
+
export function saveSession(name, agent) {
|
|
37
|
+
ensureDir();
|
|
38
|
+
const history = getHistory();
|
|
39
|
+
if (history.length === 0) {
|
|
40
|
+
throw new Error('No conversation to save');
|
|
41
|
+
}
|
|
42
|
+
const id = name ? slugify(name) : generateId();
|
|
43
|
+
const firstUserMsg = history.find(t => t.role === 'user')?.content || '';
|
|
44
|
+
const preview = firstUserMsg.slice(0, 100);
|
|
45
|
+
const session = {
|
|
46
|
+
id,
|
|
47
|
+
name: name || `Session ${id}`,
|
|
48
|
+
created: new Date().toISOString(),
|
|
49
|
+
updated: new Date().toISOString(),
|
|
50
|
+
cwd: process.cwd(),
|
|
51
|
+
turnCount: history.length,
|
|
52
|
+
preview,
|
|
53
|
+
history: [...history],
|
|
54
|
+
agent,
|
|
55
|
+
};
|
|
56
|
+
writeFileSync(sessionPath(id), JSON.stringify(session, null, 2));
|
|
57
|
+
// Cleanup old sessions if over limit
|
|
58
|
+
pruneOldSessions();
|
|
59
|
+
return session;
|
|
60
|
+
}
|
|
61
|
+
/** Load a session by ID or name */
|
|
62
|
+
export function loadSession(idOrName) {
|
|
63
|
+
ensureDir();
|
|
64
|
+
const slug = slugify(idOrName);
|
|
65
|
+
// Try exact match first
|
|
66
|
+
const exactPath = sessionPath(slug);
|
|
67
|
+
if (existsSync(exactPath)) {
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(readFileSync(exactPath, 'utf-8'));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Try fuzzy match on ID or name
|
|
76
|
+
const files = readdirSync(SESSIONS_DIR).filter(f => f.endsWith('.json'));
|
|
77
|
+
for (const file of files) {
|
|
78
|
+
const id = file.replace('.json', '');
|
|
79
|
+
if (id.includes(slug) || id === idOrName) {
|
|
80
|
+
try {
|
|
81
|
+
return JSON.parse(readFileSync(join(SESSIONS_DIR, file), 'utf-8'));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Try matching by name field
|
|
89
|
+
for (const file of files) {
|
|
90
|
+
try {
|
|
91
|
+
const session = JSON.parse(readFileSync(join(SESSIONS_DIR, file), 'utf-8'));
|
|
92
|
+
if (session.name.toLowerCase().includes(idOrName.toLowerCase())) {
|
|
93
|
+
return session;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
/** List all saved sessions, newest first */
|
|
103
|
+
export function listSessions() {
|
|
104
|
+
ensureDir();
|
|
105
|
+
const files = readdirSync(SESSIONS_DIR).filter(f => f.endsWith('.json'));
|
|
106
|
+
const sessions = [];
|
|
107
|
+
for (const file of files) {
|
|
108
|
+
try {
|
|
109
|
+
const session = JSON.parse(readFileSync(join(SESSIONS_DIR, file), 'utf-8'));
|
|
110
|
+
sessions.push(session);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return sessions.sort((a, b) => new Date(b.updated).getTime() - new Date(a.updated).getTime());
|
|
117
|
+
}
|
|
118
|
+
/** Delete a session */
|
|
119
|
+
export function deleteSession(idOrName) {
|
|
120
|
+
const session = loadSession(idOrName);
|
|
121
|
+
if (!session)
|
|
122
|
+
return false;
|
|
123
|
+
const path = sessionPath(session.id);
|
|
124
|
+
if (existsSync(path)) {
|
|
125
|
+
unlinkSync(path);
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
/** Update an existing session with current history */
|
|
131
|
+
export function updateSession(id, agent) {
|
|
132
|
+
const session = loadSession(id);
|
|
133
|
+
if (!session)
|
|
134
|
+
return null;
|
|
135
|
+
const history = getHistory();
|
|
136
|
+
session.history = [...history];
|
|
137
|
+
session.turnCount = history.length;
|
|
138
|
+
session.updated = new Date().toISOString();
|
|
139
|
+
if (agent)
|
|
140
|
+
session.agent = agent;
|
|
141
|
+
writeFileSync(sessionPath(session.id), JSON.stringify(session, null, 2));
|
|
142
|
+
return session;
|
|
143
|
+
}
|
|
144
|
+
/** Keep only the most recent MAX_SESSIONS sessions */
|
|
145
|
+
function pruneOldSessions() {
|
|
146
|
+
const sessions = listSessions();
|
|
147
|
+
if (sessions.length <= MAX_SESSIONS)
|
|
148
|
+
return;
|
|
149
|
+
const toDelete = sessions.slice(MAX_SESSIONS);
|
|
150
|
+
for (const session of toDelete) {
|
|
151
|
+
const path = sessionPath(session.id);
|
|
152
|
+
if (existsSync(path))
|
|
153
|
+
unlinkSync(path);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Get the most recent session for auto-resume */
|
|
157
|
+
export function getLastSession() {
|
|
158
|
+
const sessions = listSessions();
|
|
159
|
+
return sessions.length > 0 ? sessions[0] : null;
|
|
160
|
+
}
|
|
161
|
+
/** Format session list for display */
|
|
162
|
+
export function formatSessionList(sessions) {
|
|
163
|
+
if (sessions.length === 0)
|
|
164
|
+
return ' No saved sessions.';
|
|
165
|
+
const lines = [];
|
|
166
|
+
for (const s of sessions.slice(0, 15)) {
|
|
167
|
+
const date = new Date(s.updated).toLocaleDateString();
|
|
168
|
+
const turns = `${s.turnCount} turns`;
|
|
169
|
+
const preview = s.preview.slice(0, 50) + (s.preview.length > 50 ? '...' : '');
|
|
170
|
+
lines.push(` ${s.id} ${date} ${turns} "${preview}"`);
|
|
171
|
+
}
|
|
172
|
+
if (sessions.length > 15) {
|
|
173
|
+
lines.push(` ... and ${sessions.length - 15} more`);
|
|
174
|
+
}
|
|
175
|
+
return lines.join('\n');
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** Streaming event types from Claude API */
|
|
2
|
+
export interface StreamEvent {
|
|
3
|
+
type: string;
|
|
4
|
+
index?: number;
|
|
5
|
+
delta?: {
|
|
6
|
+
type?: string;
|
|
7
|
+
text?: string;
|
|
8
|
+
partial_json?: string;
|
|
9
|
+
thinking?: string;
|
|
10
|
+
};
|
|
11
|
+
content_block?: {
|
|
12
|
+
type: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
id?: string;
|
|
15
|
+
name?: string;
|
|
16
|
+
thinking?: string;
|
|
17
|
+
};
|
|
18
|
+
message?: {
|
|
19
|
+
id: string;
|
|
20
|
+
content: Array<{
|
|
21
|
+
type: string;
|
|
22
|
+
text?: string;
|
|
23
|
+
thinking?: string;
|
|
24
|
+
}>;
|
|
25
|
+
usage: {
|
|
26
|
+
input_tokens: number;
|
|
27
|
+
output_tokens: number;
|
|
28
|
+
};
|
|
29
|
+
stop_reason: string;
|
|
30
|
+
model: string;
|
|
31
|
+
};
|
|
32
|
+
usage?: {
|
|
33
|
+
input_tokens: number;
|
|
34
|
+
output_tokens: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** State for tracking a streaming response */
|
|
38
|
+
export interface StreamState {
|
|
39
|
+
thinking: string;
|
|
40
|
+
content: string;
|
|
41
|
+
toolCalls: Array<{
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
partialJson: string;
|
|
45
|
+
}>;
|
|
46
|
+
model: string;
|
|
47
|
+
usage: {
|
|
48
|
+
input_tokens: number;
|
|
49
|
+
output_tokens: number;
|
|
50
|
+
};
|
|
51
|
+
stopReason: string;
|
|
52
|
+
isThinking: boolean;
|
|
53
|
+
thinkingDisplayed: boolean;
|
|
54
|
+
}
|
|
55
|
+
export declare function createStreamState(): StreamState;
|
|
56
|
+
/**
|
|
57
|
+
* Stream a response from the Anthropic API with thinking display.
|
|
58
|
+
* Shows thinking in dim italic text, then the final response.
|
|
59
|
+
*/
|
|
60
|
+
export declare function streamAnthropicResponse(apiKey: string, apiUrl: string, model: string, system: string, messages: Array<{
|
|
61
|
+
role: string;
|
|
62
|
+
content: unknown;
|
|
63
|
+
}>, tools?: Array<{
|
|
64
|
+
name: string;
|
|
65
|
+
description: string;
|
|
66
|
+
input_schema: Record<string, unknown>;
|
|
67
|
+
}>, options?: {
|
|
68
|
+
thinking?: boolean;
|
|
69
|
+
thinkingBudget?: number;
|
|
70
|
+
}): Promise<StreamState>;
|
|
71
|
+
/**
|
|
72
|
+
* Stream a response from OpenAI-compatible APIs.
|
|
73
|
+
* These don't have thinking blocks but we stream tokens progressively.
|
|
74
|
+
*/
|
|
75
|
+
export declare function streamOpenAIResponse(apiKey: string, apiUrl: string, model: string, system: string, messages: Array<{
|
|
76
|
+
role: string;
|
|
77
|
+
content: string;
|
|
78
|
+
}>, tools?: Array<{
|
|
79
|
+
name: string;
|
|
80
|
+
description: string;
|
|
81
|
+
input_schema: Record<string, unknown>;
|
|
82
|
+
}>): Promise<StreamState>;
|
|
83
|
+
/**
|
|
84
|
+
* Format thinking text for display (summarized).
|
|
85
|
+
* Used when showing thinking after the fact rather than streaming.
|
|
86
|
+
*/
|
|
87
|
+
export declare function formatThinkingSummary(thinking: string): string;
|
|
88
|
+
//# sourceMappingURL=streaming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
// K:BOT Streaming with Thinking — Show reasoning steps during generation
|
|
2
|
+
//
|
|
3
|
+
// Two modes:
|
|
4
|
+
// 1. Extended thinking (Claude) — shows <thinking> blocks in dim text
|
|
5
|
+
// 2. Streaming tokens — progressive output as tokens arrive
|
|
6
|
+
//
|
|
7
|
+
// The thinking display shows the AI's reasoning process in real-time,
|
|
8
|
+
// then the final response renders normally.
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
const ACCENT_DIM = chalk.hex('#7C6CB0');
|
|
11
|
+
const THINKING_COLOR = chalk.dim.italic;
|
|
12
|
+
export function createStreamState() {
|
|
13
|
+
return {
|
|
14
|
+
thinking: '',
|
|
15
|
+
content: '',
|
|
16
|
+
toolCalls: [],
|
|
17
|
+
model: '',
|
|
18
|
+
usage: { input_tokens: 0, output_tokens: 0 },
|
|
19
|
+
stopReason: '',
|
|
20
|
+
isThinking: false,
|
|
21
|
+
thinkingDisplayed: false,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Stream a response from the Anthropic API with thinking display.
|
|
26
|
+
* Shows thinking in dim italic text, then the final response.
|
|
27
|
+
*/
|
|
28
|
+
export async function streamAnthropicResponse(apiKey, apiUrl, model, system, messages, tools, options) {
|
|
29
|
+
const body = {
|
|
30
|
+
model,
|
|
31
|
+
max_tokens: options?.thinking ? 16384 : 8192,
|
|
32
|
+
system: system || undefined,
|
|
33
|
+
messages,
|
|
34
|
+
stream: true,
|
|
35
|
+
};
|
|
36
|
+
// Enable extended thinking if requested
|
|
37
|
+
if (options?.thinking) {
|
|
38
|
+
body.thinking = {
|
|
39
|
+
type: 'enabled',
|
|
40
|
+
budget_tokens: options.thinkingBudget || 10000,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (tools && tools.length > 0)
|
|
44
|
+
body.tools = tools;
|
|
45
|
+
const res = await fetch(apiUrl, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
headers: {
|
|
48
|
+
'Content-Type': 'application/json',
|
|
49
|
+
'x-api-key': apiKey,
|
|
50
|
+
'anthropic-version': '2023-06-01',
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify(body),
|
|
53
|
+
});
|
|
54
|
+
if (!res.ok) {
|
|
55
|
+
const err = await res.json().catch(() => ({ error: { message: `HTTP ${res.status}` } }));
|
|
56
|
+
throw new Error(err.error?.message || `Anthropic streaming error: ${res.status}`);
|
|
57
|
+
}
|
|
58
|
+
const state = createStreamState();
|
|
59
|
+
const reader = res.body?.getReader();
|
|
60
|
+
if (!reader)
|
|
61
|
+
throw new Error('No response body');
|
|
62
|
+
const decoder = new TextDecoder();
|
|
63
|
+
let buffer = '';
|
|
64
|
+
let thinkingLineCount = 0;
|
|
65
|
+
try {
|
|
66
|
+
while (true) {
|
|
67
|
+
const { done, value } = await reader.read();
|
|
68
|
+
if (done)
|
|
69
|
+
break;
|
|
70
|
+
buffer += decoder.decode(value, { stream: true });
|
|
71
|
+
// Process SSE events
|
|
72
|
+
const lines = buffer.split('\n');
|
|
73
|
+
buffer = lines.pop() || ''; // Keep incomplete last line
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
if (!line.startsWith('data: '))
|
|
76
|
+
continue;
|
|
77
|
+
const data = line.slice(6).trim();
|
|
78
|
+
if (data === '[DONE]')
|
|
79
|
+
continue;
|
|
80
|
+
let event;
|
|
81
|
+
try {
|
|
82
|
+
event = JSON.parse(data);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
processStreamEvent(event, state, (type, text) => {
|
|
88
|
+
if (type === 'thinking') {
|
|
89
|
+
if (!state.thinkingDisplayed) {
|
|
90
|
+
process.stderr.write(`\n ${chalk.dim('thinking…')}\n`);
|
|
91
|
+
state.thinkingDisplayed = true;
|
|
92
|
+
}
|
|
93
|
+
// Thinking is status — goes to stderr
|
|
94
|
+
const thinkingLines = text.split('\n');
|
|
95
|
+
for (const tl of thinkingLines) {
|
|
96
|
+
if (tl.trim()) {
|
|
97
|
+
process.stderr.write(` ${THINKING_COLOR(tl)}\n`);
|
|
98
|
+
thinkingLineCount++;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (type === 'thinking_done') {
|
|
103
|
+
if (state.thinkingDisplayed) {
|
|
104
|
+
process.stderr.write(` ${chalk.dim(`(${thinkingLineCount} lines)`)}\n\n`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (type === 'content') {
|
|
108
|
+
// Content is pipeable — goes to stdout
|
|
109
|
+
if (state.content.length === text.length) {
|
|
110
|
+
process.stdout.write('\n');
|
|
111
|
+
}
|
|
112
|
+
process.stdout.write(text);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
reader.releaseLock();
|
|
120
|
+
}
|
|
121
|
+
// Final newline after streamed content
|
|
122
|
+
if (state.content) {
|
|
123
|
+
process.stdout.write('\n');
|
|
124
|
+
}
|
|
125
|
+
return state;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Stream a response from OpenAI-compatible APIs.
|
|
129
|
+
* These don't have thinking blocks but we stream tokens progressively.
|
|
130
|
+
*/
|
|
131
|
+
export async function streamOpenAIResponse(apiKey, apiUrl, model, system, messages, tools) {
|
|
132
|
+
const apiMessages = [];
|
|
133
|
+
if (system)
|
|
134
|
+
apiMessages.push({ role: 'system', content: system });
|
|
135
|
+
apiMessages.push(...messages);
|
|
136
|
+
const body = {
|
|
137
|
+
model,
|
|
138
|
+
max_tokens: 8192,
|
|
139
|
+
messages: apiMessages,
|
|
140
|
+
stream: true,
|
|
141
|
+
};
|
|
142
|
+
if (tools && tools.length > 0) {
|
|
143
|
+
body.tools = tools.map(t => ({
|
|
144
|
+
type: 'function',
|
|
145
|
+
function: { name: t.name, description: t.description, parameters: t.input_schema },
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
const res = await fetch(apiUrl, {
|
|
149
|
+
method: 'POST',
|
|
150
|
+
headers: {
|
|
151
|
+
'Content-Type': 'application/json',
|
|
152
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
153
|
+
},
|
|
154
|
+
body: JSON.stringify(body),
|
|
155
|
+
});
|
|
156
|
+
if (!res.ok) {
|
|
157
|
+
const err = await res.json().catch(() => ({ error: { message: `HTTP ${res.status}` } }));
|
|
158
|
+
throw new Error(err.error?.message || `API streaming error: ${res.status}`);
|
|
159
|
+
}
|
|
160
|
+
const state = createStreamState();
|
|
161
|
+
const reader = res.body?.getReader();
|
|
162
|
+
if (!reader)
|
|
163
|
+
throw new Error('No response body');
|
|
164
|
+
const decoder = new TextDecoder();
|
|
165
|
+
let buffer = '';
|
|
166
|
+
try {
|
|
167
|
+
while (true) {
|
|
168
|
+
const { done, value } = await reader.read();
|
|
169
|
+
if (done)
|
|
170
|
+
break;
|
|
171
|
+
buffer += decoder.decode(value, { stream: true });
|
|
172
|
+
const lines = buffer.split('\n');
|
|
173
|
+
buffer = lines.pop() || '';
|
|
174
|
+
for (const line of lines) {
|
|
175
|
+
if (!line.startsWith('data: '))
|
|
176
|
+
continue;
|
|
177
|
+
const data = line.slice(6).trim();
|
|
178
|
+
if (data === '[DONE]')
|
|
179
|
+
continue;
|
|
180
|
+
let chunk;
|
|
181
|
+
try {
|
|
182
|
+
chunk = JSON.parse(data);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const choice = chunk.choices?.[0];
|
|
188
|
+
if (!choice)
|
|
189
|
+
continue;
|
|
190
|
+
const delta = choice.delta;
|
|
191
|
+
if (delta?.content) {
|
|
192
|
+
const text = String(delta.content);
|
|
193
|
+
// Add a blank line before the first content token for clean formatting
|
|
194
|
+
if (state.content.length === 0) {
|
|
195
|
+
process.stdout.write('\n');
|
|
196
|
+
}
|
|
197
|
+
state.content += text;
|
|
198
|
+
process.stdout.write(text);
|
|
199
|
+
}
|
|
200
|
+
// Tool call deltas
|
|
201
|
+
if (delta?.tool_calls) {
|
|
202
|
+
const tcs = delta.tool_calls;
|
|
203
|
+
for (const tc of tcs) {
|
|
204
|
+
const idx = tc.index;
|
|
205
|
+
if (!state.toolCalls[idx]) {
|
|
206
|
+
state.toolCalls[idx] = {
|
|
207
|
+
id: String(tc.id || ''),
|
|
208
|
+
name: '',
|
|
209
|
+
partialJson: '',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const fn = tc.function;
|
|
213
|
+
if (fn?.name)
|
|
214
|
+
state.toolCalls[idx].name = fn.name;
|
|
215
|
+
if (fn?.arguments)
|
|
216
|
+
state.toolCalls[idx].partialJson += fn.arguments;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (choice.finish_reason) {
|
|
220
|
+
state.stopReason = String(choice.finish_reason);
|
|
221
|
+
}
|
|
222
|
+
// Capture usage from the final stream chunk (OpenAI includes it)
|
|
223
|
+
const chunkUsage = chunk.usage;
|
|
224
|
+
if (chunkUsage) {
|
|
225
|
+
state.usage = {
|
|
226
|
+
input_tokens: chunkUsage.prompt_tokens || chunkUsage.input_tokens || 0,
|
|
227
|
+
output_tokens: chunkUsage.completion_tokens || chunkUsage.output_tokens || 0,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
reader.releaseLock();
|
|
235
|
+
}
|
|
236
|
+
if (state.content) {
|
|
237
|
+
process.stdout.write('\n');
|
|
238
|
+
}
|
|
239
|
+
// Usage is captured from the final stream chunk (some providers include it)
|
|
240
|
+
// If not available from stream, it stays at 0 — the non-streaming path handles this correctly
|
|
241
|
+
return state;
|
|
242
|
+
}
|
|
243
|
+
/** Process a single SSE event and call the callback for display */
|
|
244
|
+
function processStreamEvent(event, state, onDisplay) {
|
|
245
|
+
switch (event.type) {
|
|
246
|
+
case 'content_block_start':
|
|
247
|
+
if (event.content_block?.type === 'thinking') {
|
|
248
|
+
state.isThinking = true;
|
|
249
|
+
}
|
|
250
|
+
else if (event.content_block?.type === 'tool_use') {
|
|
251
|
+
state.toolCalls.push({
|
|
252
|
+
id: event.content_block.id || '',
|
|
253
|
+
name: event.content_block.name || '',
|
|
254
|
+
partialJson: '',
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
break;
|
|
258
|
+
case 'content_block_delta':
|
|
259
|
+
if (event.delta?.type === 'thinking_delta' && event.delta.thinking) {
|
|
260
|
+
state.thinking += event.delta.thinking;
|
|
261
|
+
onDisplay('thinking', event.delta.thinking);
|
|
262
|
+
}
|
|
263
|
+
else if (event.delta?.type === 'text_delta' && event.delta.text) {
|
|
264
|
+
state.content += event.delta.text;
|
|
265
|
+
onDisplay('content', event.delta.text);
|
|
266
|
+
}
|
|
267
|
+
else if (event.delta?.type === 'input_json_delta' && event.delta.partial_json) {
|
|
268
|
+
const lastTool = state.toolCalls[state.toolCalls.length - 1];
|
|
269
|
+
if (lastTool) {
|
|
270
|
+
lastTool.partialJson += event.delta.partial_json;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
break;
|
|
274
|
+
case 'content_block_stop':
|
|
275
|
+
if (state.isThinking) {
|
|
276
|
+
state.isThinking = false;
|
|
277
|
+
onDisplay('thinking_done', '');
|
|
278
|
+
}
|
|
279
|
+
break;
|
|
280
|
+
case 'message_start':
|
|
281
|
+
if (event.message?.model) {
|
|
282
|
+
state.model = event.message.model;
|
|
283
|
+
}
|
|
284
|
+
break;
|
|
285
|
+
case 'message_delta':
|
|
286
|
+
if (event.usage) {
|
|
287
|
+
state.usage = {
|
|
288
|
+
input_tokens: event.usage.input_tokens || state.usage.input_tokens,
|
|
289
|
+
output_tokens: event.usage.output_tokens || state.usage.output_tokens,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
case 'message_stop':
|
|
294
|
+
// Final event
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Format thinking text for display (summarized).
|
|
300
|
+
* Used when showing thinking after the fact rather than streaming.
|
|
301
|
+
*/
|
|
302
|
+
export function formatThinkingSummary(thinking) {
|
|
303
|
+
if (!thinking)
|
|
304
|
+
return '';
|
|
305
|
+
const lines = thinking.split('\n').filter(l => l.trim());
|
|
306
|
+
if (lines.length <= 5) {
|
|
307
|
+
return lines.map(l => ` ${THINKING_COLOR(l)}`).join('\n');
|
|
308
|
+
}
|
|
309
|
+
// Show first 3 and last 2 lines
|
|
310
|
+
const summary = [
|
|
311
|
+
...lines.slice(0, 3).map(l => ` ${THINKING_COLOR(l)}`),
|
|
312
|
+
` ${chalk.dim(`... (${lines.length - 5} more lines)`)}`,
|
|
313
|
+
...lines.slice(-2).map(l => ` ${THINKING_COLOR(l)}`),
|
|
314
|
+
];
|
|
315
|
+
return summary.join('\n');
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,aAAa;AACb,wEAAwE;AACxE,8DAA8D;AAC9D,EAAE;AACF,sEAAsE;AACtE,4CAA4C;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AACvC,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAA;AAyCvC,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;QAC5C,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,KAAK;QACjB,iBAAiB,EAAE,KAAK;KACzB,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,MAAc,EACd,KAAa,EACb,MAAc,EACd,QAAmD,EACnD,KAA2F,EAC3F,OAAyD;IAEzD,MAAM,IAAI,GAA4B;QACpC,KAAK;QACL,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC5C,MAAM,EAAE,MAAM,IAAI,SAAS;QAC3B,QAAQ;QACR,MAAM,EAAE,IAAI;KACb,CAAA;IAED,wCAAwC;IACxC,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK;SAC/C,CAAA;IACH,CAAC;IAED,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IAEjD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;QAC9B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,MAAM;YACnB,mBAAmB,EAAE,YAAY;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACxF,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,8BAA8B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IACnF,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAA;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAA;IACpC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAEhD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,iBAAiB,GAAG,CAAC,CAAA;IAEzB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,IAAI;gBAAE,MAAK;YAEf,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;YAEjD,qBAAqB;YACrB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA,CAAC,4BAA4B;YAEvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,SAAQ;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACjC,IAAI,IAAI,KAAK,QAAQ;oBAAE,SAAQ;gBAE/B,IAAI,KAAkB,CAAA;gBACtB,IAAI,CAAC;oBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAQ;gBACV,CAAC;gBAED,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;oBAC9C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;wBACxB,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;4BAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;4BACvD,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAA;wBAChC,CAAC;wBACD,sCAAsC;wBACtC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;wBACtC,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;4BAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gCACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;gCACjD,iBAAiB,EAAE,CAAA;4BACrB,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;wBACpC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;4BAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,iBAAiB,SAAS,CAAC,MAAM,CAAC,CAAA;wBAC5E,CAAC;oBACH,CAAC;yBAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC9B,uCAAuC;wBACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;4BACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;wBAC5B,CAAC;wBACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBAC5B,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAA;IACtB,CAAC;IAED,uCAAuC;IACvC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAc,EACd,MAAc,EACd,KAAa,EACb,MAAc,EACd,QAAkD,EAClD,KAA2F;IAE3F,MAAM,WAAW,GAA6C,EAAE,CAAA;IAChE,IAAI,MAAM;QAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IACjE,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;IAE7B,MAAM,IAAI,GAA4B;QACpC,KAAK;QACL,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,IAAI;KACb,CAAA;IAED,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,YAAY,EAAE;SACnF,CAAC,CAAC,CAAA;IACL,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;QAC9B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,MAAM,EAAE;SACpC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACxF,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,wBAAwB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAA;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAA;IACpC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAEhD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,IAAI,MAAM,GAAG,EAAE,CAAA;IAEf,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,IAAI;gBAAE,MAAK;YAEf,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;YACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;YAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,SAAQ;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACjC,IAAI,IAAI,KAAK,QAAQ;oBAAE,SAAQ;gBAE/B,IAAI,KAA8B,CAAA;gBAClC,IAAI,CAAC;oBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAQ;gBACV,CAAC;gBAED,MAAM,MAAM,GAAI,KAAK,CAAC,OAA0C,EAAE,CAAC,CAAC,CAAC,CAAA;gBACrE,IAAI,CAAC,MAAM;oBAAE,SAAQ;gBAErB,MAAM,KAAK,GAAG,MAAM,CAAC,KAA4C,CAAA;gBACjE,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;oBACnB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oBAClC,uEAAuE;oBACvE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBAC5B,CAAC;oBACD,KAAK,CAAC,OAAO,IAAI,IAAI,CAAA;oBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC5B,CAAC;gBAED,mBAAmB;gBACnB,IAAI,KAAK,EAAE,UAAU,EAAE,CAAC;oBACtB,MAAM,GAAG,GAAG,KAAK,CAAC,UAA4C,CAAA;oBAC9D,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;wBACrB,MAAM,GAAG,GAAG,EAAE,CAAC,KAAe,CAAA;wBAC9B,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC1B,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG;gCACrB,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;gCACvB,IAAI,EAAE,EAAE;gCACR,WAAW,EAAE,EAAE;6BAChB,CAAA;wBACH,CAAC;wBACD,MAAM,EAAE,GAAG,EAAE,CAAC,QAA8C,CAAA;wBAC5D,IAAI,EAAE,EAAE,IAAI;4BAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAA;wBACjD,IAAI,EAAE,EAAE,SAAS;4BAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,SAAS,CAAA;oBACrE,CAAC;gBACH,CAAC;gBAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACzB,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;gBACjD,CAAC;gBAED,iEAAiE;gBACjE,MAAM,UAAU,GAAG,KAAK,CAAC,KAA2C,CAAA;gBACpE,IAAI,UAAU,EAAE,CAAC;oBACf,KAAK,CAAC,KAAK,GAAG;wBACZ,YAAY,EAAE,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,YAAY,IAAI,CAAC;wBACtE,aAAa,EAAE,UAAU,CAAC,iBAAiB,IAAI,UAAU,CAAC,aAAa,IAAI,CAAC;qBAC7E,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAA;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,4EAA4E;IAC5E,8FAA8F;IAE9F,OAAO,KAAK,CAAA;AACd,CAAC;AAED,mEAAmE;AACnE,SAAS,kBAAkB,CACzB,KAAkB,EAClB,KAAkB,EAClB,SAA8F;IAE9F,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,qBAAqB;YACxB,IAAI,KAAK,CAAC,aAAa,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7C,KAAK,CAAC,UAAU,GAAG,IAAI,CAAA;YACzB,CAAC;iBAAM,IAAI,KAAK,CAAC,aAAa,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBACpD,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;oBACnB,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE;oBAChC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE;oBACpC,WAAW,EAAE,EAAE;iBAChB,CAAC,CAAA;YACJ,CAAC;YACD,MAAK;QAEP,KAAK,qBAAqB;YACxB,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAA;gBACtC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC7C,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAClE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAA;gBACjC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACxC,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAChF,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAC5D,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,CAAA;gBAClD,CAAC;YACH,CAAC;YACD,MAAK;QAEP,KAAK,oBAAoB;YACvB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAA;gBACxB,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;YAChC,CAAC;YACD,MAAK;QAEP,KAAK,eAAe;YAClB,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBACzB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAA;YACnC,CAAC;YACD,MAAK;QAEP,KAAK,eAAe;YAClB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,CAAC,KAAK,GAAG;oBACZ,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY;oBAClE,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa;iBACtE,CAAA;YACH,CAAC;YACD,MAAK;QAEP,KAAK,cAAc;YACjB,cAAc;YACd,MAAK;IACT,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAA;IAExB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACxD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5D,CAAC;IAED,gCAAgC;IAChC,MAAM,OAAO,GAAG;QACd,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE;QACxD,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAA;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../src/tools/background.ts"],"names":[],"mappings":"AA8BA,wBAAgB,uBAAuB,IAAI,IAAI,CAmK9C"}
|