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.
Files changed (112) hide show
  1. package/dist/__tests__/config.test.js +1 -0
  2. package/dist/__tests__/config.test.js.map +1 -1
  3. package/dist/__tests__/installHostDeps.test.js +45 -0
  4. package/dist/__tests__/installHostDeps.test.js.map +1 -0
  5. package/dist/__tests__/whitelistedBackend.test.js +18 -0
  6. package/dist/__tests__/whitelistedBackend.test.js.map +1 -0
  7. package/dist/cli/config.d.ts +2 -0
  8. package/dist/cli/config.js +1 -0
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/index.js +84 -100
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/core/agentLoop.d.ts +10 -29
  13. package/dist/core/agentLoop.js +66 -237
  14. package/dist/core/agentLoop.js.map +1 -1
  15. package/dist/core/promptBuilder.js.map +1 -1
  16. package/dist/hitl/bridge.js +1 -27
  17. package/dist/hitl/bridge.js.map +1 -1
  18. package/dist/middleware/loopDetection.d.ts +7 -23
  19. package/dist/middleware/loopDetection.js +38 -42
  20. package/dist/middleware/loopDetection.js.map +1 -1
  21. package/dist/sandbox/whitelistedBackend.d.ts +5 -0
  22. package/dist/sandbox/whitelistedBackend.js +27 -0
  23. package/dist/sandbox/whitelistedBackend.js.map +1 -0
  24. package/dist/tools/askUser.d.ts +12 -3
  25. package/dist/tools/askUser.js +16 -28
  26. package/dist/tools/askUser.js.map +1 -1
  27. package/dist/tools/bashTool.d.ts +11 -0
  28. package/dist/tools/bashTool.js +51 -0
  29. package/dist/tools/bashTool.js.map +1 -0
  30. package/dist/tools/index.d.ts +15 -28
  31. package/dist/tools/index.js +9 -189
  32. package/dist/tools/index.js.map +1 -1
  33. package/dist/tools/installHostDeps.d.ts +8 -2
  34. package/dist/tools/installHostDeps.js +38 -31
  35. package/dist/tools/installHostDeps.js.map +1 -1
  36. package/dist/ui/App.js +112 -56
  37. package/dist/ui/App.js.map +1 -1
  38. package/dist/ui/components/MessageBubble.js +1 -1
  39. package/dist/ui/components/MessageBubble.js.map +1 -1
  40. package/package.json +7 -2
  41. package/dist/__tests__/m55.test.js +0 -160
  42. package/dist/__tests__/m55.test.js.map +0 -1
  43. package/dist/__tests__/middleware.test.js +0 -169
  44. package/dist/__tests__/middleware.test.js.map +0 -1
  45. package/dist/__tests__/optimizations.test.d.ts +0 -1
  46. package/dist/__tests__/optimizations.test.js +0 -136
  47. package/dist/__tests__/optimizations.test.js.map +0 -1
  48. package/dist/__tests__/security.test.d.ts +0 -1
  49. package/dist/__tests__/security.test.js +0 -86
  50. package/dist/__tests__/security.test.js.map +0 -1
  51. package/dist/__tests__/streaming.test.d.ts +0 -1
  52. package/dist/__tests__/streaming.test.js +0 -71
  53. package/dist/__tests__/streaming.test.js.map +0 -1
  54. package/dist/__tests__/toolRouter.test.d.ts +0 -1
  55. package/dist/__tests__/toolRouter.test.js +0 -37
  56. package/dist/__tests__/toolRouter.test.js.map +0 -1
  57. package/dist/__tests__/tools.test.d.ts +0 -1
  58. package/dist/__tests__/tools.test.js +0 -112
  59. package/dist/__tests__/tools.test.js.map +0 -1
  60. package/dist/core/subAgent.d.ts +0 -56
  61. package/dist/core/subAgent.js +0 -240
  62. package/dist/core/subAgent.js.map +0 -1
  63. package/dist/debug_google.d.ts +0 -1
  64. package/dist/debug_google.js +0 -23
  65. package/dist/debug_google.js.map +0 -1
  66. package/dist/middleware/commandSanitizer.d.ts +0 -18
  67. package/dist/middleware/commandSanitizer.js +0 -50
  68. package/dist/middleware/commandSanitizer.js.map +0 -1
  69. package/dist/middleware/permission.d.ts +0 -17
  70. package/dist/middleware/permission.js +0 -60
  71. package/dist/middleware/permission.js.map +0 -1
  72. package/dist/middleware/pipeline.d.ts +0 -31
  73. package/dist/middleware/pipeline.js +0 -62
  74. package/dist/middleware/pipeline.js.map +0 -1
  75. package/dist/middleware/preCompletion.d.ts +0 -29
  76. package/dist/middleware/preCompletion.js +0 -82
  77. package/dist/middleware/preCompletion.js.map +0 -1
  78. package/dist/middleware/types.d.ts +0 -40
  79. package/dist/middleware/types.js +0 -8
  80. package/dist/middleware/types.js.map +0 -1
  81. package/dist/skills/loader.d.ts +0 -55
  82. package/dist/skills/loader.js +0 -132
  83. package/dist/skills/loader.js.map +0 -1
  84. package/dist/skills/tools.d.ts +0 -5
  85. package/dist/skills/tools.js +0 -78
  86. package/dist/skills/tools.js.map +0 -1
  87. package/dist/test_cache.d.ts +0 -1
  88. package/dist/test_cache.js +0 -55
  89. package/dist/test_cache.js.map +0 -1
  90. package/dist/test_google.d.ts +0 -1
  91. package/dist/test_google.js +0 -36
  92. package/dist/test_google.js.map +0 -1
  93. package/dist/tools/browser.d.ts +0 -19
  94. package/dist/tools/browser.js +0 -114
  95. package/dist/tools/browser.js.map +0 -1
  96. package/dist/tools/registry.d.ts +0 -31
  97. package/dist/tools/registry.js +0 -168
  98. package/dist/tools/registry.js.map +0 -1
  99. package/dist/tools/router.d.ts +0 -34
  100. package/dist/tools/router.js +0 -76
  101. package/dist/tools/router.js.map +0 -1
  102. package/dist/tools/security.d.ts +0 -28
  103. package/dist/tools/security.js +0 -183
  104. package/dist/tools/security.js.map +0 -1
  105. package/dist/tools/spawnAgent.d.ts +0 -19
  106. package/dist/tools/spawnAgent.js +0 -132
  107. package/dist/tools/spawnAgent.js.map +0 -1
  108. package/dist/tools/webSearch.d.ts +0 -6
  109. package/dist/tools/webSearch.js +0 -120
  110. package/dist/tools/webSearch.js.map +0 -1
  111. /package/dist/__tests__/{m55.test.d.ts → installHostDeps.test.d.ts} +0 -0
  112. /package/dist/__tests__/{middleware.test.d.ts → whitelistedBackend.test.d.ts} +0 -0
