joonecli 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/__tests__/config.test.js +1 -0
  2. package/dist/__tests__/config.test.js.map +1 -1
  3. package/dist/__tests__/installHostDeps.test.js +45 -0
  4. package/dist/__tests__/installHostDeps.test.js.map +1 -0
  5. package/dist/__tests__/whitelistedBackend.test.js +18 -0
  6. package/dist/__tests__/whitelistedBackend.test.js.map +1 -0
  7. package/dist/cli/config.d.ts +2 -0
  8. package/dist/cli/config.js +1 -0
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/index.js +84 -100
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/core/agentLoop.d.ts +10 -29
  13. package/dist/core/agentLoop.js +66 -237
  14. package/dist/core/agentLoop.js.map +1 -1
  15. package/dist/core/promptBuilder.js.map +1 -1
  16. package/dist/hitl/bridge.js +1 -27
  17. package/dist/hitl/bridge.js.map +1 -1
  18. package/dist/middleware/loopDetection.d.ts +7 -23
  19. package/dist/middleware/loopDetection.js +38 -42
  20. package/dist/middleware/loopDetection.js.map +1 -1
  21. package/dist/sandbox/whitelistedBackend.d.ts +5 -0
  22. package/dist/sandbox/whitelistedBackend.js +27 -0
  23. package/dist/sandbox/whitelistedBackend.js.map +1 -0
  24. package/dist/tools/askUser.d.ts +12 -3
  25. package/dist/tools/askUser.js +16 -28
  26. package/dist/tools/askUser.js.map +1 -1
  27. package/dist/tools/bashTool.d.ts +11 -0
  28. package/dist/tools/bashTool.js +51 -0
  29. package/dist/tools/bashTool.js.map +1 -0
  30. package/dist/tools/index.d.ts +15 -28
  31. package/dist/tools/index.js +9 -189
  32. package/dist/tools/index.js.map +1 -1
  33. package/dist/tools/installHostDeps.d.ts +8 -2
  34. package/dist/tools/installHostDeps.js +38 -31
  35. package/dist/tools/installHostDeps.js.map +1 -1
  36. package/dist/ui/App.js +112 -56
  37. package/dist/ui/App.js.map +1 -1
  38. package/dist/ui/components/MessageBubble.js +1 -1
  39. package/dist/ui/components/MessageBubble.js.map +1 -1
  40. package/package.json +7 -2
  41. package/dist/__tests__/m55.test.js +0 -160
  42. package/dist/__tests__/m55.test.js.map +0 -1
  43. package/dist/__tests__/middleware.test.js +0 -169
  44. package/dist/__tests__/middleware.test.js.map +0 -1
  45. package/dist/__tests__/optimizations.test.d.ts +0 -1
  46. package/dist/__tests__/optimizations.test.js +0 -136
  47. package/dist/__tests__/optimizations.test.js.map +0 -1
  48. package/dist/__tests__/security.test.d.ts +0 -1
  49. package/dist/__tests__/security.test.js +0 -86
  50. package/dist/__tests__/security.test.js.map +0 -1
  51. package/dist/__tests__/streaming.test.d.ts +0 -1
  52. package/dist/__tests__/streaming.test.js +0 -71
  53. package/dist/__tests__/streaming.test.js.map +0 -1
  54. package/dist/__tests__/toolRouter.test.d.ts +0 -1
  55. package/dist/__tests__/toolRouter.test.js +0 -37
  56. package/dist/__tests__/toolRouter.test.js.map +0 -1
  57. package/dist/__tests__/tools.test.d.ts +0 -1
  58. package/dist/__tests__/tools.test.js +0 -112
  59. package/dist/__tests__/tools.test.js.map +0 -1
  60. package/dist/core/subAgent.d.ts +0 -56
  61. package/dist/core/subAgent.js +0 -240
  62. package/dist/core/subAgent.js.map +0 -1
  63. package/dist/debug_google.d.ts +0 -1
  64. package/dist/debug_google.js +0 -23
  65. package/dist/debug_google.js.map +0 -1
  66. package/dist/middleware/commandSanitizer.d.ts +0 -18
  67. package/dist/middleware/commandSanitizer.js +0 -50
  68. package/dist/middleware/commandSanitizer.js.map +0 -1
  69. package/dist/middleware/permission.d.ts +0 -17
  70. package/dist/middleware/permission.js +0 -60
  71. package/dist/middleware/permission.js.map +0 -1
  72. package/dist/middleware/pipeline.d.ts +0 -31
  73. package/dist/middleware/pipeline.js +0 -62
  74. package/dist/middleware/pipeline.js.map +0 -1
  75. package/dist/middleware/preCompletion.d.ts +0 -29
  76. package/dist/middleware/preCompletion.js +0 -82
  77. package/dist/middleware/preCompletion.js.map +0 -1
  78. package/dist/middleware/types.d.ts +0 -40
  79. package/dist/middleware/types.js +0 -8
  80. package/dist/middleware/types.js.map +0 -1
  81. package/dist/skills/loader.d.ts +0 -55
  82. package/dist/skills/loader.js +0 -132
  83. package/dist/skills/loader.js.map +0 -1
  84. package/dist/skills/tools.d.ts +0 -5
  85. package/dist/skills/tools.js +0 -78
  86. package/dist/skills/tools.js.map +0 -1
  87. package/dist/test_cache.d.ts +0 -1
  88. package/dist/test_cache.js +0 -55
  89. package/dist/test_cache.js.map +0 -1
  90. package/dist/test_google.d.ts +0 -1
  91. package/dist/test_google.js +0 -36
  92. package/dist/test_google.js.map +0 -1
  93. package/dist/tools/browser.d.ts +0 -19
  94. package/dist/tools/browser.js +0 -114
  95. package/dist/tools/browser.js.map +0 -1
  96. package/dist/tools/registry.d.ts +0 -31
  97. package/dist/tools/registry.js +0 -168
  98. package/dist/tools/registry.js.map +0 -1
  99. package/dist/tools/router.d.ts +0 -34
  100. package/dist/tools/router.js +0 -76
  101. package/dist/tools/router.js.map +0 -1
  102. package/dist/tools/security.d.ts +0 -28
  103. package/dist/tools/security.js +0 -183
  104. package/dist/tools/security.js.map +0 -1
  105. package/dist/tools/spawnAgent.d.ts +0 -19
  106. package/dist/tools/spawnAgent.js +0 -132
  107. package/dist/tools/spawnAgent.js.map +0 -1
  108. package/dist/tools/webSearch.d.ts +0 -6
  109. package/dist/tools/webSearch.js +0 -120
  110. package/dist/tools/webSearch.js.map +0 -1
  111. /package/dist/__tests__/{m55.test.d.ts → installHostDeps.test.d.ts} +0 -0
  112. /package/dist/__tests__/{middleware.test.d.ts → whitelistedBackend.test.d.ts} +0 -0
