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,71 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { AIMessageChunk } from "@langchain/core/messages";
3
- import { ExecutionHarness } from "../core/agentLoop.js";
4
- /**
5
- * Creates a mock LLM that yields predefined chunks when .stream() is called.
6
- * This avoids real API calls while testing streaming behavior.
7
- */
8
- function createMockStreamingLlm(chunks) {
9
- return {
10
- invoke: vi.fn(),
11
- stream: vi.fn().mockResolvedValue({
12
- async *[Symbol.asyncIterator]() {
13
- for (const chunk of chunks) {
14
- yield chunk;
15
- }
16
- },
17
- }),
18
- };
19
- }
20
- describe("ExecutionHarness Streaming", () => {
21
- const baseState = {
22
- globalSystemInstructions: "You are a helpful assistant.",
23
- projectMemory: "",
24
- sessionContext: "",
25
- conversationHistory: [],
26
- };
27
- // ─── RED Test #8: streamStep emits text chunks to a callback ───
28
- it("emits text content chunks to an onToken callback", async () => {
29
- const chunks = [
30
- new AIMessageChunk({ content: "Hello" }),
31
- new AIMessageChunk({ content: " world" }),
32
- new AIMessageChunk({ content: "!" }),
33
- ];
34
- const mockLlm = createMockStreamingLlm(chunks);
35
- const harness = new ExecutionHarness(mockLlm);
36
- const receivedTokens = [];
37
- const result = await harness.streamStep(baseState, {
38
- onToken: (token) => receivedTokens.push(token),
39
- });
40
- // Callback should have received each text chunk
41
- expect(receivedTokens).toEqual(["Hello", " world", "!"]);
42
- // The returned message should contain the full concatenated content
43
- expect(result.content).toBe("Hello world!");
44
- });
45
- // ─── RED Test #9: streamStep buffers tool calls and returns complete AIMessage ───
46
- it("buffers tool call chunks and returns a complete AIMessage with tool_calls", async () => {
47
- const chunks = [
48
- new AIMessageChunk({
49
- content: "",
50
- tool_call_chunks: [
51
- { name: "read_file", args: '{"path": "', index: 0, id: "tc_1", type: "tool_call_chunk" },
52
- ],
53
- }),
54
- new AIMessageChunk({
55
- content: "",
56
- tool_call_chunks: [
57
- { name: undefined, args: 'src/index.ts"}', index: 0, id: undefined, type: "tool_call_chunk" },
58
- ],
59
- }),
60
- ];
61
- const mockLlm = createMockStreamingLlm(chunks);
62
- const harness = new ExecutionHarness(mockLlm);
63
- const result = await harness.streamStep(baseState, {});
64
- // The result should have tool_calls populated
65
- expect(result.tool_calls).toBeDefined();
66
- expect(result.tool_calls.length).toBe(1);
67
- expect(result.tool_calls[0].name).toBe("read_file");
68
- expect(result.tool_calls[0].args).toEqual({ path: "src/index.ts" });
69
- });
70
- });
71
- //# sourceMappingURL=streaming.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.test.js","sourceRoot":"","sources":["../../src/__tests__/streaming.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,37 +0,0 @@
1
- import { describe, it, expect, beforeEach } from "vitest";
2
- import { ToolRouter, ToolTarget } from "../tools/router.js";
3
- describe("Tool Router", () => {
4
- let router;
5
- beforeEach(() => {
6
- router = new ToolRouter();
7
- });
8
- // ─── Test #20: Routes write_file to host ───
9
- it("routes write_file to the host", () => {
10
- expect(router.getTarget("write_file")).toBe(ToolTarget.HOST);
11
- });
12
- // ─── Test #21: Routes read_file to host ───
13
- it("routes read_file to the host", () => {
14
- expect(router.getTarget("read_file")).toBe(ToolTarget.HOST);
15
- });
16
- // ─── Test #22: Routes bash to sandbox ───
17
- it("routes bash to the sandbox", () => {
18
- expect(router.getTarget("bash")).toBe(ToolTarget.SANDBOX);
19
- });
20
- // ─── Test #23: Routes run_tests to sandbox ───
21
- it("routes run_tests to the sandbox", () => {
22
- expect(router.getTarget("run_tests")).toBe(ToolTarget.SANDBOX);
23
- });
24
- // ─── Test #24: Routes install_deps to sandbox ───
25
- it("routes install_deps to the sandbox", () => {
26
- expect(router.getTarget("install_deps")).toBe(ToolTarget.SANDBOX);
27
- });
28
- // ─── Test #25: Routes search_tools to host ───
29
- it("routes search_tools to the host", () => {
30
- expect(router.getTarget("search_tools")).toBe(ToolTarget.HOST);
31
- });
32
- // ─── Test #26: Unknown tools default to sandbox (safe) ───
33
- it("defaults unknown tools to sandbox for safety", () => {
34
- expect(router.getTarget("unknown_tool")).toBe(ToolTarget.SANDBOX);
35
- });
36
- });
37
- //# sourceMappingURL=toolRouter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolRouter.test.js","sourceRoot":"","sources":["../../src/__tests__/toolRouter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAM,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE5D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,MAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAE9C,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAE7C,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAE3C,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,gDAAgD;IAEhD,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,mDAAmD;IAEnD,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,gDAAgD;IAEhD,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAE5D,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,112 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import * as fs from "node:fs";
3
- import * as path from "node:path";
4
- import * as os from "node:os";
5
- import { ReadFileTool, WriteFileTool } from "../tools/index.js";
6
- describe("ReadFileTool", () => {
7
- let tmpDir;
8
- beforeEach(() => {
9
- tmpDir = fs.mkdtempSync(path.join(process.cwd(), ".joone-tools-test-"));
10
- });
11
- afterEach(() => {
12
- fs.rmSync(tmpDir, { recursive: true, force: true });
13
- });
14
- // ─── Test #27: Reads a normal file ───
15
- it("reads a small file and returns its content", async () => {
16
- const filePath = path.join(tmpDir, "hello.txt");
17
- fs.writeFileSync(filePath, "Hello, world!", "utf-8");
18
- const result = await ReadFileTool.execute({ path: filePath });
19
- expect(result.content).toBe("Hello, world!");
20
- });
21
- // ─── Test #28: Returns error for non-existent file ───
22
- it("returns an error message for a non-existent file", async () => {
23
- const result = await ReadFileTool.execute({
24
- path: path.join(tmpDir, "nope.txt"),
25
- });
26
- expect(result.content).toMatch(/not found/i);
27
- });
28
- // ─── Test #29: File size guardrail rejects files over 512KB ───
29
- it("rejects files larger than 512KB with a descriptive error", async () => {
30
- const filePath = path.join(tmpDir, "big.txt");
31
- // Create a 600KB file
32
- const bigContent = "x".repeat(600 * 1024);
33
- fs.writeFileSync(filePath, bigContent, "utf-8");
34
- const result = await ReadFileTool.execute({ path: filePath });
35
- expect(result.content).toMatch(/too large/i);
36
- expect(result.content).toMatch(/512/);
37
- });
38
- // ─── Test #30: Line range slicing works ───
39
- it("returns only the requested line range", async () => {
40
- const filePath = path.join(tmpDir, "lines.txt");
41
- const lines = Array.from({ length: 20 }, (_, i) => `Line ${i + 1}`);
42
- fs.writeFileSync(filePath, lines.join("\n"), "utf-8");
43
- const result = await ReadFileTool.execute({
44
- path: filePath,
45
- startLine: 5,
46
- endLine: 7,
47
- });
48
- expect(result.content).toContain("5: Line 5");
49
- expect(result.content).toContain("6: Line 6");
50
- expect(result.content).toContain("7: Line 7");
51
- expect(result.content).not.toContain("4: Line 4");
52
- expect(result.content).not.toContain("8: Line 8");
53
- });
54
- // ─── Test #31: Line count guardrail truncates long files ───
55
- it("truncates files with more than 2000 lines", async () => {
56
- const filePath = path.join(tmpDir, "long.txt");
57
- // Create a file with 2500 short lines (under 512KB)
58
- const lines = Array.from({ length: 2500 }, (_, i) => `L${i + 1}`);
59
- fs.writeFileSync(filePath, lines.join("\n"), "utf-8");
60
- const result = await ReadFileTool.execute({ path: filePath });
61
- expect(result.content).toMatch(/truncated at 2000 lines/i);
62
- expect(result.content).toContain("1: L1");
63
- expect(result.content).toContain("2000: L2000");
64
- expect(result.content).not.toContain("2001: L2001");
65
- });
66
- // ─── Test #X: Security Guardrail Blocks Outside Files ───
67
- it("blocks reading files outside the project workspace", async () => {
68
- // Create a file in the OS tmp directory (guaranteed outside project workspace)
69
- const outsideDir = fs.mkdtempSync(path.join(os.tmpdir(), "joone-outside-"));
70
- const filePath = path.join(outsideDir, "secret.txt");
71
- fs.writeFileSync(filePath, "secret token", "utf-8");
72
- try {
73
- const result = await ReadFileTool.execute({ path: filePath });
74
- expect(result.isError).toBe(true);
75
- expect(result.content).toMatch(/Security Error: Access Denied/i);
76
- expect(result.content).toMatch(/outside the current project workspace/i);
77
- }
78
- finally {
79
- fs.rmSync(outsideDir, { recursive: true, force: true });
80
- }
81
- });
82
- });
83
- describe("WriteFileTool", () => {
84
- let tmpDir;
85
- beforeEach(() => {
86
- tmpDir = fs.mkdtempSync(path.join(process.cwd(), ".joone-write-test-"));
87
- });
88
- afterEach(() => {
89
- fs.rmSync(tmpDir, { recursive: true, force: true });
90
- });
91
- // ─── Test #32: Writes a file to disk ───
92
- it("writes content to a file and confirms", async () => {
93
- const filePath = path.join(tmpDir, "output.ts");
94
- const result = await WriteFileTool.execute({
95
- path: filePath,
96
- content: "const x = 42;",
97
- });
98
- expect(result.content).toMatch(/file written/i);
99
- expect(fs.readFileSync(filePath, "utf-8")).toBe("const x = 42;");
100
- });
101
- // ─── Test #33: Creates parent directories if needed ───
102
- it("creates parent directories if they do not exist", async () => {
103
- const filePath = path.join(tmpDir, "nested", "deep", "file.ts");
104
- const result = await WriteFileTool.execute({
105
- path: filePath,
106
- content: "export {}",
107
- });
108
- expect(result.content).toMatch(/file written/i);
109
- expect(fs.existsSync(filePath)).toBe(true);
110
- });
111
- });
112
- //# sourceMappingURL=tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
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
- }
@@ -1,240 +0,0 @@
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, SystemMessage, 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 SystemMessage(`${spec.systemPrompt}\n\n--- Current Task ---\n${task}`);
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"subAgent.js","sourceRoot":"","sources":["../../src/core/subAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAe,YAAY,EAAa,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5G,mFAAmF;AAEnF,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAcnD,mFAAmF;AAEnF,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAgB;IACxB,QAAQ,CAAyB;IACjC,GAAG,CAA2B;IAC9B,UAAU,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC/C,WAAW,GAAG,CAAC,CAAC;IAExB,YACE,QAAuB,EACvB,KAA6B,EAC7B,GAA6B;QAE7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,sFAAsF;QACtF,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAC5D,CAAC;QACF,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,SAAiB,EACjB,IAAY,EACZ,gBAAyB;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,eAAe,CACzB,SAAS,EACT,IAAI,EACJ,kBAAkB,SAAS,iBAAiB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,SAAiB,EACjB,IAAY,EACZ,gBAAyB;QAEzB,8BAA8B;QAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;aACrD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAEtC,IAAI,WAAW,IAAI,oBAAoB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,4CAA4C,oBAAoB,KAAK;gBACrE,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,iBAAiB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC1B,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE;YAC1B,MAAM;YACN,SAAS;YACT,eAAe,EAAE,IAAI;YACrB,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,oBAAoB,MAAM,8BAA8B,CAAC;QAClE,CAAC;QAED,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YAC5C,oBAAoB;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,SAAS,CAAC,MAAM,CAAC;QAC1B,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,OAAO,SAAS,SAAS,CAAC,eAAe,aAAa,SAAS,CAAC,SAAS,IAAI;YAC3E,qBAAqB,OAAO,aAAa,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,QAAQ,CACpB,IAAe,EACf,IAAY,EACZ,gBAAyB;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,gBAAgB,IAAI,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC;QAExE,yCAAyC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK;YAC3B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAElB,uCAAuC;QACvC,MAAM,YAAY,GAAG,IAAI,aAAa,CACpC,GAAG,IAAI,CAAC,YAAY,6BAA6B,IAAI,EAAE,CACxD,CAAC;QAEF,MAAM,OAAO,GAAkB;YAC7B,IAAI,YAAY,CAAC,IAAI,CAAC;SACvB,CAAC;QAEF,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,MAAM,aAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;QAE7C,gDAAgD;QAChD,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,mDAAmD;YACnD,IAAI,QAAa,CAAC;YAClB,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,IAAI,OAAQ,IAAI,CAAC,GAAW,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBACjF,QAAQ,GAAI,IAAI,CAAC,GAAW,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;YACtB,CAAC;YAED,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC3C,SAAS,EAAE,CAAC;gBAEZ,+BAA+B;gBAC/B,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,CAAC;gBAC5C,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBACtD,YAAY,IAAI,gBAAgB,CAAC;gBAEjC,iBAAiB;gBACjB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjD,MAAM,cAAc,GAAG,kBAAkB,CAAC,CAAC,QAAqB,CAAC,CAAC,CAAC;gBACnE,gBAAgB,IAAI,cAAc,CAAC;gBAEnC,MAAM,SAAS,GAAG,QAAqB,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAExB,uBAAuB;gBACvB,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1E,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;gBACnC,CAAC;gBAED,uBAAuB;gBACvB,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/D,gCAAgC;oBAChC,MAAM;gBACR,CAAC;gBAED,qBAAqB;gBACrB,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,EAAE;wBAAE,SAAS;oBAEvB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;4BAC3B,OAAO,EAAE,gBAAgB,IAAI,CAAC,IAAI,uCAAuC;4BACzE,YAAY,EAAE,IAAI,CAAC,EAAE;yBACtB,CAAC,CAAC,CAAC;wBACJ,SAAS;oBACX,CAAC;oBAED,aAAa,EAAE,CAAC;oBAEhB,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC7C,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,MAAqB,CAAC,OAAO,CAAC;wBAEpF,2BAA2B;wBAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;4BAClD,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACpC,CAAC;wBAED,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;4BAC3B,OAAO,EAAE,MAAM;4BACf,YAAY,EAAE,IAAI,CAAC,EAAE;yBACtB,CAAC,CAAC,CAAC;oBACN,CAAC;oBAAC,OAAO,GAAQ,EAAE,CAAC;wBAClB,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;4BAC3B,OAAO,EAAE,eAAe,GAAG,CAAC,OAAO,EAAE;4BACrC,YAAY,EAAE,IAAI,CAAC,EAAE;yBACtB,CAAC,CAAC,CAAC;oBACN,CAAC;gBACH,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,MAAM,OAAO,GAAG,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAE9D,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,eAAe,EAAE,IAAI;gBACrB,OAAO;gBACP,MAAM,EAAE,YAAY,IAAI,qCAAqC;gBAC7D,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;gBACxC,aAAa;gBACb,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE;gBAClE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,SAAS;aACV,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,eAAe,CACzB,IAAI,CAAC,IAAI,EACT,IAAI,EACJ,oBAAoB,KAAK,CAAC,OAAO,EAAE,EACnC,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CACrB,SAAiB,EACjB,IAAY,EACZ,QAAgB,EAChB,OAOC;QAED,OAAO;YACL,SAAS;YACT,eAAe,EAAE,IAAI;YACrB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;YAC/D,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC;YAC1C,UAAU,EAAE;gBACV,MAAM,EAAE,OAAO,EAAE,YAAY,IAAI,CAAC;gBAClC,UAAU,EAAE,OAAO,EAAE,gBAAgB,IAAI,CAAC;aAC3C;YACD,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACtD,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC;SACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,eAAe,EAAE,CAAC;gBAC3C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,23 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug_google.js","sourceRoot":"","sources":["../src/debug_google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,KAAK,UAAU,GAAG;IAChB,MAAM,GAAG,GAAG,IAAI,sBAAsB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAEhG,MAAM,KAAK,GAAG;QACZ,wBAAwB,EAAE,kBAAkB;QAC5C,aAAa,EAAE,gCAAgC;QAC/C,cAAc,EAAE,8BAA8B;QAC9C,mBAAmB,EAAE;YACnB,IAAI,YAAY,CAAC,iBAAiB,CAAC;SACpC;KACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,GAAG,EAAE,CAAC"}
@@ -1,18 +0,0 @@
1
- import { ToolCallContext, ToolMiddleware } from "./types.js";
2
- /**
3
- * Intercepts bash tool calls to block dangerous or interactive commands.
4
- *
5
- * Categories of blocked commands:
6
- * 1. Destructive: `rm -rf /`, `mkfs`, `dd if=`, fork bombs
7
- * 2. Interactive/hanging: `vim`, `nano`, `less`, `top`, `htop`, `man`
8
- * 3. Network abuse: `curl | sh`, `wget | bash`
9
- */
10
- export declare class CommandSanitizerMiddleware implements ToolMiddleware {
11
- readonly name = "CommandSanitizer";
12
- /**
13
- * Patterns that will cause a command to be blocked.
14
- * Each entry is [regex, human-readable reason].
15
- */
16
- private readonly blockedPatterns;
17
- before(ctx: ToolCallContext): ToolCallContext | string;
18
- }