joonecli 0.1.0 → 0.2.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/README.md +12 -12
- package/dist/__tests__/optimizations.test.js.map +1 -1
- package/dist/__tests__/promptBuilder.test.js +14 -20
- package/dist/__tests__/promptBuilder.test.js.map +1 -1
- package/dist/agents/agentRegistry.d.ts +37 -0
- package/dist/agents/agentRegistry.js +58 -0
- package/dist/agents/agentRegistry.js.map +1 -0
- package/dist/agents/agentSpec.d.ts +54 -0
- package/dist/agents/agentSpec.js +9 -0
- package/dist/agents/agentSpec.js.map +1 -0
- package/dist/agents/builtinAgents.d.ts +20 -0
- package/{src/agents/builtinAgents.ts → dist/agents/builtinAgents.js} +84 -101
- package/dist/agents/builtinAgents.js.map +1 -0
- package/dist/cli/config.d.ts +4 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +29 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/postinstall.d.ts +2 -0
- package/dist/cli/postinstall.js +25 -0
- package/dist/cli/postinstall.js.map +1 -0
- package/dist/commands/builtinCommands.d.ts +21 -0
- package/dist/commands/builtinCommands.js +241 -0
- package/dist/commands/builtinCommands.js.map +1 -0
- package/dist/commands/commandRegistry.d.ts +92 -0
- package/dist/commands/commandRegistry.js +128 -0
- package/dist/commands/commandRegistry.js.map +1 -0
- package/dist/core/agentLoop.d.ts +7 -2
- package/dist/core/agentLoop.js +35 -13
- package/dist/core/agentLoop.js.map +1 -1
- package/dist/core/autoSave.d.ts +41 -0
- package/dist/core/autoSave.js +69 -0
- package/dist/core/autoSave.js.map +1 -0
- package/dist/core/compactor.d.ts +66 -0
- package/dist/core/compactor.js +170 -0
- package/dist/core/compactor.js.map +1 -0
- package/dist/core/contextGuard.d.ts +38 -0
- package/dist/core/contextGuard.js +122 -0
- package/dist/core/contextGuard.js.map +1 -0
- package/dist/core/events.d.ts +45 -0
- package/dist/core/events.js +8 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/promptBuilder.d.ts +16 -1
- package/dist/core/promptBuilder.js +27 -14
- package/dist/core/promptBuilder.js.map +1 -1
- package/dist/core/sessionResumer.js +3 -3
- package/dist/core/sessionResumer.js.map +1 -1
- package/dist/core/sessionStore.js +3 -2
- package/dist/core/sessionStore.js.map +1 -1
- package/dist/core/subAgent.d.ts +56 -0
- package/dist/core/subAgent.js +240 -0
- package/dist/core/subAgent.js.map +1 -0
- package/dist/core/tokenCounter.d.ts +8 -1
- package/dist/core/tokenCounter.js +28 -0
- package/dist/core/tokenCounter.js.map +1 -1
- package/dist/debug_google.d.ts +1 -0
- package/dist/debug_google.js +23 -0
- package/dist/debug_google.js.map +1 -0
- package/dist/middleware/permission.js +1 -0
- package/dist/middleware/permission.js.map +1 -1
- package/dist/test_google.d.ts +1 -0
- package/dist/test_google.js +32 -89
- package/dist/test_google.js.map +1 -0
- package/dist/tools/browser.js +4 -1
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.js +11 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/installHostDeps.d.ts +2 -0
- package/dist/tools/installHostDeps.js +37 -0
- package/dist/tools/installHostDeps.js.map +1 -0
- package/dist/tools/router.js +3 -0
- package/dist/tools/router.js.map +1 -1
- package/dist/tools/spawnAgent.d.ts +19 -0
- package/dist/tools/spawnAgent.js +132 -0
- package/dist/tools/spawnAgent.js.map +1 -0
- package/dist/tracing/sessionTracer.d.ts +1 -0
- package/dist/tracing/sessionTracer.js +4 -1
- package/dist/tracing/sessionTracer.js.map +1 -1
- package/dist/ui/App.js +94 -6
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ActionLog.d.ts +7 -0
- package/dist/ui/components/ActionLog.js +63 -0
- package/dist/ui/components/ActionLog.js.map +1 -0
- package/dist/ui/components/FileBrowser.d.ts +2 -0
- package/dist/ui/components/FileBrowser.js +41 -0
- package/dist/ui/components/FileBrowser.js.map +1 -0
- package/package.json +5 -6
- package/AGENTS.md +0 -56
- package/Handover.md +0 -115
- package/PROGRESS.md +0 -160
- package/docs/01_insights_and_patterns.md +0 -27
- package/docs/02_edge_cases_and_mitigations.md +0 -143
- package/docs/03_initial_implementation_plan.md +0 -66
- package/docs/04_tech_stack_proposal.md +0 -20
- package/docs/05_prd.md +0 -87
- package/docs/06_user_stories.md +0 -72
- package/docs/07_system_architecture.md +0 -138
- package/docs/08_roadmap.md +0 -200
- package/e2b/Dockerfile +0 -26
- package/src/__tests__/bootstrap.test.ts +0 -111
- package/src/__tests__/config.test.ts +0 -97
- package/src/__tests__/m55.test.ts +0 -238
- package/src/__tests__/middleware.test.ts +0 -219
- package/src/__tests__/modelFactory.test.ts +0 -63
- package/src/__tests__/optimizations.test.ts +0 -201
- package/src/__tests__/promptBuilder.test.ts +0 -141
- package/src/__tests__/sandbox.test.ts +0 -102
- package/src/__tests__/security.test.ts +0 -122
- package/src/__tests__/streaming.test.ts +0 -82
- package/src/__tests__/toolRouter.test.ts +0 -52
- package/src/__tests__/tools.test.ts +0 -146
- package/src/__tests__/tracing.test.ts +0 -196
- package/src/agents/agentRegistry.ts +0 -69
- package/src/agents/agentSpec.ts +0 -67
- package/src/cli/config.ts +0 -124
- package/src/cli/index.ts +0 -730
- package/src/cli/modelFactory.ts +0 -174
- package/src/cli/providers.ts +0 -107
- package/src/commands/builtinCommands.ts +0 -293
- package/src/commands/commandRegistry.ts +0 -194
- package/src/core/agentLoop.d.ts.map +0 -1
- package/src/core/agentLoop.ts +0 -312
- package/src/core/autoSave.ts +0 -95
- package/src/core/compactor.ts +0 -252
- package/src/core/contextGuard.ts +0 -129
- package/src/core/errors.ts +0 -202
- package/src/core/promptBuilder.d.ts.map +0 -1
- package/src/core/promptBuilder.ts +0 -139
- package/src/core/reasoningRouter.ts +0 -121
- package/src/core/retry.ts +0 -75
- package/src/core/sessionResumer.ts +0 -90
- package/src/core/sessionStore.ts +0 -215
- package/src/core/subAgent.ts +0 -339
- package/src/core/tokenCounter.ts +0 -64
- package/src/evals/dataset.ts +0 -67
- package/src/evals/evaluator.ts +0 -81
- package/src/hitl/bridge.ts +0 -160
- package/src/middleware/commandSanitizer.ts +0 -60
- package/src/middleware/loopDetection.ts +0 -63
- package/src/middleware/permission.ts +0 -72
- package/src/middleware/pipeline.ts +0 -75
- package/src/middleware/preCompletion.ts +0 -94
- package/src/middleware/types.ts +0 -45
- package/src/sandbox/bootstrap.ts +0 -121
- package/src/sandbox/manager.ts +0 -239
- package/src/sandbox/sync.ts +0 -157
- package/src/skills/loader.ts +0 -143
- package/src/skills/tools.ts +0 -99
- package/src/skills/types.ts +0 -13
- package/src/test_cache.ts +0 -72
- package/src/test_google.js +0 -40
- package/src/test_google.ts +0 -40
- package/src/tools/askUser.ts +0 -47
- package/src/tools/browser.ts +0 -137
- package/src/tools/index.d.ts.map +0 -1
- package/src/tools/index.ts +0 -237
- package/src/tools/registry.ts +0 -198
- package/src/tools/router.ts +0 -78
- package/src/tools/security.ts +0 -220
- package/src/tools/spawnAgent.ts +0 -158
- package/src/tools/webSearch.ts +0 -142
- package/src/tracing/analyzer.ts +0 -265
- package/src/tracing/langsmith.ts +0 -63
- package/src/tracing/sessionTracer.ts +0 -202
- package/src/tracing/types.ts +0 -49
- package/src/types/valyu.d.ts +0 -37
- package/src/ui/App.tsx +0 -404
- package/src/ui/components/HITLPrompt.tsx +0 -119
- package/src/ui/components/Header.tsx +0 -51
- package/src/ui/components/MessageBubble.tsx +0 -46
- package/src/ui/components/StatusBar.tsx +0 -138
- package/src/ui/components/StreamingText.tsx +0 -48
- package/src/ui/components/ToolCallPanel.tsx +0 -80
- package/tests/commands/commands.test.ts +0 -356
- package/tests/core/compactor.test.ts +0 -217
- package/tests/core/retryAndErrors.test.ts +0 -164
- package/tests/core/sessionResumer.test.ts +0 -95
- package/tests/core/sessionStore.test.ts +0 -84
- package/tests/core/stability.test.ts +0 -165
- package/tests/core/subAgent.test.ts +0 -238
- package/tests/hitl/hitlBridge.test.ts +0 -115
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -10
- package/vitest.out +0 -48
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sub-Agent Manager
|
|
3
|
+
*
|
|
4
|
+
* Spawns and orchestrates isolated sub-agents for scoped tasks.
|
|
5
|
+
* Each sub-agent gets its own ExecutionHarness with a separate conversation
|
|
6
|
+
* history. Only the final SubAgentResult is returned to the main agent,
|
|
7
|
+
* discarding the sub-agent's internal conversation to save context.
|
|
8
|
+
*
|
|
9
|
+
* Supports both synchronous (blocking) and asynchronous (non-blocking) modes.
|
|
10
|
+
*
|
|
11
|
+
* Safety:
|
|
12
|
+
* - Depth limit of 1: sub-agents cannot spawn other sub-agents
|
|
13
|
+
* - maxTurns cap per agent prevents doom-loops
|
|
14
|
+
* - Concurrent async agent cap of 3 prevents resource exhaustion
|
|
15
|
+
* - Per-agent token budget tracking
|
|
16
|
+
*/
|
|
17
|
+
import { SubAgentResult } from "../agents/agentSpec.js";
|
|
18
|
+
import { AgentRegistry } from "../agents/agentRegistry.js";
|
|
19
|
+
import { DynamicToolInterface } from "../tools/index.js";
|
|
20
|
+
import { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
21
|
+
import { Runnable } from "@langchain/core/runnables";
|
|
22
|
+
export declare class SubAgentManager {
|
|
23
|
+
private registry;
|
|
24
|
+
private allTools;
|
|
25
|
+
private llm;
|
|
26
|
+
private asyncTasks;
|
|
27
|
+
private taskCounter;
|
|
28
|
+
constructor(registry: AgentRegistry, tools: DynamicToolInterface[], llm: Runnable | BaseChatModel);
|
|
29
|
+
/**
|
|
30
|
+
* Synchronous spawn — blocks until the sub-agent finishes.
|
|
31
|
+
*/
|
|
32
|
+
spawn(agentName: string, task: string, maxTurnsOverride?: number): Promise<SubAgentResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Asynchronous spawn — returns immediately with a taskId.
|
|
35
|
+
* The main agent can poll with getResult(taskId).
|
|
36
|
+
*/
|
|
37
|
+
spawnAsync(agentName: string, task: string, maxTurnsOverride?: number): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Check the status or get the result of an async task.
|
|
40
|
+
* Returns the result if completed, or a status message if still running.
|
|
41
|
+
*/
|
|
42
|
+
getResult(taskId: string): Promise<SubAgentResult | string>;
|
|
43
|
+
/**
|
|
44
|
+
* Core execution loop for a sub-agent.
|
|
45
|
+
* Creates an isolated conversation and runs a multi-turn loop.
|
|
46
|
+
*/
|
|
47
|
+
private runAgent;
|
|
48
|
+
/**
|
|
49
|
+
* Creates an error SubAgentResult.
|
|
50
|
+
*/
|
|
51
|
+
private makeErrorResult;
|
|
52
|
+
/**
|
|
53
|
+
* Clean up expired async tasks.
|
|
54
|
+
*/
|
|
55
|
+
private cleanupExpired;
|
|
56
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sub-Agent Manager
|
|
3
|
+
*
|
|
4
|
+
* Spawns and orchestrates isolated sub-agents for scoped tasks.
|
|
5
|
+
* Each sub-agent gets its own ExecutionHarness with a separate conversation
|
|
6
|
+
* history. Only the final SubAgentResult is returned to the main agent,
|
|
7
|
+
* discarding the sub-agent's internal conversation to save context.
|
|
8
|
+
*
|
|
9
|
+
* Supports both synchronous (blocking) and asynchronous (non-blocking) modes.
|
|
10
|
+
*
|
|
11
|
+
* Safety:
|
|
12
|
+
* - Depth limit of 1: sub-agents cannot spawn other sub-agents
|
|
13
|
+
* - maxTurns cap per agent prevents doom-loops
|
|
14
|
+
* - Concurrent async agent cap of 3 prevents resource exhaustion
|
|
15
|
+
* - Per-agent token budget tracking
|
|
16
|
+
*/
|
|
17
|
+
import { countMessageTokens } from "../core/tokenCounter.js";
|
|
18
|
+
import { HumanMessage, ToolMessage } from "@langchain/core/messages";
|
|
19
|
+
// ─── Constants ──────────────────────────────────────────────────────────────────
|
|
20
|
+
const DEFAULT_MAX_TURNS = 10;
|
|
21
|
+
const MAX_CONCURRENT_ASYNC = 3;
|
|
22
|
+
const ASYNC_EXPIRY_MS = 5 * 60 * 1000; // 5 minutes
|
|
23
|
+
// ─── SubAgentManager ────────────────────────────────────────────────────────────
|
|
24
|
+
export class SubAgentManager {
|
|
25
|
+
registry;
|
|
26
|
+
allTools;
|
|
27
|
+
llm;
|
|
28
|
+
asyncTasks = new Map();
|
|
29
|
+
taskCounter = 0;
|
|
30
|
+
constructor(registry, tools, llm) {
|
|
31
|
+
this.registry = registry;
|
|
32
|
+
// Filter out spawn_agent and check_agent to prevent recursive nesting (depth-1 limit)
|
|
33
|
+
this.allTools = tools.filter((t) => t.name !== "spawn_agent" && t.name !== "check_agent");
|
|
34
|
+
this.llm = llm;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Synchronous spawn — blocks until the sub-agent finishes.
|
|
38
|
+
*/
|
|
39
|
+
async spawn(agentName, task, maxTurnsOverride) {
|
|
40
|
+
const spec = this.registry.get(agentName);
|
|
41
|
+
if (!spec) {
|
|
42
|
+
return this.makeErrorResult(agentName, task, `Unknown agent "${agentName}". Available: ${this.registry.getNames().join(", ")}`);
|
|
43
|
+
}
|
|
44
|
+
return this.runAgent(spec, task, maxTurnsOverride);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Asynchronous spawn — returns immediately with a taskId.
|
|
48
|
+
* The main agent can poll with getResult(taskId).
|
|
49
|
+
*/
|
|
50
|
+
async spawnAsync(agentName, task, maxTurnsOverride) {
|
|
51
|
+
// Cap concurrent async agents
|
|
52
|
+
this.cleanupExpired();
|
|
53
|
+
const activeCount = Array.from(this.asyncTasks.values())
|
|
54
|
+
.filter((t) => !t.completed).length;
|
|
55
|
+
if (activeCount >= MAX_CONCURRENT_ASYNC) {
|
|
56
|
+
throw new Error(`Maximum concurrent async agents reached (${MAX_CONCURRENT_ASYNC}). ` +
|
|
57
|
+
`Wait for existing tasks to complete or check them with check_agent.`);
|
|
58
|
+
}
|
|
59
|
+
const spec = this.registry.get(agentName);
|
|
60
|
+
if (!spec) {
|
|
61
|
+
throw new Error(`Unknown agent "${agentName}". Available: ${this.registry.getNames().join(", ")}`);
|
|
62
|
+
}
|
|
63
|
+
const taskId = `task_${++this.taskCounter}_${Date.now()}`;
|
|
64
|
+
const promise = this.runAgent(spec, task, maxTurnsOverride).then((result) => {
|
|
65
|
+
const asyncTask = this.asyncTasks.get(taskId);
|
|
66
|
+
if (asyncTask) {
|
|
67
|
+
asyncTask.result = result;
|
|
68
|
+
asyncTask.completed = true;
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
});
|
|
72
|
+
this.asyncTasks.set(taskId, {
|
|
73
|
+
taskId,
|
|
74
|
+
agentName,
|
|
75
|
+
taskDescription: task,
|
|
76
|
+
promise,
|
|
77
|
+
startedAt: Date.now(),
|
|
78
|
+
completed: false,
|
|
79
|
+
});
|
|
80
|
+
return taskId;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check the status or get the result of an async task.
|
|
84
|
+
* Returns the result if completed, or a status message if still running.
|
|
85
|
+
*/
|
|
86
|
+
async getResult(taskId) {
|
|
87
|
+
const asyncTask = this.asyncTasks.get(taskId);
|
|
88
|
+
if (!asyncTask) {
|
|
89
|
+
return `Unknown task ID: ${taskId}. No such async task exists.`;
|
|
90
|
+
}
|
|
91
|
+
if (asyncTask.completed && asyncTask.result) {
|
|
92
|
+
// Clean up the task
|
|
93
|
+
this.asyncTasks.delete(taskId);
|
|
94
|
+
return asyncTask.result;
|
|
95
|
+
}
|
|
96
|
+
const elapsed = Math.round((Date.now() - asyncTask.startedAt) / 1000);
|
|
97
|
+
return `Task "${asyncTask.taskDescription}" (agent: ${asyncTask.agentName}) ` +
|
|
98
|
+
`is still running (${elapsed}s elapsed).`;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Core execution loop for a sub-agent.
|
|
102
|
+
* Creates an isolated conversation and runs a multi-turn loop.
|
|
103
|
+
*/
|
|
104
|
+
async runAgent(spec, task, maxTurnsOverride) {
|
|
105
|
+
const startTime = Date.now();
|
|
106
|
+
const maxTurns = maxTurnsOverride ?? spec.maxTurns ?? DEFAULT_MAX_TURNS;
|
|
107
|
+
// Resolve available tools for this agent
|
|
108
|
+
const agentTools = spec.tools
|
|
109
|
+
? this.allTools.filter((t) => spec.tools.includes(t.name))
|
|
110
|
+
: this.allTools;
|
|
111
|
+
// Create isolated conversation history
|
|
112
|
+
const systemPrompt = new HumanMessage(`<system-directive>\n${spec.systemPrompt}\n\n--- Current Task ---\n${task}\n</system-directive>`);
|
|
113
|
+
const history = [
|
|
114
|
+
new HumanMessage(task),
|
|
115
|
+
];
|
|
116
|
+
let promptTokens = 0;
|
|
117
|
+
let completionTokens = 0;
|
|
118
|
+
let toolCallCount = 0;
|
|
119
|
+
let turnsUsed = 0;
|
|
120
|
+
let lastResponse = "";
|
|
121
|
+
const filesModified = new Set();
|
|
122
|
+
// Build LangChain tool declarations for binding
|
|
123
|
+
const toolDeclarations = agentTools.map((t) => ({
|
|
124
|
+
name: t.name,
|
|
125
|
+
description: t.description,
|
|
126
|
+
schema: t.schema,
|
|
127
|
+
}));
|
|
128
|
+
try {
|
|
129
|
+
// Bind tools to the LLM for this sub-agent session
|
|
130
|
+
let boundLlm;
|
|
131
|
+
if ("bindTools" in this.llm && typeof this.llm.bindTools === "function") {
|
|
132
|
+
boundLlm = this.llm.bindTools(toolDeclarations);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
boundLlm = this.llm;
|
|
136
|
+
}
|
|
137
|
+
for (let turn = 0; turn < maxTurns; turn++) {
|
|
138
|
+
turnsUsed++;
|
|
139
|
+
// Build the full message array
|
|
140
|
+
const messages = [systemPrompt, ...history];
|
|
141
|
+
const stepPromptTokens = countMessageTokens(messages);
|
|
142
|
+
promptTokens += stepPromptTokens;
|
|
143
|
+
// Invoke the LLM
|
|
144
|
+
const response = await boundLlm.invoke(messages);
|
|
145
|
+
const responseTokens = countMessageTokens([response]);
|
|
146
|
+
completionTokens += responseTokens;
|
|
147
|
+
const aiMessage = response;
|
|
148
|
+
history.push(aiMessage);
|
|
149
|
+
// Extract text content
|
|
150
|
+
if (typeof aiMessage.content === "string" && aiMessage.content.length > 0) {
|
|
151
|
+
lastResponse = aiMessage.content;
|
|
152
|
+
}
|
|
153
|
+
// Check for tool calls
|
|
154
|
+
if (!aiMessage.tool_calls || aiMessage.tool_calls.length === 0) {
|
|
155
|
+
// No tool calls — agent is done
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
// Execute tool calls
|
|
159
|
+
for (const call of aiMessage.tool_calls) {
|
|
160
|
+
if (!call.id)
|
|
161
|
+
continue;
|
|
162
|
+
const tool = agentTools.find((t) => t.name === call.name);
|
|
163
|
+
if (!tool) {
|
|
164
|
+
history.push(new ToolMessage({
|
|
165
|
+
content: `Error: Tool "${call.name}" is not available to this sub-agent.`,
|
|
166
|
+
tool_call_id: call.id,
|
|
167
|
+
}));
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
toolCallCount++;
|
|
171
|
+
try {
|
|
172
|
+
const result = await tool.execute(call.args);
|
|
173
|
+
const output = typeof result === "string" ? result : result.content;
|
|
174
|
+
// Track file modifications
|
|
175
|
+
if (call.name === "write_file" && call.args?.path) {
|
|
176
|
+
filesModified.add(call.args.path);
|
|
177
|
+
}
|
|
178
|
+
history.push(new ToolMessage({
|
|
179
|
+
content: output,
|
|
180
|
+
tool_call_id: call.id,
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
history.push(new ToolMessage({
|
|
185
|
+
content: `Tool error: ${err.message}`,
|
|
186
|
+
tool_call_id: call.id,
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Determine outcome
|
|
192
|
+
const outcome = turnsUsed >= maxTurns ? "partial" : "success";
|
|
193
|
+
return {
|
|
194
|
+
agentName: spec.name,
|
|
195
|
+
taskDescription: task,
|
|
196
|
+
outcome,
|
|
197
|
+
result: lastResponse || "(Sub-agent produced no text output)",
|
|
198
|
+
filesModified: Array.from(filesModified),
|
|
199
|
+
toolCallCount,
|
|
200
|
+
tokenUsage: { prompt: promptTokens, completion: completionTokens },
|
|
201
|
+
duration: Date.now() - startTime,
|
|
202
|
+
turnsUsed,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
return this.makeErrorResult(spec.name, task, `Sub-agent error: ${error.message}`, { promptTokens, completionTokens, toolCallCount, turnsUsed, startTime, filesModified });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Creates an error SubAgentResult.
|
|
211
|
+
*/
|
|
212
|
+
makeErrorResult(agentName, task, errorMsg, partial) {
|
|
213
|
+
return {
|
|
214
|
+
agentName,
|
|
215
|
+
taskDescription: task,
|
|
216
|
+
outcome: "failure",
|
|
217
|
+
result: errorMsg,
|
|
218
|
+
filesModified: partial ? Array.from(partial.filesModified) : [],
|
|
219
|
+
toolCallCount: partial?.toolCallCount ?? 0,
|
|
220
|
+
tokenUsage: {
|
|
221
|
+
prompt: partial?.promptTokens ?? 0,
|
|
222
|
+
completion: partial?.completionTokens ?? 0,
|
|
223
|
+
},
|
|
224
|
+
duration: partial ? Date.now() - partial.startTime : 0,
|
|
225
|
+
turnsUsed: partial?.turnsUsed ?? 0,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Clean up expired async tasks.
|
|
230
|
+
*/
|
|
231
|
+
cleanupExpired() {
|
|
232
|
+
const now = Date.now();
|
|
233
|
+
for (const [taskId, task] of this.asyncTasks.entries()) {
|
|
234
|
+
if (now - task.startedAt > ASYNC_EXPIRY_MS) {
|
|
235
|
+
this.asyncTasks.delete(taskId);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=subAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subAgent.js","sourceRoot":"","sources":["../../src/core/subAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseMessage } from "@langchain/core/messages";
|
|
1
|
+
import { BaseMessage, AIMessage } from "@langchain/core/messages";
|
|
2
2
|
/**
|
|
3
3
|
* Estimates the token count for a string.
|
|
4
4
|
*/
|
|
@@ -15,3 +15,10 @@ export declare function countMessageTokens(messages: BaseMessage[]): number;
|
|
|
15
15
|
* @param threshold - Fraction of capacity to trigger compaction (default: 0.8 = 80%).
|
|
16
16
|
*/
|
|
17
17
|
export declare function isNearCapacity(messages: BaseMessage[], maxTokens: number, threshold?: number): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Extracts provider-specific cache hit metrics from an AI message.
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractCacheMetrics(aiMessage: AIMessage, provider: string): {
|
|
22
|
+
cachedTokens: number;
|
|
23
|
+
createdTokens: number;
|
|
24
|
+
};
|
|
@@ -51,4 +51,32 @@ export function isNearCapacity(messages, maxTokens, threshold = 0.8) {
|
|
|
51
51
|
const used = countMessageTokens(messages);
|
|
52
52
|
return used >= maxTokens * threshold;
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Extracts provider-specific cache hit metrics from an AI message.
|
|
56
|
+
*/
|
|
57
|
+
export function extractCacheMetrics(aiMessage, provider) {
|
|
58
|
+
const meta = aiMessage.response_metadata;
|
|
59
|
+
if (!meta)
|
|
60
|
+
return { cachedTokens: 0, createdTokens: 0 };
|
|
61
|
+
const usage = (meta.usage || meta.tokenUsage || meta.estimatedTokenUsage || {});
|
|
62
|
+
// Anthropic uses these specific nested fields
|
|
63
|
+
if (provider === "anthropic") {
|
|
64
|
+
return {
|
|
65
|
+
cachedTokens: usage.cache_read_input_tokens || 0,
|
|
66
|
+
createdTokens: usage.cache_creation_input_tokens || 0,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Google Gemini uses cachedContentTokenCount
|
|
70
|
+
if (provider === "google-genai") {
|
|
71
|
+
return {
|
|
72
|
+
cachedTokens: usage.cachedContentTokenCount || 0,
|
|
73
|
+
createdTokens: usage.promptTokenCount - (usage.cachedContentTokenCount || 0) || 0,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Fallback for others (assuming standard usage pattern if any support arises)
|
|
77
|
+
return {
|
|
78
|
+
cachedTokens: usage.prompt_tokens_details?.cached_tokens || usage.cached_tokens || 0,
|
|
79
|
+
createdTokens: 0,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
54
82
|
//# sourceMappingURL=tokenCounter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenCounter.js","sourceRoot":"","sources":["../../src/core/tokenCounter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAuB;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,KAAK,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,iDAAiD;YACjD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;qBAAM,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC3D,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,SAAiB,EACjB,SAAS,GAAG,GAAG;IAEf,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC;AACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"tokenCounter.js","sourceRoot":"","sources":["../../src/core/tokenCounter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAuB;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,KAAK,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,iDAAiD;YACjD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;qBAAM,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC3D,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,SAAiB,EACjB,SAAS,GAAG,GAAG;IAEf,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAoB,EACpB,QAAgB;IAEhB,MAAM,IAAI,GAAG,SAAS,CAAC,iBAAiB,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IAExD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAQ,CAAC;IAEvF,8CAA8C;IAC9C,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO;YACL,YAAY,EAAE,KAAK,CAAC,uBAAuB,IAAI,CAAC;YAChD,aAAa,EAAE,KAAK,CAAC,2BAA2B,IAAI,CAAC;SACtD,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,OAAO;YACL,YAAY,EAAE,KAAK,CAAC,uBAAuB,IAAI,CAAC;YAChD,aAAa,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC,IAAI,CAAC;SAClF,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,qBAAqB,EAAE,aAAa,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC;QACpF,aAAa,EAAE,CAAC;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ExecutionHarness } from "./core/agentLoop.js";
|
|
2
|
+
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
|
|
3
|
+
import { HumanMessage } from "@langchain/core/messages";
|
|
4
|
+
async function run() {
|
|
5
|
+
const llm = new ChatGoogleGenerativeAI({ apiKey: "dummy-key", modelName: "gemini-1.5-pro" });
|
|
6
|
+
const harness = new ExecutionHarness(llm, [], undefined, undefined, "google", "gemini-1.5-pro");
|
|
7
|
+
const state = {
|
|
8
|
+
globalSystemInstructions: `You are Joone...`,
|
|
9
|
+
projectMemory: "No project context loaded yet.",
|
|
10
|
+
sessionContext: `Environment: test\nCWD: test`,
|
|
11
|
+
conversationHistory: [
|
|
12
|
+
new HumanMessage("Hello Google AI")
|
|
13
|
+
]
|
|
14
|
+
};
|
|
15
|
+
try {
|
|
16
|
+
await harness.step(state);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
console.error("Caught in harness:", e.message);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
run();
|
|
23
|
+
//# sourceMappingURL=debug_google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug_google.js","sourceRoot":"","sources":["../src/debug_google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,KAAK,UAAU,GAAG;IAChB,MAAM,GAAG,GAAG,IAAI,sBAAsB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAEhG,MAAM,KAAK,GAAG;QACZ,wBAAwB,EAAE,kBAAkB;QAC5C,aAAa,EAAE,gCAAgC;QAC/C,cAAc,EAAE,8BAA8B;QAC9C,mBAAmB,EAAE;YACnB,IAAI,YAAY,CAAC,iBAAiB,CAAC;SACpC;KACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,GAAG,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/middleware/permission.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C,+DAA+D;AAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACvB,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,YAAY;IACZ,cAAc;IACd,mBAAmB,EAAE,2CAA2C;CACnE,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,YAAY;IACZ,sBAAsB;IACtB,4BAA4B;IAC5B,cAAc;
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/middleware/permission.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C,+DAA+D;AAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACvB,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,YAAY;IACZ,cAAc;IACd,mBAAmB,EAAE,2CAA2C;CACnE,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,YAAY;IACZ,sBAAsB;IACtB,4BAA4B;IAC5B,cAAc;IACd,2BAA2B;CAC9B,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IAC7B,IAAI,GAAG,sBAAsB,CAAC;IACtB,IAAI,CAAiB;IAE7B,YAAY,OAAuB,MAAM;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAoB;QAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC;QAErC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,CAAC,aAAa;YAAE,OAAO,GAAG,CAAC;QAE/B,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAEpE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,uDAAuD;YACvD,OAAO,CACH,qEAAqE,QAAQ,KAAK;gBAClF,4FAA4F,CAC/F,CAAC;QACN,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACrC,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;YAAE,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExE,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/test_google.js
CHANGED
|
@@ -1,93 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
var google_genai_1 = require("@langchain/google-genai");
|
|
40
|
-
var messages_1 = require("@langchain/core/messages");
|
|
41
|
-
var dotenv = require("dotenv");
|
|
1
|
+
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
|
|
2
|
+
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
|
|
3
|
+
import * as dotenv from "dotenv";
|
|
42
4
|
dotenv.config();
|
|
43
|
-
function main() {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return __generator(this, function (_a) {
|
|
47
|
-
switch (_a.label) {
|
|
48
|
-
case 0:
|
|
49
|
-
model = new google_genai_1.ChatGoogleGenerativeAI({
|
|
50
|
-
model: "gemini-2.5-flash",
|
|
51
|
-
});
|
|
52
|
-
messagesGrouped = [
|
|
53
|
-
new messages_1.SystemMessage("You are a helpful assistant."),
|
|
54
|
-
new messages_1.SystemMessage("Also, be concise."),
|
|
55
|
-
new messages_1.HumanMessage("Hello!"),
|
|
56
|
-
];
|
|
57
|
-
_a.label = 1;
|
|
58
|
-
case 1:
|
|
59
|
-
_a.trys.push([1, 3, , 4]);
|
|
60
|
-
return [4 /*yield*/, model.invoke(messagesGrouped)];
|
|
61
|
-
case 2:
|
|
62
|
-
_a.sent();
|
|
63
|
-
console.log("Success: Grouped SystemMessages at the start work perfectly.");
|
|
64
|
-
return [3 /*break*/, 4];
|
|
65
|
-
case 3:
|
|
66
|
-
e_1 = _a.sent();
|
|
67
|
-
console.error("Grouped systems failed:", e_1.message);
|
|
68
|
-
return [3 /*break*/, 4];
|
|
69
|
-
case 4:
|
|
70
|
-
messagesMidstream = [
|
|
71
|
-
new messages_1.SystemMessage("You are a helpful assistant."),
|
|
72
|
-
new messages_1.HumanMessage("Hello!"),
|
|
73
|
-
new messages_1.SystemMessage("System recovery hint here."),
|
|
74
|
-
new messages_1.HumanMessage("What did I say?"),
|
|
75
|
-
];
|
|
76
|
-
_a.label = 5;
|
|
77
|
-
case 5:
|
|
78
|
-
_a.trys.push([5, 7, , 8]);
|
|
79
|
-
return [4 /*yield*/, model.invoke(messagesMidstream)];
|
|
80
|
-
case 6:
|
|
81
|
-
_a.sent();
|
|
82
|
-
console.log("Success: Mid-stream SystemMessages work.");
|
|
83
|
-
return [3 /*break*/, 8];
|
|
84
|
-
case 7:
|
|
85
|
-
e_2 = _a.sent();
|
|
86
|
-
console.error("Midstream systems failed:", e_2.message);
|
|
87
|
-
return [3 /*break*/, 8];
|
|
88
|
-
case 8: return [2 /*return*/];
|
|
89
|
-
}
|
|
90
|
-
});
|
|
5
|
+
async function main() {
|
|
6
|
+
const model = new ChatGoogleGenerativeAI({
|
|
7
|
+
model: "gemini-2.5-flash",
|
|
91
8
|
});
|
|
9
|
+
const messagesGrouped = [
|
|
10
|
+
new SystemMessage("You are a helpful assistant."),
|
|
11
|
+
new SystemMessage("Also, be concise."),
|
|
12
|
+
new HumanMessage("Hello!"),
|
|
13
|
+
];
|
|
14
|
+
try {
|
|
15
|
+
await model.invoke(messagesGrouped);
|
|
16
|
+
console.log("Success: Grouped SystemMessages at the start work perfectly.");
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
console.error("Grouped systems failed:", e.message);
|
|
20
|
+
}
|
|
21
|
+
const messagesMidstream = [
|
|
22
|
+
new SystemMessage("You are a helpful assistant."),
|
|
23
|
+
new HumanMessage("Hello!"),
|
|
24
|
+
new SystemMessage("System recovery hint here."),
|
|
25
|
+
new HumanMessage("What did I say?"),
|
|
26
|
+
];
|
|
27
|
+
try {
|
|
28
|
+
await model.invoke(messagesMidstream);
|
|
29
|
+
console.log("Success: Mid-stream SystemMessages work.");
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
console.error("Midstream systems failed:", e.message);
|
|
33
|
+
}
|
|
92
34
|
}
|
|
93
35
|
main();
|
|
36
|
+
//# sourceMappingURL=test_google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_google.js","sourceRoot":"","sources":["../src/test_google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC;QACvC,KAAK,EAAE,kBAAkB;KAC1B,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG;QACtB,IAAI,aAAa,CAAC,8BAA8B,CAAC;QACjD,IAAI,aAAa,CAAC,mBAAmB,CAAC;QACtC,IAAI,YAAY,CAAC,QAAQ,CAAC;KAC3B,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,IAAI,aAAa,CAAC,8BAA8B,CAAC;QACjD,IAAI,YAAY,CAAC,QAAQ,CAAC;QAC1B,IAAI,aAAa,CAAC,4BAA4B,CAAC;QAC/C,IAAI,YAAY,CAAC,iBAAiB,CAAC;KACpC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/tools/browser.js
CHANGED
|
@@ -60,7 +60,10 @@ export const BrowserTool = {
|
|
|
60
60
|
},
|
|
61
61
|
required: ["action"],
|
|
62
62
|
},
|
|
63
|
-
execute: async (args) => {
|
|
63
|
+
execute: async (args, emitter) => {
|
|
64
|
+
if (args.action === "navigate" && args.url && emitter) {
|
|
65
|
+
emitter.emit("agent:event", { type: "browser:nav", url: args.url });
|
|
66
|
+
}
|
|
64
67
|
if (!_sandboxManager || !_sandboxManager.isActive()) {
|
|
65
68
|
return { content: "Sandbox is not active. Cannot use browser tool.", isError: true };
|
|
66
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SandboxManager } from "../sandbox/manager.js";
|
|
2
2
|
import { FileSync } from "../sandbox/sync.js";
|
|
3
|
+
import { AgentEventEmitter } from "../core/events.js";
|
|
3
4
|
export interface ToolResult {
|
|
4
5
|
content: string;
|
|
5
6
|
metadata?: Record<string, any>;
|
|
@@ -9,7 +10,7 @@ export interface DynamicToolInterface {
|
|
|
9
10
|
name: string;
|
|
10
11
|
description: string;
|
|
11
12
|
schema: Record<string, any>;
|
|
12
|
-
execute: (args: any) => Promise<ToolResult> | ToolResult;
|
|
13
|
+
execute: (args: any, emitter?: AgentEventEmitter) => Promise<ToolResult> | ToolResult;
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
16
|
* Binds the tools to a SandboxManager and FileSync instance.
|
package/dist/tools/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
+
import { InstallHostDependenciesTool } from "./installHostDeps.js";
|
|
3
4
|
// ─── Configuration ──────────────────────────────────────────────────────────────
|
|
4
5
|
/** Maximum file size (in bytes) the agent is allowed to read into context. */
|
|
5
6
|
const MAX_FILE_SIZE_BYTES = 512 * 1024; // 512 KB
|
|
@@ -43,7 +44,9 @@ export const BashTool = {
|
|
|
43
44
|
},
|
|
44
45
|
required: ["command"],
|
|
45
46
|
},
|
|
46
|
-
execute: async (args) => {
|
|
47
|
+
execute: async (args, emitter) => {
|
|
48
|
+
if (emitter)
|
|
49
|
+
emitter.emit("agent:event", { type: "system:script_exec", command: args.command, location: "sandbox" });
|
|
47
50
|
if (!_sandboxManager || !_sandboxManager.isActive()) {
|
|
48
51
|
throw new Error("Sandbox is not active. Cannot execute bash commands without an active sandbox session.");
|
|
49
52
|
}
|
|
@@ -90,8 +93,10 @@ export const ReadFileTool = {
|
|
|
90
93
|
},
|
|
91
94
|
required: ["path"],
|
|
92
95
|
},
|
|
93
|
-
execute: async (args) => {
|
|
96
|
+
execute: async (args, emitter) => {
|
|
94
97
|
const filePath = path.resolve(args.path);
|
|
98
|
+
if (emitter)
|
|
99
|
+
emitter.emit("agent:event", { type: "file:io", action: "read", path: filePath });
|
|
95
100
|
// ── Security Guardrail ──
|
|
96
101
|
if (!isPathInsideWorkspace(filePath)) {
|
|
97
102
|
return {
|
|
@@ -153,8 +158,10 @@ export const WriteFileTool = {
|
|
|
153
158
|
},
|
|
154
159
|
required: ["path", "content"],
|
|
155
160
|
},
|
|
156
|
-
execute: async (args) => {
|
|
161
|
+
execute: async (args, emitter) => {
|
|
157
162
|
const filePath = path.resolve(args.path);
|
|
163
|
+
if (emitter)
|
|
164
|
+
emitter.emit("agent:event", { type: "file:io", action: "write", path: filePath });
|
|
158
165
|
// ── Security Guardrail ──
|
|
159
166
|
if (!isPathInsideWorkspace(filePath)) {
|
|
160
167
|
return {
|
|
@@ -180,5 +187,6 @@ export const CORE_TOOLS = [
|
|
|
180
187
|
BashTool,
|
|
181
188
|
ReadFileTool,
|
|
182
189
|
WriteFileTool,
|
|
190
|
+
InstallHostDependenciesTool,
|
|
183
191
|
];
|
|
184
192
|
//# sourceMappingURL=index.js.map
|