@@ -1,10 +1,19 @@
1
- import { DynamicToolInterface } from "./index.js";
1
+ import { z } from "zod";
2
2
  /**
3
- * AskUserQuestionTool — allows the agent to ask the user a clarifying question mid-turn.
3
+ * askUserQuestionTool — allows the agent to ask the user a clarifying question mid-turn.
4
4
  *
5
5
  * Use cases:
6
6
  * - Resolving ambiguous requirements before coding.
7
7
  * - Getting user preferences (framework choice, styling, naming).
8
8
  * - Requesting approval of an implementation plan before proceeding.
9
9
  */
10
- export declare const AskUserQuestionTool: DynamicToolInterface;
10
+ export declare const askUserQuestionTool: import("langchain").DynamicStructuredTool<z.ZodObject<{
11
+ question: z.ZodString;
12
+ options: z.ZodOptional<z.ZodArray<z.ZodString>>;
13
+ }, z.core.$strip>, {
14
+ question: string;
15
+ options?: string[];
16
+ }, {
17
+ question: string;
18
+ options?: string[] | undefined;
19
+ }, string, "ask_user_question">;
@@ -1,42 +1,30 @@
1
1
  import { HITLBridge } from "../hitl/bridge.js";
2
+ import { tool } from "langchain";
3
+ import { z } from "zod";
2
4
  /**
3
- * AskUserQuestionTool — allows the agent to ask the user a clarifying question mid-turn.
5
+ * askUserQuestionTool — allows the agent to ask the user a clarifying question mid-turn.
4
6
  *
5
7
  * Use cases:
6
8
  * - Resolving ambiguous requirements before coding.
7
9
  * - Getting user preferences (framework choice, styling, naming).
8
10
  * - Requesting approval of an implementation plan before proceeding.
9
11
  */
