Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## 2026-04-25 - LLM API Connection Pooling
**Learning:** Making repeated API calls to external LLM providers (e.g. OpenRouter, OpenAI) without HTTP Keep-Alive results in 100-200ms of unnecessary TCP/TLS handshake overhead per request. In an agentic loop, this accumulates significantly.
**Action:** When initializing HTTP clients (like Axios) for repeated internal/external services, configure them with an `https.Agent` setting `keepAlive: true` to pool connections.
## 2026-06-04 - In-memory caching for deep search tool
**Learning:** In agentic loops, repeatedly querying the same external context (like search results) causes an architectural bottleneck due to redundant network requests.
**Action:** Implemented an in-memory cache (using `Map`) in `SearchTool.deep` to instantly return identical query results, preventing redundant API calls while still wrapping logic within `this.core.execute()` to preserve standard formatting, logging, and retry behaviors.
1 change: 1 addition & 0 deletions dist/src/agents/connector.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export interface ToolDefinition {
export declare class AgentConnector {
private core;
private config;
private client;
constructor(core: CoreEngine, config?: {
provider?: string;
apiKey?: string;
Expand Down
41 changes: 40 additions & 1 deletion dist/src/agents/connector.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,53 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AgentConnector = void 0;
const axios_1 = __importDefault(require("axios"));
const https = __importStar(require("https"));
class AgentConnector {
constructor(core, config = {}) {
this.core = core;
this.config = config;
// Optimize repeated API calls by enabling keep-alive for HTTP/HTTPS connections.
// This avoids expensive TCP/TLS handshakes (~100-200ms per request) on consecutive LLM calls.
this.client = axios_1.default.create({
httpsAgent: new https.Agent({ keepAlive: true })
});
}
/**
* Standard protocol to expose oneshotsx tools to any LLM
Expand Down Expand Up @@ -39,7 +78,7 @@ class AgentConnector {
return "Agent running in simulation mode. No API key provided.";
}
try {
const response = await axios_1.default.post('https://openrouter.ai/api/v1/chat/completions', {
const response = await this.client.post('https://openrouter.ai/api/v1/chat/completions', {
model: 'meta-llama/llama-3.1-70b-instruct',
messages: [{ role: 'user', content: message }]
}, {
Expand Down
8 changes: 5 additions & 3 deletions dist/src/tools/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ export declare class ShellTool {
export declare class FileTool {
private core;
constructor(core: CoreEngine);
read(path: string): Promise<ExecutionResult<string>>;
write(path: string, content: string): Promise<ExecutionResult<void>>;
patch(path: string, search: string, replace: string): Promise<ExecutionResult<void>>;
private resolveAndValidatePath;
read(unsafePath: string): Promise<ExecutionResult<string>>;
write(unsafePath: string, content: string): Promise<ExecutionResult<void>>;
patch(unsafePath: string, search: string, replace: string): Promise<ExecutionResult<void>>;
}
export declare class SearchTool {
private core;
private cache;
constructor(core: CoreEngine);
deep(query: string): Promise<ExecutionResult<any>>;
}
50 changes: 37 additions & 13 deletions dist/src/tools/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ exports.SearchTool = exports.FileTool = exports.ShellTool = void 0;
const child_process_1 = require("child_process");
const util_1 = require("util");
const fs = __importStar(require("fs/promises"));
const path = __importStar(require("path"));
const execAsync = (0, util_1.promisify)(child_process_1.exec);
class ShellTool {
constructor(core) {
Expand All @@ -55,44 +56,67 @@ class FileTool {
constructor(core) {
this.core = core;
}
async read(path) {
this.core.log(`Reading file: ${path}`);
return this.core.execute(() => fs.readFile(path, 'utf-8'));
resolveAndValidatePath(unsafePath) {
const resolvedPath = path.resolve(process.cwd(), unsafePath);
if (!resolvedPath.startsWith(process.cwd() + path.sep) && resolvedPath !== process.cwd()) {
throw new Error('Access denied: Invalid path');
}
return resolvedPath;
}
async write(path, content) {
this.core.log(`Writing file: ${path}`);
return this.core.execute(() => fs.writeFile(path, content));
async read(unsafePath) {
this.core.log(`Reading file: ${unsafePath}`);
return this.core.execute(() => {
const safePath = this.resolveAndValidatePath(unsafePath);
return fs.readFile(safePath, 'utf-8');
});
}
async write(unsafePath, content) {
this.core.log(`Writing file: ${unsafePath}`);
return this.core.execute(() => {
const safePath = this.resolveAndValidatePath(unsafePath);
return fs.writeFile(safePath, content);
});
}
async patch(path, search, replace) {
this.core.log(`Patching file: ${path}`);
async patch(unsafePath, search, replace) {
this.core.log(`Patching file: ${unsafePath}`);
return this.core.execute(async () => {
const content = await fs.readFile(path, 'utf-8');
const safePath = this.resolveAndValidatePath(unsafePath);
const content = await fs.readFile(safePath, 'utf-8');
const newContent = content.replace(search, replace);
if (content === newContent) {
throw new Error(`Search string not found in ${path}`);
throw new Error(`Search string not found in file`);
}
await fs.writeFile(path, newContent);
await fs.writeFile(safePath, newContent);
});
}
}
exports.FileTool = FileTool;
class SearchTool {
constructor(core) {
this.core = core;
// Cache to prevent redundant external search queries in agentic loops,
// reducing bottlenecks and improving performance.
this.cache = new Map();
}
async deep(query) {
this.core.log(`Initiating deep search for: ${query}`);
// This is where real API calls to Google/X/Reddit would go
return this.core.execute(async () => {
if (this.cache.has(query)) {
this.core.log(`Cache hit for query: ${query}`);
return this.cache.get(query);
}
// This is where real API calls to Google/X/Reddit would go
// Simulated results for the SDK base
return {
const result = {
query,
timestamp: new Date().toISOString(),
findings: [
"Best practices for " + query,
"Trending solutions in 2026"
]
};
this.cache.set(query, result);
return result;
});
}
}
Expand Down
17 changes: 15 additions & 2 deletions src/tools/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,21 +60,34 @@ export class FileTool {
}

export class SearchTool {
// Cache to prevent redundant external search queries in agentic loops,
// reducing bottlenecks and improving performance.
private cache = new Map<string, any>();

constructor(private core: CoreEngine) {}

async deep(query: string): Promise<ExecutionResult<any>> {
this.core.log(`Initiating deep search for: ${query}`);
// This is where real API calls to Google/X/Reddit would go

return this.core.execute(async () => {
if (this.cache.has(query)) {
this.core.log(`Cache hit for query: ${query}`);
return this.cache.get(query);
}

// This is where real API calls to Google/X/Reddit would go
// Simulated results for the SDK base
return {
const result = {
query,
timestamp: new Date().toISOString(),
findings: [
"Best practices for " + query,
"Trending solutions in 2026"
]
};

this.cache.set(query, result);
return result;
});
}
}