joonecli 0.1.1 → 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 (235) 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 -97
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/commands/builtinCommands.js +6 -6
  13. package/dist/commands/builtinCommands.js.map +1 -1
  14. package/dist/commands/commandRegistry.d.ts +3 -1
  15. package/dist/commands/commandRegistry.js.map +1 -1
  16. package/dist/core/agentLoop.d.ts +11 -28
  17. package/dist/core/agentLoop.js +68 -229
  18. package/dist/core/agentLoop.js.map +1 -1
  19. package/dist/core/compactor.js +2 -2
  20. package/dist/core/compactor.js.map +1 -1
  21. package/dist/core/contextGuard.d.ts +5 -0
  22. package/dist/core/contextGuard.js +30 -3
  23. package/dist/core/contextGuard.js.map +1 -1
  24. package/dist/core/events.d.ts +45 -0
  25. package/dist/core/events.js +8 -0
  26. package/dist/core/events.js.map +1 -0
  27. package/dist/core/promptBuilder.js.map +1 -1
  28. package/dist/core/sessionStore.js +3 -2
  29. package/dist/core/sessionStore.js.map +1 -1
  30. package/dist/core/tokenCounter.d.ts +8 -1
  31. package/dist/core/tokenCounter.js +28 -0
  32. package/dist/core/tokenCounter.js.map +1 -1
  33. package/dist/hitl/bridge.js +1 -27
  34. package/dist/hitl/bridge.js.map +1 -1
  35. package/dist/middleware/loopDetection.d.ts +7 -23
  36. package/dist/middleware/loopDetection.js +38 -42
  37. package/dist/middleware/loopDetection.js.map +1 -1
  38. package/dist/sandbox/whitelistedBackend.d.ts +5 -0
  39. package/dist/sandbox/whitelistedBackend.js +27 -0
  40. package/dist/sandbox/whitelistedBackend.js.map +1 -0
  41. package/dist/tools/askUser.d.ts +12 -3
  42. package/dist/tools/askUser.js +16 -28
  43. package/dist/tools/askUser.js.map +1 -1
  44. package/dist/tools/bashTool.d.ts +11 -0
  45. package/dist/tools/bashTool.js +51 -0
  46. package/dist/tools/bashTool.js.map +1 -0
  47. package/dist/tools/index.d.ts +15 -27
  48. package/dist/tools/index.js +9 -181
  49. package/dist/tools/index.js.map +1 -1
  50. package/dist/tools/installHostDeps.d.ts +8 -0
  51. package/dist/tools/installHostDeps.js +44 -0
  52. package/dist/tools/installHostDeps.js.map +1 -0
  53. package/dist/tracing/sessionTracer.d.ts +1 -0
  54. package/dist/tracing/sessionTracer.js +4 -1
  55. package/dist/tracing/sessionTracer.js.map +1 -1
  56. package/dist/ui/App.js +116 -55
  57. package/dist/ui/App.js.map +1 -1
  58. package/dist/ui/components/ActionLog.d.ts +7 -0
  59. package/dist/ui/components/ActionLog.js +63 -0
  60. package/dist/ui/components/ActionLog.js.map +1 -0
  61. package/dist/ui/components/FileBrowser.d.ts +2 -0
  62. package/dist/ui/components/FileBrowser.js +41 -0
  63. package/dist/ui/components/FileBrowser.js.map +1 -0
  64. package/dist/ui/components/MessageBubble.js +1 -1
  65. package/dist/ui/components/MessageBubble.js.map +1 -1
  66. package/package.json +8 -5
  67. package/AGENTS.md +0 -56
  68. package/Handover.md +0 -115
  69. package/PROGRESS.md +0 -160
  70. package/dist/__tests__/m55.test.js +0 -160
  71. package/dist/__tests__/m55.test.js.map +0 -1
  72. package/dist/__tests__/middleware.test.js +0 -169
  73. package/dist/__tests__/middleware.test.js.map +0 -1
  74. package/dist/__tests__/optimizations.test.d.ts +0 -1
  75. package/dist/__tests__/optimizations.test.js +0 -136
  76. package/dist/__tests__/optimizations.test.js.map +0 -1
  77. package/dist/__tests__/security.test.d.ts +0 -1
  78. package/dist/__tests__/security.test.js +0 -86
  79. package/dist/__tests__/security.test.js.map +0 -1
  80. package/dist/__tests__/streaming.test.d.ts +0 -1
  81. package/dist/__tests__/streaming.test.js +0 -71
  82. package/dist/__tests__/streaming.test.js.map +0 -1
  83. package/dist/__tests__/toolRouter.test.d.ts +0 -1
  84. package/dist/__tests__/toolRouter.test.js +0 -37
  85. package/dist/__tests__/toolRouter.test.js.map +0 -1
  86. package/dist/__tests__/tools.test.d.ts +0 -1
  87. package/dist/__tests__/tools.test.js +0 -112
  88. package/dist/__tests__/tools.test.js.map +0 -1
  89. package/dist/core/subAgent.d.ts +0 -56
  90. package/dist/core/subAgent.js +0 -240
  91. package/dist/core/subAgent.js.map +0 -1
  92. package/dist/debug_google.d.ts +0 -1
  93. package/dist/debug_google.js +0 -23
  94. package/dist/debug_google.js.map +0 -1
  95. package/dist/middleware/commandSanitizer.d.ts +0 -18
  96. package/dist/middleware/commandSanitizer.js +0 -50
  97. package/dist/middleware/commandSanitizer.js.map +0 -1
  98. package/dist/middleware/permission.d.ts +0 -17
  99. package/dist/middleware/permission.js +0 -59
  100. package/dist/middleware/permission.js.map +0 -1
  101. package/dist/middleware/pipeline.d.ts +0 -31
  102. package/dist/middleware/pipeline.js +0 -62
  103. package/dist/middleware/pipeline.js.map +0 -1
  104. package/dist/middleware/preCompletion.d.ts +0 -29
  105. package/dist/middleware/preCompletion.js +0 -82
  106. package/dist/middleware/preCompletion.js.map +0 -1
  107. package/dist/middleware/types.d.ts +0 -40
  108. package/dist/middleware/types.js +0 -8
  109. package/dist/middleware/types.js.map +0 -1
  110. package/dist/skills/loader.d.ts +0 -55
  111. package/dist/skills/loader.js +0 -132
  112. package/dist/skills/loader.js.map +0 -1
  113. package/dist/skills/tools.d.ts +0 -5
  114. package/dist/skills/tools.js +0 -78
  115. package/dist/skills/tools.js.map +0 -1
  116. package/dist/test_cache.d.ts +0 -1
  117. package/dist/test_cache.js +0 -55
  118. package/dist/test_cache.js.map +0 -1
  119. package/dist/test_google.d.ts +0 -1
  120. package/dist/test_google.js +0 -36
  121. package/dist/test_google.js.map +0 -1
  122. package/dist/tools/browser.d.ts +0 -19
  123. package/dist/tools/browser.js +0 -111
  124. package/dist/tools/browser.js.map +0 -1
  125. package/dist/tools/registry.d.ts +0 -31
  126. package/dist/tools/registry.js +0 -168
  127. package/dist/tools/registry.js.map +0 -1
  128. package/dist/tools/router.d.ts +0 -34
  129. package/dist/tools/router.js +0 -75
  130. package/dist/tools/router.js.map +0 -1
  131. package/dist/tools/security.d.ts +0 -28
  132. package/dist/tools/security.js +0 -183
  133. package/dist/tools/security.js.map +0 -1
  134. package/dist/tools/spawnAgent.d.ts +0 -19
  135. package/dist/tools/spawnAgent.js +0 -130
  136. package/dist/tools/spawnAgent.js.map +0 -1
  137. package/dist/tools/webSearch.d.ts +0 -6
  138. package/dist/tools/webSearch.js +0 -120
  139. package/dist/tools/webSearch.js.map +0 -1
  140. package/docs/01_insights_and_patterns.md +0 -27
  141. package/docs/02_edge_cases_and_mitigations.md +0 -143
  142. package/docs/03_initial_implementation_plan.md +0 -66
  143. package/docs/04_tech_stack_proposal.md +0 -20
  144. package/docs/05_prd.md +0 -87
  145. package/docs/06_user_stories.md +0 -72
  146. package/docs/07_system_architecture.md +0 -138
  147. package/docs/08_roadmap.md +0 -200
  148. package/e2b/Dockerfile +0 -26
  149. package/src/__tests__/bootstrap.test.ts +0 -111
  150. package/src/__tests__/config.test.ts +0 -97
  151. package/src/__tests__/m55.test.ts +0 -238
  152. package/src/__tests__/middleware.test.ts +0 -219
  153. package/src/__tests__/modelFactory.test.ts +0 -63
  154. package/src/__tests__/optimizations.test.ts +0 -201
  155. package/src/__tests__/promptBuilder.test.ts +0 -141
  156. package/src/__tests__/sandbox.test.ts +0 -102
  157. package/src/__tests__/security.test.ts +0 -122
  158. package/src/__tests__/streaming.test.ts +0 -82
  159. package/src/__tests__/toolRouter.test.ts +0 -52
  160. package/src/__tests__/tools.test.ts +0 -146
  161. package/src/__tests__/tracing.test.ts +0 -196
  162. package/src/agents/agentRegistry.ts +0 -69
  163. package/src/agents/agentSpec.ts +0 -67
  164. package/src/agents/builtinAgents.ts +0 -142
  165. package/src/cli/config.ts +0 -124
  166. package/src/cli/index.ts +0 -742
  167. package/src/cli/modelFactory.ts +0 -174
  168. package/src/cli/postinstall.ts +0 -28
  169. package/src/cli/providers.ts +0 -107
  170. package/src/commands/builtinCommands.ts +0 -293
  171. package/src/commands/commandRegistry.ts +0 -194
  172. package/src/core/agentLoop.d.ts.map +0 -1
  173. package/src/core/agentLoop.ts +0 -312
  174. package/src/core/autoSave.ts +0 -95
  175. package/src/core/compactor.ts +0 -252
  176. package/src/core/contextGuard.ts +0 -129
  177. package/src/core/errors.ts +0 -202
  178. package/src/core/promptBuilder.d.ts.map +0 -1
  179. package/src/core/promptBuilder.ts +0 -139
  180. package/src/core/reasoningRouter.ts +0 -121
  181. package/src/core/retry.ts +0 -75
  182. package/src/core/sessionResumer.ts +0 -90
  183. package/src/core/sessionStore.ts +0 -216
  184. package/src/core/subAgent.ts +0 -339
  185. package/src/core/tokenCounter.ts +0 -64
  186. package/src/evals/dataset.ts +0 -67
  187. package/src/evals/evaluator.ts +0 -81
  188. package/src/hitl/bridge.ts +0 -160
  189. package/src/middleware/commandSanitizer.ts +0 -60
  190. package/src/middleware/loopDetection.ts +0 -63
  191. package/src/middleware/permission.ts +0 -72
  192. package/src/middleware/pipeline.ts +0 -75
  193. package/src/middleware/preCompletion.ts +0 -94
  194. package/src/middleware/types.ts +0 -45
  195. package/src/sandbox/bootstrap.ts +0 -121
  196. package/src/sandbox/manager.ts +0 -239
  197. package/src/sandbox/sync.ts +0 -157
  198. package/src/skills/loader.ts +0 -143
  199. package/src/skills/tools.ts +0 -99
  200. package/src/skills/types.ts +0 -13
  201. package/src/test_cache.ts +0 -72
  202. package/src/tools/askUser.ts +0 -47
  203. package/src/tools/browser.ts +0 -137
  204. package/src/tools/index.d.ts.map +0 -1
  205. package/src/tools/index.ts +0 -237
  206. package/src/tools/registry.ts +0 -198
  207. package/src/tools/router.ts +0 -78
  208. package/src/tools/security.ts +0 -220
  209. package/src/tools/spawnAgent.ts +0 -158
  210. package/src/tools/webSearch.ts +0 -142
  211. package/src/tracing/analyzer.ts +0 -265
  212. package/src/tracing/langsmith.ts +0 -63
  213. package/src/tracing/sessionTracer.ts +0 -202
  214. package/src/tracing/types.ts +0 -49
  215. package/src/types/valyu.d.ts +0 -37
  216. package/src/ui/App.tsx +0 -404
  217. package/src/ui/components/HITLPrompt.tsx +0 -119
  218. package/src/ui/components/Header.tsx +0 -51
  219. package/src/ui/components/MessageBubble.tsx +0 -46
  220. package/src/ui/components/StatusBar.tsx +0 -138
  221. package/src/ui/components/StreamingText.tsx +0 -48
  222. package/src/ui/components/ToolCallPanel.tsx +0 -80
  223. package/tests/commands/commands.test.ts +0 -356
  224. package/tests/core/compactor.test.ts +0 -217
  225. package/tests/core/retryAndErrors.test.ts +0 -164
  226. package/tests/core/sessionResumer.test.ts +0 -95
  227. package/tests/core/sessionStore.test.ts +0 -84
  228. package/tests/core/stability.test.ts +0 -165
  229. package/tests/core/subAgent.test.ts +0 -238
  230. package/tests/hitl/hitlBridge.test.ts +0 -115
  231. package/tsconfig.json +0 -16
  232. package/vitest.config.ts +0 -10
  233. package/vitest.out +0 -48
  234. /package/dist/__tests__/{m55.test.d.ts → installHostDeps.test.d.ts} +0 -0
  235. /package/dist/__tests__/{middleware.test.d.ts → whitelistedBackend.test.d.ts} +0 -0