10
- export const AskUserQuestionTool = {
12
+ export const askUserQuestionTool = tool(async ({ question, options }) => {
13
+ if (!question || question.trim() === "") {
14
+ return "Error: You must provide a non-empty question.";
15
+ }
16
+ const bridge = HITLBridge.getInstance();
17
+ const answer = await bridge.askUser(question, options);
18
+ return answer;
19
+ }, {
11
20
  name: "ask_user_question",
12
21
  description: "Ask the user a question and wait for their response. " +
13
22
  "Use this when you need clarification on the task, user preferences, " +
14
23
  "or approval before proceeding with a significant change. " +
15
24
  "You may optionally provide a list of answer choices.",
16
- schema: {
17
- type: "object",
18
- properties: {
19
- question: {
20
- type: "string",
21
- description: "The question to ask the user.",
22
- },
23
- options: {
24
- type: "array",
25
- items: { type: "string" },
26
- description: "Optional list of predefined answer choices.",
27
- },
28
- },
29
- required: ["question"],
30
- },
31
- async execute(args) {
32
- const question = args.question;
33
- const options = args.options;
34
- if (!question || question.trim() === "") {
35
- return { content: "Error: You must provide a non-empty question.", isError: true };
36
- }
37
- const bridge = HITLBridge.getInstance();
38
- const answer = await bridge.askUser(question, options);
39
- return { content: answer };
40
- },
41
- };
25
+ schema: z.object({
26
+ question: z.string().describe("The question to ask the user."),
27
+ options: z.array(z.string()).optional().describe("Optional list of predefined answer choices."),
28
+ }),
29
+ });
42
30
  //# sourceMappingURL=askUser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"askUser.js","sourceRoot":"","sources":["../../src/tools/askUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACrD,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACP,uDAAuD;QACvD,sEAAsE;QACtE,2DAA2D;QAC3D,sDAAsD;IAC1D,MAAM,EAAE;QACJ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACR,QAAQ,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+BAA+B;aAC/C;YACD,OAAO,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,6CAA6C;aAC7D;SACJ;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACzB;IACD,KAAK,CAAC,OAAO,CAAC,IAA6B;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAA+B,CAAC;QAErD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,+CAA+C,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvF,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;CACJ,CAAC"}
