@claudebuddy/claudebuddy-agent-sdk 0.4.0 → 0.5.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/CHANGELOG.md +36 -0
- package/README.md +75 -3
- package/dist/agent.d.ts +12 -22
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +209 -224
- package/dist/agent.js.map +1 -1
- package/dist/engine.d.ts +7 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +234 -224
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/client.d.ts +3 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +13 -4
- package/dist/mcp/client.js.map +1 -1
- package/dist/providers/anthropic.d.ts +2 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +31 -1
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/openai.d.ts +3 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +54 -3
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/sse.d.ts +3 -0
- package/dist/providers/sse.d.ts.map +1 -0
- package/dist/providers/sse.js +36 -0
- package/dist/providers/sse.js.map +1 -0
- package/dist/providers/types.d.ts +16 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +98 -4
- package/dist/session.js.map +1 -1
- package/dist/tools/agent-tool.d.ts.map +1 -1
- package/dist/tools/agent-tool.js +32 -9
- package/dist/tools/agent-tool.js.map +1 -1
- package/dist/tools/ask-user.d.ts +3 -2
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +16 -15
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/bash.d.ts +0 -3
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +79 -59
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/config-tool.d.ts +4 -3
- package/dist/tools/config-tool.d.ts.map +1 -1
- package/dist/tools/config-tool.js +20 -16
- package/dist/tools/config-tool.js.map +1 -1
- package/dist/tools/cron-tools.d.ts +3 -2
- package/dist/tools/cron-tools.d.ts.map +1 -1
- package/dist/tools/cron-tools.js +33 -29
- package/dist/tools/cron-tools.js.map +1 -1
- package/dist/tools/index.js +55 -53
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp-tool.js +2 -2
- package/dist/tools/lsp-tool.js.map +1 -1
- package/dist/tools/mcp-resource-tools.d.ts +2 -1
- package/dist/tools/mcp-resource-tools.d.ts.map +1 -1
- package/dist/tools/mcp-resource-tools.js +44 -27
- package/dist/tools/mcp-resource-tools.js.map +1 -1
- package/dist/tools/plan-tools.d.ts +3 -2
- package/dist/tools/plan-tools.d.ts.map +1 -1
- package/dist/tools/plan-tools.js +24 -21
- package/dist/tools/plan-tools.js.map +1 -1
- package/dist/tools/send-message.d.ts +5 -4
- package/dist/tools/send-message.d.ts.map +1 -1
- package/dist/tools/send-message.js +24 -21
- package/dist/tools/send-message.js.map +1 -1
- package/dist/tools/session-state.d.ts +4 -0
- package/dist/tools/session-state.d.ts.map +1 -0
- package/dist/tools/session-state.js +9 -0
- package/dist/tools/session-state.js.map +1 -0
- package/dist/tools/task-tools.d.ts +19 -4
- package/dist/tools/task-tools.d.ts.map +1 -1
- package/dist/tools/task-tools.js +119 -31
- package/dist/tools/task-tools.js.map +1 -1
- package/dist/tools/team-tools.d.ts +7 -3
- package/dist/tools/team-tools.d.ts.map +1 -1
- package/dist/tools/team-tools.js +26 -22
- package/dist/tools/team-tools.js.map +1 -1
- package/dist/tools/todo-tool.d.ts +3 -2
- package/dist/tools/todo-tool.d.ts.map +1 -1
- package/dist/tools/todo-tool.js +24 -21
- package/dist/tools/todo-tool.js.map +1 -1
- package/dist/tools/tool-search.d.ts +2 -1
- package/dist/tools/tool-search.d.ts.map +1 -1
- package/dist/tools/tool-search.js +14 -13
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/update-goal.d.ts +9 -7
- package/dist/tools/update-goal.d.ts.map +1 -1
- package/dist/tools/update-goal.js +20 -21
- package/dist/tools/update-goal.js.map +1 -1
- package/dist/tools/worktree-tools.d.ts +0 -6
- package/dist/tools/worktree-tools.d.ts.map +1 -1
- package/dist/tools/worktree-tools.js +14 -6
- package/dist/tools/worktree-tools.js.map +1 -1
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/compact.d.ts +5 -1
- package/dist/utils/compact.d.ts.map +1 -1
- package/dist/utils/compact.js +11 -1
- package/dist/utils/compact.js.map +1 -1
- package/dist/utils/permissions.d.ts +7 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +39 -0
- package/dist/utils/permissions.js.map +1 -0
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +17 -2
- package/dist/utils/retry.js.map +1 -1
- package/docs/background-tasks.md +62 -0
- package/docs/runtime-progress.md +63 -0
- package/package.json +9 -5
package/dist/session.js
CHANGED
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
* Persists conversation transcripts to disk for resumption.
|
|
5
5
|
* Manages session lifecycle (create, resume, list, fork).
|
|
6
6
|
*/
|
|
7
|
-
import { readFile,
|
|
7
|
+
import { readFile, mkdir, readdir, open, rename, unlink } from 'fs/promises';
|
|
8
8
|
import { join } from 'path';
|
|
9
9
|
/**
|
|
10
10
|
* Get the sessions directory path.
|
|
11
11
|
*/
|
|
12
12
|
function getSessionsDir() {
|
|
13
|
+
if (process.env.AGENT_SDK_SESSION_DIR)
|
|
14
|
+
return process.env.AGENT_SDK_SESSION_DIR;
|
|
13
15
|
const home = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
14
16
|
return join(home, '.open-agent-sdk', 'sessions');
|
|
15
17
|
}
|
|
@@ -17,6 +19,8 @@ function getSessionsDir() {
|
|
|
17
19
|
* Get the path for a specific session.
|
|
18
20
|
*/
|
|
19
21
|
function getSessionPath(sessionId) {
|
|
22
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(sessionId))
|
|
23
|
+
throw new Error('Invalid session id');
|
|
20
24
|
return join(getSessionsDir(), sessionId);
|
|
21
25
|
}
|
|
22
26
|
/**
|
|
@@ -25,19 +29,35 @@ function getSessionPath(sessionId) {
|
|
|
25
29
|
export async function saveSession(sessionId, messages, metadata) {
|
|
26
30
|
const dir = getSessionPath(sessionId);
|
|
27
31
|
await mkdir(dir, { recursive: true });
|
|
32
|
+
const previous = await readFile(join(dir, 'transcript.json'), 'utf8').then(text => JSON.parse(text), (error) => { if (error.code !== 'ENOENT')
|
|
33
|
+
throw error; return undefined; });
|
|
28
34
|
const data = {
|
|
29
35
|
metadata: {
|
|
30
36
|
id: sessionId,
|
|
31
37
|
cwd: metadata.cwd || process.cwd(),
|
|
32
38
|
model: metadata.model || 'claude-sonnet-4-6',
|
|
33
|
-
createdAt: metadata.createdAt || new Date().toISOString(),
|
|
39
|
+
createdAt: metadata.createdAt || previous?.metadata.createdAt || new Date().toISOString(),
|
|
34
40
|
updatedAt: new Date().toISOString(),
|
|
35
41
|
messageCount: messages.length,
|
|
36
42
|
summary: metadata.summary,
|
|
37
43
|
},
|
|
38
44
|
messages,
|
|
39
45
|
};
|
|
40
|
-
|
|
46
|
+
const temporary = join(dir, `transcript-${crypto.randomUUID()}.tmp`);
|
|
47
|
+
try {
|
|
48
|
+
const handle = await open(temporary, 'wx', 0o600);
|
|
49
|
+
try {
|
|
50
|
+
await handle.writeFile(JSON.stringify(data, null, 2));
|
|
51
|
+
await handle.sync();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
await handle.close();
|
|
55
|
+
}
|
|
56
|
+
await rename(temporary, join(dir, 'transcript.json'));
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await unlink(temporary).catch(() => { });
|
|
60
|
+
}
|
|
41
61
|
}
|
|
42
62
|
/**
|
|
43
63
|
* Load session from disk.
|
|
@@ -46,7 +66,26 @@ export async function loadSession(sessionId) {
|
|
|
46
66
|
try {
|
|
47
67
|
const filePath = join(getSessionPath(sessionId), 'transcript.json');
|
|
48
68
|
const content = await readFile(filePath, 'utf-8');
|
|
49
|
-
|
|
69
|
+
const data = JSON.parse(content);
|
|
70
|
+
// A crash after a tool request leaves its outcome unknown. Pair it with an
|
|
71
|
+
// explicit failure, never replay a possibly completed external mutation.
|
|
72
|
+
for (let i = 0; i < data.messages.length; i++) {
|
|
73
|
+
const message = data.messages[i];
|
|
74
|
+
if (message.role !== 'assistant' || !Array.isArray(message.content))
|
|
75
|
+
continue;
|
|
76
|
+
const calls = message.content.filter(block => block.type === 'tool_use');
|
|
77
|
+
const next = data.messages[i + 1];
|
|
78
|
+
const results = next?.role === 'user' && Array.isArray(next.content) ? next.content : [];
|
|
79
|
+
const missing = calls.filter(call => !results.some(result => result.type === 'tool_result' && result.tool_use_id === call.id));
|
|
80
|
+
if (missing.length) {
|
|
81
|
+
const interrupted = missing.map(call => ({ type: 'tool_result', tool_use_id: call.id, content: 'Execution interrupted; tool outcome unknown. Verify external state before retrying.', is_error: true }));
|
|
82
|
+
if (results.length)
|
|
83
|
+
results.push(...interrupted);
|
|
84
|
+
else
|
|
85
|
+
data.messages.splice(i + 1, 0, { role: 'user', content: interrupted });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return data;
|
|
50
89
|
}
|
|
51
90
|
catch {
|
|
52
91
|
return null;
|
|
@@ -156,4 +195,59 @@ export async function tagSession(sessionId, tag, options) {
|
|
|
156
195
|
data.metadata.updatedAt = new Date().toISOString();
|
|
157
196
|
await saveSession(sessionId, data.messages, data.metadata);
|
|
158
197
|
}
|
|
198
|
+
export async function appendSessionEvent(sessionId, event) {
|
|
199
|
+
// Token deltas are ephemeral; complete assistant messages are persisted instead.
|
|
200
|
+
if (event.type === 'partial_message')
|
|
201
|
+
return;
|
|
202
|
+
const dir = getSessionPath(sessionId);
|
|
203
|
+
await mkdir(dir, { recursive: true });
|
|
204
|
+
const path = join(dir, 'events.jsonl');
|
|
205
|
+
const record = { version: 1, id: crypto.randomUUID(), timestamp: new Date().toISOString(), event };
|
|
206
|
+
const handle = await open(path, 'a+', 0o600);
|
|
207
|
+
try {
|
|
208
|
+
// Normally read just the last byte. Scan backwards only after a torn append.
|
|
209
|
+
const { size } = await handle.stat();
|
|
210
|
+
if (size) {
|
|
211
|
+
const last = Buffer.alloc(1);
|
|
212
|
+
await handle.read(last, 0, 1, size - 1);
|
|
213
|
+
if (last[0] !== 10) {
|
|
214
|
+
let end = size;
|
|
215
|
+
let boundary = 0;
|
|
216
|
+
while (end > 0) {
|
|
217
|
+
const start = Math.max(0, end - 65536);
|
|
218
|
+
const chunk = Buffer.alloc(end - start);
|
|
219
|
+
await handle.read(chunk, 0, chunk.length, start);
|
|
220
|
+
const newline = chunk.lastIndexOf(10);
|
|
221
|
+
if (newline >= 0) {
|
|
222
|
+
boundary = start + newline + 1;
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
end = start;
|
|
226
|
+
}
|
|
227
|
+
await handle.truncate(boundary);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
await handle.writeFile(JSON.stringify(record) + '\n');
|
|
231
|
+
await handle.sync();
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
await handle.close();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export async function readSessionEvents(sessionId, afterId) {
|
|
238
|
+
const content = await readFile(join(getSessionPath(sessionId), 'events.jsonl'), 'utf8').catch((error) => {
|
|
239
|
+
if (error.code !== 'ENOENT')
|
|
240
|
+
throw error;
|
|
241
|
+
return '';
|
|
242
|
+
});
|
|
243
|
+
const lines = content.split('\n');
|
|
244
|
+
lines.pop(); // ignore a torn final record, or the empty trailing line
|
|
245
|
+
const records = lines.filter(Boolean).map(line => JSON.parse(line));
|
|
246
|
+
if (!afterId)
|
|
247
|
+
return records;
|
|
248
|
+
const index = records.findIndex(record => record.id === afterId);
|
|
249
|
+
if (index < 0)
|
|
250
|
+
throw new Error('Unknown session event cursor');
|
|
251
|
+
return records.slice(index + 1);
|
|
252
|
+
}
|
|
159
253
|
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tool.d.ts","sourceRoot":"","sources":["../../src/tools/agent-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"agent-tool.d.ts","sourceRoot":"","sources":["../../src/tools/agent-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,eAAe,EAAE,MAAM,aAAa,CAAA;AAS3F;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAE5E;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAkBD,eAAO,MAAM,SAAS,EAAE,cAgJvB,CAAA"}
|
package/dist/tools/agent-tool.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Supports built-in agents (Explore, Plan) and custom agent definitions.
|
|
5
5
|
* Agents run as nested query loops with their own context and tool sets.
|
|
6
6
|
*/
|
|
7
|
+
import { startBackgroundTask } from './task-tools.js';
|
|
7
8
|
import { QueryEngine } from '../engine.js';
|
|
8
9
|
import { getAllBaseTools, filterTools } from './index.js';
|
|
9
10
|
import { createProvider } from '../providers/index.js';
|
|
@@ -76,16 +77,20 @@ export const AgentTool = {
|
|
|
76
77
|
return 'Launch a subagent to handle complex tasks autonomously.';
|
|
77
78
|
},
|
|
78
79
|
async call(input, context) {
|
|
80
|
+
if (input.run_in_background) {
|
|
81
|
+
const task = startBackgroundTask(context, 'agent', input.description || 'Subagent', async (signal) => {
|
|
82
|
+
const result = await AgentTool.call({ ...input, run_in_background: false }, { ...context, abortSignal: signal });
|
|
83
|
+
return { output: typeof result.content === 'string' ? result.content : JSON.stringify(result.content), is_error: result.is_error };
|
|
84
|
+
});
|
|
85
|
+
return { type: 'tool_result', tool_use_id: '', content: JSON.stringify({ task_id: task.id, status: task.status }) };
|
|
86
|
+
}
|
|
79
87
|
const agentType = input.subagent_type || 'general-purpose';
|
|
80
88
|
// Find agent definition
|
|
81
|
-
const agentDef = registeredAgents[agentType] || BUILTIN_AGENTS[agentType];
|
|
89
|
+
const agentDef = (context.agents ?? registeredAgents)[agentType] || BUILTIN_AGENTS[agentType];
|
|
82
90
|
// Determine tools for subagent
|
|
83
|
-
let tools = getAllBaseTools();
|
|
84
|
-
if (agentDef?.tools) {
|
|
85
|
-
tools = filterTools(tools, agentDef.tools);
|
|
86
|
-
}
|
|
91
|
+
let tools = filterTools(context.tools ?? getAllBaseTools(), agentDef?.tools, agentDef?.disallowedTools);
|
|
87
92
|
// Remove AgentTool from subagent to prevent infinite recursion
|
|
88
|
-
tools = tools.filter(t => t.name !== 'Agent');
|
|
93
|
+
tools = tools.filter(t => t.name !== 'Agent' && t.name !== 'update_goal');
|
|
89
94
|
// Build system prompt
|
|
90
95
|
const systemPrompt = agentDef?.prompt ||
|
|
91
96
|
'You are a helpful assistant. Complete the given task using the available tools.';
|
|
@@ -94,7 +99,8 @@ export const AgentTool = {
|
|
|
94
99
|
const envApiType = process.env.CLAUDEBUDDY_API_TYPE;
|
|
95
100
|
const envApiKey = process.env.CLAUDEBUDDY_API_KEY;
|
|
96
101
|
const envBaseUrl = process.env.CLAUDEBUDDY_BASE_URL;
|
|
97
|
-
const
|
|
102
|
+
const requestedModel = input.model || agentDef?.model;
|
|
103
|
+
const subModel = (requestedModel === 'inherit' ? undefined : requestedModel) || context.model || envModel || 'claude-sonnet-4-6';
|
|
98
104
|
const provider = context.provider ?? createProvider((context.apiType || envApiType) || 'anthropic-messages', {
|
|
99
105
|
apiKey: envApiKey,
|
|
100
106
|
baseURL: envBaseUrl,
|
|
@@ -108,14 +114,28 @@ export const AgentTool = {
|
|
|
108
114
|
systemPrompt,
|
|
109
115
|
maxTurns: agentDef?.maxTurns || 10,
|
|
110
116
|
maxTokens: 16384,
|
|
111
|
-
canUseTool: async () => ({ behavior: 'allow' }),
|
|
117
|
+
canUseTool: context.canUseTool ?? (async () => ({ behavior: 'allow' })),
|
|
118
|
+
abortSignal: context.abortSignal,
|
|
119
|
+
sessionState: context.sessionState,
|
|
120
|
+
agents: context.agents,
|
|
121
|
+
maxBudgetUsd: context.maxBudgetUsd,
|
|
122
|
+
executionBudget: context.executionBudget,
|
|
123
|
+
pricingPerMillion: context.pricingPerMillion,
|
|
124
|
+
hookRegistry: context.hookRegistry,
|
|
125
|
+
sessionId: context.sessionId,
|
|
112
126
|
includePartialMessages: false,
|
|
113
127
|
});
|
|
114
128
|
// Run the subagent
|
|
115
129
|
let resultText = '';
|
|
130
|
+
let isError = false;
|
|
131
|
+
let failureReason = '';
|
|
116
132
|
let toolCalls = [];
|
|
117
133
|
try {
|
|
118
134
|
for await (const event of engine.submitMessage(input.prompt)) {
|
|
135
|
+
if (event.type === 'result' && event.is_error) {
|
|
136
|
+
isError = true;
|
|
137
|
+
failureReason = event.subtype;
|
|
138
|
+
}
|
|
119
139
|
if (event.type === 'assistant') {
|
|
120
140
|
for (const block of event.message.content) {
|
|
121
141
|
if ('text' in block && block.text) {
|
|
@@ -136,7 +156,9 @@ export const AgentTool = {
|
|
|
136
156
|
is_error: true,
|
|
137
157
|
};
|
|
138
158
|
}
|
|
139
|
-
const output =
|
|
159
|
+
const output = isError
|
|
160
|
+
? `Subagent error: ${failureReason}${resultText ? `\n${resultText}` : ''}`
|
|
161
|
+
: resultText || '(Subagent completed with no text output)';
|
|
140
162
|
const toolSummary = toolCalls.length > 0
|
|
141
163
|
? `\n[Tools used: ${toolCalls.join(', ')}]`
|
|
142
164
|
: '';
|
|
@@ -144,6 +166,7 @@ export const AgentTool = {
|
|
|
144
166
|
type: 'tool_result',
|
|
145
167
|
tool_use_id: '',
|
|
146
168
|
content: output + toolSummary,
|
|
169
|
+
is_error: isError,
|
|
147
170
|
};
|
|
148
171
|
},
|
|
149
172
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tool.js","sourceRoot":"","sources":["../../src/tools/agent-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,cAAc,EAAgB,MAAM,uBAAuB,CAAA;AAEpE,yCAAyC;AACzC,IAAI,gBAAgB,GAAoC,EAAE,CAAA;AAE1D;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAuC;IACpE,gBAAgB,GAAG,EAAE,GAAG,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAAA;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,gBAAgB,GAAG,EAAE,CAAA;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,cAAc,GAAoC;IACtD,OAAO,EAAE;QACP,WAAW,EAAE,wHAAwH;QACrI,MAAM,EAAE,gMAAgM;QACxM,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KACxC;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,wHAAwH;QACrI,MAAM,EAAE,0NAA0N;QAClO,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KACxC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,yIAAyI;IACtJ,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mCAAmC;aACjD;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4CAA4C;aAC1D;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4EAA4E;aAC1F;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wCAAwC;aACtD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4BAA4B;aAC1C;YACD,iBAAiB,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,8BAA8B;aAC5C;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;KACpC;IACD,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK;IACvB,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;IAC9B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IACrB,KAAK,CAAC,MAAM;QACV,OAAO,yDAAyD,CAAA;IAClE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAU,EAAE,OAAoB;QACzC,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,IAAI,iBAAiB,CAAA;QAE1D,wBAAwB;QACxB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"agent-tool.js","sourceRoot":"","sources":["../../src/tools/agent-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/ask-user.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SessionState } from './session-state.js';
|
|
1
2
|
/**
|
|
2
3
|
* AskUserQuestionTool - Interactive user questions
|
|
3
4
|
*
|
|
@@ -9,10 +10,10 @@ import type { ToolDefinition } from '../types.js';
|
|
|
9
10
|
/**
|
|
10
11
|
* Set the question handler for AskUserQuestion.
|
|
11
12
|
*/
|
|
12
|
-
export declare function setQuestionHandler(handler: (question: string, options?: string[]) => Promise<string
|
|
13
|
+
export declare function setQuestionHandler(handler: (question: string, options?: string[]) => Promise<string>, sessionState?: SessionState): void;
|
|
13
14
|
/**
|
|
14
15
|
* Clear the question handler.
|
|
15
16
|
*/
|
|
16
|
-
export declare function clearQuestionHandler(): void;
|
|
17
|
+
export declare function clearQuestionHandler(sessionState?: SessionState): void;
|
|
17
18
|
export declare const AskUserQuestionTool: ToolDefinition;
|
|
18
19
|
//# sourceMappingURL=ask-user.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user.d.ts","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"ask-user.d.ts","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACpE;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,aAAa,CAAA;AAI1E;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,EAClE,YAAY,CAAC,EAAE,YAAY,GAC1B,IAAI,CAGN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAGtE;AAED,eAAO,MAAM,mBAAmB,EAAE,cAkDjC,CAAA"}
|
package/dist/tools/ask-user.js
CHANGED
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
* AskUserQuestionTool - Interactive user questions
|
|
3
|
-
*
|
|
4
|
-
* In SDK mode, returns a permission_request event and waits
|
|
5
|
-
* for the consumer to provide an answer.
|
|
6
|
-
* In non-interactive mode, returns a default or denies.
|
|
7
|
-
*/
|
|
1
|
+
import { sessionStore } from './session-state.js';
|
|
8
2
|
// Callback for handling user questions (set by the agent)
|
|
9
|
-
let questionHandler = null;
|
|
10
3
|
/**
|
|
11
4
|
* Set the question handler for AskUserQuestion.
|
|
12
5
|
*/
|
|
13
|
-
export function setQuestionHandler(handler) {
|
|
14
|
-
|
|
6
|
+
export function setQuestionHandler(handler, sessionState) {
|
|
7
|
+
const state = getState(sessionState);
|
|
8
|
+
state.questionHandler = handler;
|
|
15
9
|
}
|
|
16
10
|
/**
|
|
17
11
|
* Clear the question handler.
|
|
18
12
|
*/
|
|
19
|
-
export function clearQuestionHandler() {
|
|
20
|
-
|
|
13
|
+
export function clearQuestionHandler(sessionState) {
|
|
14
|
+
const state = getState(sessionState);
|
|
15
|
+
state.questionHandler = null;
|
|
21
16
|
}
|
|
22
17
|
export const AskUserQuestionTool = {
|
|
23
18
|
name: 'AskUserQuestion',
|
|
@@ -42,10 +37,11 @@ export const AskUserQuestionTool = {
|
|
|
42
37
|
isConcurrencySafe: () => false,
|
|
43
38
|
isEnabled: () => true,
|
|
44
39
|
async prompt() { return 'Ask the user a question.'; },
|
|
45
|
-
async call(input) {
|
|
46
|
-
|
|
40
|
+
async call(input, context) {
|
|
41
|
+
const state = getState(context?.sessionState);
|
|
42
|
+
if (state.questionHandler) {
|
|
47
43
|
try {
|
|
48
|
-
const answer = await questionHandler(input.question, input.options);
|
|
44
|
+
const answer = await state.questionHandler(input.question, input.options);
|
|
49
45
|
return {
|
|
50
46
|
type: 'tool_result',
|
|
51
47
|
tool_use_id: '',
|
|
@@ -69,4 +65,9 @@ export const AskUserQuestionTool = {
|
|
|
69
65
|
};
|
|
70
66
|
},
|
|
71
67
|
};
|
|
68
|
+
function getState(sessionState) {
|
|
69
|
+
return sessionStore(sessionState, 'ask-user', () => ({
|
|
70
|
+
questionHandler: null,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
72
73
|
//# sourceMappingURL=ask-user.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAWpE,0DAA0D;AAE1D;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAkE,EAClE,YAA2B;IAE3B,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IACpC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAA;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,YAA2B;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IACpC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,8GAA8G;IAC3H,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACzE,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,uCAAuC;aACrD;YACD,iBAAiB,EAAE;gBACjB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,oDAAoD;aAClE;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACvB;IACD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;IACtB,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;IAC9B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;IACrB,KAAK,CAAC,MAAM,KAAK,OAAO,0BAA0B,CAAA,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,KAAU,EAAE,OAAqB;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QAC7C,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBACzE,OAAO;oBACL,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,EAAE;oBACf,OAAO,EAAE,MAAM;iBAChB,CAAA;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO;oBACL,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,EAAE;oBACf,OAAO,EAAE,4BAA4B,GAAG,CAAC,OAAO,EAAE;oBAClD,QAAQ,EAAE,IAAI;iBACf,CAAA;YACH,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,oCAAoC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iEAAiE;SAC7L,CAAA;IACH,CAAC;CACF,CAAA;AAED,SAAS,QAAQ,CAAC,YAA2B;IAC3C,OAAO,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,eAAe,EAAE,IAA0E;KAC5F,CAAC,CAAC,CAAA;AACL,CAAC"}
|
package/dist/tools/bash.d.ts
CHANGED
package/dist/tools/bash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,sCAoBnB,CAAA"}
|
package/dist/tools/bash.js
CHANGED
|
@@ -1,67 +1,87 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BashTool - Execute shell commands
|
|
3
|
-
*/
|
|
1
|
+
/** Shell execution with bounded output and real task cancellation. */
|
|
4
2
|
import { spawn } from 'child_process';
|
|
5
3
|
import { defineTool } from './types.js';
|
|
4
|
+
import { startBackgroundTask } from './task-tools.js';
|
|
6
5
|
export const BashTool = defineTool({
|
|
7
6
|
name: 'Bash',
|
|
8
|
-
description: 'Execute a bash command
|
|
9
|
-
inputSchema: {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
},
|
|
16
|
-
timeout: {
|
|
17
|
-
type: 'number',
|
|
18
|
-
description: 'Optional timeout in milliseconds (max 600000, default 120000)',
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
required: ['command'],
|
|
22
|
-
},
|
|
23
|
-
isReadOnly: false,
|
|
24
|
-
isConcurrencySafe: false,
|
|
7
|
+
description: 'Execute a bash command. Set run_in_background to receive a task_id for TaskOutput/TaskStop. Background work is scoped to the current query.',
|
|
8
|
+
inputSchema: { type: 'object', properties: {
|
|
9
|
+
command: { type: 'string', description: 'Shell command' },
|
|
10
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds, 1–600000 (default 120000)' },
|
|
11
|
+
run_in_background: { type: 'boolean', description: 'Return a task_id immediately' },
|
|
12
|
+
}, required: ['command'] },
|
|
13
|
+
isReadOnly: false, isConcurrencySafe: false,
|
|
25
14
|
async call(input, context) {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
proc.stdout?.on('data', (data) => chunks.push(data));
|
|
38
|
-
proc.stderr?.on('data', (data) => errChunks.push(data));
|
|
39
|
-
if (context.abortSignal) {
|
|
40
|
-
context.abortSignal.addEventListener('abort', () => {
|
|
41
|
-
proc.kill('SIGTERM');
|
|
42
|
-
}, { once: true });
|
|
43
|
-
}
|
|
44
|
-
proc.on('close', (code) => {
|
|
45
|
-
const stdout = Buffer.concat(chunks).toString('utf-8');
|
|
46
|
-
const stderr = Buffer.concat(errChunks).toString('utf-8');
|
|
47
|
-
let output = '';
|
|
48
|
-
if (stdout)
|
|
49
|
-
output += stdout;
|
|
50
|
-
if (stderr)
|
|
51
|
-
output += (output ? '\n' : '') + stderr;
|
|
52
|
-
if (code !== 0 && code !== null) {
|
|
53
|
-
output += `\nExit code: ${code}`;
|
|
54
|
-
}
|
|
55
|
-
// Truncate very large outputs
|
|
56
|
-
if (output.length > 100000) {
|
|
57
|
-
output = output.slice(0, 50000) + '\n...(truncated)...\n' + output.slice(-50000);
|
|
58
|
-
}
|
|
59
|
-
resolve(output || '(no output)');
|
|
60
|
-
});
|
|
61
|
-
proc.on('error', (err) => {
|
|
62
|
-
resolve(`Error executing command: ${err.message}`);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
15
|
+
const timeout = input.timeout ?? 120000;
|
|
16
|
+
if (!Number.isFinite(timeout) || timeout < 1 || timeout > 600000)
|
|
17
|
+
throw new Error('Invalid command timeout');
|
|
18
|
+
if (typeof input.command !== 'string' || !input.command.trim())
|
|
19
|
+
throw new Error('command must be non-empty');
|
|
20
|
+
if (input.run_in_background) {
|
|
21
|
+
const task = startBackgroundTask(context, 'bash', input.command.slice(0, 200), (signal, append) => executeShell(input.command, context.cwd, timeout, signal, append));
|
|
22
|
+
return JSON.stringify({ task_id: task.id, status: task.status });
|
|
23
|
+
}
|
|
24
|
+
const result = await executeShell(input.command, context.cwd, timeout, context.abortSignal);
|
|
25
|
+
return { data: result.output, is_error: result.is_error };
|
|
65
26
|
},
|
|
66
27
|
});
|
|
28
|
+
function executeShell(command, cwd, timeout, signal, append) {
|
|
29
|
+
signal?.throwIfAborted();
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
let output = '';
|
|
32
|
+
let truncated = false;
|
|
33
|
+
let timedOut = false;
|
|
34
|
+
let settled = false;
|
|
35
|
+
let escalation;
|
|
36
|
+
const proc = spawn('bash', ['-c', command], { cwd, env: { ...process.env }, detached: process.platform !== 'win32', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
37
|
+
const add = (text) => { output += text; if (output.length > 100000) {
|
|
38
|
+
output = output.slice(-100000);
|
|
39
|
+
truncated = true;
|
|
40
|
+
} ; append?.(text); };
|
|
41
|
+
const kill = (sig) => {
|
|
42
|
+
try {
|
|
43
|
+
if (process.platform !== 'win32' && proc.pid)
|
|
44
|
+
process.kill(-proc.pid, sig);
|
|
45
|
+
else
|
|
46
|
+
proc.kill(sig);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error.code !== 'ESRCH')
|
|
50
|
+
add(`\nTermination error: ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const stop = () => { kill('SIGTERM'); if (!escalation)
|
|
54
|
+
escalation = setTimeout(() => kill('SIGKILL'), 500); };
|
|
55
|
+
const timer = setTimeout(() => { timedOut = true; stop(); }, timeout);
|
|
56
|
+
signal?.addEventListener('abort', stop, { once: true });
|
|
57
|
+
if (signal?.aborted)
|
|
58
|
+
stop();
|
|
59
|
+
proc.stdout.setEncoding('utf8');
|
|
60
|
+
proc.stderr.setEncoding('utf8');
|
|
61
|
+
proc.stdout.on('data', add);
|
|
62
|
+
proc.stderr.on('data', add);
|
|
63
|
+
const finish = (code, error, killedBy) => {
|
|
64
|
+
if (settled)
|
|
65
|
+
return;
|
|
66
|
+
settled = true;
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
if (escalation) {
|
|
69
|
+
kill('SIGKILL');
|
|
70
|
+
clearTimeout(escalation);
|
|
71
|
+
}
|
|
72
|
+
signal?.removeEventListener('abort', stop);
|
|
73
|
+
if (error)
|
|
74
|
+
add(`\nError executing command: ${error.message}`);
|
|
75
|
+
else if (timedOut)
|
|
76
|
+
add('\nCommand timed out');
|
|
77
|
+
else if (signal?.aborted)
|
|
78
|
+
add('\nCommand cancelled');
|
|
79
|
+
else if (code !== 0)
|
|
80
|
+
add(`\nExit code: ${code}${killedBy ? ` (${killedBy})` : ''}`);
|
|
81
|
+
resolve({ output: (truncated ? '(earlier output truncated)\n' : '') + (output || '(no output)'), is_error: !!error || timedOut || !!signal?.aborted || code !== 0, exitCode: code });
|
|
82
|
+
};
|
|
83
|
+
proc.on('error', error => finish(null, error));
|
|
84
|
+
proc.on('close', (code, sig) => finish(code, undefined, sig));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
67
87
|
//# sourceMappingURL=bash.js.map
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAA4B,MAAM,iBAAiB,CAAA;AAE/E,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,6IAA6I;IAC1J,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE;YACzC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;YACzD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oDAAoD,EAAE;YAC9F,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,8BAA8B,EAAE;SACpF,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE;IAC1B,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK;IAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAA;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5G,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC5G,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;YACrK,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;QAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAA;IAC3D,CAAC;CACF,CAAC,CAAA;AAEF,SAAS,YAAY,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAE,MAAoB,EAAE,MAA+B;IACxH,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;QAAC,IAAI,SAAS,GAAG,KAAK,CAAC;QAAC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAAC,IAAI,OAAO,GAAG,KAAK,CAAA;QACjF,IAAI,UAAqD,CAAA;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QACxJ,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;YAAC,SAAS,GAAG,IAAI,CAAA;QAAC,CAAC,CAAA,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,CAAA;QAClJ,MAAM,IAAI,GAAG,CAAC,GAAmB,EAAE,EAAE;YACnC,IAAI,CAAC;gBAAC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;oBAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAAC,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAAC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;oBAAE,GAAG,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YAAC,CAAC;QACzM,CAAC,CAAA;QACD,MAAM,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU;YAAE,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAA;QAC5G,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACvD,IAAI,MAAM,EAAE,OAAO;YAAE,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,KAAa,EAAE,QAAwB,EAAE,EAAE;YAC9E,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,UAAU,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,YAAY,CAAC,UAAU,CAAC,CAAA;YAAC,CAAC;YAClF,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC1C,IAAI,KAAK;gBAAE,GAAG,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;iBACxD,IAAI,QAAQ;gBAAE,GAAG,CAAC,qBAAqB,CAAC,CAAA;iBACxC,IAAI,MAAM,EAAE,OAAO;gBAAE,GAAG,CAAC,qBAAqB,CAAC,CAAA;iBAC/C,IAAI,IAAI,KAAK,CAAC;gBAAE,GAAG,CAAC,gBAAgB,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACnF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACtL,CAAC,CAAA;QACD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;QAC9C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SessionState } from './session-state.js';
|
|
1
2
|
/**
|
|
2
3
|
* ConfigTool - Dynamic configuration management
|
|
3
4
|
*
|
|
@@ -7,14 +8,14 @@ import type { ToolDefinition } from '../types.js';
|
|
|
7
8
|
/**
|
|
8
9
|
* Get a config value.
|
|
9
10
|
*/
|
|
10
|
-
export declare function getConfig(key: string): unknown;
|
|
11
|
+
export declare function getConfig(key: string, sessionState?: SessionState): unknown;
|
|
11
12
|
/**
|
|
12
13
|
* Set a config value.
|
|
13
14
|
*/
|
|
14
|
-
export declare function setConfig(key: string, value: unknown): void;
|
|
15
|
+
export declare function setConfig(key: string, value: unknown, sessionState?: SessionState): void;
|
|
15
16
|
/**
|
|
16
17
|
* Clear all config.
|
|
17
18
|
*/
|
|
18
|
-
export declare function clearConfig(): void;
|
|
19
|
+
export declare function clearConfig(sessionState?: SessionState): void;
|
|
19
20
|
export declare const ConfigTool: ToolDefinition;
|
|
20
21
|
//# sourceMappingURL=config-tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-tool.d.ts","sourceRoot":"","sources":["../../src/tools/config-tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"config-tool.d.ts","sourceRoot":"","sources":["../../src/tools/config-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACpE;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,aAAa,CAAA;AAI1E;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAG3E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAGxF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAG7D;AAED,eAAO,MAAM,UAAU,EAAE,cAyDxB,CAAA"}
|