@@ -1,27 +1,15 @@
1
- import { SandboxManager } from "../sandbox/manager.js";
2
- import { FileSync } from "../sandbox/sync.js";
3
- export interface ToolResult {
4
- content: string;
5
- metadata?: Record<string, any>;
6
- isError?: boolean;
7
- }
8
- export interface DynamicToolInterface {
9
- name: string;
10
- description: string;
11
- schema: Record<string, any>;
12
- execute: (args: any) => Promise<ToolResult> | ToolResult;
13
- }
14
- /**
15
- * Binds the tools to a SandboxManager and FileSync instance.
16
- * Must be called at session start before any tool executions.
17
- */
18
- export declare function bindSandbox(sandbox: SandboxManager, fileSync: FileSync): void;
19
- /**
20
- * Security: Validates that a resolved path is strictly inside the given workspace dir.
21
- * Prevents directory traversal attacks from accessing sensitive host files.
22
- */
23
- export declare function isPathInsideWorkspace(resolvedPath: string, workspaceDir?: string): boolean;
24
- export declare const BashTool: DynamicToolInterface;
25
- export declare const ReadFileTool: DynamicToolInterface;
26
- export declare const WriteFileTool: DynamicToolInterface;
27
- export declare const CORE_TOOLS: DynamicToolInterface[];
1
+ import { bindSandbox } from "./bashTool.js";
2
+ export { bindSandbox };
3
+ export declare const CORE_TOOLS: (import("langchain").DynamicStructuredTool<import("zod").ZodObject<{
4
+ command: import("zod").ZodString;
5
+ }, import("zod/v4/core").$strip>, {
6
+ command: string;
7
+ }, {
8
+ command: string;
9
+ }, string, "install_host_dependencies"> | import("langchain").DynamicStructuredTool<import("zod").ZodObject<{
10
+ command: import("zod").ZodString;
11
+ }, import("zod/v4/core").$strip>, {
12
+ command: string;
13
+ }, {
14
+ command: string;
15
+ }, string, "bash">)[];
@@ -1,184 +1,12 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- // ─── Configuration ──────────────────────────────────────────────────────────────
4
- /** Maximum file size (in bytes) the agent is allowed to read into context. */
5
- const MAX_FILE_SIZE_BYTES = 512 * 1024; // 512 KB
6
- /** Maximum number of lines to return if file exceeds line limit. */
7
- const MAX_FILE_LINES = 2000;
8
- // ─── Sandbox reference (set at session start) ───────────────────────────────────
9
- let _sandboxManager = null;
10
- let _fileSync = null;
11
- /**
12
- * Binds the tools to a SandboxManager and FileSync instance.
13
- * Must be called at session start before any tool executions.
14
- */
15
- export function bindSandbox(sandbox, fileSync) {
16
- _sandboxManager = sandbox;
17
- _fileSync = fileSync;
18
- }
19
- /**
20
- * Security: Validates that a resolved path is strictly inside the given workspace dir.
21
- * Prevents directory traversal attacks from accessing sensitive host files.
22
- */
23
- export function isPathInsideWorkspace(resolvedPath, workspaceDir = process.cwd()) {
24
- const normalizedWorkspace = path.resolve(workspaceDir);
25
- // path.relative returns a path relative to the first argument.
26
- // If it starts with '..' or is absolute, it means resolvedPath has escaped normalizedWorkspace.
27
- const relative = path.relative(normalizedWorkspace, resolvedPath);
28
- return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
29
- }
30
- // ─── BashTool ───────────────────────────────────────────────────────────────────
31
- // Executes shell commands inside the E2B sandbox.
32
- // The ToolRouter routes this to SANDBOX — the host machine is never exposed.
33
- export const BashTool = {
34
- name: "bash",
35
- description: "Runs a shell command inside an isolated sandbox. Use for tests, scripts, or installing dependencies. The host machine is never exposed.",
36
- schema: {
37
- type: "object",
38
- properties: {
39
- command: {
40
- type: "string",
41
- description: "The shell command to execute",
42
- },
43
- },
44
- required: ["command"],
45
- },
46
- execute: async (args) => {
47
- if (!_sandboxManager || !_sandboxManager.isActive()) {
48
- throw new Error("Sandbox is not active. Cannot execute bash commands without an active sandbox session.");
49
- }
50
- // Sync any dirty files from host → sandbox before executing
51
- if (_fileSync && _fileSync.pendingCount() > 0) {
52
- await _fileSync.syncToSandbox(_sandboxManager);
53
- }
54
- const result = await _sandboxManager.exec(args.command);
55
- if (result.exitCode !== 0) {
56
- return {
57
- content: `Command failed (exit code ${result.exitCode}):\nSTDOUT:\n${result.stdout}\nSTDERR:\n${result.stderr}`,
58
- metadata: { exitCode: result.exitCode },
59
- isError: true
60
- };
61
- }
62
- return {
63
- content: result.stdout || "(no output)",
64
- metadata: { exitCode: result.exitCode },
65
- isError: false
66
- };
67
- },
68
- };
69
- // ─── ReadFileTool ───────────────────────────────────────────────────────────────
70
- // Reads files from the HOST filesystem (so the user's real project is visible).
71
- // Includes a built-in file size guardrail to prevent sending huge files to the LLM.
72
- export const ReadFileTool = {
73
- name: "read_file",
74
- description: "Reads a file from the host filesystem. Includes a file size guardrail — files over 512KB are truncated to prevent context overflow.",
75
- schema: {
76
- type: "object",
77
- properties: {
78
- path: {
79
- type: "string",
80
- description: "Absolute or relative path to the file",
81
- },
82
- startLine: {
83
- type: "number",
84
- description: "Optional 1-indexed start line for partial reads",
85
- },
86
- endLine: {
87
- type: "number",
88
- description: "Optional 1-indexed end line for partial reads",
89
- },
90
- },
91
- required: ["path"],
92
- },
93
- execute: async (args) => {
94
- const filePath = path.resolve(args.path);
95
- // ── Security Guardrail ──
96
- if (!isPathInsideWorkspace(filePath)) {
97
- return {
98
- content: `Security Error: Access Denied. Cannot read files outside the current project workspace (${process.cwd()}).`,
99
- isError: true
100
- };
101
- }
102
- // ── Check existence ──
103
- if (!fs.existsSync(filePath)) {
104
- return {
105
- content: `Error: File not found — ${filePath}`,
106
- isError: true
107
- };
108
- }
109
- // ── File Size Guardrail ──
110
- const stat = fs.statSync(filePath);
111
- if (stat.size > MAX_FILE_SIZE_BYTES) {
112
- return {
113
- content: `Error: File too large (${Math.round(stat.size / 1024)}KB). Maximum size is 512KB. Use line ranges or grep_search.`,
114
- isError: true
115
- };
116
- }
117
- const fileContent = fs.readFileSync(filePath, "utf-8");
118
- const lines = fileContent.split("\n");
119
- if (args.startLine !== undefined || args.endLine !== undefined) {
120
- const start = Math.max(1, args.startLine ?? 1) - 1;
121
- const end = Math.min(lines.length, args.endLine ?? lines.length);
122
- const sliced = lines.slice(start, end);
123
- return { content: sliced.map((line, i) => `${start + i + 1}: ${line}`).join("\n") };
124
- }
125
- // ── Line count guardrail ──
126
- if (lines.length > MAX_FILE_LINES) {
127
- const truncated = lines.slice(0, MAX_FILE_LINES);
128
- return {
129
- content: truncated.map((line, i) => `${i + 1}: ${line}`).join("\n") +
130
- `\n\n--- Truncated at ${MAX_FILE_LINES} lines (total: ${lines.length}) ---`
131
- };
132
- }
133
- return { content: fileContent };
134
- },
135
- };
136
- // ─── WriteFileTool ──────────────────────────────────────────────────────────────
137
- // Writes files to the HOST filesystem (so the user sees changes in their IDE).
138
- // Marks written files as dirty so FileSync uploads them before sandbox execution.
139
- export const WriteFileTool = {
140
- name: "write_file",
141
- description: "Writes content to a file on the host filesystem. The user will see changes in their IDE immediately. The file is automatically synced to the sandbox before the next command execution.",
142
- schema: {
143
- type: "object",
144
- properties: {
145
- path: {
146
- type: "string",
147
- description: "Absolute or relative path to the file",
148
- },
149
- content: {
150
- type: "string",
151
- description: "The full file content to write",
152
- },
153
- },
154
- required: ["path", "content"],
155
- },
156
- execute: async (args) => {
157
- const filePath = path.resolve(args.path);
158
- // ── Security Guardrail ──
159
- if (!isPathInsideWorkspace(filePath)) {
160
- return {
161
- content: `Security Error: Access Denied. Cannot write files outside the current project workspace (${process.cwd()}).`,
162
- isError: true
163
- };
164
- }
165
- // Create parent directories if needed
166
- const dir = path.dirname(filePath);
167
- if (!fs.existsSync(dir)) {
168
- fs.mkdirSync(dir, { recursive: true });
169
- }
170
- fs.writeFileSync(filePath, args.content, "utf-8");
171
- // Mark file as dirty for next sandbox sync
172
- if (_fileSync) {
173
- _fileSync.markDirty(filePath);
174
- }
175
- return { content: `File written: ${filePath}` };
176
- },
177
- };
178
- // ─── Core Tool Set ──────────────────────────────────────────────────────────────
1
+ import { installHostDependenciesTool } from "./installHostDeps.js";
2
+ import { bashTool, bindSandbox } from "./bashTool.js";
3
+ // Re-export bindSandbox so index.ts can initialize it
4
+ export { bindSandbox };
5
+ // The core custom tools that the agent needs.
6
+ // Note: File I/O (read_file, write_file, edit_file, ls, grep) and Subagents
7
+ // are provided natively by Deep Agents via the FilesystemBackend and createSubAgentMiddleware.
179
8
  export const CORE_TOOLS = [
180
- BashTool,
181
- ReadFileTool,
182
- WriteFileTool,
9
+ bashTool,
10
+ installHostDependenciesTool,
183
11
  ];
