@visorcraft/idlehands 2.0.2 → 2.1.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.
- package/dist/agent/prompt-builder.js +188 -0
- package/dist/agent/prompt-builder.js.map +1 -0
- package/dist/agent/query-classifier.js +72 -0
- package/dist/agent/query-classifier.js.map +1 -0
- package/dist/agent/resilient-provider.js +170 -0
- package/dist/agent/resilient-provider.js.map +1 -0
- package/dist/agent/response-cache.js +124 -0
- package/dist/agent/response-cache.js.map +1 -0
- package/dist/agent/semantic-search.js +138 -0
- package/dist/agent/semantic-search.js.map +1 -0
- package/dist/agent/tool-calls.js +261 -1
- package/dist/agent/tool-calls.js.map +1 -1
- package/dist/agent/tool-name-alias.js +140 -0
- package/dist/agent/tool-name-alias.js.map +1 -0
- package/dist/agent.js +146 -43
- package/dist/agent.js.map +1 -1
- package/dist/anton/controller.js +165 -48
- package/dist/anton/controller.js.map +1 -1
- package/dist/anton/preflight.js +49 -9
- package/dist/anton/preflight.js.map +1 -1
- package/dist/anton/prompt.js +20 -0
- package/dist/anton/prompt.js.map +1 -1
- package/dist/anton/reporter.js +6 -1
- package/dist/anton/reporter.js.map +1 -1
- package/dist/bot/ux/discord-renderer.js +5 -21
- package/dist/bot/ux/discord-renderer.js.map +1 -1
- package/dist/bot/ux/emitter.js +104 -0
- package/dist/bot/ux/emitter.js.map +1 -0
- package/dist/bot/ux/telegram-renderer.js +5 -21
- package/dist/bot/ux/telegram-renderer.js.map +1 -1
- package/dist/client.js +51 -7
- package/dist/client.js.map +1 -1
- package/dist/harnesses.js +2 -0
- package/dist/harnesses.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model-customization.js +3 -1
- package/dist/model-customization.js.map +1 -1
- package/dist/security/leak-detector.js +109 -0
- package/dist/security/leak-detector.js.map +1 -0
- package/dist/security/prompt-guard.js +120 -0
- package/dist/security/prompt-guard.js.map +1 -0
- package/package.json +1 -1
package/dist/anton/preflight.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Anton preflight helpers: discovery/review prompts, JSON parsing, and plan-file guards.
|
|
3
3
|
*/
|
|
4
4
|
import { createHash } from 'node:crypto';
|
|
5
|
+
import { mkdir, stat, writeFile } from 'node:fs/promises';
|
|
6
|
+
import path from 'node:path';
|
|
5
7
|
// Force-decision prompts for when the model doesn't return valid JSON in time
|
|
6
8
|
export const FORCE_DISCOVERY_DECISION_PROMPT = `STOP. You must return your discovery result NOW.
|
|
7
9
|
|
|
@@ -19,8 +21,6 @@ Return ONLY this JSON (no markdown, no explanation, no tool calls):
|
|
|
19
21
|
|
|
20
22
|
Use the plan file path you were reviewing.
|
|
21
23
|
JSON only. Nothing else.`;
|
|
22
|
-
import { mkdir, stat, writeFile } from 'node:fs/promises';
|
|
23
|
-
import path from 'node:path';
|
|
24
24
|
export async function ensureAgentsTasksDir(projectDir) {
|
|
25
25
|
const dir = path.resolve(projectDir, '.agents', 'tasks');
|
|
26
26
|
await mkdir(dir, { recursive: true });
|
|
@@ -90,6 +90,37 @@ export async function assertPlanFileExists(absPath) {
|
|
|
90
90
|
if (!s.isFile())
|
|
91
91
|
throw new Error(`preflight-plan-not-a-file:${absPath}`);
|
|
92
92
|
}
|
|
93
|
+
export async function assertPlanFileExistsAndNonEmpty(absPath) {
|
|
94
|
+
const s = await stat(absPath);
|
|
95
|
+
if (!s.isFile())
|
|
96
|
+
throw new Error(`preflight-plan-not-a-file:${absPath}`);
|
|
97
|
+
if (s.size <= 0)
|
|
98
|
+
throw new Error(`preflight-plan-empty:${absPath}`);
|
|
99
|
+
}
|
|
100
|
+
export function buildDiscoveryRewritePrompt(planFilePath, reason) {
|
|
101
|
+
return `The plan file you returned is invalid (${reason}).
|
|
102
|
+
|
|
103
|
+
You must now write a NON-EMPTY markdown plan file at EXACTLY this path:
|
|
104
|
+
${planFilePath}
|
|
105
|
+
|
|
106
|
+
Do NOT edit source files. Only write this plan file.
|
|
107
|
+
After writing it, return EXACT JSON only:
|
|
108
|
+
{"status":"incomplete","filename":"${planFilePath}"}
|
|
109
|
+
|
|
110
|
+
Return JSON only. No markdown fences. No commentary.`;
|
|
111
|
+
}
|
|
112
|
+
export function buildReviewRewritePrompt(planFilePath, reason) {
|
|
113
|
+
return `The reviewed plan file is invalid (${reason}).
|
|
114
|
+
|
|
115
|
+
You must now write/update a NON-EMPTY markdown file at EXACTLY this path:
|
|
116
|
+
${planFilePath}
|
|
117
|
+
|
|
118
|
+
Do NOT edit source files. Only write this plan file.
|
|
119
|
+
After writing it, return EXACT JSON only:
|
|
120
|
+
{"status":"ready","filename":"${planFilePath}"}
|
|
121
|
+
|
|
122
|
+
Return JSON only. No markdown fences. No commentary.`;
|
|
123
|
+
}
|
|
93
124
|
/**
|
|
94
125
|
* Ensure a plan file exists. If the model returned a filename but failed to write it,
|
|
95
126
|
* bootstrap a deterministic fallback file so preflight can continue.
|
|
@@ -131,15 +162,13 @@ export async function ensurePlanFileExistsOrBootstrap(opts) {
|
|
|
131
162
|
export function buildDiscoveryPrompt(opts) {
|
|
132
163
|
return `You are running PRE-FLIGHT for an autonomous coding orchestrator.
|
|
133
164
|
|
|
134
|
-
##
|
|
135
|
-
|
|
136
|
-
- Most new tasks are obviously incomplete — don't waste time verifying.
|
|
137
|
-
- Only read files if you CANNOT determine status from the task description alone.
|
|
138
|
-
- If in doubt, assume INCOMPLETE and write the plan.
|
|
165
|
+
## PRIORITY
|
|
166
|
+
Be fast, but NEVER claim a file was written unless it truly exists and has content.
|
|
139
167
|
|
|
140
168
|
## RULES
|
|
141
169
|
- DO NOT implement code changes. DO NOT modify source files.
|
|
142
170
|
- You may ONLY write to: ${path.resolve(opts.projectDir, '.agents', 'tasks')}
|
|
171
|
+
- Never call edit_range/apply_patch on source files during discovery.
|
|
143
172
|
|
|
144
173
|
## TASK
|
|
145
174
|
File: ${opts.taskFilePath} (line ${opts.task.line})
|
|
@@ -159,14 +188,18 @@ ${opts.task.text}
|
|
|
159
188
|
- What needs to be done
|
|
160
189
|
- Implementation approach (reviewed for correctness, edge cases, code reuse)
|
|
161
190
|
- Files to modify/create
|
|
162
|
-
3.
|
|
191
|
+
3. Verify the file exists and is NON-EMPTY (check file content/size).
|
|
192
|
+
4. ONLY after verification, return:
|
|
193
|
+
{"status":"incomplete","filename":"${opts.planFilePath}"}
|
|
194
|
+
|
|
195
|
+
CRITICAL: Do NOT return status=incomplete with filename unless the file is truly written and non-empty.
|
|
163
196
|
|
|
164
197
|
Note: Write a REVIEWED plan — thorough enough that implementation can proceed without further planning.
|
|
165
198
|
${opts.retryHint
|
|
166
199
|
? `
|
|
167
200
|
## RETRY CONTEXT
|
|
168
201
|
${opts.retryHint}
|
|
169
|
-
Keep output minimal. Write the plan file
|
|
202
|
+
Keep output minimal. Write/verify the plan file, then return JSON.`
|
|
170
203
|
: ''}
|
|
171
204
|
|
|
172
205
|
## OUTPUT
|
|
@@ -180,9 +213,16 @@ Treat it as written by an entry-level developer who may miss edge cases and fail
|
|
|
180
213
|
Be thorough and precise. Update the SAME file in-place to improve correctness, reuse, and clarity.
|
|
181
214
|
Remove ambiguity and tighten implementation steps.
|
|
182
215
|
|
|
216
|
+
Before returning status=ready:
|
|
217
|
+
1) Ensure the file exists
|
|
218
|
+
2) Ensure the file is NON-EMPTY
|
|
219
|
+
3) Ensure your reviewed content is persisted to that same path
|
|
220
|
+
|
|
183
221
|
After review, return EXACT JSON only:
|
|
184
222
|
{"status":"ready","filename":"${planFilePath}"}
|
|
185
223
|
|
|
224
|
+
CRITICAL: Do not return status=ready unless that file truly exists and has non-empty content.
|
|
225
|
+
|
|
186
226
|
Return JSON only. No markdown fences. No commentary.`;
|
|
187
227
|
}
|
|
188
228
|
//# sourceMappingURL=preflight.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/anton/preflight.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/anton/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/anton/prompt.js
CHANGED
|
@@ -11,6 +11,10 @@ export async function buildAntonPrompt(opts) {
|
|
|
11
11
|
const sections = [];
|
|
12
12
|
// 1. Preamble - rules and instructions
|
|
13
13
|
sections.push(buildPreamble(opts.config));
|
|
14
|
+
// 1a. Iteration budget - tell model how many turns it has
|
|
15
|
+
if (opts.maxIterations && opts.maxIterations > 0) {
|
|
16
|
+
sections.push(buildIterationBudget(opts.currentTurn ?? 1, opts.maxIterations));
|
|
17
|
+
}
|
|
14
18
|
// 1b. Decomposition nudge for complex tasks
|
|
15
19
|
if (opts.config.decompose && classifyTaskComplexity(opts.task.text) === 'complex') {
|
|
16
20
|
sections.push(`## Task Analysis
|
|
@@ -108,6 +112,22 @@ export function classifyTaskComplexity(taskText) {
|
|
|
108
112
|
];
|
|
109
113
|
return complexPatterns.some((p) => p.test(taskText)) ? 'complex' : 'simple';
|
|
110
114
|
}
|
|
115
|
+
function buildIterationBudget(currentTurn, maxIterations) {
|
|
116
|
+
const remaining = Math.max(0, maxIterations - currentTurn);
|
|
117
|
+
const urgency = remaining <= 5 ? '🚨 ' : remaining <= 10 ? '⚠️ ' : '';
|
|
118
|
+
let section = `## Iteration Budget
|
|
119
|
+
|
|
120
|
+
${urgency}**Turn ${currentTurn} of ${maxIterations}** (${remaining} remaining)
|
|
121
|
+
|
|
122
|
+
You have a LIMITED number of turns to complete this task. Plan accordingly:
|
|
123
|
+
- Do NOT explore endlessly — identify what you need, make changes, verify, done.
|
|
124
|
+
- If you're past turn ${Math.floor(maxIterations * 0.6)}, start wrapping up.
|
|
125
|
+
- If you cannot complete the task in time, emit \`status: failed\` with a reason.`;
|
|
126
|
+
if (remaining <= 5) {
|
|
127
|
+
section += `\n\n**URGENT:** You are almost out of turns. Finish NOW or report failure.`;
|
|
128
|
+
}
|
|
129
|
+
return section;
|
|
130
|
+
}
|
|
111
131
|
function buildPreamble(config) {
|
|
112
132
|
let preamble = `You are an autonomous coding agent working on exactly ONE task at a time.
|
|
113
133
|
Complete ONLY the task described below, then emit exactly one \`<anton-result>\` block at the very end of your response, even if you fail.
|
package/dist/anton/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/anton/prompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/anton/prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/anton/reporter.js
CHANGED
|
@@ -65,7 +65,12 @@ export function formatTaskHeartbeat(progress) {
|
|
|
65
65
|
const eta = progress.estimatedRemainingMs !== undefined
|
|
66
66
|
? ` · ETA ~${formatDuration(progress.estimatedRemainingMs)}`
|
|
67
67
|
: '';
|
|
68
|
-
|
|
68
|
+
// Show turn progress if available
|
|
69
|
+
const turn = progress.currentTurn ?? 0;
|
|
70
|
+
const maxTurns = progress.maxTurns ?? 0;
|
|
71
|
+
const turnInfo = maxTurns > 0 ? ` · Turn ${turn}/${maxTurns}` : '';
|
|
72
|
+
const urgency = maxTurns > 0 && turn >= maxTurns - 5 ? ' ⚠️' : '';
|
|
73
|
+
return `⏳ Still working: ${task} (attempt ${attempt}${turnInfo}${urgency})\n${bar}\nElapsed: ${elapsed}${eta}`;
|
|
69
74
|
}
|
|
70
75
|
/**
|
|
71
76
|
* Format task end message.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/anton/reporter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/anton/reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Discord Markdown format, respecting Discord's message limits and formatting.
|
|
6
6
|
*/
|
|
7
7
|
import { blocksToPlainText } from './renderer.js';
|
|
8
|
+
import { truncateBlocks } from './shared-formatter.js';
|
|
8
9
|
/**
|
|
9
10
|
* Discord message length limit (recommended: 1900, hard limit: 2000).
|
|
10
11
|
*/
|
|
@@ -83,27 +84,10 @@ function blockToDiscordMarkdown(block, opts) {
|
|
|
83
84
|
* Truncates content if necessary and adds ellipsis.
|
|
84
85
|
*/
|
|
85
86
|
export function renderDiscordMarkdown(blocks, opts) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
for (const block of blocks) {
|
|
91
|
-
const piece = blockToDiscordMarkdown(block, opts);
|
|
92
|
-
const sep = parts.length ? '\n\n' : '';
|
|
93
|
-
const add = sep + piece;
|
|
94
|
-
if (used + add.length > maxLen) {
|
|
95
|
-
truncated = true;
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
parts.push(add);
|
|
99
|
-
used += add.length;
|
|
100
|
-
}
|
|
101
|
-
let out = parts.join('');
|
|
102
|
-
if (truncated && out.length + 2 <= maxLen)
|
|
103
|
-
out += '\n…';
|
|
104
|
-
if (!out.trim())
|
|
105
|
-
out = '⏳ Thinking...';
|
|
106
|
-
return out;
|
|
87
|
+
return truncateBlocks(blocks, blockToDiscordMarkdown, {
|
|
88
|
+
maxLen: opts?.maxLen ?? DISCORD_MAX_LEN,
|
|
89
|
+
fallback: '⏳ Thinking...',
|
|
90
|
+
});
|
|
107
91
|
}
|
|
108
92
|
/**
|
|
109
93
|
* Fallback: render blocks to plain text for very long messages.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discord-renderer.js","sourceRoot":"","sources":["../../../src/bot/ux/discord-renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"discord-renderer.js","sourceRoot":"","sources":["../../../src/bot/ux/discord-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared UX event emitter for IdleHands bots.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a unified event emitter that both Telegram and Discord
|
|
5
|
+
* bots use to emit identical semantic events for the same workflow stages.
|
|
6
|
+
* This ensures consistent event semantics across all platforms.
|
|
7
|
+
*/
|
|
8
|
+
import { createACKEvent, createPROGRESSEvent, createWARNINGEvent, createERROREvent, createRESULTEvent, createACTIONSEvent } from './events.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a new event emitter state.
|
|
11
|
+
*/
|
|
12
|
+
export function createUXEventEmitterState(sessionId, userId, opts) {
|
|
13
|
+
return {
|
|
14
|
+
sessionId,
|
|
15
|
+
userId,
|
|
16
|
+
sequence: 0,
|
|
17
|
+
buffer: [],
|
|
18
|
+
maxBuffer: opts?.maxBuffer,
|
|
19
|
+
listeners: [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Emit an event to all listeners.
|
|
24
|
+
*/
|
|
25
|
+
export function emit(state, event) {
|
|
26
|
+
// Update sequence number
|
|
27
|
+
state.sequence = event.sequence ?? state.sequence + 1;
|
|
28
|
+
event.sequence = state.sequence;
|
|
29
|
+
event.sessionId = state.sessionId;
|
|
30
|
+
event.userId = state.userId;
|
|
31
|
+
// Add to buffer
|
|
32
|
+
state.buffer.push(event);
|
|
33
|
+
if (state.maxBuffer && state.buffer.length > state.maxBuffer) {
|
|
34
|
+
state.buffer.shift();
|
|
35
|
+
}
|
|
36
|
+
// Notify listeners
|
|
37
|
+
for (const listener of state.listeners) {
|
|
38
|
+
void listener(event);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Add an event listener.
|
|
43
|
+
*/
|
|
44
|
+
export function on(state, listener) {
|
|
45
|
+
state.listeners.push(listener);
|
|
46
|
+
return () => {
|
|
47
|
+
state.listeners = state.listeners.filter((l) => l !== listener);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Emit an ACK event.
|
|
52
|
+
*/
|
|
53
|
+
export function emitACK(state, message, opts) {
|
|
54
|
+
const event = createACKEvent(state.sessionId, state.userId, state.sequence + 1, message, opts);
|
|
55
|
+
emit(state, event);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Emit a PROGRESS event.
|
|
59
|
+
*/
|
|
60
|
+
export function emitPROGRESS(state, message, progress, opts) {
|
|
61
|
+
const event = createPROGRESSEvent(state.sessionId, state.userId, state.sequence + 1, message, { ...opts, progress });
|
|
62
|
+
emit(state, event);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Emit a WARNING event.
|
|
66
|
+
*/
|
|
67
|
+
export function emitWARNING(state, message, opts) {
|
|
68
|
+
const event = createWARNINGEvent(state.sessionId, state.userId, state.sequence + 1, message, opts);
|
|
69
|
+
emit(state, event);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Emit an ERROR event.
|
|
73
|
+
*/
|
|
74
|
+
export function emitERROR(state, message, opts) {
|
|
75
|
+
const event = createERROREvent(state.sessionId, state.userId, state.sequence + 1, message, opts);
|
|
76
|
+
emit(state, event);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Emit a RESULT event.
|
|
80
|
+
*/
|
|
81
|
+
export function emitRESULT(state, summary, opts) {
|
|
82
|
+
const event = createRESULTEvent(state.sessionId, state.userId, state.sequence + 1, summary, opts);
|
|
83
|
+
emit(state, event);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Emit an ACTIONS event.
|
|
87
|
+
*/
|
|
88
|
+
export function emitACTIONS(state, actions, opts) {
|
|
89
|
+
const event = createACTIONSEvent(state.sessionId, state.userId, state.sequence + 1, actions, opts);
|
|
90
|
+
emit(state, event);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the last N events from the buffer.
|
|
94
|
+
*/
|
|
95
|
+
export function getRecentEvents(state, count = 10) {
|
|
96
|
+
return state.buffer.slice(-count);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Clear the event buffer.
|
|
100
|
+
*/
|
|
101
|
+
export function clearBuffer(state) {
|
|
102
|
+
state.buffer = [];
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../../src/bot/ux/emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Telegram HTML format, respecting Telegram's message limits and formatting.
|
|
6
6
|
*/
|
|
7
7
|
import { blocksToPlainText } from './renderer.js';
|
|
8
|
+
import { truncateBlocks } from './shared-formatter.js';
|
|
8
9
|
/**
|
|
9
10
|
* Telegram message length limit (hard limit: 4096 characters).
|
|
10
11
|
*/
|
|
@@ -79,27 +80,10 @@ function blockToTelegramHtml(block, opts) {
|
|
|
79
80
|
* Truncates content if necessary and adds ellipsis.
|
|
80
81
|
*/
|
|
81
82
|
export function renderTelegramHtml(blocks, opts) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
for (const block of blocks) {
|
|
87
|
-
const piece = blockToTelegramHtml(block, opts);
|
|
88
|
-
const sep = parts.length ? '\n\n' : '';
|
|
89
|
-
const add = sep + piece;
|
|
90
|
-
if (used + add.length > maxLen) {
|
|
91
|
-
truncated = true;
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
parts.push(add);
|
|
95
|
-
used += add.length;
|
|
96
|
-
}
|
|
97
|
-
let out = parts.join('');
|
|
98
|
-
if (truncated && out.length + 2 <= maxLen)
|
|
99
|
-
out += '\n…';
|
|
100
|
-
if (!out.trim())
|
|
101
|
-
out = '⏳ Thinking...';
|
|
102
|
-
return out;
|
|
83
|
+
return truncateBlocks(blocks, blockToTelegramHtml, {
|
|
84
|
+
maxLen: opts?.maxLen ?? TELEGRAM_MAX_LEN,
|
|
85
|
+
fallback: '⏳ Thinking...',
|
|
86
|
+
});
|
|
103
87
|
}
|
|
104
88
|
/**
|
|
105
89
|
* Fallback: render blocks to plain text for very long messages.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram-renderer.js","sourceRoot":"","sources":["../../../src/bot/ux/telegram-renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"telegram-renderer.js","sourceRoot":"","sources":["../../../src/bot/ux/telegram-renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -2,9 +2,27 @@ import fsSync from 'node:fs';
|
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { setTimeout as delay } from 'node:timers/promises';
|
|
5
|
+
import { Agent } from 'undici';
|
|
5
6
|
import { asError, getRetryDelayMs, isConnRefused, isConnTimeout, isFetchFailed, makeClientError, } from './client/error-utils.js';
|
|
6
7
|
import { BackpressureMonitor, RateLimiter } from './client/pressure.js';
|
|
7
8
|
export { BackpressureMonitor, RateLimiter } from './client/pressure.js';
|
|
9
|
+
// ── Persistent connection pool ───────────────────────────────────────────
|
|
10
|
+
// Reuses TCP+TLS connections across requests to avoid the overhead of
|
|
11
|
+
// handshake negotiation on every API call. Supports HTTP/2 multiplexing
|
|
12
|
+
// when the server advertises it (e.g., llama-server, OpenAI, Anthropic).
|
|
13
|
+
//
|
|
14
|
+
// ZeroClaw does this via reqwest::Client with connection pooling;
|
|
15
|
+
// we use undici's Agent which backs Node's global fetch().
|
|
16
|
+
const pooledAgent = new Agent({
|
|
17
|
+
keepAliveTimeout: 30_000, // Keep idle connections alive for 30s
|
|
18
|
+
keepAliveMaxTimeout: 120_000, // Max keep-alive for any connection
|
|
19
|
+
connections: 16, // Max connections per origin
|
|
20
|
+
pipelining: 1, // HTTP/1.1 pipelining depth
|
|
21
|
+
allowH2: true, // Negotiate HTTP/2 when available
|
|
22
|
+
connect: {
|
|
23
|
+
rejectUnauthorized: true, // Enforce TLS verification
|
|
24
|
+
},
|
|
25
|
+
});
|
|
8
26
|
export class OpenAIClient {
|
|
9
27
|
endpoint;
|
|
10
28
|
apiKey;
|
|
@@ -353,7 +371,12 @@ export class OpenAIClient {
|
|
|
353
371
|
chainedAbort?.addEventListener('abort', onCallerAbort, { once: true });
|
|
354
372
|
const timer = setTimeout(() => ac.abort(), connTimeoutMs);
|
|
355
373
|
try {
|
|
356
|
-
const res = await fetch(url, {
|
|
374
|
+
const res = await fetch(url, {
|
|
375
|
+
...init,
|
|
376
|
+
signal: ac.signal,
|
|
377
|
+
// @ts-expect-error -- undici dispatcher is not in the standard RequestInit type
|
|
378
|
+
dispatcher: pooledAgent,
|
|
379
|
+
});
|
|
357
380
|
clearTimeout(timer);
|
|
358
381
|
return res;
|
|
359
382
|
}
|
|
@@ -692,19 +715,40 @@ export class OpenAIClient {
|
|
|
692
715
|
const { value, done } = result;
|
|
693
716
|
if (done)
|
|
694
717
|
break;
|
|
695
|
-
|
|
718
|
+
// ── Optimized SSE parsing ──────────────────────────────────
|
|
719
|
+
// Instead of buf += decoder.decode(value), which creates a new
|
|
720
|
+
// string on every chunk, we check if the chunk contains a complete
|
|
721
|
+
// frame boundary first. If the buffer is empty and the chunk
|
|
722
|
+
// contains no frame boundary, we can skip the concat entirely
|
|
723
|
+
// for partial-line chunks (common with fast local models).
|
|
724
|
+
const decoded = decoder.decode(value, { stream: true });
|
|
725
|
+
// Fast path: if buffer is empty and no frame boundary in this chunk,
|
|
726
|
+
// just assign (avoid string concat allocation)
|
|
727
|
+
if (buf.length === 0) {
|
|
728
|
+
buf = decoded;
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
buf += decoded;
|
|
732
|
+
}
|
|
696
733
|
while (true) {
|
|
697
734
|
const idx = buf.indexOf('\n\n');
|
|
698
735
|
if (idx === -1)
|
|
699
736
|
break;
|
|
700
737
|
const frame = buf.slice(0, idx);
|
|
701
738
|
buf = buf.slice(idx + 2);
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
739
|
+
// ── Fast SSE line parser ─────────────────────────────────
|
|
740
|
+
// Parse `data: ...` lines without splitting the entire frame
|
|
741
|
+
// into an array first. For single-data-line frames (the common
|
|
742
|
+
// case), this avoids an array allocation entirely.
|
|
743
|
+
let searchStart = 0;
|
|
744
|
+
while (searchStart < frame.length) {
|
|
745
|
+
const lineEnd = frame.indexOf('\n', searchStart);
|
|
746
|
+
const line = lineEnd === -1 ? frame.slice(searchStart) : frame.slice(searchStart, lineEnd);
|
|
747
|
+
searchStart = lineEnd === -1 ? frame.length : lineEnd + 1;
|
|
748
|
+
// Only process "data: ..." lines (skip event:, id:, etc.)
|
|
749
|
+
if (!line.startsWith('data:'))
|
|
706
750
|
continue;
|
|
707
|
-
const data =
|
|
751
|
+
const data = line.slice(5).trimStart();
|
|
708
752
|
if (data === '[DONE]') {
|
|
709
753
|
const doneResult = this.finalizeStreamAggregate(agg, toolIdByIndex, toolNameByIndex, toolArgsByIndex);
|
|
710
754
|
const totalMs = Date.now() - reqStart;
|