@@ -1,267 +1,96 @@
1
- import { AIMessage, ToolMessage, HumanMessage } from "@langchain/core/messages";
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 { retryWithBackoff } from "./retry.js";
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 { EventEmitter } from "node:events";
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
- llm;
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
- * The main execution engine (non-streaming).
45
- * Takes the context state, builds the cache-optimized prompt, and queries the LLM.
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
- catch (error) {
73
- // Self-recovery: inject the error hint and let the agent adapt
74
- if (error instanceof JooneError && error.retryable) {
75
- this.tracer.recordError({ message: `LLM retries exhausted: ${error.message}` });
76
- state.conversationHistory.push(new HumanMessage(`<system-alert>\nSystem recovery hint:\n${error.toRecoveryHint()}\n</system-alert>`));
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
- for await (const chunk of stream) {
107
- if (chunk.content && typeof chunk.content === "string") {
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
- catch (error) {
170
- // Self-recovery for streaming
171
- if (error instanceof JooneError && error.retryable) {
172
- this.tracer.recordError({ message: `LLM stream retries exhausted: ${error.message}` });
173
- state.conversationHistory.push(new HumanMessage(`<system-alert>\nSystem recovery hint:\n${error.toRecoveryHint()}\n</system-alert>`));
174
- await this.autoSave.forceSave({ config: { provider: this.provider, model: this.model }, state });
175
- return new AIMessage(error.toRecoveryHint());
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
- throw error;
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 tool calls from an AI response, routing through the middleware pipeline.
182
- * Each call passes through all registered before-hooks, then the tool, then after-hooks.
66
+ * Executes the agent loop autonomously, yielding events instead of
67
+ * requiring App.tsx to manually loop.
183
68
  */
184
- async executeToolCalls(aiMessage, state) {
185
- const results = [];
186
- if (!aiMessage.tool_calls || aiMessage.tool_calls.length === 0) {
187
- return results;
188
- }
189
- for (const call of aiMessage.tool_calls) {
190
- // Soft-Fail Edge Case: If the LLM omits the tool_call_id, do not execute the tool.
191
- // Return a HumanMessage prompting correction instead of a malformed ToolMessage.
192
- if (!call.id) {
193
- this.tracer.recordError({ message: `Malformed tool call: Missing ID for ${call.name}`, tool: call.name });
194
- results.push(new HumanMessage(`You attempted to call the tool '${call.name}', but you did not provide a tool_call_id. ` +
195
- `This is a malformed request. Please try again and ensure you provide a valid ID.`));
196
- continue;
197
- }
198
- const safeCallId = call.id;
199
- // Handle malformed args from streaming parse errors
200
- if (call.args && call.args._parseError) {
201
- this.tracer.recordError({ message: `Failed to parse tool arguments`, tool: call.name });
202
- results.push(new ToolMessage({
203
- content: `Error: Failed to parse tool arguments. The JSON provided was malformed:\n${call.args.rawArgs}\nPlease correct the JSON format and try again.`,
204
- tool_call_id: safeCallId
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,GAEb,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"}
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"}
@@ -41,23 +41,10 @@ export class HITLBridge extends EventEmitter {
41
41
  options,
42
42
  createdAt: Date.now(),
43
43
  };
44
- return new Promise((resolve, reject) => {
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/hitl/bridge.ts"],"names":[],"mappings":"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"}
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
- * Prevents the "Blind Retry" doom loop.
2
+ * Creates a middleware that prevents the "Blind Retry" doom loop.
4
3
  *
5
- * Tracks a rolling window of recent tool call signatures. If the same
6
- * tool + args combination appears N times consecutively, the call is
7
- * rejected with an instruction to try a different approach.
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 class LoopDetectionMiddleware implements ToolMiddleware {
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
- * Prevents the "Blind Retry" doom loop.
4
+ * Creates a middleware that prevents the "Blind Retry" doom loop.
3
5
  *
4
- * Tracks a rolling window of recent tool call signatures. If the same
5
- * tool + args combination appears N times consecutively, the call is
6
- * rejected with an instruction to try a different approach.
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 class LoopDetectionMiddleware {
11
- name = "LoopDetection";
12
- history = [];
13
- threshold;
14
- /**
15
- * @param threshold - Number of identical consecutive calls before blocking (default: 3).
16
- */
17
- constructor(threshold = 3) {
18
- this.threshold = threshold;
19
- }
20
- /**
21
- * Creates a signature string for a tool call (name + sorted args JSON).
22
- */
23
- signature(ctx) {
24
- return `${ctx.toolName}:${JSON.stringify(ctx.args, Object.keys(ctx.args).sort())}`;
25
- }
26
- before(ctx) {
27
- const sig = this.signature(ctx);
28
- this.history.push(sig);
29
- // Keep only the last N entries to avoid unbounded growth
30
- if (this.history.length > this.threshold * 2) {
31
- this.history = this.history.slice(-this.threshold * 2);
32
- }
33
- // Check if the last `threshold` entries are all identical
34
- const tail = this.history.slice(-this.threshold);
35
- if (tail.length >= this.threshold &&
36
- tail.every((s) => s === sig)) {
37
- return (`⚠ Loop detected: You have called "${ctx.toolName}" with identical arguments ` +
38
- `${this.threshold} times consecutively. Stop this approach and try a different strategy.`);
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":"AAEA;;;;;;;;GAQG;AACH,MAAM,OAAO,uBAAuB;IACzB,IAAI,GAAG,eAAe,CAAC;IAExB,OAAO,GAAa,EAAE,CAAC;IACd,SAAS,CAAS;IAEnC;;OAEG;IACH,YAAY,SAAS,GAAG,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,GAAoB;QACpC,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,GAAoB;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvB,yDAAyD;QACzD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,0DAA0D;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IACE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS;YAC7B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAC5B,CAAC;YACD,OAAO,CACL,qCAAqC,GAAG,CAAC,QAAQ,6BAA6B;gBAC9E,GAAG,IAAI,CAAC,SAAS,wEAAwE,CAC1F,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
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,5 @@
1
+ import { LocalShellBackend } from "deepagents";
2
+ export declare class WhitelistedLocalShellBackend extends LocalShellBackend {
3
+ constructor(config?: any);
4
+ execute(command: string): Promise<import("deepagents").ExecuteResponse>;
5
+ }
@@ -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"}