joonecli 0.2.0 → 0.2.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/dist/__tests__/config.test.js +1 -0
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/installHostDeps.test.js +45 -0
- package/dist/__tests__/installHostDeps.test.js.map +1 -0
- package/dist/__tests__/whitelistedBackend.test.js +18 -0
- package/dist/__tests__/whitelistedBackend.test.js.map +1 -0
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.js +1 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +84 -100
- package/dist/cli/index.js.map +1 -1
- package/dist/core/agentLoop.d.ts +10 -29
- package/dist/core/agentLoop.js +66 -237
- package/dist/core/agentLoop.js.map +1 -1
- package/dist/core/promptBuilder.js.map +1 -1
- package/dist/hitl/bridge.js +1 -27
- package/dist/hitl/bridge.js.map +1 -1
- package/dist/middleware/loopDetection.d.ts +7 -23
- package/dist/middleware/loopDetection.js +38 -42
- package/dist/middleware/loopDetection.js.map +1 -1
- package/dist/sandbox/whitelistedBackend.d.ts +5 -0
- package/dist/sandbox/whitelistedBackend.js +27 -0
- package/dist/sandbox/whitelistedBackend.js.map +1 -0
- package/dist/tools/askUser.d.ts +12 -3
- package/dist/tools/askUser.js +16 -28
- package/dist/tools/askUser.js.map +1 -1
- package/dist/tools/bashTool.d.ts +11 -0
- package/dist/tools/bashTool.js +51 -0
- package/dist/tools/bashTool.js.map +1 -0
- package/dist/tools/index.d.ts +15 -28
- package/dist/tools/index.js +9 -189
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/installHostDeps.d.ts +8 -2
- package/dist/tools/installHostDeps.js +38 -31
- package/dist/tools/installHostDeps.js.map +1 -1
- package/dist/ui/App.js +112 -56
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/MessageBubble.js +1 -1
- package/dist/ui/components/MessageBubble.js.map +1 -1
- package/package.json +7 -2
- package/dist/__tests__/m55.test.js +0 -160
- package/dist/__tests__/m55.test.js.map +0 -1
- package/dist/__tests__/middleware.test.js +0 -169
- package/dist/__tests__/middleware.test.js.map +0 -1
- package/dist/__tests__/optimizations.test.d.ts +0 -1
- package/dist/__tests__/optimizations.test.js +0 -136
- package/dist/__tests__/optimizations.test.js.map +0 -1
- package/dist/__tests__/security.test.d.ts +0 -1
- package/dist/__tests__/security.test.js +0 -86
- package/dist/__tests__/security.test.js.map +0 -1
- package/dist/__tests__/streaming.test.d.ts +0 -1
- package/dist/__tests__/streaming.test.js +0 -71
- package/dist/__tests__/streaming.test.js.map +0 -1
- package/dist/__tests__/toolRouter.test.d.ts +0 -1
- package/dist/__tests__/toolRouter.test.js +0 -37
- package/dist/__tests__/toolRouter.test.js.map +0 -1
- package/dist/__tests__/tools.test.d.ts +0 -1
- package/dist/__tests__/tools.test.js +0 -112
- package/dist/__tests__/tools.test.js.map +0 -1
- package/dist/core/subAgent.d.ts +0 -56
- package/dist/core/subAgent.js +0 -240
- package/dist/core/subAgent.js.map +0 -1
- package/dist/debug_google.d.ts +0 -1
- package/dist/debug_google.js +0 -23
- package/dist/debug_google.js.map +0 -1
- package/dist/middleware/commandSanitizer.d.ts +0 -18
- package/dist/middleware/commandSanitizer.js +0 -50
- package/dist/middleware/commandSanitizer.js.map +0 -1
- package/dist/middleware/permission.d.ts +0 -17
- package/dist/middleware/permission.js +0 -60
- package/dist/middleware/permission.js.map +0 -1
- package/dist/middleware/pipeline.d.ts +0 -31
- package/dist/middleware/pipeline.js +0 -62
- package/dist/middleware/pipeline.js.map +0 -1
- package/dist/middleware/preCompletion.d.ts +0 -29
- package/dist/middleware/preCompletion.js +0 -82
- package/dist/middleware/preCompletion.js.map +0 -1
- package/dist/middleware/types.d.ts +0 -40
- package/dist/middleware/types.js +0 -8
- package/dist/middleware/types.js.map +0 -1
- package/dist/skills/loader.d.ts +0 -55
- package/dist/skills/loader.js +0 -132
- package/dist/skills/loader.js.map +0 -1
- package/dist/skills/tools.d.ts +0 -5
- package/dist/skills/tools.js +0 -78
- package/dist/skills/tools.js.map +0 -1
- package/dist/test_cache.d.ts +0 -1
- package/dist/test_cache.js +0 -55
- package/dist/test_cache.js.map +0 -1
- package/dist/test_google.d.ts +0 -1
- package/dist/test_google.js +0 -36
- package/dist/test_google.js.map +0 -1
- package/dist/tools/browser.d.ts +0 -19
- package/dist/tools/browser.js +0 -114
- package/dist/tools/browser.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -31
- package/dist/tools/registry.js +0 -168
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/router.d.ts +0 -34
- package/dist/tools/router.js +0 -76
- package/dist/tools/router.js.map +0 -1
- package/dist/tools/security.d.ts +0 -28
- package/dist/tools/security.js +0 -183
- package/dist/tools/security.js.map +0 -1
- package/dist/tools/spawnAgent.d.ts +0 -19
- package/dist/tools/spawnAgent.js +0 -132
- package/dist/tools/spawnAgent.js.map +0 -1
- package/dist/tools/webSearch.d.ts +0 -6
- package/dist/tools/webSearch.js +0 -120
- package/dist/tools/webSearch.js.map +0 -1
- /package/dist/__tests__/{m55.test.d.ts → installHostDeps.test.d.ts} +0 -0
- /package/dist/__tests__/{middleware.test.d.ts → whitelistedBackend.test.d.ts} +0 -0
package/dist/core/agentLoop.js
CHANGED
|
@@ -1,267 +1,96 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CacheOptimizedPromptBuilder } from "./promptBuilder.js";
|
|
3
|
-
import { MiddlewarePipeline } from "../middleware/pipeline.js";
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
4
2
|
import { SessionTracer } from "../tracing/sessionTracer.js";
|
|
5
|
-
import { countMessageTokens, extractCacheMetrics } from "./tokenCounter.js";
|
|
6
3
|
import { SessionStore } from "./sessionStore.js";
|
|
7
|
-
import {
|
|
8
|
-
import { wrapLLMError, JooneError, ToolExecutionError } from "./errors.js";
|
|
9
|
-
import { ContextGuard, getProviderContextLimit } from "./contextGuard.js";
|
|
4
|
+
import { SystemMessage } from "@langchain/core/messages";
|
|
10
5
|
import { AutoSave } from "./autoSave.js";
|
|
11
|
-
import {
|
|
6
|
+
import { createDeepAgent } from "deepagents";
|
|
7
|
+
import { WhitelistedLocalShellBackend } from "../sandbox/whitelistedBackend.js";
|
|
8
|
+
import { createMiddleware } from "langchain";
|
|
9
|
+
import { createLoopDetectionMiddleware } from "../middleware/loopDetection.js";
|
|
10
|
+
import { MemorySaver } from "@langchain/langgraph";
|
|
12
11
|
export class ExecutionHarness extends EventEmitter {
|
|
13
|
-
|
|
14
|
-
promptBuilder;
|
|
15
|
-
availableTools;
|
|
16
|
-
pipeline;
|
|
12
|
+
agent;
|
|
17
13
|
tracer;
|
|
18
14
|
sessionStore;
|
|
19
15
|
sessionId;
|
|
20
16
|
provider;
|
|
21
17
|
model;
|
|
22
|
-
contextGuard;
|
|
23
18
|
autoSave;
|
|
24
|
-
|
|
25
|
-
* Initializes the harness with a pre-configured, tool-bound LLM instance.
|
|
26
|
-
* This allows swapping between Anthropic Claude, OpenAI GPT-4, Google Gemini, etc.
|
|
27
|
-
*/
|
|
28
|
-
constructor(boundLlm, tools = [], pipeline, tracer, provider = "unknown", model = "unknown", sessionId, maxTokens = 4096) {
|
|
19
|
+
constructor(boundLlm, tools = [], tracer, provider = "unknown", model = "unknown", sessionId, maxTokens = 4096, permissionMode = "auto", executionMode = "host") {
|
|
29
20
|
super();
|
|
30
|
-
this.llm = boundLlm;
|
|
31
|
-
this.promptBuilder = new CacheOptimizedPromptBuilder();
|
|
32
|
-
this.availableTools = tools;
|
|
33
|
-
this.pipeline = pipeline ?? new MiddlewarePipeline();
|
|
34
21
|
this.tracer = tracer ?? new SessionTracer();
|
|
35
22
|
this.sessionStore = new SessionStore();
|
|
36
23
|
this.sessionId = sessionId ?? this.tracer.getSessionId();
|
|
37
24
|
this.provider = provider;
|
|
38
25
|
this.model = model;
|
|
39
|
-
const contextLimit = getProviderContextLimit(this.provider, this.model);
|
|
40
|
-
this.contextGuard = new ContextGuard(this.llm, contextLimit, this.promptBuilder);
|
|
41
26
|
this.autoSave = new AutoSave(this.sessionId, this.sessionStore);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*/
|
|
47
|
-
async step(state) {
|
|
48
|
-
const start = Date.now();
|
|
49
|
-
// ContextGuard: Check capacity before building prompt
|
|
50
|
-
const { state: updatedState, metrics } = await this.contextGuard.ensureCapacity(state);
|
|
51
|
-
state = updatedState; // Reassign state if compacted
|
|
52
|
-
const messages = this.promptBuilder.buildPrompt(state);
|
|
53
|
-
try {
|
|
54
|
-
const response = await retryWithBackoff(() => this.llm.invoke(messages).catch((e) => { throw wrapLLMError(e, this.provider); }), {
|
|
55
|
-
onRetry: (attempt, error, delay) => {
|
|
56
|
-
this.tracer.recordError({ message: `LLM retry #${attempt}: ${error.message} (waiting ${delay}ms)` });
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
const promptTokens = countMessageTokens(messages);
|
|
60
|
-
const completionTokens = countMessageTokens([response]);
|
|
61
|
-
const cacheMetrics = extractCacheMetrics(response, this.provider);
|
|
62
|
-
this.tracer.recordLLMCall({
|
|
63
|
-
promptTokens,
|
|
64
|
-
completionTokens,
|
|
65
|
-
cached: cacheMetrics.cachedTokens > 0,
|
|
66
|
-
cachedTokens: cacheMetrics.cachedTokens,
|
|
67
|
-
duration: Date.now() - start
|
|
68
|
-
});
|
|
69
|
-
await this.autoSave.tick({ config: { provider: this.provider, model: this.model }, state });
|
|
70
|
-
return response;
|
|
27
|
+
const checkpointer = new MemorySaver();
|
|
28
|
+
let interruptOn = undefined;
|
|
29
|
+
if (permissionMode === "ask_dangerous") {
|
|
30
|
+
interruptOn = { "bash": true, "write_file": true, "install_host_dependencies": true };
|
|
71
31
|
}
|
|
72
|
-
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
await this.autoSave.forceSave({ config: { provider: this.provider, model: this.model }, state });
|
|
78
|
-
// Return a synthetic AI message so the turn doesn't crash
|
|
79
|
-
return new AIMessage(error.toRecoveryHint());
|
|
80
|
-
}
|
|
81
|
-
throw error; // Fatal (auth, config) — propagate to TUI
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Streaming execution engine.
|
|
86
|
-
* Streams text tokens via the onToken callback and buffers tool call chunks
|
|
87
|
-
* until the full call is received. Returns a complete AIMessage for history.
|
|
88
|
-
*/
|
|
89
|
-
async streamStep(state, options) {
|
|
90
|
-
const start = Date.now();
|
|
91
|
-
// ContextGuard: Check capacity before building prompt
|
|
92
|
-
const { state: updatedState, metrics } = await this.contextGuard.ensureCapacity(state);
|
|
93
|
-
state = updatedState;
|
|
94
|
-
const messages = this.promptBuilder.buildPrompt(state);
|
|
95
|
-
try {
|
|
96
|
-
const result = await retryWithBackoff(async () => {
|
|
97
|
-
let fullContent = "";
|
|
98
|
-
const toolCallBuffers = new Map();
|
|
99
|
-
let stream;
|
|
100
|
-
try {
|
|
101
|
-
stream = await this.llm.stream(messages);
|
|
102
|
-
}
|
|
103
|
-
catch (e) {
|
|
104
|
-
throw wrapLLMError(e, this.provider);
|
|
32
|
+
else if (permissionMode === "ask_all") {
|
|
33
|
+
// Note: Ask user question tool expects to run normally
|
|
34
|
+
interruptOn = tools.reduce((acc, t) => {
|
|
35
|
+
if (t.name !== "ask_user_question") {
|
|
36
|
+
acc[t.name] = true;
|
|
105
37
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
fullContent += chunk.content;
|
|
109
|
-
if (options.onToken) {
|
|
110
|
-
options.onToken(chunk.content);
|
|
111
|
-
}
|
|
112
|
-
this.emit("agent:event", { type: "agent:stream", token: chunk.content });
|
|
113
|
-
}
|
|
114
|
-
if (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) {
|
|
115
|
-
for (const tc of chunk.tool_call_chunks) {
|
|
116
|
-
const idx = tc.index ?? 0;
|
|
117
|
-
if (!toolCallBuffers.has(idx)) {
|
|
118
|
-
toolCallBuffers.set(idx, {
|
|
119
|
-
id: tc.id || "",
|
|
120
|
-
name: tc.name || "",
|
|
121
|
-
argsJson: "",
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
const buf = toolCallBuffers.get(idx);
|
|
125
|
-
if (tc.id)
|
|
126
|
-
buf.id = tc.id;
|
|
127
|
-
if (tc.name)
|
|
128
|
-
buf.name = tc.name;
|
|
129
|
-
if (tc.args)
|
|
130
|
-
buf.argsJson += tc.args;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
const toolCalls = Array.from(toolCallBuffers.values()).map((buf) => ({
|
|
135
|
-
id: buf.id,
|
|
136
|
-
name: buf.name,
|
|
137
|
-
args: (() => {
|
|
138
|
-
try {
|
|
139
|
-
return JSON.parse(buf.argsJson || "{}");
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
return { _parseError: true, rawArgs: buf.argsJson };
|
|
143
|
-
}
|
|
144
|
-
})(),
|
|
145
|
-
type: "tool_call",
|
|
146
|
-
}));
|
|
147
|
-
return new AIMessage({
|
|
148
|
-
content: fullContent,
|
|
149
|
-
tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
150
|
-
});
|
|
151
|
-
}, {
|
|
152
|
-
onRetry: (attempt, error, delay) => {
|
|
153
|
-
this.tracer.recordError({ message: `LLM stream retry #${attempt}: ${error.message} (waiting ${delay}ms)` });
|
|
154
|
-
},
|
|
155
|
-
});
|
|
156
|
-
const promptTokens = countMessageTokens(messages);
|
|
157
|
-
const completionTokens = countMessageTokens([result]);
|
|
158
|
-
const cacheMetrics = extractCacheMetrics(result, this.provider);
|
|
159
|
-
this.tracer.recordLLMCall({
|
|
160
|
-
promptTokens,
|
|
161
|
-
completionTokens,
|
|
162
|
-
cached: cacheMetrics.cachedTokens > 0,
|
|
163
|
-
cachedTokens: cacheMetrics.cachedTokens,
|
|
164
|
-
duration: Date.now() - start
|
|
165
|
-
});
|
|
166
|
-
await this.autoSave.tick({ config: { provider: this.provider, model: this.model }, state });
|
|
167
|
-
return result;
|
|
38
|
+
return acc;
|
|
39
|
+
}, {});
|
|
168
40
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
state.
|
|
174
|
-
|
|
175
|
-
|
|
41
|
+
const injectSystemMessage = createMiddleware({
|
|
42
|
+
name: "InjectSystemMessage",
|
|
43
|
+
beforeAgent: async (request, handler) => {
|
|
44
|
+
const { state } = request;
|
|
45
|
+
const sysContent = `${state.globalSystemInstructions}\n\nProject Memory:\n${state.projectMemory}\n\nSession Context:\n${state.sessionContext}`;
|
|
46
|
+
return handler({
|
|
47
|
+
...request,
|
|
48
|
+
systemMessage: new SystemMessage(sysContent),
|
|
49
|
+
});
|
|
176
50
|
}
|
|
177
|
-
|
|
178
|
-
|
|
51
|
+
});
|
|
52
|
+
const backend = executionMode === "sandbox"
|
|
53
|
+
? new WhitelistedLocalShellBackend({ rootDir: process.cwd(), virtualMode: true }) // TODO: CloudSandboxBackend
|
|
54
|
+
: new WhitelistedLocalShellBackend({ rootDir: process.cwd(), virtualMode: false });
|
|
55
|
+
this.agent = createDeepAgent({
|
|
56
|
+
model: boundLlm,
|
|
57
|
+
tools: tools,
|
|
58
|
+
backend,
|
|
59
|
+
systemPrompt: "", // Injected via middleware
|
|
60
|
+
middleware: [injectSystemMessage, createLoopDetectionMiddleware(3)],
|
|
61
|
+
checkpointer,
|
|
62
|
+
interruptOn,
|
|
63
|
+
});
|
|
179
64
|
}
|
|
180
65
|
/**
|
|
181
|
-
* Executes
|
|
182
|
-
*
|
|
66
|
+
* Executes the agent loop autonomously, yielding events instead of
|
|
67
|
+
* requiring App.tsx to manually loop.
|
|
183
68
|
*/
|
|
184
|
-
async
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}));
|
|
206
|
-
continue;
|
|
207
|
-
}
|
|
208
|
-
const tool = this.availableTools.find(t => t.name === call.name);
|
|
209
|
-
if (!tool) {
|
|
210
|
-
this.tracer.recordError({ message: `Tool ${call.name} not found`, tool: call.name });
|
|
211
|
-
results.push(new ToolMessage({
|
|
212
|
-
content: `Error: Tool ${call.name} not found.`,
|
|
213
|
-
tool_call_id: safeCallId
|
|
214
|
-
}));
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
const ctx = {
|
|
218
|
-
toolName: call.name,
|
|
219
|
-
args: call.args,
|
|
220
|
-
callId: safeCallId,
|
|
221
|
-
};
|
|
222
|
-
const start = Date.now();
|
|
223
|
-
this.emit("agent:event", { type: "tool:start", toolName: call.name, args: JSON.stringify(call.args) });
|
|
224
|
-
try {
|
|
225
|
-
const output = await this.pipeline.run(ctx, async (c) => tool.execute(c.args));
|
|
226
|
-
this.tracer.recordToolCall({
|
|
227
|
-
name: call.name,
|
|
228
|
-
args: call.args,
|
|
229
|
-
result: typeof output === "string" ? output : JSON.stringify(output).substring(0, 100),
|
|
230
|
-
duration: Date.now() - start,
|
|
231
|
-
success: true
|
|
232
|
-
});
|
|
233
|
-
const stringifiedOutput = typeof output === "string" ? output : JSON.stringify(output);
|
|
234
|
-
this.emit("agent:event", { type: "tool:end", toolName: call.name, result: stringifiedOutput, durationMs: Date.now() - start });
|
|
235
|
-
results.push(new ToolMessage({
|
|
236
|
-
content: stringifiedOutput,
|
|
237
|
-
tool_call_id: safeCallId
|
|
238
|
-
}));
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
const toolError = new ToolExecutionError(error.message, {
|
|
242
|
-
toolName: call.name,
|
|
243
|
-
args: call.args,
|
|
244
|
-
retryable: false,
|
|
245
|
-
cause: error,
|
|
246
|
-
});
|
|
247
|
-
this.tracer.recordToolCall({
|
|
248
|
-
name: call.name,
|
|
249
|
-
args: call.args,
|
|
250
|
-
duration: Date.now() - start,
|
|
251
|
-
success: false
|
|
252
|
-
});
|
|
253
|
-
this.tracer.recordError({ message: toolError.message, tool: call.name });
|
|
254
|
-
this.emit("agent:event", { type: "tool:end", toolName: call.name, result: `Error: ${toolError.message}`, durationMs: Date.now() - start });
|
|
255
|
-
results.push(new ToolMessage({
|
|
256
|
-
content: toolError.toRecoveryHint(),
|
|
257
|
-
tool_call_id: safeCallId
|
|
258
|
-
}));
|
|
69
|
+
async *run(state, resumeCommand) {
|
|
70
|
+
const streamOptions = {
|
|
71
|
+
configurable: { thread_id: this.sessionId },
|
|
72
|
+
streamMode: "values"
|
|
73
|
+
};
|
|
74
|
+
const config = resumeCommand ? resumeCommand : state;
|
|
75
|
+
// If resuming an interrupt, we pass a Command object.
|
|
76
|
+
// Otherwise, we pass the state.
|
|
77
|
+
const stream = await this.agent.streamEvents(config, {
|
|
78
|
+
...streamOptions,
|
|
79
|
+
version: "v2"
|
|
80
|
+
});
|
|
81
|
+
for await (const event of stream) {
|
|
82
|
+
// Let the UI know about tool execution and token generation
|
|
83
|
+
if (event.event === "on_chat_model_stream") {
|
|
84
|
+
if (event.data?.chunk?.content) {
|
|
85
|
+
this.emit("agent:event", {
|
|
86
|
+
type: "agent:stream",
|
|
87
|
+
token: event.data.chunk.content
|
|
88
|
+
});
|
|
89
|
+
}
|
|
259
90
|
}
|
|
91
|
+
yield event;
|
|
260
92
|
}
|
|
261
|
-
// Add the tool results to the state immediately before saving
|
|
262
|
-
state.conversationHistory.push(...results);
|
|
263
93
|
await this.autoSave.tick({ config: { provider: this.provider, model: this.model }, state });
|
|
264
|
-
return results;
|
|
265
94
|
}
|
|
266
95
|
}
|
|
267
96
|
//# sourceMappingURL=agentLoop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentLoop.js","sourceRoot":"","sources":["../../src/core/agentLoop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agentLoop.js","sourceRoot":"","sources":["../../src/core/agentLoop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptBuilder.js","sourceRoot":"","sources":["../../src/core/promptBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,YAAY,
|
|
1
|
+
{"version":3,"file":"promptBuilder.js","sourceRoot":"","sources":["../../src/core/promptBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,YAAY,GACb,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAoB,MAAM,gBAAgB,CAAC;AASzE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,2BAA2B;IACtC;;;OAGG;IACI,WAAW,CAAC,KAAmB;QACpC,+CAA+C;QAC/C,iHAAiH;QACjH,gFAAgF;QAEhF,MAAM,cAAc,GAAG;YACrB,KAAK,CAAC,wBAAwB;YAC9B,4BAA4B,KAAK,CAAC,aAAa,EAAE;YACjD,0BAA0B,KAAK,CAAC,cAAc,EAAE;SACjD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEf,MAAM,cAAc,GAAkB;YACpC,IAAI,aAAa,CAAC;gBAChB,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,gBAAgB;aACvB,CAAC;SACH,CAAC;QAEF,kEAAkE;QAClE,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CACzB,OAAsB,EACtB,QAAgB;QAEhB,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC;YACnC,OAAO,EAAE,sBAAsB,QAAQ,sBAAsB;SAC9D,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;OAQG;IACI,cAAc,CACnB,OAAsB,EACtB,OAAe,EACf,SAAS,GAAG,CAAC;QAEb,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,sFAAsF;QACtF,8CAA8C;QAC9C,MAAM,gBAAgB,GAAG,IAAI,YAAY,CACvC,uFAAuF,OAAO,oBAAoB,CACnH,CAAC;QAEF,0CAA0C;QAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;QAEjD,OAAO,CAAC,gBAAgB,EAAE,GAAG,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;OAUG;IACI,KAAK,CAAC,qBAAqB,CAChC,OAAsB,EACtB,GAA6B,EAC7B,SAAS,GAAG,CAAC;QAEb,MAAM,SAAS,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;OAMG;IACI,aAAa,CAClB,KAAmB,EACnB,SAAiB,EACjB,SAAS,GAAG,GAAG;QAEf,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC9C,OAAO,KAAK,IAAI,SAAS,GAAG,SAAS,CAAC;IACxC,CAAC;CACF"}
|
package/dist/hitl/bridge.js
CHANGED
|
@@ -41,23 +41,10 @@ export class HITLBridge extends EventEmitter {
|
|
|
41
41
|
options,
|
|
42
42
|
createdAt: Date.now(),
|
|
43
43
|
};
|
|
44
|
-
return new Promise((resolve
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
45
|
this.pendingResolvers.set(id, resolve);
|
|
46
46
|
// Emit the question so the TUI can render it
|
|
47
47
|
this.emit("question", payload);
|
|
48
|
-
// Timeout: auto-reject if user doesn't respond
|
|
49
|
-
const timer = setTimeout(() => {
|
|
50
|
-
if (this.pendingResolvers.has(id)) {
|
|
51
|
-
this.pendingResolvers.delete(id);
|
|
52
|
-
resolve("[No response — the user did not answer within the timeout period.]");
|
|
53
|
-
}
|
|
54
|
-
}, this.timeoutMs);
|
|
55
|
-
// Clean up timer if resolved before timeout
|
|
56
|
-
const originalResolve = this.pendingResolvers.get(id);
|
|
57
|
-
this.pendingResolvers.set(id, (answer) => {
|
|
58
|
-
clearTimeout(timer);
|
|
59
|
-
originalResolve(answer);
|
|
60
|
-
});
|
|
61
48
|
});
|
|
62
49
|
}
|
|
63
50
|
/**
|
|
@@ -82,19 +69,6 @@ export class HITLBridge extends EventEmitter {
|
|
|
82
69
|
this.pendingResolvers.set(id, wrappedResolve);
|
|
83
70
|
// Emit so the TUI can render the permission prompt
|
|
84
71
|
this.emit("permission", payload);
|
|
85
|
-
// Timeout: auto-deny
|
|
86
|
-
const timer = setTimeout(() => {
|
|
87
|
-
if (this.pendingResolvers.has(id)) {
|
|
88
|
-
this.pendingResolvers.delete(id);
|
|
89
|
-
resolve(false); // Denied by timeout
|
|
90
|
-
}
|
|
91
|
-
}, this.timeoutMs);
|
|
92
|
-
// Clean up timer on resolve
|
|
93
|
-
const current = this.pendingResolvers.get(id);
|
|
94
|
-
this.pendingResolvers.set(id, (answer) => {
|
|
95
|
-
clearTimeout(timer);
|
|
96
|
-
current(answer);
|
|
97
|
-
});
|
|
98
72
|
});
|
|
99
73
|
}
|
|
100
74
|
/**
|
package/dist/hitl/bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/hitl/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwB3C;;;;;;;;;GASG;AACH,MAAM,OAAO,UAAW,SAAQ,YAAY;IAChC,MAAM,CAAC,QAAQ,GAAsB,IAAI,CAAC;IAC1C,gBAAgB,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC/D,SAAS,CAAS;IAClB,eAAe,GAAG,CAAC,CAAC;IAE5B,YAAY,YAAoB,CAAC,GAAG,EAAE,GAAG,IAAI;QACzC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,SAAkB;QACjC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACvB,UAAU,CAAC,QAAQ,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,UAAU,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,aAAa;QAChB,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,OAAkB;QAC9C,MAAM,EAAE,GAAG,UAAU,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE5D,MAAM,OAAO,GAAiB;YAC1B,EAAE;YACF,QAAQ;YACR,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC;QAEF,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/hitl/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwB3C;;;;;;;;;GASG;AACH,MAAM,OAAO,UAAW,SAAQ,YAAY;IAChC,MAAM,CAAC,QAAQ,GAAsB,IAAI,CAAC;IAC1C,gBAAgB,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC/D,SAAS,CAAS;IAClB,eAAe,GAAG,CAAC,CAAC;IAE5B,YAAY,YAAoB,CAAC,GAAG,EAAE,GAAG,IAAI;QACzC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,SAAkB;QACjC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACvB,UAAU,CAAC,QAAQ,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,UAAU,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,aAAa;QAChB,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,OAAkB;QAC9C,MAAM,EAAE,GAAG,UAAU,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE5D,MAAM,OAAO,GAAiB;YAC1B,EAAE;YACF,QAAQ;YACR,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC;QAEF,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAEvC,6CAA6C;YAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,IAA6B;QACnE,MAAM,EAAE,GAAG,aAAa,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE/D,MAAM,OAAO,GAA0B;YACnC,EAAE;YACF,QAAQ;YACR,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC;QAEF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE;gBACtC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC/C,OAAO,CAAC,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,SAAS,CAAC,CAAC;YACpF,CAAC,CAAC;YAEF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,cAAqB,CAAC,CAAC;YAErD,mDAAmD;YACnD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAU,EAAE,MAAc;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,kBAAkB;QACd,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1C,CAAC"}
|
|
@@ -1,28 +1,12 @@
|
|
|
1
|
-
import { ToolCallContext, ToolMiddleware } from "./types.js";
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
2
|
+
* Creates a middleware that prevents the "Blind Retry" doom loop.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Inspects the conversation history right before the model is called.
|
|
5
|
+
* If the last N AI messages contain the exact same tool calls, it
|
|
6
|
+
* injects a warning message to force the model to try a different approach.
|
|
8
7
|
*
|
|
9
8
|
* Reference: docs/02_edge_cases_and_mitigations.md — "The Blind Retry Doom Loop"
|
|
9
|
+
*
|
|
10
|
+
* @param threshold - Number of identical consecutive calls before blocking (default: 3).
|
|
10
11
|
*/
|
|
11
|
-
export declare
|
|
12
|
-
readonly name = "LoopDetection";
|
|
13
|
-
private history;
|
|
14
|
-
private readonly threshold;
|
|
15
|
-
/**
|
|
16
|
-
* @param threshold - Number of identical consecutive calls before blocking (default: 3).
|
|
17
|
-
*/
|
|
18
|
-
constructor(threshold?: number);
|
|
19
|
-
/**
|
|
20
|
-
* Creates a signature string for a tool call (name + sorted args JSON).
|
|
21
|
-
*/
|
|
22
|
-
private signature;
|
|
23
|
-
before(ctx: ToolCallContext): ToolCallContext | string;
|
|
24
|
-
/**
|
|
25
|
-
* Resets the history. Useful for testing or session boundaries.
|
|
26
|
-
*/
|
|
27
|
-
reset(): void;
|
|
28
|
-
}
|
|
12
|
+
export declare function createLoopDetectionMiddleware(threshold?: number): import("langchain").AgentMiddleware<undefined, undefined, unknown, readonly (import("@langchain/core/tools").ClientTool | import("@langchain/core/tools").ServerTool)[]>;
|
|
@@ -1,49 +1,45 @@
|
|
|
1
|
+
import { createMiddleware } from "langchain";
|
|
2
|
+
import { AIMessage, HumanMessage } from "@langchain/core/messages";
|
|
1
3
|
/**
|
|
2
|
-
*
|
|
4
|
+
* Creates a middleware that prevents the "Blind Retry" doom loop.
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
6
|
+
* Inspects the conversation history right before the model is called.
|
|
7
|
+
* If the last N AI messages contain the exact same tool calls, it
|
|
8
|
+
* injects a warning message to force the model to try a different approach.
|
|
7
9
|
*
|
|
8
10
|
* Reference: docs/02_edge_cases_and_mitigations.md — "The Blind Retry Doom Loop"
|
|
11
|
+
*
|
|
12
|
+
* @param threshold - Number of identical consecutive calls before blocking (default: 3).
|
|
9
13
|
*/
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return ctx;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Resets the history. Useful for testing or session boundaries.
|
|
44
|
-
*/
|
|
45
|
-
reset() {
|
|
46
|
-
this.history = [];
|
|
47
|
-
}
|
|
14
|
+
export function createLoopDetectionMiddleware(threshold = 3) {
|
|
15
|
+
const signature = (calls) => {
|
|
16
|
+
return calls
|
|
17
|
+
.map((c) => `${c.name}:${JSON.stringify(c.args, Object.keys(c.args || {}).sort())}`)
|
|
18
|
+
.join("|");
|
|
19
|
+
};
|
|
20
|
+
return createMiddleware({
|
|
21
|
+
name: "LoopDetectionMiddleware",
|
|
22
|
+
wrapModelCall: async (request, handler) => {
|
|
23
|
+
// Extract recent AI messages that have tool calls
|
|
24
|
+
const aiMessagesWithTools = request.messages.filter((m) => m instanceof AIMessage && m.tool_calls !== undefined && m.tool_calls.length > 0);
|
|
25
|
+
if (aiMessagesWithTools.length >= threshold) {
|
|
26
|
+
const recent = aiMessagesWithTools.slice(-threshold);
|
|
27
|
+
const sigs = recent.map((m) => signature(m.tool_calls));
|
|
28
|
+
const allIdentical = sigs.every((sig) => sig === sigs[0]);
|
|
29
|
+
if (allIdentical) {
|
|
30
|
+
// Identify the tools for the warning
|
|
31
|
+
const toolNames = recent[0].tool_calls.map(c => c.name).join(", ");
|
|
32
|
+
// Inject a strong human message to break the loop
|
|
33
|
+
const updatedMessages = [
|
|
34
|
+
...request.messages,
|
|
35
|
+
new HumanMessage(`⚠ Loop detected: You have called the tools [${toolNames}] with identical arguments ` +
|
|
36
|
+
`${threshold} times consecutively. Stop this approach and try a different strategy immediately.`)
|
|
37
|
+
];
|
|
38
|
+
return handler({ ...request, messages: updatedMessages });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return handler(request);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
48
44
|
}
|
|
49
45
|
//# sourceMappingURL=loopDetection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopDetection.js","sourceRoot":"","sources":["../../src/middleware/loopDetection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loopDetection.js","sourceRoot":"","sources":["../../src/middleware/loopDetection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAe,MAAM,0BAA0B,CAAC;AAGhF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B,CAAC,SAAS,GAAG,CAAC;IACzD,MAAM,SAAS,GAAG,CAAC,KAAwC,EAAU,EAAE;QACrE,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;aACnF,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,yBAAyB;QAC/B,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;YACxC,kDAAkD;YAClD,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CACjD,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CACvG,CAAC;YAEF,IAAI,mBAAmB,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;gBACrD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,UAAW,CAAC,CAAC,CAAC;gBAEzD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE1D,IAAI,YAAY,EAAE,CAAC;oBACjB,qCAAqC;oBACrC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAEpE,kDAAkD;oBAClD,MAAM,eAAe,GAAG;wBACtB,GAAG,OAAO,CAAC,QAAQ;wBACnB,IAAI,YAAY,CACd,+CAA+C,SAAS,6BAA6B;4BACrF,GAAG,SAAS,oFAAoF,CACjG;qBACF,CAAC;oBAEF,OAAO,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { LocalShellBackend } from "deepagents";
|
|
2
|
+
const ALLOWED_BINARIES = new Set(["npm", "npx", "node", "ls", "dir", "echo", "cat", "git"]);
|
|
3
|
+
export class WhitelistedLocalShellBackend extends LocalShellBackend {
|
|
4
|
+
constructor(config) {
|
|
5
|
+
super(config);
|
|
6
|
+
}
|
|
7
|
+
async execute(command) {
|
|
8
|
+
const trimmed = command.trim();
|
|
9
|
+
const binary = trimmed.split(/\s+/)[0];
|
|
10
|
+
if (!ALLOWED_BINARIES.has(binary)) {
|
|
11
|
+
return {
|
|
12
|
+
output: `Security Error: Command '${binary}' is not allowed. Only [${Array.from(ALLOWED_BINARIES).join(", ")}] are permitted.`,
|
|
13
|
+
exitCode: 1,
|
|
14
|
+
truncated: false
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (/[&|;`$]/.test(trimmed)) {
|
|
18
|
+
return {
|
|
19
|
+
output: `Security Error: Command contains forbidden shell operators (&, |, ;, \`, $).`,
|
|
20
|
+
exitCode: 1,
|
|
21
|
+
truncated: false
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return super.execute(command);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=whitelistedBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitelistedBackend.js","sourceRoot":"","sources":["../../src/sandbox/whitelistedBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAE5F,MAAM,OAAO,4BAA6B,SAAQ,iBAAiB;IAC/D,YAAY,MAAY;QACpB,KAAK,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO;gBACH,MAAM,EAAE,4BAA4B,MAAM,2BAA2B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;gBAC9H,QAAQ,EAAE,CAAC;gBACX,SAAS,EAAE,KAAK;aACnB,CAAC;QACN,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACH,MAAM,EAAE,8EAA8E;gBACtF,QAAQ,EAAE,CAAC;gBACX,SAAS,EAAE,KAAK;aACnB,CAAC;QACN,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;CACJ"}
|