@j-o-r/hello-dave 0.0.2 → 0.0.4
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/CHANGELOG.md +21 -0
- package/README.md +445 -160
- package/README.md.backup +269 -0
- package/README.md.bak +481 -0
- package/README.md.bak.1774780058 +338 -0
- package/README.md.bak2 +455 -0
- package/bin/dave.js +165 -0
- package/docs.bak.1774780058/agent-manager.md +167 -0
- package/docs.bak.1774780058/agent-manager.md.bak +137 -0
- package/docs.bak.1774780058/agent-manager.md.bak2 +157 -0
- package/docs.bak.1774780058/codeserver-pattern.md +191 -0
- package/docs.bak.1774780058/path-resolution-best-practices.md +104 -0
- package/docs.bak.1774780058/project-overview.md +67 -0
- package/docs.bak.1774780058/project-overview.md.bak +67 -0
- package/docs.bak.1774780058/prompt-class.md +141 -0
- package/docs.bak.1774780058/prompt-class.md.bak +142 -0
- package/docs.bak.1774780058/tools-syntax-validation.md +121 -0
- package/docs.bak.1774780058/tools-syntax-validation.md.bak2 +125 -0
- package/docs.bak.1774780058/tools-syntax-validation.md.bak3 +125 -0
- package/docs.bak.1774780058/tools-syntax-validation.md.bak4 +106 -0
- package/docs.bak.1774780058/tools-syntax-validation.md.bak_path +106 -0
- package/docs.bak.1774780058/toolset.md +164 -0
- package/docs.bak.1774780058/toolset.md.bak +94 -0
- package/docs.bak.1774780058/toolset.md.bak3 +161 -0
- package/docs.bak.1774780058/toolset.md.bak4 +161 -0
- package/docs.bak.1774780058/toolset.md.bak5 +161 -0
- package/docs.bak.1774780058/toolset.md.bak6 +163 -0
- package/docs.bak.1774780058/toolset.md.bak_path +163 -0
- package/docs.bak.1774780058/toolset.md.bak_syntax +161 -0
- package/docs.bak.1774780058/xai-responses.md +111 -0
- package/docs.bak.1774780058/xai-responses.md.bak +107 -0
- package/docs.bak.1774780058/xai-responses.md.bak2 +107 -0
- package/docs.bak.1774780058/xai_collections.md +106 -0
- package/examples/ask_agent.js +137 -0
- package/examples/code_agent.js +149 -0
- package/examples/coderev_agent.js +136 -0
- package/examples/codeserver.sh +47 -0
- package/examples/daisy_agent.js +170 -0
- package/examples/docs_agent.js +148 -0
- package/examples/gpt_agent.js +125 -0
- package/examples/grok_agent.js +132 -0
- package/examples/grok_agent.js.bak +98 -0
- package/examples/grok_agent.js.bak.2 +99 -0
- package/examples/grok_agent.js.bak.3 +1 -0
- package/examples/grok_agent.js.bak.4 +124 -0
- package/examples/grok_agent.js.bak.5 +1 -0
- package/examples/grok_agent.js.bak.6 +1 -0
- package/examples/memory_agent.js +152 -0
- package/examples/npm_agent.js +202 -0
- package/examples/npm_agent.js.bak.3 +2 -0
- package/examples/npm_agent.js.bak.4 +205 -0
- package/examples/npm_agent.js.bak.5 +1 -0
- package/examples/npm_agent.js.bak.6 +1 -0
- package/examples/prompt_agent.js +133 -0
- package/examples/readme_agent.js +148 -0
- package/examples/spawn_agent.js +293 -0
- package/examples/test_agent.js +187 -0
- package/examples/todo_agent.js +175 -0
- package/examples.bak.1774780058/ask_agent.js +114 -0
- package/examples.bak.1774780058/code_agent.js +149 -0
- package/examples.bak.1774780058/coderev_agent.js +72 -0
- package/examples.bak.1774780058/codeserver.sh +47 -0
- package/examples.bak.1774780058/daisy_agent.js +177 -0
- package/examples.bak.1774780058/docs_agent.js +119 -0
- package/{bin/hdAsk.js → examples.bak.1774780058/gpt_agent.js} +46 -40
- package/examples.bak.1774780058/grok_agent.js +98 -0
- package/examples.bak.1774780058/memory_agent.js +112 -0
- package/examples.bak.1774780058/npm_agent.js +175 -0
- package/examples.bak.1774780058/prompt_agent.js +112 -0
- package/examples.bak.1774780058/readme_agent.js +144 -0
- package/examples.bak.1774780058/spawn_agent.js +263 -0
- package/examples.bak.1774780058/test_agent.js +162 -0
- package/examples.bak.1774780058/todo_agent.js +138 -0
- package/lib/API/openai.com/reponses/text.js +12 -18
- package/lib/API/x.ai/collections.js +354 -0
- package/lib/API/x.ai/files.js +218 -0
- package/lib/API/x.ai/responses.js +492 -0
- package/lib/API/x.ai/text.js +1 -1
- package/lib/AgentClient.js +13 -6
- package/lib/AgentManager.js +80 -10
- package/lib/AgentServer.js +50 -22
- package/lib/Cli.js +7 -1
- package/lib/Prompt.js +4 -2
- package/lib/ToolSet.js +2 -1
- package/lib/genericToolset.js +258 -88
- package/lib/genericToolset.js.bak_syntax +402 -0
- package/lib/index.js +4 -2
- package/lib/wsCli.js +256 -0
- package/lib/wsIO.js +96 -0
- package/package.json +26 -21
- package/scenarios.bak.1774780058/data/eval_node_message.json +9 -0
- package/scenarios.bak.1774780058/data/hist_oa.json +66 -0
- package/scenarios.bak.1774780058/data/o3_response1.json +96 -0
- package/scenarios.bak.1774780058/data/oa_reasoning_parse.json +112 -0
- package/scenarios.bak.1774780058/data/tool_oa.json +96 -0
- package/scenarios.bak.1774780058/data/tool_xai.json +59 -0
- package/scenarios.bak.1774780058/data/tool_xai2.json +40 -0
- package/scenarios.bak.1774780058/data/xai-response-1.json +59 -0
- package/scenarios.bak.1774780058/data/xai-response-2.json +10 -0
- package/scenarios.bak.1774780058/data/xai_reasoning_tools_resp.json +59 -0
- package/scenarios.bak.1774780058/data/xai_search_response.json +58 -0
- package/scenarios.bak.1774780058/environment.js +10 -0
- package/scenarios.bak.1774780058/example.js +17 -0
- package/scenarios.bak.1774780058/genericToolset.test.js +182 -0
- package/scenarios.bak.1774780058/grok.js +113 -0
- package/scenarios.bak.1774780058/memory-tools.js +51 -0
- package/scenarios.bak.1774780058/openai-o3.js +137 -0
- package/scenarios.bak.1774780058/openai-prompt.js +155 -0
- package/scenarios.bak.1774780058/openai-session.js +148 -0
- package/scenarios.bak.1774780058/openai.js +102 -0
- package/scenarios.bak.1774780058/prompt.js +118 -0
- package/scenarios.bak.1774780058/promptFishbowl.js +76 -0
- package/scenarios.bak.1774780058/search.brave.com.js +25 -0
- package/scenarios.bak.1774780058/sh.js +15 -0
- package/scenarios.bak.1774780058/test-wsio.js +26 -0
- package/scenarios.bak.1774780058/testToolset.js +42 -0
- package/scenarios.bak.1774780058/toolset.js +16 -0
- package/scenarios.bak.1774780058/toolset.test.js +141 -0
- package/scenarios.bak.1774780058/write_file_syntax.test.js +145 -0
- package/scenarios.bak.1774780058/write_file_validation/README.md +30 -0
- package/scenarios.bak.1774780058/write_file_validation/bad.js +3 -0
- package/scenarios.bak.1774780058/write_file_validation/good.js +4 -0
- package/scenarios.bak.1774780058/write_file_validation/test.sh +43 -0
- package/scenarios.bak.1774780058/wsClient.js +69 -0
- package/scenarios.bak.1774780058/xai_responses.integration.test.js +57 -0
- package/scenarios.bak.1774780058/xai_responses.test.js +154 -0
- package/scenarios.bak.1774780058/xaicoll.js +50 -0
- package/scenarios.bak.1774780058/xaifiles.js +48 -0
- package/types/API/openai.com/reponses/text.d.ts +17 -3
- package/types/API/x.ai/collections.d.ts +167 -0
- package/types/API/x.ai/files.d.ts +84 -0
- package/types/API/x.ai/responses.d.ts +379 -0
- package/types/AgentClient.d.ts +5 -0
- package/types/AgentManager.d.ts +25 -31
- package/types/AgentServer.d.ts +5 -1
- package/types/Prompt.d.ts +4 -2
- package/types/ToolSet.d.ts +1 -0
- package/types/index.d.ts +4 -3
- package/types/wsCli.d.ts +3 -0
- package/types/wsIO.d.ts +26 -0
- package/utils/bars.js +40 -0
- package/utils/clear_sessions.sh +54 -0
- package/{bin/hdInspect.js → utils/format_log.js} +5 -0
- package/utils/list_sessions.sh +46 -0
- package/utils/search_sessions.sh +73 -0
- package/utils/syntax_check.sh +61 -0
- package/utils/test.sh +46 -0
- package/bin/hdClear.js +0 -13
- package/bin/hdCode.js +0 -115
- package/bin/hdConnect.js +0 -230
- package/bin/hdNpm.js +0 -114
- package/bin/hdPrompt.js +0 -108
- package/examples/claude-test.js +0 -89
- package/examples/claude.js +0 -143
- package/examples/gpt.js +0 -127
- package/examples/gpt_code.js +0 -125
- package/examples/gpt_note_keeping.js +0 -117
- package/examples/grok.js +0 -119
- package/examples/grok_code.js +0 -114
- package/examples/grok_note_keeping.js +0 -111
- package/module.md +0 -189
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { AgentManager } from '@j-o-r/hello-dave';
|
|
3
|
+
import { parseArgs } from '@j-o-r/sh';
|
|
4
|
+
|
|
5
|
+
const name = 'coderev_agent';
|
|
6
|
+
const api = 'xai';
|
|
7
|
+
let secret = '';
|
|
8
|
+
|
|
9
|
+
const args = parseArgs();
|
|
10
|
+
|
|
11
|
+
let input;
|
|
12
|
+
if (args._.length === 1 && typeof args._[0] === 'string' && args._[0].trim() !== '') {
|
|
13
|
+
input = args._[0].trim();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const help = args['help'] || false;
|
|
17
|
+
const connect = args['connect'] ? args['connect'] : undefined;
|
|
18
|
+
const serve = args['serve'] ? parseInt(args['serve']) : undefined;
|
|
19
|
+
|
|
20
|
+
/** @type {import('lib/API/x.ai/responses.js').XAIOptions} */
|
|
21
|
+
const options = { tools: [] };
|
|
22
|
+
options.tools.push({
|
|
23
|
+
type: 'web_search'
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (args['secret']) {
|
|
27
|
+
secret = args['secret'];
|
|
28
|
+
}
|
|
29
|
+
if (args['model'] || true) {
|
|
30
|
+
options.model = args['model'] || 'grok-4-fast-reasoning';
|
|
31
|
+
}
|
|
32
|
+
if (args['temperature']) {
|
|
33
|
+
options.temperature = parseFloat(args['temperature']);
|
|
34
|
+
}
|
|
35
|
+
if (args['tokens']) {
|
|
36
|
+
options.max_output_tokens = parseInt(args['tokens']);
|
|
37
|
+
}
|
|
38
|
+
if (args['top_p']) {
|
|
39
|
+
options.top_p = parseFloat(args['top_p']);
|
|
40
|
+
}
|
|
41
|
+
const reasoning = true;
|
|
42
|
+
if (reasoning) {
|
|
43
|
+
options.reasoning = {
|
|
44
|
+
effort: 'medium',
|
|
45
|
+
summary: 'auto'
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const toolsetMode = 'auto';
|
|
49
|
+
const contextWindow = args['context'] ? parseInt(args['context']) : 500000;
|
|
50
|
+
|
|
51
|
+
function printHelp() {
|
|
52
|
+
console.log(`
|
|
53
|
+
'${name} --help' You are looking at it.
|
|
54
|
+
|
|
55
|
+
## USAGE MODES:
|
|
56
|
+
|
|
57
|
+
### 1. Direct Call (One-Shot, Positional ONLY):
|
|
58
|
+
./examples/${name}.js "Paste git diff here" [--options]
|
|
59
|
+
|
|
60
|
+
### 2. Interactive CLI (no positional arg):
|
|
61
|
+
./examples/${name}.js [--options]
|
|
62
|
+
|
|
63
|
+
### 3. WS Server (no positional arg):
|
|
64
|
+
./examples/${name}.js --serve 8080 [--secret mysecret] [--options]
|
|
65
|
+
|
|
66
|
+
### 4. WS Client (no positional arg):
|
|
67
|
+
./examples/${name}.js --connect ws://127.0.0.1:8080/ws --secret mysecret [--options]
|
|
68
|
+
|
|
69
|
+
### 5. Hybrid (Server + Client, no positional arg):
|
|
70
|
+
./examples/${name}.js --serve 8081 --connect ws://other:8080/ws [--secret ...] [--options]
|
|
71
|
+
|
|
72
|
+
## SERVER OPTIONS EXPLAINED:
|
|
73
|
+
--serve [port]: Starts WebSocket SERVER at ws://127.0.0.1:[port]/ws. Allows other agents (--connect) to connect and use this agent as a remote TOOL (e.g., 'coderev_agent'). Runs indefinitely until Ctrl+C.
|
|
74
|
+
|
|
75
|
+
--connect [ws_url]: Connects as CLIENT to remote WS server at [ws_url] (e.g., ws://127.0.0.1:8080/ws). Gains access to remote agent's tools. Interactive CLI available.
|
|
76
|
+
|
|
77
|
+
--secret [string]: SHARED AUTH TOKEN (min 3 chars). SERVER rejects clients without matching --secret. CLIENTS must provide server's secret to connect. Use same secret for chains.
|
|
78
|
+
|
|
79
|
+
Note: Server/Client/Hybrid IGNORES positional input arg (use CLI modes instead). Hybrid: This agent serves AND uses remote tools.
|
|
80
|
+
|
|
81
|
+
## OPTIONS:
|
|
82
|
+
--model [grok-4-fast-reasoning|...] (default: grok-4-fast-reasoning)
|
|
83
|
+
--temperature [float] (-2 to +2)
|
|
84
|
+
--tokens [number] (max output tokens)
|
|
85
|
+
--top_p [float]
|
|
86
|
+
--context [number] (default: 500000)
|
|
87
|
+
|
|
88
|
+
## SERVER TOOLS (when no input):
|
|
89
|
+
Exposes as 'coderev_agent' tool for chaining.
|
|
90
|
+
`);
|
|
91
|
+
process.exit();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (help) {
|
|
95
|
+
printHelp();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const tool_call_name = 'coderev_agent';
|
|
99
|
+
const tool_call_description = `
|
|
100
|
+
Git diff analyzer. Supports WS chaining.
|
|
101
|
+
`.trim();
|
|
102
|
+
|
|
103
|
+
const prompt = `
|
|
104
|
+
You are coderev, a Git diff analyzer.
|
|
105
|
+
|
|
106
|
+
Analyze git diffs provided in queries, review code changes for bugs, improvements, best practices, security issues, and provide actionable suggestions. Use read_file to access specific files, execute_bash_script for git commands or other shell tasks, and web_search for looking up coding standards or references if needed. Be thorough, constructive, and reference specific lines in diffs when possible.
|
|
107
|
+
|
|
108
|
+
Respond in a structured format: Summary, Issues Found, Suggestions, Overall Rating (1-10).
|
|
109
|
+
`.trim();
|
|
110
|
+
|
|
111
|
+
const agent = new AgentManager({ name, secret });
|
|
112
|
+
agent.setup({
|
|
113
|
+
prompt,
|
|
114
|
+
api,
|
|
115
|
+
options,
|
|
116
|
+
toolsetMode,
|
|
117
|
+
contextWindow
|
|
118
|
+
});
|
|
119
|
+
const toolset = agent.getToolset();
|
|
120
|
+
if (toolset) {
|
|
121
|
+
agent.addGenericToolcall('read_file');
|
|
122
|
+
agent.addGenericToolcall('execute_bash_script');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const cliIntro = `
|
|
126
|
+
${name} ${options.model}.
|
|
127
|
+
- context: ${contextWindow}
|
|
128
|
+
${tool_call_name}
|
|
129
|
+
`.trim();
|
|
130
|
+
|
|
131
|
+
if (input) {
|
|
132
|
+
const RES = await agent.directCall(input);
|
|
133
|
+
console.log(RES);
|
|
134
|
+
} else {
|
|
135
|
+
await agent.start(serve, connect, cliIntro, tool_call_name, tool_call_description);
|
|
136
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
|
|
3
|
+
echo "Usage: $0 <PORT> [SECRET] # PORT: 1024-65535, SECRET: optional (defaults to '123')"
|
|
4
|
+
exit 1
|
|
5
|
+
fi
|
|
6
|
+
|
|
7
|
+
PORT="$1"
|
|
8
|
+
SECRET="${2:-123}"
|
|
9
|
+
|
|
10
|
+
if [ -z "$SECRET" ] || [ ${#SECRET} -lt 3 ]; then
|
|
11
|
+
echo "Error: SECRET must be at least 3 characters: '$SECRET'"
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1024 ] || [ "$PORT" -gt 65535 ]; then
|
|
16
|
+
echo "Error: Invalid port number: $PORT. Must be between 1024 and 65535."
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Compute paths relative to THIS script's location (portable from anywhere)
|
|
21
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
22
|
+
PROJECT_DIR="$( cd "$( dirname "${SCRIPT_DIR}" )" && pwd )"
|
|
23
|
+
FOLDER=$(basename "$PROJECT_DIR")
|
|
24
|
+
|
|
25
|
+
echo "Starting CodeServer on port ${PORT} in folder '${FOLDER}' (SCRIPT_DIR: ${SCRIPT_DIR}) with SECRET '${SECRET}'..."
|
|
26
|
+
|
|
27
|
+
# Delete existing processes with folder_port suffix
|
|
28
|
+
pm2 delete "${FOLDER}_code_agent_${PORT}" 2>/dev/null || true
|
|
29
|
+
pm2 delete "${FOLDER}_todo_agent_${PORT}" 2>/dev/null || true
|
|
30
|
+
pm2 delete "${FOLDER}_readme_agent_${PORT}" 2>/dev/null || true
|
|
31
|
+
pm2 delete "${FOLDER}_npm_agent_${PORT}" 2>/dev/null || true
|
|
32
|
+
pm2 delete "${FOLDER}_docs_agent_${PORT}" 2>/dev/null || true
|
|
33
|
+
pm2 delete "${FOLDER}_test_agent_${PORT}" 2>/dev/null || true
|
|
34
|
+
pm2 delete "${FOLDER}_memory_agent_${PORT}" 2>/dev/null || true
|
|
35
|
+
|
|
36
|
+
# Spawn main Agent / server (absolute paths to scripts)
|
|
37
|
+
pm2 start "${SCRIPT_DIR}/code_agent.js" --name "${FOLDER}_code_agent_${PORT}" -- --serve "${PORT}" --tools javascript --secret "${SECRET}"
|
|
38
|
+
# Attach clients
|
|
39
|
+
pm2 start "${SCRIPT_DIR}/todo_agent.js" --name "${FOLDER}_todo_agent_${PORT}" -- --connect "ws://127.0.0.1:${PORT}/ws" --secret "${SECRET}"
|
|
40
|
+
pm2 start "${SCRIPT_DIR}/readme_agent.js" --name "${FOLDER}_readme_agent_${PORT}" -- --connect "ws://127.0.0.1:${PORT}/ws" --secret "${SECRET}"
|
|
41
|
+
pm2 start "${SCRIPT_DIR}/npm_agent.js" --name "${FOLDER}_npm_agent_${PORT}" -- --connect "ws://127.0.0.1:${PORT}/ws" --secret "${SECRET}"
|
|
42
|
+
pm2 start "${SCRIPT_DIR}/docs_agent.js" --name "${FOLDER}_docs_agent_${PORT}" -- --connect "ws://127.0.0.1:${PORT}/ws" --secret "${SECRET}"
|
|
43
|
+
pm2 start "${SCRIPT_DIR}/test_agent.js" --name "${FOLDER}_test_agent_${PORT}" -- --connect "ws://127.0.0.1:${PORT}/ws" --secret "${SECRET}"
|
|
44
|
+
pm2 start "${SCRIPT_DIR}/memory_agent.js" --name "${FOLDER}_memory_agent_${PORT}" -- --connect "ws://127.0.0.1:${PORT}/ws" --secret "${SECRET}"
|
|
45
|
+
|
|
46
|
+
echo "CodeServer processes spawned with prefix '${FOLDER}_' and suffix _${PORT}. Check with: pm2 list | grep '${FOLDER}_${PORT}'"
|
|
47
|
+
echo "dave --connect ws://127.0.0.1:${PORT}/ws --secret '$SECRET'"
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { AgentManager } from '@j-o-r/hello-dave';
|
|
3
|
+
import { parseArgs } from '@j-o-r/sh';
|
|
4
|
+
|
|
5
|
+
const name = 'daisy_agent';
|
|
6
|
+
const api = 'xai';
|
|
7
|
+
let secret = '';
|
|
8
|
+
|
|
9
|
+
const args = parseArgs();
|
|
10
|
+
|
|
11
|
+
let input;
|
|
12
|
+
if (args._.length === 1 && typeof args._[0] === 'string' && args._[0].trim() !== '') {
|
|
13
|
+
input = args._[0].trim();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const help = args['help'] || false;
|
|
17
|
+
const connect = args['connect'] ? args['connect'] : undefined;
|
|
18
|
+
const serve = args['serve'] ? parseInt(args['serve']) : undefined;
|
|
19
|
+
|
|
20
|
+
/** @type {import('lib/API/x.ai/responses.js').XAIOptions} */
|
|
21
|
+
const options = { tools: [] };
|
|
22
|
+
options.tools.push({
|
|
23
|
+
type: 'web_search'
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (args['secret']) {
|
|
27
|
+
secret = args['secret'];
|
|
28
|
+
}
|
|
29
|
+
if (args['model'] || true) {
|
|
30
|
+
options.model = args['model'] || 'grok-4-fast-reasoning';
|
|
31
|
+
}
|
|
32
|
+
if (args['temperature']) {
|
|
33
|
+
options.temperature = parseFloat(args['temperature']);
|
|
34
|
+
} else {
|
|
35
|
+
options.temperature = 0.8;
|
|
36
|
+
}
|
|
37
|
+
if (args['tokens']) {
|
|
38
|
+
options.max_output_tokens = parseInt(args['tokens']);
|
|
39
|
+
}
|
|
40
|
+
if (args['top_p']) {
|
|
41
|
+
options.top_p = parseFloat(args['top_p']);
|
|
42
|
+
}
|
|
43
|
+
const reasoning = true;
|
|
44
|
+
if (reasoning) {
|
|
45
|
+
options.reasoning = {
|
|
46
|
+
effort: 'medium',
|
|
47
|
+
summary: 'auto'
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const toolsetMode = 'auto';
|
|
51
|
+
const contextWindow = args['context'] ? parseInt(args['context']) : 1900000;
|
|
52
|
+
|
|
53
|
+
function printHelp() {
|
|
54
|
+
console.log(`
|
|
55
|
+
'${name} --help' You are looking at it.
|
|
56
|
+
|
|
57
|
+
## USAGE MODES:
|
|
58
|
+
|
|
59
|
+
### 1. Direct Call (One-Shot, Positional ONLY):
|
|
60
|
+
./examples/${name}.js "Generate lyrics for pop song" [--options]
|
|
61
|
+
|
|
62
|
+
### 2. Interactive CLI (no positional arg):
|
|
63
|
+
./examples/${name}.js [--options]
|
|
64
|
+
|
|
65
|
+
### 3. WS Server (no positional arg):
|
|
66
|
+
./examples/${name}.js --serve 8080 [--secret mysecret] [--options]
|
|
67
|
+
|
|
68
|
+
### 4. WS Client (no positional arg):
|
|
69
|
+
./examples/${name}.js --connect ws://127.0.0.1:8080/ws --secret mysecret [--options]
|
|
70
|
+
|
|
71
|
+
### 5. Hybrid (Server + Client, no positional arg):
|
|
72
|
+
./examples/${name}.js --serve 8081 --connect ws://other:8080/ws [--secret ...] [--options]
|
|
73
|
+
|
|
74
|
+
## SERVER OPTIONS EXPLAINED:
|
|
75
|
+
--serve [port]: Starts WebSocket SERVER at ws://127.0.0.1:[port]/ws. Allows other agents (--connect) to connect and use this agent as a remote TOOL (e.g., 'daisy_agent'). Runs indefinitely until Ctrl+C.
|
|
76
|
+
|
|
77
|
+
--connect [ws_url]: Connects as CLIENT to remote WS server at [ws_url] (e.g., ws://127.0.0.1:8080/ws). Gains access to remote agent's tools. Interactive CLI available.
|
|
78
|
+
|
|
79
|
+
--secret [string]: SHARED AUTH TOKEN (min 3 chars). SERVER rejects clients without matching --secret. CLIENTS must provide server's secret to connect. Use same secret for chains.
|
|
80
|
+
|
|
81
|
+
Note: Server/Client/Hybrid IGNORES positional input arg (use CLI modes instead). Hybrid: This agent serves AND uses remote tools.
|
|
82
|
+
|
|
83
|
+
## OPTIONS:
|
|
84
|
+
--model [grok-4-fast-reasoning|...] (default: grok-4-fast-reasoning)
|
|
85
|
+
--temperature [float] (-2 to +2, default 0.8 for creativity)
|
|
86
|
+
--tokens [number] (max output tokens)
|
|
87
|
+
--top_p [float]
|
|
88
|
+
--context [number] (default: 1900000)
|
|
89
|
+
|
|
90
|
+
## SERVER TOOLS (when no input):
|
|
91
|
+
Exposes as 'daisy_agent' tool for chaining.
|
|
92
|
+
`);
|
|
93
|
+
process.exit();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (help) {
|
|
97
|
+
printHelp();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const tool_call_name = 'daisy_agent';
|
|
101
|
+
const tool_call_description = `
|
|
102
|
+
Daisy Music Assistant:
|
|
103
|
+
- "Lyrics for [theme]" → Generate lyrics.
|
|
104
|
+
- "Suno prompt: [style]" → Optimized Suno prompt.
|
|
105
|
+
- "ffmpeg [task] on file.wav" → Bash script to run.
|
|
106
|
+
- web_search: Research chords/lyrics.
|
|
107
|
+
- execute_bash_script: Processes your local files safely.
|
|
108
|
+
`.trim();
|
|
109
|
+
|
|
110
|
+
const prompt = `
|
|
111
|
+
You are ${name}, a helpful music creation and editing assistant for the user's computer.
|
|
112
|
+
|
|
113
|
+
Core expertise:
|
|
114
|
+
- Generate lyrics: Creative, structured (verses, chorus), themed, rhyming.
|
|
115
|
+
- Suno AI prompts: Detailed, vivid descriptions (genre, mood, instruments, structure, vocals).
|
|
116
|
+
- Local audio editing: Use execute_bash_script with ffmpeg/sox commands. Provide exact bash snippets first, confirm before running. Examples:
|
|
117
|
+
* Trim: ffmpeg -i input.mp3 -ss 00:00:30 -t 00:01:00 output.mp3
|
|
118
|
+
* Concat: echo "file 'a.mp3'" > list.txt; ffmpeg -f concat -i list.txt out.mp3
|
|
119
|
+
* Sox effects: sox input.wav output.wav fade 0 3 2 norm
|
|
120
|
+
* Convert: ffmpeg -i video.mp4 audio.aac
|
|
121
|
+
- Music theory: Chords, scales, BPM, EQ tips.
|
|
122
|
+
- Workflows: Step-by-step for mixing, mastering, layering tracks.
|
|
123
|
+
|
|
124
|
+
Behavior:
|
|
125
|
+
- Be creative & enthusiastic!
|
|
126
|
+
- Step-by-step: Explain, provide code, suggest files in current dir.
|
|
127
|
+
- Safety: Quote bash commands; ask confirmation for destructive ops (e.g., overwrite).
|
|
128
|
+
- Use web_search for inspiration/lyrics if needed.
|
|
129
|
+
- Output ready-to-copy bash for ffmpeg/sox.
|
|
130
|
+
- List files if unclear: Use ls *.wav *.mp3 etc. via bash.
|
|
131
|
+
|
|
132
|
+
Current env: Ubuntu, ffmpeg & sox installed, cwd: /home/jd/devpri/js/hello-dave
|
|
133
|
+
|
|
134
|
+
Respond concisely but completely. Use markdown for code/lyrics/prompts.
|
|
135
|
+
`.trim();
|
|
136
|
+
|
|
137
|
+
const agent = new AgentManager({ name, secret });
|
|
138
|
+
agent.setup({
|
|
139
|
+
prompt,
|
|
140
|
+
api,
|
|
141
|
+
options,
|
|
142
|
+
toolsetMode,
|
|
143
|
+
contextWindow
|
|
144
|
+
});
|
|
145
|
+
const toolset = agent.getToolset();
|
|
146
|
+
if (toolset) {
|
|
147
|
+
agent.addGenericToolcall('open_link');
|
|
148
|
+
agent.addGenericToolcall('send_email');
|
|
149
|
+
agent.addGenericToolcall('execute_bash_script');
|
|
150
|
+
agent.addGenericToolcall('read_file');
|
|
151
|
+
agent.addGenericToolcall('write_file');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const cliIntro = `
|
|
155
|
+
${name} ${options.model} ready! (temp: ${options.temperature}, context: ${contextWindow})
|
|
156
|
+
|
|
157
|
+
Ask me to:
|
|
158
|
+
- Write lyrics
|
|
159
|
+
- Craft Suno prompts
|
|
160
|
+
- Edit audio: "fade out my track.mp3" → I'll give ffmpeg cmd
|
|
161
|
+
Type /help for more.
|
|
162
|
+
${tool_call_name}
|
|
163
|
+
`.trim();
|
|
164
|
+
|
|
165
|
+
if (input) {
|
|
166
|
+
const RES = await agent.directCall(input);
|
|
167
|
+
console.log(RES);
|
|
168
|
+
} else {
|
|
169
|
+
await agent.start(serve, connect, cliIntro, tool_call_name, tool_call_description);
|
|
170
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { AgentManager } from '@j-o-r/hello-dave';
|
|
3
|
+
import { parseArgs } from '@j-o-r/sh';
|
|
4
|
+
|
|
5
|
+
const name = 'docs_agent';
|
|
6
|
+
const api = 'xai';
|
|
7
|
+
let secret = '';
|
|
8
|
+
|
|
9
|
+
const args = parseArgs();
|
|
10
|
+
|
|
11
|
+
let input;
|
|
12
|
+
if (args._.length === 1 && typeof args._[0] === 'string' && args._[0].trim() !== '') {
|
|
13
|
+
input = args._[0].trim();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const help = args['help'] || false;
|
|
17
|
+
const connect = args['connect'] ? args['connect'] : undefined;
|
|
18
|
+
const serve = args['serve'] ? parseInt(args['serve']) : undefined;
|
|
19
|
+
|
|
20
|
+
const options = { tools: [] };
|
|
21
|
+
options.tools.push({
|
|
22
|
+
type: 'web_search'
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (args['secret']) {
|
|
26
|
+
secret = args['secret'];
|
|
27
|
+
}
|
|
28
|
+
if (args['model'] || true) {
|
|
29
|
+
options.model = args['model'] || 'grok-4-fast-reasoning';
|
|
30
|
+
}
|
|
31
|
+
if (args['temperature']) {
|
|
32
|
+
options.temperature = parseFloat(args['temperature']);
|
|
33
|
+
}
|
|
34
|
+
if (args['tokens']) {
|
|
35
|
+
options.max_output_tokens = parseInt(args['tokens']);
|
|
36
|
+
}
|
|
37
|
+
if (args['top_p']) {
|
|
38
|
+
options.top_p = parseFloat(args['top_p']);
|
|
39
|
+
}
|
|
40
|
+
const reasoning = true;
|
|
41
|
+
if (reasoning) {
|
|
42
|
+
options.reasoning = {
|
|
43
|
+
effort: 'medium',
|
|
44
|
+
summary: 'auto'
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const toolsetMode = 'auto';
|
|
48
|
+
const contextWindow = args['context'] ? parseInt(args['context']) : 250000;
|
|
49
|
+
|
|
50
|
+
function printHelp() {
|
|
51
|
+
console.log(`
|
|
52
|
+
'${name} --help' You are looking at it.
|
|
53
|
+
|
|
54
|
+
## USAGE MODES:
|
|
55
|
+
|
|
56
|
+
### 1. Direct Call (One-Shot, Positional ONLY):
|
|
57
|
+
./examples/${name}.js "Create a doc on Node.js basics" [--options]
|
|
58
|
+
|
|
59
|
+
### 2. Interactive CLI (no positional arg):
|
|
60
|
+
./examples/${name}.js [--options]
|
|
61
|
+
|
|
62
|
+
### 3. WS Server (no positional arg):
|
|
63
|
+
./examples/${name}.js --serve 8080 [--secret mysecret] [--options]
|
|
64
|
+
|
|
65
|
+
### 4. WS Client (no positional arg):
|
|
66
|
+
./examples/${name}.js --connect ws://127.0.0.1:8080/ws --secret mysecret [--options]
|
|
67
|
+
|
|
68
|
+
### 5. Hybrid (Server + Client, no positional arg):
|
|
69
|
+
./examples/${name}.js --serve 8081 --connect ws://other:8080/ws [--secret ...] [--options]
|
|
70
|
+
|
|
71
|
+
## SERVER OPTIONS EXPLAINED:
|
|
72
|
+
--serve [port]: Starts WebSocket SERVER at ws://127.0.0.1:[port]/ws. Allows other agents (--connect) to connect and use this agent as a remote TOOL (e.g., 'agent_docs'). Runs indefinitely until Ctrl+C.
|
|
73
|
+
|
|
74
|
+
--connect [ws_url]: Connects as CLIENT to remote WS server at [ws_url] (e.g., ws://127.0.0.1:8080/ws). Gains access to remote agent's tools. Interactive CLI available.
|
|
75
|
+
|
|
76
|
+
--secret [string]: SHARED AUTH TOKEN (min 3 chars). SERVER rejects clients without matching --secret. CLIENTS must provide server's secret to connect. Use same secret for chains.
|
|
77
|
+
|
|
78
|
+
Note: Server/Client/Hybrid IGNORES positional input arg (use CLI modes instead). Hybrid: This agent serves AND uses remote tools.
|
|
79
|
+
|
|
80
|
+
## OPTIONS:
|
|
81
|
+
--model [grok-4-fast-reasoning|...] (default: grok-4-fast-reasoning)
|
|
82
|
+
--temperature [float] (-2 to +2)
|
|
83
|
+
--tokens [number] (max output tokens)
|
|
84
|
+
--top_p [float]
|
|
85
|
+
--context [number] (default: 250000)
|
|
86
|
+
|
|
87
|
+
## SERVER TOOLS (when no input):
|
|
88
|
+
Exposes as 'agent_docs' tool for chaining.
|
|
89
|
+
`);
|
|
90
|
+
process.exit();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (help) {
|
|
94
|
+
printHelp();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const tool_call_name = 'agent_docs';
|
|
98
|
+
const tool_call_description = `
|
|
99
|
+
documentation maintainer that creates, updates, retrieves, and organizes Markdown files in ./docs/ for any subject.
|
|
100
|
+
`.trim();
|
|
101
|
+
|
|
102
|
+
const prompt = `
|
|
103
|
+
You are docs_agent, a documentation maintainer that creates, updates, retrieves, and organizes Markdown files in ./docs/ (relative to cwd). You own this folder—create it if missing. All content is in clean Markdown (.md files only). Filenames must descriptively indicate content (e.g., "introduction-to-nodejs.md", "react-hooks-guide.md"—kebab-case, no spaces).
|
|
104
|
+
|
|
105
|
+
**CRITICAL: STRICT NO-CODING RULE** - Stick to docs management ONLY. NEVER:
|
|
106
|
+
- Use coding tools (e.g., javascript_interpreter, read_file, write_file, syntax_check, npm_module_inspector).
|
|
107
|
+
- Generate, execute, or edit code (JS/Python/Bash beyond safe docs ops).
|
|
108
|
+
- Misuse bash for anything beyond safe ./docs/*.md ops (e.g., ls docs/, cat docs/file.md, echo > docs/file.md, cp docs/file.md docs/file.md.bak).
|
|
109
|
+
- Touch files outside ./docs/.
|
|
110
|
+
If asked to code or edit non-docs files, decline: "For coding or other tasks, use specialized agents like code_agent. I'll handle ./docs/ only."
|
|
111
|
+
|
|
112
|
+
Behaviors:
|
|
113
|
+
- AUTONOMOUS: Use tools to manage files without user intervention. For reading: \`ls docs/*.md\` then \`cat docs/[filename].md\`. For writing/updating: Backup first (\`cp docs/old.md docs/old.md.bak\`), then \`echo "[full Markdown content]" > docs/[filename].md\`.
|
|
114
|
+
- RESEARCH: Use web_search or browse_page to gather accurate info before creating/updating.
|
|
115
|
+
- STRUCTURE: Markdown best practices—use # Headings, ## Subheadings, - Lists, \`code\` inline, \`\`\`blocks\`\`\`, links [text](url). Keep concise yet comprehensive.
|
|
116
|
+
- RETRIEVAL: Display full file content in Markdown format when asked.
|
|
117
|
+
- SAFETY: Never delete files. Confirm overwrites via backup. If unsure, ask for clarification.
|
|
118
|
+
- FILENAME SUGGESTION: Propose and use logical names based on topic (e.g., for "AI agents", use "ai-agents-overview.md").
|
|
119
|
+
- OUTPUT: Respond in Markdown. For file ops, show before/after diffs if changed.
|
|
120
|
+
|
|
121
|
+
Use execute_bash_script ONLY for safe ./docs/ ops and inspections (ls, cat, cp, echo >). Use web_search/browse_page for research. Reason step-by-step.
|
|
122
|
+
`.trim();
|
|
123
|
+
|
|
124
|
+
const agent = new AgentManager({ name, secret });
|
|
125
|
+
agent.setup({
|
|
126
|
+
prompt,
|
|
127
|
+
api,
|
|
128
|
+
options,
|
|
129
|
+
toolsetMode,
|
|
130
|
+
contextWindow
|
|
131
|
+
});
|
|
132
|
+
const toolset = agent.getToolset();
|
|
133
|
+
if (toolset) {
|
|
134
|
+
agent.addGenericToolcall('execute_bash_script');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const cliIntro = `
|
|
138
|
+
${name} ${options.model}.
|
|
139
|
+
- context: ${contextWindow}
|
|
140
|
+
${tool_call_name}
|
|
141
|
+
`.trim();
|
|
142
|
+
|
|
143
|
+
if (input) {
|
|
144
|
+
const RES = await agent.directCall(input);
|
|
145
|
+
console.log(RES);
|
|
146
|
+
} else {
|
|
147
|
+
await agent.start(serve, connect, cliIntro, tool_call_name, tool_call_description);
|
|
148
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { AgentManager } from '@j-o-r/hello-dave';
|
|
3
|
+
import { parseArgs } from '@j-o-r/sh';
|
|
4
|
+
|
|
5
|
+
const name = 'gpt_agent';
|
|
6
|
+
const api = 'gpt';
|
|
7
|
+
let secret = '';
|
|
8
|
+
|
|
9
|
+
const args = parseArgs();
|
|
10
|
+
|
|
11
|
+
let input; // Directcall input (positional ONLY - NO pipe)
|
|
12
|
+
if (args._.length === 1 && typeof args._[0] === 'string' && args._[0].trim() !== '') {
|
|
13
|
+
input = args._[0].trim();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const help = args['help'] || false;
|
|
17
|
+
const connect = args['connect'] ? args['connect'] : undefined;
|
|
18
|
+
const serve = args['serve'] ? parseInt(args['serve']) : undefined;
|
|
19
|
+
|
|
20
|
+
/** @type {import('@j-o-r/hello-dave/types/API/openai.com/reponses/text').OAOptions} */
|
|
21
|
+
const options = { tools: [] };
|
|
22
|
+
options.tools.push({
|
|
23
|
+
type: 'web_search'
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (args['secret']) {
|
|
27
|
+
secret = args['secret'];
|
|
28
|
+
}
|
|
29
|
+
if (args['model'] || true) {
|
|
30
|
+
options.model = args['model'] || 'gpt-5.4';
|
|
31
|
+
}
|
|
32
|
+
if (args['temperature']) {
|
|
33
|
+
options.temperature = parseFloat(args['temperature']);
|
|
34
|
+
}
|
|
35
|
+
if (args['tokens']) {
|
|
36
|
+
options.max_output_tokens = parseInt(args['tokens']);
|
|
37
|
+
}
|
|
38
|
+
if (args['top_p']) {
|
|
39
|
+
options.top_p = parseFloat(args['top_p']);
|
|
40
|
+
}
|
|
41
|
+
const reasoning = true;
|
|
42
|
+
if (reasoning) {
|
|
43
|
+
options.reasoning = {
|
|
44
|
+
effort: 'medium',
|
|
45
|
+
summary: 'auto'
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const contextWindow = args['context'] ? parseInt(args['context']) : 100000;
|
|
49
|
+
const toolsetMode = 'auto';
|
|
50
|
+
|
|
51
|
+
function printHelp() {
|
|
52
|
+
console.log(`
|
|
53
|
+
'${name} --help' You are looking at it.
|
|
54
|
+
|
|
55
|
+
## USAGE MODES:
|
|
56
|
+
|
|
57
|
+
### 1. Direct Call (One-Shot, Positional ONLY):
|
|
58
|
+
./examples/${name}.js "Your query" [--options]
|
|
59
|
+
|
|
60
|
+
### 2. Interactive CLI (no positional arg):
|
|
61
|
+
./examples/${name}.js [--options]
|
|
62
|
+
|
|
63
|
+
### 3. WS Server (no positional arg):
|
|
64
|
+
./examples/${name}.js --serve 8080 [--secret mysecret] [--options]
|
|
65
|
+
|
|
66
|
+
### 4. WS Client (no positional arg):
|
|
67
|
+
./examples/${name}.js --connect ws://127.0.0.1:8080/ws --secret mysecret [--options]
|
|
68
|
+
|
|
69
|
+
### 5. Hybrid (Server + Client, no positional arg):
|
|
70
|
+
./examples/${name}.js --serve 8081 --connect ws://other:8080/ws [--secret ...] [--options]
|
|
71
|
+
|
|
72
|
+
## SERVER OPTIONS EXPLAINED:
|
|
73
|
+
--serve [port]: Starts WebSocket SERVER at ws://127.0.0.1:[port]/ws. Allows other agents (--connect) to connect and use this agent as a remote TOOL (e.g., 'gpt_agent'). Runs indefinitely until Ctrl+C.
|
|
74
|
+
|
|
75
|
+
--connect [ws_url]: Connects as CLIENT to remote WS server at [ws_url] (e.g., ws://127.0.0.1:8080/ws). Gains access to remote agent's tools. Interactive CLI available.
|
|
76
|
+
|
|
77
|
+
--secret [string]: SHARED AUTH TOKEN (min 3 chars). SERVER rejects clients without matching --secret. CLIENTS must provide server's secret to connect. Use same secret for chains.
|
|
78
|
+
|
|
79
|
+
Note: Server/Client/Hybrid IGNORES positional input arg (use CLI modes instead). Hybrid: This agent serves AND uses remote tools.
|
|
80
|
+
|
|
81
|
+
## OPTIONS:
|
|
82
|
+
--model ['gpt-5.4'|...] (default: gpt-5.4)
|
|
83
|
+
--temperature [float] (-2 to +2)
|
|
84
|
+
--tokens [number] (max output tokens)
|
|
85
|
+
--top_p [float]
|
|
86
|
+
--context [number] (default: 100000)
|
|
87
|
+
|
|
88
|
+
## SERVER TOOLS (when no input):
|
|
89
|
+
Exposes as 'gpt_agent' tool for chaining.
|
|
90
|
+
`);
|
|
91
|
+
process.exit()
|
|
92
|
+
}
|
|
93
|
+
if (help) {
|
|
94
|
+
printHelp();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const prompt = `
|
|
98
|
+
Respond briefly and directly, using minimal words. Reason step-by-step first. Focus solely on core point; avoid elaboration or follow-ups. If unclear, ask clarifying questions before proceeding.
|
|
99
|
+
`.trim();
|
|
100
|
+
|
|
101
|
+
const tool_call_name = 'gpt_agent';
|
|
102
|
+
const tool_call_description = `
|
|
103
|
+
GPT Agent for quick responses and web search.
|
|
104
|
+
`.trim();
|
|
105
|
+
|
|
106
|
+
const agent = new AgentManager({ name, secret });
|
|
107
|
+
agent.setup({
|
|
108
|
+
prompt,
|
|
109
|
+
api,
|
|
110
|
+
options,
|
|
111
|
+
toolsetMode,
|
|
112
|
+
contextWindow
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const cliIntro = `
|
|
116
|
+
${name} ${options.model}.
|
|
117
|
+
- context: ${contextWindow}
|
|
118
|
+
`.trim();
|
|
119
|
+
|
|
120
|
+
if (input) {
|
|
121
|
+
const RES = await agent.directCall(input);
|
|
122
|
+
console.log(RES);
|
|
123
|
+
} else {
|
|
124
|
+
await agent.start(serve, connect, cliIntro, tool_call_name, tool_call_description);
|
|
125
|
+
}
|