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.
Files changed (184) hide show
  1. package/README.md +12 -12
  2. package/dist/__tests__/optimizations.test.js.map +1 -1
  3. package/dist/__tests__/promptBuilder.test.js +14 -20
  4. package/dist/__tests__/promptBuilder.test.js.map +1 -1
  5. package/dist/agents/agentRegistry.d.ts +37 -0
  6. package/dist/agents/agentRegistry.js +58 -0
  7. package/dist/agents/agentRegistry.js.map +1 -0
  8. package/dist/agents/agentSpec.d.ts +54 -0
  9. package/dist/agents/agentSpec.js +9 -0
  10. package/dist/agents/agentSpec.js.map +1 -0
  11. package/dist/agents/builtinAgents.d.ts +20 -0
  12. package/{src/agents/builtinAgents.ts → dist/agents/builtinAgents.js} +84 -101
  13. package/dist/agents/builtinAgents.js.map +1 -0
  14. package/dist/cli/config.d.ts +4 -0
  15. package/dist/cli/config.js.map +1 -1
  16. package/dist/cli/index.js +29 -2
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/postinstall.d.ts +2 -0
  19. package/dist/cli/postinstall.js +25 -0
  20. package/dist/cli/postinstall.js.map +1 -0
  21. package/dist/commands/builtinCommands.d.ts +21 -0
  22. package/dist/commands/builtinCommands.js +241 -0
  23. package/dist/commands/builtinCommands.js.map +1 -0
  24. package/dist/commands/commandRegistry.d.ts +92 -0
  25. package/dist/commands/commandRegistry.js +128 -0
  26. package/dist/commands/commandRegistry.js.map +1 -0
  27. package/dist/core/agentLoop.d.ts +7 -2
  28. package/dist/core/agentLoop.js +35 -13
  29. package/dist/core/agentLoop.js.map +1 -1
  30. package/dist/core/autoSave.d.ts +41 -0
  31. package/dist/core/autoSave.js +69 -0
  32. package/dist/core/autoSave.js.map +1 -0
  33. package/dist/core/compactor.d.ts +66 -0
  34. package/dist/core/compactor.js +170 -0
  35. package/dist/core/compactor.js.map +1 -0
  36. package/dist/core/contextGuard.d.ts +38 -0
  37. package/dist/core/contextGuard.js +122 -0
  38. package/dist/core/contextGuard.js.map +1 -0
  39. package/dist/core/events.d.ts +45 -0
  40. package/dist/core/events.js +8 -0
  41. package/dist/core/events.js.map +1 -0
  42. package/dist/core/promptBuilder.d.ts +16 -1
  43. package/dist/core/promptBuilder.js +27 -14
  44. package/dist/core/promptBuilder.js.map +1 -1
  45. package/dist/core/sessionResumer.js +3 -3
  46. package/dist/core/sessionResumer.js.map +1 -1
  47. package/dist/core/sessionStore.js +3 -2
  48. package/dist/core/sessionStore.js.map +1 -1
  49. package/dist/core/subAgent.d.ts +56 -0
  50. package/dist/core/subAgent.js +240 -0
  51. package/dist/core/subAgent.js.map +1 -0
  52. package/dist/core/tokenCounter.d.ts +8 -1
  53. package/dist/core/tokenCounter.js +28 -0
  54. package/dist/core/tokenCounter.js.map +1 -1
  55. package/dist/debug_google.d.ts +1 -0
  56. package/dist/debug_google.js +23 -0
  57. package/dist/debug_google.js.map +1 -0
  58. package/dist/middleware/permission.js +1 -0
  59. package/dist/middleware/permission.js.map +1 -1
  60. package/dist/test_google.d.ts +1 -0
  61. package/dist/test_google.js +32 -89
  62. package/dist/test_google.js.map +1 -0
  63. package/dist/tools/browser.js +4 -1
  64. package/dist/tools/browser.js.map +1 -1
  65. package/dist/tools/index.d.ts +2 -1
  66. package/dist/tools/index.js +11 -3
  67. package/dist/tools/index.js.map +1 -1
  68. package/dist/tools/installHostDeps.d.ts +2 -0
  69. package/dist/tools/installHostDeps.js +37 -0
  70. package/dist/tools/installHostDeps.js.map +1 -0
  71. package/dist/tools/router.js +3 -0
  72. package/dist/tools/router.js.map +1 -1
  73. package/dist/tools/spawnAgent.d.ts +19 -0
  74. package/dist/tools/spawnAgent.js +132 -0
  75. package/dist/tools/spawnAgent.js.map +1 -0
  76. package/dist/tracing/sessionTracer.d.ts +1 -0
  77. package/dist/tracing/sessionTracer.js +4 -1
  78. package/dist/tracing/sessionTracer.js.map +1 -1
  79. package/dist/ui/App.js +94 -6
  80. package/dist/ui/App.js.map +1 -1
  81. package/dist/ui/components/ActionLog.d.ts +7 -0
  82. package/dist/ui/components/ActionLog.js +63 -0
  83. package/dist/ui/components/ActionLog.js.map +1 -0
  84. package/dist/ui/components/FileBrowser.d.ts +2 -0
  85. package/dist/ui/components/FileBrowser.js +41 -0
  86. package/dist/ui/components/FileBrowser.js.map +1 -0
  87. package/package.json +5 -6
  88. package/AGENTS.md +0 -56
  89. package/Handover.md +0 -115
  90. package/PROGRESS.md +0 -160
  91. package/docs/01_insights_and_patterns.md +0 -27
  92. package/docs/02_edge_cases_and_mitigations.md +0 -143
  93. package/docs/03_initial_implementation_plan.md +0 -66
  94. package/docs/04_tech_stack_proposal.md +0 -20
  95. package/docs/05_prd.md +0 -87
  96. package/docs/06_user_stories.md +0 -72
  97. package/docs/07_system_architecture.md +0 -138
  98. package/docs/08_roadmap.md +0 -200
  99. package/e2b/Dockerfile +0 -26
  100. package/src/__tests__/bootstrap.test.ts +0 -111
  101. package/src/__tests__/config.test.ts +0 -97
  102. package/src/__tests__/m55.test.ts +0 -238
  103. package/src/__tests__/middleware.test.ts +0 -219
  104. package/src/__tests__/modelFactory.test.ts +0 -63
  105. package/src/__tests__/optimizations.test.ts +0 -201
  106. package/src/__tests__/promptBuilder.test.ts +0 -141
  107. package/src/__tests__/sandbox.test.ts +0 -102
  108. package/src/__tests__/security.test.ts +0 -122
  109. package/src/__tests__/streaming.test.ts +0 -82
  110. package/src/__tests__/toolRouter.test.ts +0 -52
  111. package/src/__tests__/tools.test.ts +0 -146
  112. package/src/__tests__/tracing.test.ts +0 -196
  113. package/src/agents/agentRegistry.ts +0 -69
  114. package/src/agents/agentSpec.ts +0 -67
  115. package/src/cli/config.ts +0 -124
  116. package/src/cli/index.ts +0 -730
  117. package/src/cli/modelFactory.ts +0 -174
  118. package/src/cli/providers.ts +0 -107
  119. package/src/commands/builtinCommands.ts +0 -293
  120. package/src/commands/commandRegistry.ts +0 -194
  121. package/src/core/agentLoop.d.ts.map +0 -1
  122. package/src/core/agentLoop.ts +0 -312
  123. package/src/core/autoSave.ts +0 -95
  124. package/src/core/compactor.ts +0 -252
  125. package/src/core/contextGuard.ts +0 -129
  126. package/src/core/errors.ts +0 -202
  127. package/src/core/promptBuilder.d.ts.map +0 -1
  128. package/src/core/promptBuilder.ts +0 -139
  129. package/src/core/reasoningRouter.ts +0 -121
  130. package/src/core/retry.ts +0 -75
  131. package/src/core/sessionResumer.ts +0 -90
  132. package/src/core/sessionStore.ts +0 -215
  133. package/src/core/subAgent.ts +0 -339
  134. package/src/core/tokenCounter.ts +0 -64
  135. package/src/evals/dataset.ts +0 -67
  136. package/src/evals/evaluator.ts +0 -81
  137. package/src/hitl/bridge.ts +0 -160
  138. package/src/middleware/commandSanitizer.ts +0 -60
  139. package/src/middleware/loopDetection.ts +0 -63
  140. package/src/middleware/permission.ts +0 -72
  141. package/src/middleware/pipeline.ts +0 -75
  142. package/src/middleware/preCompletion.ts +0 -94
  143. package/src/middleware/types.ts +0 -45
  144. package/src/sandbox/bootstrap.ts +0 -121
  145. package/src/sandbox/manager.ts +0 -239
  146. package/src/sandbox/sync.ts +0 -157
  147. package/src/skills/loader.ts +0 -143
  148. package/src/skills/tools.ts +0 -99
  149. package/src/skills/types.ts +0 -13
  150. package/src/test_cache.ts +0 -72
  151. package/src/test_google.js +0 -40
  152. package/src/test_google.ts +0 -40
  153. package/src/tools/askUser.ts +0 -47
  154. package/src/tools/browser.ts +0 -137
  155. package/src/tools/index.d.ts.map +0 -1
  156. package/src/tools/index.ts +0 -237
  157. package/src/tools/registry.ts +0 -198
  158. package/src/tools/router.ts +0 -78
  159. package/src/tools/security.ts +0 -220
  160. package/src/tools/spawnAgent.ts +0 -158
  161. package/src/tools/webSearch.ts +0 -142
  162. package/src/tracing/analyzer.ts +0 -265
  163. package/src/tracing/langsmith.ts +0 -63
  164. package/src/tracing/sessionTracer.ts +0 -202
  165. package/src/tracing/types.ts +0 -49
  166. package/src/types/valyu.d.ts +0 -37
  167. package/src/ui/App.tsx +0 -404
  168. package/src/ui/components/HITLPrompt.tsx +0 -119
  169. package/src/ui/components/Header.tsx +0 -51
  170. package/src/ui/components/MessageBubble.tsx +0 -46
  171. package/src/ui/components/StatusBar.tsx +0 -138
  172. package/src/ui/components/StreamingText.tsx +0 -48
  173. package/src/ui/components/ToolCallPanel.tsx +0 -80
  174. package/tests/commands/commands.test.ts +0 -356
  175. package/tests/core/compactor.test.ts +0 -217
  176. package/tests/core/retryAndErrors.test.ts +0 -164
  177. package/tests/core/sessionResumer.test.ts +0 -95
  178. package/tests/core/sessionStore.test.ts +0 -84
  179. package/tests/core/stability.test.ts +0 -165
  180. package/tests/core/subAgent.test.ts +0 -238
  181. package/tests/hitl/hitlBridge.test.ts +0 -115
  182. package/tsconfig.json +0 -16
  183. package/vitest.config.ts +0 -10
  184. 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"}
@@ -15,6 +15,7 @@ const DANGEROUS_TOOLS = new Set([
15
15
  "replace_file_content",
16
16
  "multi_replace_file_content",
17
17
  "install_deps",
18
+ "install_host_dependencies",
18
19
  ]);
19
20
  /**
20
21
  * PermissionMiddleware — gates dangerous tool calls behind user approval.
@@ -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;CACjB,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"}
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 {};
@@ -1,93 +1,36 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
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
- return __awaiter(this, void 0, void 0, function () {
45
- var model, messagesGrouped, e_1, messagesMidstream, e_2;
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"}
@@ -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":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
@@ -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.
@@ -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