1
+ {"version":3,"file":"askUser.js","sourceRoot":"","sources":["../../src/tools/askUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CACnC,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAA4C,EAAE,EAAE;IACtE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtC,OAAO,+CAA+C,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEvD,OAAO,MAAM,CAAC;AAClB,CAAC,EACD;IACI,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACP,uDAAuD;QACvD,sEAAsE;QACtE,2DAA2D;QAC3D,sDAAsD;IAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC9D,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KAClG,CAAC;CACL,CACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from "zod";
2
+ import { SandboxManager } from "../sandbox/manager.js";
3
+ import { FileSync } from "../sandbox/sync.js";
4
+ export declare function bindSandbox(sandbox: SandboxManager, fileSync: FileSync): void;
5
+ export declare const bashTool: import("langchain").DynamicStructuredTool<z.ZodObject<{
6
+ command: z.ZodString;
7
+ }, z.core.$strip>, {
8
+ command: string;
9
+ }, {
10
+ command: string;
11
+ }, string, "bash">;
@@ -0,0 +1,51 @@
1
+ import { tool } from "langchain";
2
+ import { z } from "zod";
3
+ const BLOCKED_PATTERNS = [
4
+ // Destructive
5
+ [/rm\s+(-\w*r\w*f\w*|-\w*f\w*r\w*)\s+\/(\*)?(?:\s|$)/, "destructive: rm -rf /"],
6
+ [/mkfs\b/, "destructive: filesystem format"],
7
+ [/\bdd\s+.*of=\/dev\//, "destructive: raw disk write"],
8
+ [/chmod\s+(-\w+\s+)*777\s+\//, "dangerous: chmod 777 on root"],
9
+ // Interactive / hanging
10
+ [/\b(vim|vi|nano|emacs|pico)\b/, "interactive: text editor (hangs the sandbox)"],
11
+ [/\b(less|more)\b/, "interactive: pager (hangs the sandbox)"],
12
+ [/\b(top|htop|glances)\b/, "interactive: process monitor (hangs the sandbox)"],
13
+ [/\bman\s+\w+/, "interactive: man page (hangs the sandbox)"],
14
+ // Network abuse: pipe-to-shell
15
+ [/curl\s+.*\|\s*(sh|bash|zsh)/, "unsafe: pipe remote script to shell"],
16
+ [/wget\s+.*\|\s*(sh|bash|zsh)/, "unsafe: pipe remote script to shell"],
17
+ ];
18
+ let _sandboxManager = null;
19
+ let _fileSync = null;
20
+ export function bindSandbox(sandbox, fileSync) {
21
+ _sandboxManager = sandbox;
22
+ _fileSync = fileSync;
23
+ }
24
+ export const bashTool = tool(async ({ command }) => {
25
+ for (const [pattern, reason] of BLOCKED_PATTERNS) {
26
+ if (pattern.test(command)) {
27
+ return (`⚠ Blocked: Command rejected by sanitizer.\n` +
28
+ `Reason: ${reason}\n` +
29
+ `Command: ${command}\n` +
30
+ `Use a safer alternative or refine your approach.`);
31
+ }
32
+ }
33
+ if (!_sandboxManager || !_sandboxManager.isActive()) {
34
+ throw new Error("Sandbox is not active. Cannot execute bash commands without an active sandbox session.");
35
+ }
36
+ if (_fileSync && _fileSync.pendingCount() > 0) {
37
+ await _fileSync.syncToSandbox(_sandboxManager);
38
+ }
39
+ const result = await _sandboxManager.exec(command);
40
+ if (result.exitCode !== 0) {
41
+ return `Command failed (exit code ${result.exitCode}):\nSTDOUT:\n${result.stdout}\nSTDERR:\n${result.stderr}`;
42
+ }
43
+ return result.stdout || "(no output)";
44
+ }, {
45
+ name: "bash",
46
+ description: "Runs a shell command inside an isolated sandbox. Use for tests, scripts, or installing dependencies. The host machine is never exposed.",
47
+ schema: z.object({
48
+ command: z.string().describe("The shell command to execute"),
49
+ }),
50
+ });
51
+ //# sourceMappingURL=bashTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bashTool.js","sourceRoot":"","sources":["../../src/tools/bashTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,gBAAgB,GAAuB;IACzC,cAAc;IACd,CAAC,oDAAoD,EAAE,uBAAuB,CAAC;IAC/E,CAAC,QAAQ,EAAE,gCAAgC,CAAC;IAC5C,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;IACtD,CAAC,4BAA4B,EAAE,8BAA8B,CAAC;IAE9D,wBAAwB;IACxB,CAAC,8BAA8B,EAAE,8CAA8C,CAAC;IAChF,CAAC,iBAAiB,EAAE,wCAAwC,CAAC;IAC7D,CAAC,wBAAwB,EAAE,kDAAkD,CAAC;IAC9E,CAAC,aAAa,EAAE,2CAA2C,CAAC;IAE5D,+BAA+B;IAC/B,CAAC,6BAA6B,EAAE,qCAAqC,CAAC;IACtE,CAAC,6BAA6B,EAAE,qCAAqC,CAAC;CACzE,CAAC;AAEF,IAAI,eAAe,GAA0B,IAAI,CAAC;AAClD,IAAI,SAAS,GAAoB,IAAI,CAAC;AAEtC,MAAM,UAAU,WAAW,CAAC,OAAuB,EAAE,QAAkB;IACnE,eAAe,GAAG,OAAO,CAAC;IAC1B,SAAS,GAAG,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CACxB,KAAK,EAAE,EAAE,OAAO,EAAuB,EAAE,EAAE;IACvC,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,CACH,6CAA6C;gBAC7C,WAAW,MAAM,IAAI;gBACrB,YAAY,OAAO,IAAI;gBACvB,kDAAkD,CACrD,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACX,wFAAwF,CAC3F,CAAC;IACN,CAAC;IAED,IAAI,SAAS,IAAI,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,6BAA6B,MAAM,CAAC,QAAQ,gBAAgB,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC;IAClH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC;AAC1C,CAAC,EACD;IACI,IAAI,EAAE,MAAM;IACZ,WAAW,EACP,yIAAyI;IAC7I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KAC/D,CAAC;CACL,CACJ,CAAC"}
@@ -1,28 +1,15 @@
1
- import { SandboxManager } from "../sandbox/manager.js";
2
- import { FileSync } from "../sandbox/sync.js";
3
- import { AgentEventEmitter } from "../core/events.js";
4
- export interface ToolResult {
5
- content: string;
6
- metadata?: Record<string, any>;
7
- isError?: boolean;
8
- }
9
- export interface DynamicToolInterface {
10
- name: string;
11
- description: string;
12
- schema: Record<string, any>;
13
- execute: (args: any, emitter?: AgentEventEmitter) => Promise<ToolResult> | ToolResult;
14
- }
15
- /**
16
- * Binds the tools to a SandboxManager and FileSync instance.
17
- * Must be called at session start before any tool executions.
18
- */
19
- export declare function bindSandbox(sandbox: SandboxManager, fileSync: FileSync): void;
20
- /**
21
- * Security: Validates that a resolved path is strictly inside the given workspace dir.
22
- * Prevents directory traversal attacks from accessing sensitive host files.
23
- */
24
- export declare function isPathInsideWorkspace(resolvedPath: string, workspaceDir?: string): boolean;
25
- export declare const BashTool: DynamicToolInterface;
26
- export declare const ReadFileTool: DynamicToolInterface;
27
- export declare const WriteFileTool: DynamicToolInterface;
28
- 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,192 +1,12 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import { InstallHostDependenciesTool } from "./installHostDeps.js";
4
- // ─── Configuration ──────────────────────────────────────────────────────────────
5
- /** Maximum file size (in bytes) the agent is allowed to read into context. */
6
- const MAX_FILE_SIZE_BYTES = 512 * 1024; // 512 KB
7
- /** Maximum number of lines to return if file exceeds line limit. */
8
- const MAX_FILE_LINES = 2000;
9
- // ─── Sandbox reference (set at session start) ───────────────────────────────────
10
- let _sandboxManager = null;
11
- let _fileSync = null;
12
- /**
13
- * Binds the tools to a SandboxManager and FileSync instance.
14
- * Must be called at session start before any tool executions.
15
- */
16
- export function bindSandbox(sandbox, fileSync) {
17
- _sandboxManager = sandbox;
18
- _fileSync = fileSync;
19
- }
20
- /**
21
- * Security: Validates that a resolved path is strictly inside the given workspace dir.
22
- * Prevents directory traversal attacks from accessing sensitive host files.
23
- */
24
- export function isPathInsideWorkspace(resolvedPath, workspaceDir = process.cwd()) {
25
- const normalizedWorkspace = path.resolve(workspaceDir);
26
- // path.relative returns a path relative to the first argument.
27
- // If it starts with '..' or is absolute, it means resolvedPath has escaped normalizedWorkspace.
28
- const relative = path.relative(normalizedWorkspace, resolvedPath);
29
- return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
30
- }
31
- // ─── BashTool ───────────────────────────────────────────────────────────────────
32
- // Executes shell commands inside the E2B sandbox.
33
- // The ToolRouter routes this to SANDBOX — the host machine is never exposed.
34
- export const BashTool = {
35
- name: "bash",
36
- description: "Runs a shell command inside an isolated sandbox. Use for tests, scripts, or installing dependencies. The host machine is never exposed.",
37
- schema: {
38
- type: "object",
39
- properties: {
40
- command: {
41
- type: "string",
42
- description: "The shell command to execute",
43
- },
44
- },
45
- required: ["command"],
46
- },
47
- execute: async (args, emitter) => {
48
- if (emitter)
49
- emitter.emit("agent:event", { type: "system:script_exec", command: args.command, location: "sandbox" });
50
- if (!_sandboxManager || !_sandboxManager.isActive()) {
51
- throw new Error("Sandbox is not active. Cannot execute bash commands without an active sandbox session.");
52
- }
53
- // Sync any dirty files from host → sandbox before executing
54
- if (_fileSync && _fileSync.pendingCount() > 0) {
55
- await _fileSync.syncToSandbox(_sandboxManager);
56
- }
57
- const result = await _sandboxManager.exec(args.command);
58
- if (result.exitCode !== 0) {
59
- return {
60
- content: `Command failed (exit code ${result.exitCode}):\nSTDOUT:\n${result.stdout}\nSTDERR:\n${result.stderr}`,
61
- metadata: { exitCode: result.exitCode },
62
- isError: true
63
- };
64
- }
65
- return {
66
- content: result.stdout || "(no output)",
67
- metadata: { exitCode: result.exitCode },
68
- isError: false
69
- };
70
- },
71
- };
72
- // ─── ReadFileTool ───────────────────────────────────────────────────────────────
73
- // Reads files from the HOST filesystem (so the user's real project is visible).
74
- // Includes a built-in file size guardrail to prevent sending huge files to the LLM.
75
- export const ReadFileTool = {
76
- name: "read_file",
77
- description: "Reads a file from the host filesystem. Includes a file size guardrail — files over 512KB are truncated to prevent context overflow.",
78
- schema: {
79
- type: "object",
80
- properties: {
81
- path: {
82
- type: "string",
83
- description: "Absolute or relative path to the file",
84
- },
85
- startLine: {
86
- type: "number",
87
- description: "Optional 1-indexed start line for partial reads",
88
- },
89
- endLine: {
90
- type: "number",
91
- description: "Optional 1-indexed end line for partial reads",
92
- },
93
- },
94
- required: ["path"],
95
- },
96
- execute: async (args, emitter) => {
97
- const filePath = path.resolve(args.path);
98
- if (emitter)
99
- emitter.emit("agent:event", { type: "file:io", action: "read", path: filePath });
100
- // ── Security Guardrail ──
101
- if (!isPathInsideWorkspace(filePath)) {
102
- return {
103
- content: `Security Error: Access Denied. Cannot read files outside the current project workspace (${process.cwd()}).`,
104
- isError: true
105
- };
106
- }
107
- // ── Check existence ──
108
- if (!fs.existsSync(filePath)) {
109
- return {
110
- content: `Error: File not found — ${filePath}`,
111
- isError: true
112
- };
113
- }
114
- // ── File Size Guardrail ──
115
- const stat = fs.statSync(filePath);
116
- if (stat.size > MAX_FILE_SIZE_BYTES) {
117
- return {
118
- content: `Error: File too large (${Math.round(stat.size / 1024)}KB). Maximum size is 512KB. Use line ranges or grep_search.`,
119
- isError: true
120
- };
121
- }
122
- const fileContent = fs.readFileSync(filePath, "utf-8");
123
- const lines = fileContent.split("\n");
124
- if (args.startLine !== undefined || args.endLine !== undefined) {
125
- const start = Math.max(1, args.startLine ?? 1) - 1;
126
- const end = Math.min(lines.length, args.endLine ?? lines.length);
127
- const sliced = lines.slice(start, end);
128
- return { content: sliced.map((line, i) => `${start + i + 1}: ${line}`).join("\n") };
129
- }
130
- // ── Line count guardrail ──
131
- if (lines.length > MAX_FILE_LINES) {
132
- const truncated = lines.slice(0, MAX_FILE_LINES);
133
- return {
134
- content: truncated.map((line, i) => `${i + 1}: ${line}`).join("\n") +
135
- `\n\n--- Truncated at ${MAX_FILE_LINES} lines (total: ${lines.length}) ---`
136
- };
137
- }
138
- return { content: fileContent };
139
- },
140
- };
141
- // ─── WriteFileTool ──────────────────────────────────────────────────────────────
142
- // Writes files to the HOST filesystem (so the user sees changes in their IDE).
143
- // Marks written files as dirty so FileSync uploads them before sandbox execution.
144
- export const WriteFileTool = {
145
- name: "write_file",
146
- 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.",
147
- schema: {
148
- type: "object",
149
- properties: {
150
- path: {
151
- type: "string",
152
- description: "Absolute or relative path to the file",
153
- },
154
- content: {
155
- type: "string",
156
- description: "The full file content to write",
157
- },
158
- },
159
- required: ["path", "content"],
160
- },
161
- execute: async (args, emitter) => {
162
- const filePath = path.resolve(args.path);
163
- if (emitter)
164
- emitter.emit("agent:event", { type: "file:io", action: "write", path: filePath });
165
- // ── Security Guardrail ──
166
- if (!isPathInsideWorkspace(filePath)) {
167
- return {
168
- content: `Security Error: Access Denied. Cannot write files outside the current project workspace (${process.cwd()}).`,
169
- isError: true
170
- };
171
- }
172
- // Create parent directories if needed
173
- const dir = path.dirname(filePath);
174
- if (!fs.existsSync(dir)) {
175
- fs.mkdirSync(dir, { recursive: true });
176
- }
177
- fs.writeFileSync(filePath, args.content, "utf-8");
178
- // Mark file as dirty for next sandbox sync
179
- if (_fileSync) {
180
- _fileSync.markDirty(filePath);
181
- }
182
- return { content: `File written: ${filePath}` };
183
- },
184
- };
185
- // ─── 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.
186
8
  export const CORE_TOOLS = [
187
- BashTool,
188
- ReadFileTool,
189
- WriteFileTool,
190
- InstallHostDependenciesTool,
9
+ bashTool,
10
+ installHostDependenciesTool,
191
11
  ];
192
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"}
@@ -1,2 +1,8 @@
1
- import { DynamicToolInterface } from "./index.js";
2
- export declare const InstallHostDependenciesTool: DynamicToolInterface;
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">;
@@ -1,37 +1,44 @@
1
1
  import { exec } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
+ import { tool } from "langchain";
4
+ import { z } from "zod";
3
5
  const execAsync = promisify(exec);
4
- export const InstallHostDependenciesTool = {
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
+ }, {
5
38
  name: "install_host_dependencies",
6
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.",
7
- schema: {
8
- type: "object",
9
- properties: {
10
- command: {
11
- type: "string",
12
- description: "The native installation command (e.g., 'npm install express')",
13
- },
14
- },
15
- required: ["command"],
16
- },
17
- execute: async (args, emitter) => {
18
- if (emitter) {
19
- emitter.emit("agent:event", { type: "system:script_exec", command: args.command, location: "host" });
20
- }
21
- try {
22
- const { stdout, stderr } = await execAsync(args.command, { cwd: process.cwd() });
23
- return {
24
- content: `Successfully ran on host:\nSTDOUT:\n${stdout}\nSTDERR:\n${stderr}`,
25
- isError: false,
26
- };
27
- }
28
- catch (error) {
29
- return {
30
- content: `Host command failed (exit code ${error.code}):\nSTDOUT:\n${error.stdout}\nSTDERR:\n${error.stderr}\nMESSAGE:\n${error.message}`,
31
- metadata: { exitCode: error.code },
32
- isError: true
33
- };
34
- }
35
- },
36
- };
40
+ schema: z.object({
41
+ command: z.string().describe("The native installation command (e.g., 'npm install express')"),
42
+ }),
43
+ });
37
44
  //# sourceMappingURL=installHostDeps.js.map
@@ -1 +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;AAItC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,2BAA2B,GAAyB;IAC7D,IAAI,EAAE,2BAA2B;IACjC,WAAW,EACP,wLAAwL;IAC5L,MAAM,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,OAAO,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+DAA+D;aAC/E;SACJ;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACxB;IACD,OAAO,EAAE,KAAK,EAAE,IAAyB,EAAE,OAA2B,EAAuB,EAAE;QAC3F,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACzG,CAAC;QAED,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACjF,OAAO;gBACH,OAAO,EAAE,uCAAuC,MAAM,cAAc,MAAM,EAAE;gBAC5E,OAAO,EAAE,KAAK;aACjB,CAAC;QACN,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACjB,OAAO;gBACJ,OAAO,EAAE,kCAAkC,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,OAAO,EAAE;gBACzI,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE;gBAClC,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC;CACJ,CAAC"}
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"}