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.
- package/dist/__tests__/config.test.js +1 -0
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/installHostDeps.test.js +45 -0
- package/dist/__tests__/installHostDeps.test.js.map +1 -0
- package/dist/__tests__/whitelistedBackend.test.js +18 -0
- package/dist/__tests__/whitelistedBackend.test.js.map +1 -0
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.js +1 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +84 -97
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/builtinCommands.js +6 -6
- package/dist/commands/builtinCommands.js.map +1 -1
- package/dist/commands/commandRegistry.d.ts +3 -1
- package/dist/commands/commandRegistry.js.map +1 -1
- package/dist/core/agentLoop.d.ts +11 -28
- package/dist/core/agentLoop.js +68 -229
- package/dist/core/agentLoop.js.map +1 -1
- package/dist/core/compactor.js +2 -2
- package/dist/core/compactor.js.map +1 -1
- package/dist/core/contextGuard.d.ts +5 -0
- package/dist/core/contextGuard.js +30 -3
- package/dist/core/contextGuard.js.map +1 -1
- package/dist/core/events.d.ts +45 -0
- package/dist/core/events.js +8 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/promptBuilder.js.map +1 -1
- package/dist/core/sessionStore.js +3 -2
- package/dist/core/sessionStore.js.map +1 -1
- package/dist/core/tokenCounter.d.ts +8 -1
- package/dist/core/tokenCounter.js +28 -0
- package/dist/core/tokenCounter.js.map +1 -1
- package/dist/hitl/bridge.js +1 -27
- package/dist/hitl/bridge.js.map +1 -1
- package/dist/middleware/loopDetection.d.ts +7 -23
- package/dist/middleware/loopDetection.js +38 -42
- package/dist/middleware/loopDetection.js.map +1 -1
- package/dist/sandbox/whitelistedBackend.d.ts +5 -0
- package/dist/sandbox/whitelistedBackend.js +27 -0
- package/dist/sandbox/whitelistedBackend.js.map +1 -0
- package/dist/tools/askUser.d.ts +12 -3
- package/dist/tools/askUser.js +16 -28
- package/dist/tools/askUser.js.map +1 -1
- package/dist/tools/bashTool.d.ts +11 -0
- package/dist/tools/bashTool.js +51 -0
- package/dist/tools/bashTool.js.map +1 -0
- package/dist/tools/index.d.ts +15 -27
- package/dist/tools/index.js +9 -181
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/installHostDeps.d.ts +8 -0
- package/dist/tools/installHostDeps.js +44 -0
- package/dist/tools/installHostDeps.js.map +1 -0
- package/dist/tracing/sessionTracer.d.ts +1 -0
- package/dist/tracing/sessionTracer.js +4 -1
- package/dist/tracing/sessionTracer.js.map +1 -1
- package/dist/ui/App.js +116 -55
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ActionLog.d.ts +7 -0
- package/dist/ui/components/ActionLog.js +63 -0
- package/dist/ui/components/ActionLog.js.map +1 -0
- package/dist/ui/components/FileBrowser.d.ts +2 -0
- package/dist/ui/components/FileBrowser.js +41 -0
- package/dist/ui/components/FileBrowser.js.map +1 -0
- package/dist/ui/components/MessageBubble.js +1 -1
- package/dist/ui/components/MessageBubble.js.map +1 -1
- package/package.json +8 -5
- package/AGENTS.md +0 -56
- package/Handover.md +0 -115
- package/PROGRESS.md +0 -160
- package/dist/__tests__/m55.test.js +0 -160
- package/dist/__tests__/m55.test.js.map +0 -1
- package/dist/__tests__/middleware.test.js +0 -169
- package/dist/__tests__/middleware.test.js.map +0 -1
- package/dist/__tests__/optimizations.test.d.ts +0 -1
- package/dist/__tests__/optimizations.test.js +0 -136
- package/dist/__tests__/optimizations.test.js.map +0 -1
- package/dist/__tests__/security.test.d.ts +0 -1
- package/dist/__tests__/security.test.js +0 -86
- package/dist/__tests__/security.test.js.map +0 -1
- package/dist/__tests__/streaming.test.d.ts +0 -1
- package/dist/__tests__/streaming.test.js +0 -71
- package/dist/__tests__/streaming.test.js.map +0 -1
- package/dist/__tests__/toolRouter.test.d.ts +0 -1
- package/dist/__tests__/toolRouter.test.js +0 -37
- package/dist/__tests__/toolRouter.test.js.map +0 -1
- package/dist/__tests__/tools.test.d.ts +0 -1
- package/dist/__tests__/tools.test.js +0 -112
- package/dist/__tests__/tools.test.js.map +0 -1
- package/dist/core/subAgent.d.ts +0 -56
- package/dist/core/subAgent.js +0 -240
- package/dist/core/subAgent.js.map +0 -1
- package/dist/debug_google.d.ts +0 -1
- package/dist/debug_google.js +0 -23
- package/dist/debug_google.js.map +0 -1
- package/dist/middleware/commandSanitizer.d.ts +0 -18
- package/dist/middleware/commandSanitizer.js +0 -50
- package/dist/middleware/commandSanitizer.js.map +0 -1
- package/dist/middleware/permission.d.ts +0 -17
- package/dist/middleware/permission.js +0 -59
- package/dist/middleware/permission.js.map +0 -1
- package/dist/middleware/pipeline.d.ts +0 -31
- package/dist/middleware/pipeline.js +0 -62
- package/dist/middleware/pipeline.js.map +0 -1
- package/dist/middleware/preCompletion.d.ts +0 -29
- package/dist/middleware/preCompletion.js +0 -82
- package/dist/middleware/preCompletion.js.map +0 -1
- package/dist/middleware/types.d.ts +0 -40
- package/dist/middleware/types.js +0 -8
- package/dist/middleware/types.js.map +0 -1
- package/dist/skills/loader.d.ts +0 -55
- package/dist/skills/loader.js +0 -132
- package/dist/skills/loader.js.map +0 -1
- package/dist/skills/tools.d.ts +0 -5
- package/dist/skills/tools.js +0 -78
- package/dist/skills/tools.js.map +0 -1
- package/dist/test_cache.d.ts +0 -1
- package/dist/test_cache.js +0 -55
- package/dist/test_cache.js.map +0 -1
- package/dist/test_google.d.ts +0 -1
- package/dist/test_google.js +0 -36
- package/dist/test_google.js.map +0 -1
- package/dist/tools/browser.d.ts +0 -19
- package/dist/tools/browser.js +0 -111
- package/dist/tools/browser.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -31
- package/dist/tools/registry.js +0 -168
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/router.d.ts +0 -34
- package/dist/tools/router.js +0 -75
- package/dist/tools/router.js.map +0 -1
- package/dist/tools/security.d.ts +0 -28
- package/dist/tools/security.js +0 -183
- package/dist/tools/security.js.map +0 -1
- package/dist/tools/spawnAgent.d.ts +0 -19
- package/dist/tools/spawnAgent.js +0 -130
- package/dist/tools/spawnAgent.js.map +0 -1
- package/dist/tools/webSearch.d.ts +0 -6
- package/dist/tools/webSearch.js +0 -120
- package/dist/tools/webSearch.js.map +0 -1
- package/docs/01_insights_and_patterns.md +0 -27
- package/docs/02_edge_cases_and_mitigations.md +0 -143
- package/docs/03_initial_implementation_plan.md +0 -66
- package/docs/04_tech_stack_proposal.md +0 -20
- package/docs/05_prd.md +0 -87
- package/docs/06_user_stories.md +0 -72
- package/docs/07_system_architecture.md +0 -138
- package/docs/08_roadmap.md +0 -200
- package/e2b/Dockerfile +0 -26
- package/src/__tests__/bootstrap.test.ts +0 -111
- package/src/__tests__/config.test.ts +0 -97
- package/src/__tests__/m55.test.ts +0 -238
- package/src/__tests__/middleware.test.ts +0 -219
- package/src/__tests__/modelFactory.test.ts +0 -63
- package/src/__tests__/optimizations.test.ts +0 -201
- package/src/__tests__/promptBuilder.test.ts +0 -141
- package/src/__tests__/sandbox.test.ts +0 -102
- package/src/__tests__/security.test.ts +0 -122
- package/src/__tests__/streaming.test.ts +0 -82
- package/src/__tests__/toolRouter.test.ts +0 -52
- package/src/__tests__/tools.test.ts +0 -146
- package/src/__tests__/tracing.test.ts +0 -196
- package/src/agents/agentRegistry.ts +0 -69
- package/src/agents/agentSpec.ts +0 -67
- package/src/agents/builtinAgents.ts +0 -142
- package/src/cli/config.ts +0 -124
- package/src/cli/index.ts +0 -742
- package/src/cli/modelFactory.ts +0 -174
- package/src/cli/postinstall.ts +0 -28
- package/src/cli/providers.ts +0 -107
- package/src/commands/builtinCommands.ts +0 -293
- package/src/commands/commandRegistry.ts +0 -194
- package/src/core/agentLoop.d.ts.map +0 -1
- package/src/core/agentLoop.ts +0 -312
- package/src/core/autoSave.ts +0 -95
- package/src/core/compactor.ts +0 -252
- package/src/core/contextGuard.ts +0 -129
- package/src/core/errors.ts +0 -202
- package/src/core/promptBuilder.d.ts.map +0 -1
- package/src/core/promptBuilder.ts +0 -139
- package/src/core/reasoningRouter.ts +0 -121
- package/src/core/retry.ts +0 -75
- package/src/core/sessionResumer.ts +0 -90
- package/src/core/sessionStore.ts +0 -216
- package/src/core/subAgent.ts +0 -339
- package/src/core/tokenCounter.ts +0 -64
- package/src/evals/dataset.ts +0 -67
- package/src/evals/evaluator.ts +0 -81
- package/src/hitl/bridge.ts +0 -160
- package/src/middleware/commandSanitizer.ts +0 -60
- package/src/middleware/loopDetection.ts +0 -63
- package/src/middleware/permission.ts +0 -72
- package/src/middleware/pipeline.ts +0 -75
- package/src/middleware/preCompletion.ts +0 -94
- package/src/middleware/types.ts +0 -45
- package/src/sandbox/bootstrap.ts +0 -121
- package/src/sandbox/manager.ts +0 -239
- package/src/sandbox/sync.ts +0 -157
- package/src/skills/loader.ts +0 -143
- package/src/skills/tools.ts +0 -99
- package/src/skills/types.ts +0 -13
- package/src/test_cache.ts +0 -72
- package/src/tools/askUser.ts +0 -47
- package/src/tools/browser.ts +0 -137
- package/src/tools/index.d.ts.map +0 -1
- package/src/tools/index.ts +0 -237
- package/src/tools/registry.ts +0 -198
- package/src/tools/router.ts +0 -78
- package/src/tools/security.ts +0 -220
- package/src/tools/spawnAgent.ts +0 -158
- package/src/tools/webSearch.ts +0 -142
- package/src/tracing/analyzer.ts +0 -265
- package/src/tracing/langsmith.ts +0 -63
- package/src/tracing/sessionTracer.ts +0 -202
- package/src/tracing/types.ts +0 -49
- package/src/types/valyu.d.ts +0 -37
- package/src/ui/App.tsx +0 -404
- package/src/ui/components/HITLPrompt.tsx +0 -119
- package/src/ui/components/Header.tsx +0 -51
- package/src/ui/components/MessageBubble.tsx +0 -46
- package/src/ui/components/StatusBar.tsx +0 -138
- package/src/ui/components/StreamingText.tsx +0 -48
- package/src/ui/components/ToolCallPanel.tsx +0 -80
- package/tests/commands/commands.test.ts +0 -356
- package/tests/core/compactor.test.ts +0 -217
- package/tests/core/retryAndErrors.test.ts +0 -164
- package/tests/core/sessionResumer.test.ts +0 -95
- package/tests/core/sessionStore.test.ts +0 -84
- package/tests/core/stability.test.ts +0 -165
- package/tests/core/subAgent.test.ts +0 -238
- package/tests/hitl/hitlBridge.test.ts +0 -115
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -10
- package/vitest.out +0 -48
- /package/dist/__tests__/{m55.test.d.ts → installHostDeps.test.d.ts} +0 -0
- /package/dist/__tests__/{middleware.test.d.ts → whitelistedBackend.test.d.ts} +0 -0
package/dist/tools/security.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { SandboxManager } from "../sandbox/manager.js";
|
|
2
|
-
import { LazyInstaller } from "../sandbox/bootstrap.js";
|
|
3
|
-
import { DynamicToolInterface } from "./index.js";
|
|
4
|
-
/**
|
|
5
|
-
* Binds the security tools to the sandbox and installer.
|
|
6
|
-
* Must be called at session start.
|
|
7
|
-
*/
|
|
8
|
-
export declare function bindSecuritySandbox(sandbox: SandboxManager, installer: LazyInstaller): void;
|
|
9
|
-
/**
|
|
10
|
-
* Scans code for security vulnerabilities using the Gemini CLI Security Extension.
|
|
11
|
-
*
|
|
12
|
-
* Execution flow:
|
|
13
|
-
* 1. LazyInstaller ensures Gemini CLI + security extension are in the sandbox.
|
|
14
|
-
* 2. Runs `gemini -x security:analyze` in the sandbox.
|
|
15
|
-
* 3. Returns the generated security report.
|
|
16
|
-
*
|
|
17
|
-
* If Gemini CLI installation fails, returns a descriptive fallback message
|
|
18
|
-
* suggesting manual review or alternative tools.
|
|
19
|
-
*/
|
|
20
|
-
export declare const SecurityScanTool: DynamicToolInterface;
|
|
21
|
-
/**
|
|
22
|
-
* Scans project dependencies for known vulnerabilities.
|
|
23
|
-
*
|
|
24
|
-
* Execution flow:
|
|
25
|
-
* 1. Try OSV-Scanner (more comprehensive, covers multiple ecosystems).
|
|
26
|
-
* 2. Fall back to `npm audit --json` (always available in Node sandboxes).
|
|
27
|
-
*/
|
|
28
|
-
export declare const DepScanTool: DynamicToolInterface;
|
package/dist/tools/security.js
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
// ─── Sandbox + Installer references (set at session start) ──────────────────
|
|
2
|
-
let _sandboxManager = null;
|
|
3
|
-
let _installer = null;
|
|
4
|
-
/**
|
|
5
|
-
* Binds the security tools to the sandbox and installer.
|
|
6
|
-
* Must be called at session start.
|
|
7
|
-
*/
|
|
8
|
-
export function bindSecuritySandbox(sandbox, installer) {
|
|
9
|
-
_sandboxManager = sandbox;
|
|
10
|
-
_installer = installer;
|
|
11
|
-
}
|
|
12
|
-
// ─── Security Helpers ───────────────────────────────────────────────────────────
|
|
13
|
-
/**
|
|
14
|
-
* Escapes a string so it can be safely used as an argument in a Bash shell command.
|
|
15
|
-
*/
|
|
16
|
-
function escapeBashArg(arg) {
|
|
17
|
-
return `'${arg.replace(/'/g, "'\\''")}'`;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Validates a file path to prevent directory traversal out of the workspace.
|
|
21
|
-
*/
|
|
22
|
-
function isSafePath(pathStr) {
|
|
23
|
-
if (!pathStr || pathStr.trim() === "")
|
|
24
|
-
return false;
|
|
25
|
-
if (pathStr.includes("..") || pathStr.startsWith("/"))
|
|
26
|
-
return false;
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
// ─── SecurityScanTool ───────────────────────────────────────────────────────────
|
|
30
|
-
/**
|
|
31
|
-
* Scans code for security vulnerabilities using the Gemini CLI Security Extension.
|
|
32
|
-
*
|
|
33
|
-
* Execution flow:
|
|
34
|
-
* 1. LazyInstaller ensures Gemini CLI + security extension are in the sandbox.
|
|
35
|
-
* 2. Runs `gemini -x security:analyze` in the sandbox.
|
|
36
|
-
* 3. Returns the generated security report.
|
|
37
|
-
*
|
|
38
|
-
* If Gemini CLI installation fails, returns a descriptive fallback message
|
|
39
|
-
* suggesting manual review or alternative tools.
|
|
40
|
-
*/
|
|
41
|
-
export const SecurityScanTool = {
|
|
42
|
-
name: "security_scan",
|
|
43
|
-
description: "Scans code changes for security vulnerabilities using the Gemini CLI Security Extension. " +
|
|
44
|
-
"Analyzes the current branch diff for common vulnerabilities and generates a security report.",
|
|
45
|
-
schema: {
|
|
46
|
-
type: "object",
|
|
47
|
-
properties: {
|
|
48
|
-
target: {
|
|
49
|
-
type: "string",
|
|
50
|
-
enum: ["changes", "file", "deps"],
|
|
51
|
-
description: 'What to scan: "changes" (branch diff), "file" (specific file), "deps" (dependencies only)',
|
|
52
|
-
},
|
|
53
|
-
path: {
|
|
54
|
-
type: "string",
|
|
55
|
-
description: "File path for single-file scan (required when target is 'file')",
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
required: ["target"],
|
|
59
|
-
},
|
|
60
|
-
execute: async (args) => {
|
|
61
|
-
if (!_sandboxManager || !_sandboxManager.isActive()) {
|
|
62
|
-
return { content: "Sandbox is not active. Cannot run security scan.", isError: true };
|
|
63
|
-
}
|
|
64
|
-
if (!_installer) {
|
|
65
|
-
return { content: "LazyInstaller not initialized. Call bindSecuritySandbox() first.", isError: true };
|
|
66
|
-
}
|
|
67
|
-
// Ensure Gemini CLI is available
|
|
68
|
-
const cliReady = await _installer.ensureGeminiCli(_sandboxManager);
|
|
69
|
-
if (!cliReady) {
|
|
70
|
-
return {
|
|
71
|
-
content: ("⚠ Gemini CLI could not be installed in the sandbox.\n" +
|
|
72
|
-
"Suggestions:\n" +
|
|
73
|
-
' - Use `dep_scan` tool for dependency vulnerability scanning (uses npm audit)\n' +
|
|
74
|
-
" - Manually review code for OWASP Top 10 vulnerabilities\n" +
|
|
75
|
-
" - Set sandboxTemplate to a pre-baked template with Gemini CLI installed"),
|
|
76
|
-
isError: true
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
// Build the command based on target
|
|
80
|
-
let command;
|
|
81
|
-
switch (args.target) {
|
|
82
|
-
case "changes":
|
|
83
|
-
command = "cd /workspace && gemini -x security:analyze 2>&1";
|
|
84
|
-
break;
|
|
85
|
-
case "file":
|
|
86
|
-
if (!args.path) {
|
|
87
|
-
return { content: "Error: 'path' is required when target is 'file'.", isError: true };
|
|
88
|
-
}
|
|
89
|
-
if (!isSafePath(args.path)) {
|
|
90
|
-
return { content: "Error: Invalid file path. Path must be relative and cannot contain traversal characters ('..').", isError: true };
|
|
91
|
-
}
|
|
92
|
-
command = `cd /workspace && gemini -x security:analyze --file ${escapeBashArg(args.path)} 2>&1`;
|
|
93
|
-
break;
|
|
94
|
-
case "deps":
|
|
95
|
-
command = "cd /workspace && gemini -x security:analyze --deps-only 2>&1";
|
|
96
|
-
break;
|
|
97
|
-
default:
|
|
98
|
-
return { content: `Error: Unknown target "${args.target}". Use "changes", "file", or "deps".`, isError: true };
|
|
99
|
-
}
|
|
100
|
-
const result = await _sandboxManager.exec(command);
|
|
101
|
-
if (result.exitCode !== 0) {
|
|
102
|
-
return {
|
|
103
|
-
content: `Security scan failed (exit code ${result.exitCode}):\n${result.stdout}\n${result.stderr}`,
|
|
104
|
-
metadata: { exitCode: result.exitCode },
|
|
105
|
-
isError: true
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
109
|
-
content: result.stdout || "Security scan completed — no issues found.",
|
|
110
|
-
metadata: { exitCode: result.exitCode },
|
|
111
|
-
isError: false
|
|
112
|
-
};
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
// ─── DepScanTool ────────────────────────────────────────────────────────────────
|
|
116
|
-
/**
|
|
117
|
-
* Scans project dependencies for known vulnerabilities.
|
|
118
|
-
*
|
|
119
|
-
* Execution flow:
|
|
120
|
-
* 1. Try OSV-Scanner (more comprehensive, covers multiple ecosystems).
|
|
121
|
-
* 2. Fall back to `npm audit --json` (always available in Node sandboxes).
|
|
122
|
-
*/
|
|
123
|
-
export const DepScanTool = {
|
|
124
|
-
name: "dep_scan",
|
|
125
|
-
description: "Scans project dependencies for known vulnerabilities (CVEs). " +
|
|
126
|
-
"Uses OSV-Scanner when available, falls back to npm audit.",
|
|
127
|
-
schema: {
|
|
128
|
-
type: "object",
|
|
129
|
-
properties: {
|
|
130
|
-
format: {
|
|
131
|
-
type: "string",
|
|
132
|
-
enum: ["summary", "json"],
|
|
133
|
-
description: 'Output format: "summary" (human readable) or "json" (raw)',
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
execute: async (args) => {
|
|
138
|
-
if (!_sandboxManager || !_sandboxManager.isActive()) {
|
|
139
|
-
return { content: "Sandbox is not active. Cannot run dependency scan.", isError: true };
|
|
140
|
-
}
|
|
141
|
-
if (!_installer) {
|
|
142
|
-
return { content: "LazyInstaller not initialized.", isError: true };
|
|
143
|
-
}
|
|
144
|
-
const format = args?.format ?? "summary";
|
|
145
|
-
// Try OSV-Scanner first
|
|
146
|
-
const osvReady = await _installer.ensureOsvScanner(_sandboxManager);
|
|
147
|
-
if (osvReady) {
|
|
148
|
-
const osvCmd = format === "json"
|
|
149
|
-
? "cd /workspace && osv-scanner --json . 2>&1"
|
|
150
|
-
: "cd /workspace && osv-scanner . 2>&1";
|
|
151
|
-
const result = await _sandboxManager.exec(osvCmd);
|
|
152
|
-
if (result.exitCode === 0) {
|
|
153
|
-
return {
|
|
154
|
-
content: result.stdout || "No known vulnerabilities found in dependencies.",
|
|
155
|
-
metadata: { exitCode: result.exitCode },
|
|
156
|
-
isError: false
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
// Exit code 1 from OSV-Scanner means vulnerabilities found — still valid output
|
|
160
|
-
if (result.exitCode === 1 && result.stdout) {
|
|
161
|
-
return {
|
|
162
|
-
content: result.stdout,
|
|
163
|
-
metadata: { exitCode: result.exitCode },
|
|
164
|
-
isError: false
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
// If we reach here, OSV-Scanner failed for another reason (e.g. exit > 1)
|
|
168
|
-
console.warn(`⚠ OSV-Scanner failed (exit code ${result.exitCode}). Falling back to npm audit.\nDetails: ${result.stdout}\n${result.stderr}`);
|
|
169
|
-
}
|
|
170
|
-
// Fallback: npm audit
|
|
171
|
-
const auditCmd = format === "json"
|
|
172
|
-
? "cd /workspace && npm audit --json 2>&1"
|
|
173
|
-
: "cd /workspace && npm audit 2>&1";
|
|
174
|
-
const auditResult = await _sandboxManager.exec(auditCmd);
|
|
175
|
-
// npm audit returns 1 when vulnerabilities are found — that's valid output
|
|
176
|
-
return {
|
|
177
|
-
content: auditResult.stdout || "No known vulnerabilities found in dependencies.",
|
|
178
|
-
metadata: { exitCode: auditResult.exitCode },
|
|
179
|
-
isError: false
|
|
180
|
-
};
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
//# sourceMappingURL=security.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/tools/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spawn Agent Tools
|
|
3
|
-
*
|
|
4
|
-
* DynamicToolInterface implementations for spawning and checking sub-agents.
|
|
5
|
-
* These tools are registered with the main agent's tool set, allowing the
|
|
6
|
-
* LLM to delegate scoped tasks to isolated sub-agents.
|
|
7
|
-
*
|
|
8
|
-
* Safety: spawn_agent and check_agent are excluded from sub-agent tool sets
|
|
9
|
-
* to enforce the depth-1 nesting limit.
|
|
10
|
-
*/
|
|
11
|
-
import { DynamicToolInterface } from "./index.js";
|
|
12
|
-
import { SubAgentManager } from "../core/subAgent.js";
|
|
13
|
-
import { AgentRegistry } from "../agents/agentRegistry.js";
|
|
14
|
-
/**
|
|
15
|
-
* Creates the spawn_agent and check_agent tools bound to a SubAgentManager.
|
|
16
|
-
* The agent registry summary is injected into the spawn_agent description
|
|
17
|
-
* so the LLM knows which agents are available.
|
|
18
|
-
*/
|
|
19
|
-
export declare function createSpawnAgentTools(manager: SubAgentManager, registry: AgentRegistry): DynamicToolInterface[];
|
package/dist/tools/spawnAgent.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spawn Agent Tools
|
|
3
|
-
*
|
|
4
|
-
* DynamicToolInterface implementations for spawning and checking sub-agents.
|
|
5
|
-
* These tools are registered with the main agent's tool set, allowing the
|
|
6
|
-
* LLM to delegate scoped tasks to isolated sub-agents.
|
|
7
|
-
*
|
|
8
|
-
* Safety: spawn_agent and check_agent are excluded from sub-agent tool sets
|
|
9
|
-
* to enforce the depth-1 nesting limit.
|
|
10
|
-
*/
|
|
11
|
-
// ─── Factory ────────────────────────────────────────────────────────────────────
|
|
12
|
-
/**
|
|
13
|
-
* Creates the spawn_agent and check_agent tools bound to a SubAgentManager.
|
|
14
|
-
* The agent registry summary is injected into the spawn_agent description
|
|
15
|
-
* so the LLM knows which agents are available.
|
|
16
|
-
*/
|
|
17
|
-
export function createSpawnAgentTools(manager, registry) {
|
|
18
|
-
const agentNames = registry.getNames();
|
|
19
|
-
const agentList = agentNames.join(", ");
|
|
20
|
-
// ─── spawn_agent ───────────────────────────────────────────────────────────
|
|
21
|
-
const SpawnAgentTool = {
|
|
22
|
-
name: "spawn_agent",
|
|
23
|
-
description: `Spawn an isolated sub-agent to handle a scoped task. Available agents: ${agentList}. ` +
|
|
24
|
-
`The sub-agent runs independently with its own conversation and returns a structured result. ` +
|
|
25
|
-
`Use mode "async" for non-blocking execution — you can continue working and check results later with check_agent.`,
|
|
26
|
-
schema: {
|
|
27
|
-
type: "object",
|
|
28
|
-
properties: {
|
|
29
|
-
agent: {
|
|
30
|
-
type: "string",
|
|
31
|
-
description: `The agent name from the registry. Available: ${agentList}`,
|
|
32
|
-
enum: agentNames,
|
|
33
|
-
},
|
|
34
|
-
task: {
|
|
35
|
-
type: "string",
|
|
36
|
-
description: "Detailed description of the task for the sub-agent to complete",
|
|
37
|
-
},
|
|
38
|
-
mode: {
|
|
39
|
-
type: "string",
|
|
40
|
-
enum: ["sync", "async"],
|
|
41
|
-
description: "Execution mode: 'sync' (default, blocks until done) or 'async' (non-blocking, returns taskId)",
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
required: ["agent", "task"],
|
|
45
|
-
},
|
|
46
|
-
execute: async (args) => {
|
|
47
|
-
const mode = args.mode ?? "sync";
|
|
48
|
-
if (mode === "async") {
|
|
49
|
-
try {
|
|
50
|
-
const taskId = await manager.spawnAsync(args.agent, args.task);
|
|
51
|
-
return {
|
|
52
|
-
content: `Async sub-agent "${args.agent}" started. Task ID: ${taskId}\n` +
|
|
53
|
-
`Use check_agent with this taskId to get the result when ready.`,
|
|
54
|
-
metadata: { taskId, agentName: args.agent, mode: "async" },
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
return { content: `Spawn error: ${err.message}`, isError: true };
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Sync mode (default)
|
|
62
|
-
const result = await manager.spawn(args.agent, args.task);
|
|
63
|
-
return {
|
|
64
|
-
content: formatSubAgentResult(result),
|
|
65
|
-
metadata: {
|
|
66
|
-
agentName: result.agentName,
|
|
67
|
-
outcome: result.outcome,
|
|
68
|
-
toolCalls: result.toolCallCount,
|
|
69
|
-
turnsUsed: result.turnsUsed,
|
|
70
|
-
duration: result.duration,
|
|
71
|
-
},
|
|
72
|
-
isError: result.outcome === "failure",
|
|
73
|
-
};
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
// ─── check_agent ───────────────────────────────────────────────────────────
|
|
77
|
-
const CheckAgentTool = {
|
|
78
|
-
name: "check_agent",
|
|
79
|
-
description: "Check the status or retrieve the result of an async sub-agent task. " +
|
|
80
|
-
"If the task is still running, returns a status update. If completed, returns the result.",
|
|
81
|
-
schema: {
|
|
82
|
-
type: "object",
|
|
83
|
-
properties: {
|
|
84
|
-
taskId: {
|
|
85
|
-
type: "string",
|
|
86
|
-
description: "The task ID returned by spawn_agent in async mode",
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
required: ["taskId"],
|
|
90
|
-
},
|
|
91
|
-
execute: async (args) => {
|
|
92
|
-
const result = await manager.getResult(args.taskId);
|
|
93
|
-
if (typeof result === "string") {
|
|
94
|
-
// Still running or unknown
|
|
95
|
-
return { content: result };
|
|
96
|
-
}
|
|
97
|
-
// Completed — return formatted result
|
|
98
|
-
return {
|
|
99
|
-
content: formatSubAgentResult(result),
|
|
100
|
-
metadata: {
|
|
101
|
-
agentName: result.agentName,
|
|
102
|
-
outcome: result.outcome,
|
|
103
|
-
toolCalls: result.toolCallCount,
|
|
104
|
-
turnsUsed: result.turnsUsed,
|
|
105
|
-
duration: result.duration,
|
|
106
|
-
},
|
|
107
|
-
isError: result.outcome === "failure",
|
|
108
|
-
};
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
return [SpawnAgentTool, CheckAgentTool];
|
|
112
|
-
}
|
|
113
|
-
// ─── Formatter ──────────────────────────────────────────────────────────────────
|
|
114
|
-
/**
|
|
115
|
-
* Formats a SubAgentResult into a readable string for the main agent.
|
|
116
|
-
*/
|
|
117
|
-
function formatSubAgentResult(result) {
|
|
118
|
-
const lines = [
|
|
119
|
-
`--- Sub-Agent Result: ${result.agentName} ---`,
|
|
120
|
-
`Outcome: ${result.outcome}`,
|
|
121
|
-
`Turns: ${result.turnsUsed} | Tool Calls: ${result.toolCallCount} | Duration: ${Math.round(result.duration / 1000)}s`,
|
|
122
|
-
`Tokens: ~${result.tokenUsage.prompt} prompt + ~${result.tokenUsage.completion} completion`,
|
|
123
|
-
];
|
|
124
|
-
if (result.filesModified.length > 0) {
|
|
125
|
-
lines.push(`Files Modified: ${result.filesModified.join(", ")}`);
|
|
126
|
-
}
|
|
127
|
-
lines.push(`\nResult:\n${result.result}`);
|
|
128
|
-
return lines.join("\n");
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=spawnAgent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawnAgent.js","sourceRoot":"","sources":["../../src/tools/spawnAgent.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/webSearch.js
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Web Search Tool — wraps the Valyu AI Search SDK.
|
|
3
|
-
*
|
|
4
|
-
* Provides AI-optimized web search and domain-specific search
|
|
5
|
-
* (papers, finance, patents, SEC filings, etc.). Runs on the Host
|
|
6
|
-
* (API call, not a shell command).
|
|
7
|
-
*
|
|
8
|
-
* Requires a Valyu API key in config (`valyuApiKey`).
|
|
9
|
-
*/
|
|
10
|
-
let _valyuApiKey;
|
|
11
|
-
/**
|
|
12
|
-
* Bind the Valyu API key at session start.
|
|
13
|
-
*/
|
|
14
|
-
export function bindValyuApiKey(key) {
|
|
15
|
-
_valyuApiKey = key;
|
|
16
|
-
}
|
|
17
|
-
export const WebSearchTool = {
|
|
18
|
-
name: "web_search",
|
|
19
|
-
description: "Search the web for information. Supports general web search and specialized sources: " +
|
|
20
|
-
"papers (arXiv/PubMed), finance, patents, SEC filings, companies. " +
|
|
21
|
-
"Returns AI-optimized structured results.",
|
|
22
|
-
schema: {
|
|
23
|
-
type: "object",
|
|
24
|
-
properties: {
|
|
25
|
-
query: {
|
|
26
|
-
type: "string",
|
|
27
|
-
description: "The search query",
|
|
28
|
-
},
|
|
29
|
-
source: {
|
|
30
|
-
type: "string",
|
|
31
|
-
enum: ["web", "papers", "finance", "patents", "sec", "companies"],
|
|
32
|
-
description: 'Search source (default: "web"). Use "papers" for academic, "finance" for financial data, etc.',
|
|
33
|
-
},
|
|
34
|
-
maxResults: {
|
|
35
|
-
type: "number",
|
|
36
|
-
description: "Maximum number of results to return (default: 5)",
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
required: ["query"],
|
|
40
|
-
},
|
|
41
|
-
execute: async (args) => {
|
|
42
|
-
if (!_valyuApiKey) {
|
|
43
|
-
return {
|
|
44
|
-
content: "Error: Valyu API key not configured.\n" +
|
|
45
|
-
'Run `joone config` and set your Valyu API key, or add "valyuApiKey" to ~/.joone/config.json.',
|
|
46
|
-
isError: true
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
const source = args.source ?? "web";
|
|
50
|
-
const maxResults = args.maxResults ?? 5;
|
|
51
|
-
try {
|
|
52
|
-
// Dynamic import to avoid requiring the dependency at startup
|
|
53
|
-
const { Valyu } = await import("@valyu/ai-sdk");
|
|
54
|
-
const valyu = new Valyu({ apiKey: _valyuApiKey });
|
|
55
|
-
let results;
|
|
56
|
-
switch (source) {
|
|
57
|
-
case "web":
|
|
58
|
-
results = await valyu.search({
|
|
59
|
-
query: args.query,
|
|
60
|
-
maxResults,
|
|
61
|
-
});
|
|
62
|
-
break;
|
|
63
|
-
case "papers":
|
|
64
|
-
results = await valyu.paperSearch({
|
|
65
|
-
query: args.query,
|
|
66
|
-
maxResults,
|
|
67
|
-
});
|
|
68
|
-
break;
|
|
69
|
-
case "finance":
|
|
70
|
-
results = await valyu.financeSearch({
|
|
71
|
-
query: args.query,
|
|
72
|
-
maxResults,
|
|
73
|
-
});
|
|
74
|
-
break;
|
|
75
|
-
case "patents":
|
|
76
|
-
results = await valyu.patentSearch({
|
|
77
|
-
query: args.query,
|
|
78
|
-
maxResults,
|
|
79
|
-
});
|
|
80
|
-
break;
|
|
81
|
-
case "sec":
|
|
82
|
-
results = await valyu.secSearch({
|
|
83
|
-
query: args.query,
|
|
84
|
-
maxResults,
|
|
85
|
-
});
|
|
86
|
-
break;
|
|
87
|
-
case "companies":
|
|
88
|
-
results = await valyu.companyResearch({
|
|
89
|
-
query: args.query,
|
|
90
|
-
maxResults,
|
|
91
|
-
});
|
|
92
|
-
break;
|
|
93
|
-
default:
|
|
94
|
-
return {
|
|
95
|
-
content: `Error: Unknown source "${source}". Use: web, papers, finance, patents, sec, companies.`,
|
|
96
|
-
isError: true
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
// Format results for the LLM
|
|
100
|
-
if (!results || !results.results || results.results.length === 0) {
|
|
101
|
-
return { content: `No results found for "${args.query}" in ${source} source.` };
|
|
102
|
-
}
|
|
103
|
-
const formatted = results.results
|
|
104
|
-
.map((r, i) => `${i + 1}. **${r.title || "Untitled"}**\n ${r.url || ""}\n ${r.snippet || r.content || ""}`)
|
|
105
|
-
.join("\n\n");
|
|
106
|
-
return { content: `Search results for "${args.query}" (${source}):\n\n${formatted}` };
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
|
|
110
|
-
return {
|
|
111
|
-
content: "Error: @valyu/ai-sdk is not installed.\n" +
|
|
112
|
-
"Run: npm install @valyu/ai-sdk",
|
|
113
|
-
isError: true
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
return { content: `Search error: ${error.message}`, isError: true };
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
//# sourceMappingURL=webSearch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../src/tools/webSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# Actionable Insights, Patterns, and Best Practices
|
|
2
|
-
|
|
3
|
-
Derived from recent research on Harness Engineering and Prompt Caching for Agentic Coding.
|
|
4
|
-
|
|
5
|
-
## 1. The Cache-Optimized Context Prefix (Prompt Caching)
|
|
6
|
-
|
|
7
|
-
- **Prefix Matching Rule:** LLM APIs cache everything from the start of a prompt up to a `cache_control` breakpoint. Any dynamic change in the middle invalidates the rest of the cache.
|
|
8
|
-
- **Order Matters (Static to Dynamic):**
|
|
9
|
-
1. Base System Instructions & Tool Definitions (Globally Cached)
|
|
10
|
-
2. Project/Workspace memory (e.g., `CLAUDE.md`) (Cached per project)
|
|
11
|
-
3. Session State (Environment variables, rules) (Cached per session)
|
|
12
|
-
4. Conversation Messages (Grows iteratively)
|
|
13
|
-
- **Immutability within a Session:** Never add/remove tools mid-conversation, and never swap models (e.g., from Opus to Haiku) mid-session, as this breaks the cache prefix.
|
|
14
|
-
- **The `<system-reminder>` Pattern:** If you need to update agent behavior or state, do **not** edit the system prompt. Instead, insert a `<system-reminder>` tag inside the next simulated User Message or Tool Result.
|
|
15
|
-
|
|
16
|
-
## 2. Harness Engineering & Middleware
|
|
17
|
-
|
|
18
|
-
- **Control via Harness, Not Just Prompts:** Mold the agent's behavior by building programmatic wrappers (middleware) around the LLM reasoning step rather than just asking the LLM nicely.
|
|
19
|
-
- **Anti-Doom-Loop Middleware:** Track per-file edits in the harness. If an agent edits the same file N times without success, inject a message forcing it to reconsider its approach.
|
|
20
|
-
- **Forced Self-Verification:** Agents tend to write code and immediately stop without testing. Implement a `PreCompletionChecklistMiddleware` that intercepts the agent's attempt to exit, forcing it to run local tests and read the full output before concluding.
|
|
21
|
-
- **Local Context Injection:** Automatically discover and map the working directory and available binaries (e.g., Python, Node) into the prompt upon startup.
|
|
22
|
-
|
|
23
|
-
## 3. Agent Execution Strategy
|
|
24
|
-
|
|
25
|
-
- **The Reasoning Sandwich:** Adjust the amount of compute/reasoning dynamically. Use heavy reasoning for Planning, Discovery, and Final Verification, but use medium reasoning for straightforward code implementations to save time and tokens.
|
|
26
|
-
- **Lazy Tool Loading (Searchable Tools):** Instead of stuffing every possible schema into the prompt, provide "stubs" (tool names and descriptions). Allow the agent to search for advanced tools, deferring the loading of full schemas to preserve prefix caching.
|
|
27
|
-
- **Trace-Driven Improvement:** Treat tracing (e.g., LangSmith) as a first-class feature. Route raw text-space traces to a designated "Trace Analyzer Subagent" to find where the agent frequently fails, allowing you to patch the harness without blindly guessing.
|