184
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEtD,sDAAsD;AACtD,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,8CAA8C;AAC9C,4EAA4E;AAC5E,+FAA+F;AAC/F,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,QAAQ;IACR,2BAA2B;CAC9B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export declare const installHostDependenciesTool: import("langchain").DynamicStructuredTool<z.ZodObject<{
3
+ command: z.ZodString;
4
+ }, z.core.$strip>, {
5
+ command: string;
6
+ }, {
7
+ command: string;
8
+ }, string, "install_host_dependencies">;
@@ -0,0 +1,44 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { tool } from "langchain";
4
+ import { z } from "zod";
5
+ const execAsync = promisify(exec);
6
+ const ALLOWED_INSTALLERS = {
7
+ npm: new Set(["install", "i", "ci", "add"]),
8
+ yarn: new Set(["add", "install"]),
9
+ pnpm: new Set(["add", "install", "i"]),
10
+ pip: new Set(["install"]),
11
+ pip3: new Set(["install"]),
12
+ cargo: new Set(["add", "install"]),
13
+ poetry: new Set(["add", "install"]),
14
+ gem: new Set(["install"]),
15
+ composer: new Set(["require", "install"]),
16
+ go: new Set(["get", "install"]),
17
+ bun: new Set(["add", "install"]),
18
+ };
19
+ export const installHostDependenciesTool = tool(async ({ command }) => {
20
+ const trimmedCmd = command.trim();
21
+ const parts = trimmedCmd.split(/\s+/);
22
+ const bin = parts[0];
23
+ const subcmd = parts[1];
24
+ if (!ALLOWED_INSTALLERS[bin] || !ALLOWED_INSTALLERS[bin].has(subcmd)) {
25
+ return `Security Error: Command '${bin} ${subcmd}' is not allowed. Only dependency installation commands (like 'npm install') are permitted by this tool.`;
26
+ }
27
+ if (/[&|;`$]/.test(trimmedCmd)) {
28
+ return `Security Error: Command contains forbidden shell operators (&, |, ;, \`, $).`;
29
+ }
30
+ try {
31
+ const { stdout, stderr } = await execAsync(command, { cwd: process.cwd() });
32
+ return `Successfully ran on host:\nSTDOUT:\n${stdout}\nSTDERR:\n${stderr}`;
33
+ }
34
+ catch (error) {
35
+ return `Host command failed (exit code ${error.code}):\nSTDOUT:\n${error.stdout}\nSTDERR:\n${error.stderr}\nMESSAGE:\n${error.message}`;
36
+ }
37
+ }, {
38
+ name: "install_host_dependencies",
39
+ description: "Installs dependencies natively on the host OS (e.g. npm install, pip install). Use this carefully to bootstrap projects outside the sandbox. This runs directly on the user's machine.",
40
+ schema: z.object({
41
+ command: z.string().describe("The native installation command (e.g., 'npm install express')"),
42
+ }),
43
+ });
44
+ //# sourceMappingURL=installHostDeps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installHostDeps.js","sourceRoot":"","sources":["../../src/tools/installHostDeps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,kBAAkB,GAAgC;IACpD,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACjC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACtC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACzB,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1B,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAClC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACzB,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/B,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAC3C,KAAK,EAAE,EAAE,OAAO,EAAuB,EAAE,EAAE;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,OAAO,4BAA4B,GAAG,IAAI,MAAM,0GAA0G,CAAC;IAC/J,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,8EAA8E,CAAC;IAC1F,CAAC;IAED,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5E,OAAO,uCAAuC,MAAM,cAAc,MAAM,EAAE,CAAC;IAC/E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,kCAAkC,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC;IAC5I,CAAC;AACL,CAAC,EACD;IACI,IAAI,EAAE,2BAA2B;IACjC,WAAW,EACP,wLAAwL;IAC5L,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;KAChG,CAAC;CACL,CACJ,CAAC"}
@@ -22,6 +22,7 @@ export declare class SessionTracer {
22
22
  promptTokens: number;
23
23
  completionTokens: number;
24
24
  cached: boolean;
25
+ cachedTokens?: number;
25
26
  duration: number;
26
27
  model?: string;
27
28
  }): void;
@@ -79,7 +79,10 @@ export class SessionTracer {
79
79
  case "llm_call":
80
80
  promptTokens += event.data.promptTokens || 0;
81
81
  completionTokens += event.data.completionTokens || 0;
82
- if (event.data.cached) {
82
+ if (event.data.cachedTokens !== undefined) {
83
+ cachedPromptTokens += event.data.cachedTokens;
84
+ }
85
+ else if (event.data.cached) {
83
86
  cachedPromptTokens += event.data.promptTokens || 0;
84
87
  }
85
88
  turnCount++;
@@ -1 +1 @@
1
- {"version":3,"file":"sessionTracer.js","sourceRoot":"","sources":["../../src/tracing/sessionTracer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionTracer.js","sourceRoot":"","sources":["../../src/tracing/sessionTracer.ts"],"names":[],"mappings":"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"}
package/dist/ui/App.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useState, useEffect, useMemo } from "react";
3
- import { Box, Text, useInput, useApp } from "ink";
3
+ import { Box, Text, useInput, useApp, Static } from "ink";
4
4
  import TextInput from "ink-text-input";
5
5
  import { Header } from "./components/Header.js";
6
6
  import { StatusBar } from "./components/StatusBar.js";
@@ -8,12 +8,16 @@ import { MessageBubble } from "./components/MessageBubble.js";
8
8
  import { StreamingText } from "./components/StreamingText.js";
9
9
  import { ToolCallPanel } from "./components/ToolCallPanel.js";
10
10
  import { HITLPrompt } from "./components/HITLPrompt.js";
11
+ import { FileBrowser } from "./components/FileBrowser.js";
11
12
  import { countMessageTokens } from "../core/tokenCounter.js";
13
+ import { getProviderContextLimit } from "../core/contextGuard.js";
12
14
  import { HumanMessage } from "@langchain/core/messages";
15
+ import { Command } from "@langchain/langgraph";
13
16
  import { HITLBridge, } from "../hitl/bridge.js";
14
17
  import { createDefaultRegistry } from "../commands/builtinCommands.js";
15
18
  export const App = ({ provider, model, streaming, harness, initialState, maxTokens, }) => {
16
19
  const { exit } = useApp();
20
+ const contextTokensLimit = useMemo(() => getProviderContextLimit(provider, model), [provider, model]);
17
21
  // Slash Command Registry — initialized once, stable across renders
18
22
  const commandRegistry = useMemo(() => createDefaultRegistry(), []);
19
23
  // UI State
@@ -50,6 +54,45 @@ export const App = ({ provider, model, streaming, harness, initialState, maxToke
50
54
  bridge.off("permission", onPermission);
51
55
  };
52
56
  }, []);
57
+ // Listen for agent events to inject as system messages
58
+ useEffect(() => {
59
+ const handleEvent = (event) => {
60
+ // Ignore text streams so we don't spam the action log
61
+ if (event.type === "agent:stream")
62
+ return;
63
+ let content = "";
64
+ switch (event.type) {
65
+ case "tool:start":
66
+ content = `[Tool] Starting ${event.toolName}`;
67
+ break;
68
+ case "tool:end":
69
+ content = `[Tool] ${event.toolName} completed in ${event.durationMs}ms`;
70
+ break;
71
+ case "subagent:spawn":
72
+ content = `[SubAgent] Spawning '${event.agentName}'`;
73
+ break;
74
+ case "file:io":
75
+ content = `[File] ${event.action.toUpperCase()}: ${event.path.split(/[\\\\/]/).pop()}`;
76
+ break;
77
+ case "system:script_exec":
78
+ content = `[Exec] ${event.location}: ${event.command.slice(0, 30)}...`;
79
+ break;
80
+ case "browser:nav":
81
+ content = `[Browser] Navigating to ${event.url}`;
82
+ break;
83
+ case "system:save":
84
+ content = `[System] Saved Session State`;
85
+ break;
86
+ default:
87
+ content = `[Unknown] Event type: ${event.type}`;
88
+ }
89
+ setMessages((prev) => [...prev, { role: "system", content }]);
90
+ };
91
+ harness.on("agent:event", handleEvent);
92
+ return () => {
93
+ harness.off("agent:event", handleEvent);
94
+ };
95
+ }, [harness]);
53
96
  // StatusBar Metrics
54
97
  const [startTime] = useState(Date.now());
55
98
  const [elapsed, setElapsed] = useState("0s");
@@ -105,70 +148,83 @@ export const App = ({ provider, model, streaming, harness, initialState, maxToke
105
148
  performGracefulExit();
106
149
  }
107
150
  });
108
- const runAgentLoop = async (currentState) => {
151
+ const runAgentLoop = async (currentState, resumeCommand) => {
109
152
  try {
110
- setIsStreaming(true);
111
- setStreamingTokens([]);
112
- let aiResponse;
113
- if (streaming) {
114
- aiResponse = await harness.streamStep(currentState, {
115
- onToken: (token) => {
116
- setStreamingTokens((prev) => [...prev, token]);
117
- },
118
- });
119
- }
120
- else {
121
- aiResponse = await harness.step(currentState);
122
- }
123
- setIsStreaming(false);
124
- // Add AI text to UI if any
125
- if (aiResponse.content &&
126
- typeof aiResponse.content === "string" &&
127
- aiResponse.content.trim() !== "") {
128
- setMessages((prev) => [
129
- ...prev,
130
- { role: "agent", content: aiResponse.content },
131
- ]);
153
+ if (!resumeCommand) {
154
+ setIsProcessing(true);
155
+ setIsStreaming(true);
156
+ setStreamingTokens([]);
132
157
  }
133
- // Add AI message to memory for following tools
134
- let nextHistory = [...currentState.conversationHistory, aiResponse];
135
- // Handle Tools
136
- if (aiResponse.tool_calls && aiResponse.tool_calls.length > 0) {
137
- // Execute all tool calls once
138
- const toolMessages = await harness.executeToolCalls(aiResponse, currentState);
139
- // Update UI sequentially for each tool call
140
- for (const call of aiResponse.tool_calls) {
158
+ const stream = harness.run(currentState, resumeCommand);
159
+ let nextHistory = [...currentState.conversationHistory];
160
+ let finalState = null;
161
+ for await (const event of stream) {
162
+ if (event.event === "on_chat_model_stream" &&
163
+ event.data?.chunk?.content) {
164
+ setStreamingTokens((prev) => [...prev, event.data.chunk.content]);
165
+ }
166
+ else if (event.event === "on_chat_model_end") {
167
+ const content = event.data.output?.content;
168
+ if (content && typeof content === "string") {
169
+ setIsStreaming(false);
170
+ setMessages((prev) => [...prev, { role: "agent", content }]);
171
+ }
172
+ }
173
+ else if (event.event === "on_tool_start") {
141
174
  setActiveToolCall({
142
- name: call.name,
143
- args: call.args,
175
+ name: event.name,
176
+ args: event.data.input,
144
177
  status: "running",
145
178
  });
146
- // Brief delay to show running state
147
- await new Promise((resolve) => setTimeout(resolve, 300));
179
+ }
180
+ else if (event.event === "on_tool_end") {
181
+ // Note: we don't display the full tool output as result since it can be massive.
148
182
  setActiveToolCall({
149
- name: call.name,
150
- args: call.args,
183
+ name: event.name,
184
+ args: event.data.input,
151
185
  status: "success",
152
- result: toolMessages.length > 0
153
- ? "Tool execution completed."
154
- : "No output.",
186
+ result: "Tool execution completed.",
155
187
  });
188
+ await new Promise((resolve) => setTimeout(resolve, 800));
189
+ setActiveToolCall(null);
190
+ }
191
+ else if (event.event === "on_chain_end" &&
192
+ event.name === "LangGraph") {
193
+ finalState = event.data.output;
156
194
  }
157
- // Add tool results to history once
158
- nextHistory = [...nextHistory, ...toolMessages];
159
- // Wait a sec so user sees the success state
160
- await new Promise((resolve) => setTimeout(resolve, 800));
161
- setActiveToolCall(null);
162
- // Recurse: Agent needs to react to the tool output
163
- const nextState = { ...currentState, conversationHistory: nextHistory };
164
- setContextState(nextState);
165
- await runAgentLoop(nextState);
166
195
  }
167
- else {
168
- // Turn complete
169
- setContextState({ ...currentState, conversationHistory: nextHistory });
170
- setIsProcessing(false);
196
+ // ── Handle LangGraph Interrupts (HITL) ──
197
+ // Check if the agent paused for permission
198
+ const stateObj = await harness.agent.getState({
199
+ configurable: { thread_id: harness.sessionId },
200
+ });
201
+ if (stateObj.next && stateObj.next.length > 0) {
202
+ const tasks = stateObj.tasks || [];
203
+ const activeTask = tasks[0];
204
+ if (activeTask &&
205
+ activeTask.interrupts &&
206
+ activeTask.interrupts.length > 0) {
207
+ const interruptPayload = activeTask.interrupts[0].value;
208
+ const toolName = interruptPayload?.toolCall?.name || "restricted_tool";
209
+ const args = interruptPayload?.toolCall?.args || {};
210
+ const bridge = HITLBridge.getInstance();
211
+ const approved = await bridge.requestPermission(toolName, args);
212
+ const resumePayload = approved
213
+ ? { action: "approve" }
214
+ : { action: "reject" };
215
+ const command = new Command({ resume: resumePayload });
216
+ // Recurse to resume the graph
217
+ await runAgentLoop(currentState, command);
218
+ return;
219
+ }
220
+ }
221
+ // Turn complete
222
+ if (finalState && finalState.messages) {
223
+ nextHistory = finalState.messages;
171
224
  }
225
+ setContextState({ ...currentState, conversationHistory: nextHistory });
226
+ setIsProcessing(false);
227
+ setIsStreaming(false);
172
228
  }
173
229
  catch (error) {
174
230
  setIsStreaming(false);
@@ -207,6 +263,7 @@ export const App = ({ provider, model, streaming, harness, initialState, maxToke
207
263
  provider,
208
264
  model,
209
265
  maxTokens,
266
+ contextTokens: contextTokensLimit,
210
267
  };
211
268
  try {
212
269
  const result = await commandRegistry.execute(userText, commandContext);
@@ -250,6 +307,10 @@ export const App = ({ provider, model, streaming, harness, initialState, maxToke
250
307
  };
251
308
  const summary = harness.tracer.getSummary();
252
309
  const contextTokens = countMessageTokens(contextState.conversationHistory);
253
- return (_jsxs(Box, { flexDirection: "column", minHeight: 15, children: [_jsx(Header, { provider: provider, model: model, streaming: streaming }), _jsx(Box, { flexDirection: "column", paddingY: 1, children: messages.map((msg, i) => (_jsx(MessageBubble, { role: msg.role, content: msg.content }, i))) }), isStreaming && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsx(Box, { marginLeft: 2, children: _jsx(StreamingText, { tokens: streamingTokens, isStreaming: isStreaming }) }) })), activeToolCall && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsx(ToolCallPanel, { toolName: activeToolCall.name, args: activeToolCall.args, status: activeToolCall.status, result: activeToolCall.result }) })), (hitlQuestion || hitlPermission) && (_jsx(HITLPrompt, { question: hitlQuestion, permission: hitlPermission })), !isProcessing && !hitlQuestion && !hitlPermission && (_jsxs(Box, { paddingX: 1, marginBottom: 1, children: [_jsx(Box, { marginRight: 1, children: _jsx(Text, { color: "green", bold: true, children: "\u276F" }) }), _jsx(TextInput, { value: inputValue, onChange: setInputValue, onSubmit: handleSubmit, placeholder: "What should we build today?" })] })), isProcessing && !isStreaming && !activeToolCall && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsx(Text, { dimColor: true, children: "Thinking..." }) })), _jsx(StatusBar, { contextTokens: contextTokens, maxContextTokens: maxTokens, totalTokens: summary.totalTokens, cacheHitRate: summary.cacheHitRate, toolCalls: summary.toolCallCount, turns: summary.turnCount, cost: summary.totalCost, elapsed: elapsed })] }));
310
+ return (_jsxs(Box, { flexDirection: "column", minHeight: 15, children: [_jsx(Header, { provider: provider, model: model, streaming: streaming }), _jsxs(Box, { flexDirection: "row", flexGrow: 1, width: "100%", children: [_jsxs(Box, { flexDirection: "column", width: "65%", paddingRight: 1, children: [_jsx(Box, { flexDirection: "column", paddingY: 1, children: _jsx(Static, { items: messages, children: (msg, i) => (_jsx(MessageBubble, { role: msg.role, content: msg.content }, i)) }) }), isStreaming && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsx(Box, { marginLeft: 2, children: _jsx(StreamingText, { tokens: streamingTokens, isStreaming: isStreaming }) }) })), activeToolCall && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsx(ToolCallPanel, { toolName: activeToolCall.name, args: activeToolCall.args, status: activeToolCall.status, result: activeToolCall.result }) })), (hitlQuestion || hitlPermission) && (_jsx(HITLPrompt, { question: hitlQuestion, permission: hitlPermission })), !isProcessing && !hitlQuestion && !hitlPermission && (_jsxs(Box, { paddingX: 1, marginBottom: 1, children: [_jsx(Box, { marginRight: 1, children: _jsx(Text, { color: "green", bold: true, children: "\u276F" }) }), _jsx(TextInput, { value: inputValue, onChange: setInputValue, onSubmit: handleSubmit, placeholder: "What should we build today?" })] })), isProcessing &&
311
+ !isStreaming &&
312
+ !activeToolCall &&
313
+ !hitlQuestion &&
314
+ !hitlPermission && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsx(Text, { dimColor: true, children: "Thinking..." }) }))] }), _jsxs(Box, { flexDirection: "column", width: "35%", paddingLeft: 1, children: [_jsx(StatusBar, { contextTokens: contextTokens, maxContextTokens: contextTokensLimit, totalTokens: summary.totalTokens, cacheHitRate: summary.cacheHitRate, toolCalls: summary.toolCallCount, turns: summary.turnCount, cost: summary.totalCost, elapsed: elapsed }), _jsx(Box, { marginTop: 1, children: _jsx(FileBrowser, {}) })] })] })] }));
254
315
  };
255
316
  //# sourceMappingURL=App.js.map