@j-o-r/hello-dave 0.0.4 → 0.0.6

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 (107) hide show
  1. package/CHANGELOG.md +35 -17
  2. package/bin/dave.js +105 -74
  3. package/examples/gpt_agent.js +3 -6
  4. package/examples/memory_agent.js +134 -23
  5. package/examples/test_agent.js +0 -2
  6. package/lib/ToolSet.js +4 -1
  7. package/lib/genericToolset.js +4 -88
  8. package/lib/index.js +5 -1
  9. package/lib/wsIO.js +1 -11
  10. package/package.json +4 -4
  11. package/types/index.d.ts +3 -1
  12. package/README.md +0 -492
  13. package/README.md.backup +0 -269
  14. package/README.md.bak +0 -481
  15. package/README.md.bak.1774780058 +0 -338
  16. package/README.md.bak2 +0 -455
  17. package/docs.bak.1774780058/agent-manager.md +0 -167
  18. package/docs.bak.1774780058/agent-manager.md.bak +0 -137
  19. package/docs.bak.1774780058/agent-manager.md.bak2 +0 -157
  20. package/docs.bak.1774780058/codeserver-pattern.md +0 -191
  21. package/docs.bak.1774780058/path-resolution-best-practices.md +0 -104
  22. package/docs.bak.1774780058/project-overview.md +0 -67
  23. package/docs.bak.1774780058/project-overview.md.bak +0 -67
  24. package/docs.bak.1774780058/prompt-class.md +0 -141
  25. package/docs.bak.1774780058/prompt-class.md.bak +0 -142
  26. package/docs.bak.1774780058/tools-syntax-validation.md +0 -121
  27. package/docs.bak.1774780058/tools-syntax-validation.md.bak2 +0 -125
  28. package/docs.bak.1774780058/tools-syntax-validation.md.bak3 +0 -125
  29. package/docs.bak.1774780058/tools-syntax-validation.md.bak4 +0 -106
  30. package/docs.bak.1774780058/tools-syntax-validation.md.bak_path +0 -106
  31. package/docs.bak.1774780058/toolset.md +0 -164
  32. package/docs.bak.1774780058/toolset.md.bak +0 -94
  33. package/docs.bak.1774780058/toolset.md.bak3 +0 -161
  34. package/docs.bak.1774780058/toolset.md.bak4 +0 -161
  35. package/docs.bak.1774780058/toolset.md.bak5 +0 -161
  36. package/docs.bak.1774780058/toolset.md.bak6 +0 -163
  37. package/docs.bak.1774780058/toolset.md.bak_path +0 -163
  38. package/docs.bak.1774780058/toolset.md.bak_syntax +0 -161
  39. package/docs.bak.1774780058/xai-responses.md +0 -111
  40. package/docs.bak.1774780058/xai-responses.md.bak +0 -107
  41. package/docs.bak.1774780058/xai-responses.md.bak2 +0 -107
  42. package/docs.bak.1774780058/xai_collections.md +0 -106
  43. package/examples/coderev_agent.js +0 -136
  44. package/examples/grok_agent.js.bak +0 -98
  45. package/examples/grok_agent.js.bak.2 +0 -99
  46. package/examples/grok_agent.js.bak.3 +0 -1
  47. package/examples/grok_agent.js.bak.4 +0 -124
  48. package/examples/grok_agent.js.bak.5 +0 -1
  49. package/examples/grok_agent.js.bak.6 +0 -1
  50. package/examples/npm_agent.js.bak.3 +0 -2
  51. package/examples/npm_agent.js.bak.4 +0 -205
  52. package/examples/npm_agent.js.bak.5 +0 -1
  53. package/examples/npm_agent.js.bak.6 +0 -1
  54. package/examples.bak.1774780058/ask_agent.js +0 -114
  55. package/examples.bak.1774780058/code_agent.js +0 -149
  56. package/examples.bak.1774780058/coderev_agent.js +0 -72
  57. package/examples.bak.1774780058/codeserver.sh +0 -47
  58. package/examples.bak.1774780058/daisy_agent.js +0 -177
  59. package/examples.bak.1774780058/docs_agent.js +0 -119
  60. package/examples.bak.1774780058/gpt_agent.js +0 -109
  61. package/examples.bak.1774780058/grok_agent.js +0 -98
  62. package/examples.bak.1774780058/memory_agent.js +0 -112
  63. package/examples.bak.1774780058/npm_agent.js +0 -175
  64. package/examples.bak.1774780058/prompt_agent.js +0 -112
  65. package/examples.bak.1774780058/readme_agent.js +0 -144
  66. package/examples.bak.1774780058/spawn_agent.js +0 -263
  67. package/examples.bak.1774780058/test_agent.js +0 -162
  68. package/examples.bak.1774780058/todo_agent.js +0 -138
  69. package/scenarios.bak.1774780058/data/eval_node_message.json +0 -9
  70. package/scenarios.bak.1774780058/data/hist_oa.json +0 -66
  71. package/scenarios.bak.1774780058/data/o3_response1.json +0 -96
  72. package/scenarios.bak.1774780058/data/oa_reasoning_parse.json +0 -112
  73. package/scenarios.bak.1774780058/data/tool_oa.json +0 -96
  74. package/scenarios.bak.1774780058/data/tool_xai.json +0 -59
  75. package/scenarios.bak.1774780058/data/tool_xai2.json +0 -40
  76. package/scenarios.bak.1774780058/data/xai-response-1.json +0 -59
  77. package/scenarios.bak.1774780058/data/xai-response-2.json +0 -10
  78. package/scenarios.bak.1774780058/data/xai_reasoning_tools_resp.json +0 -59
  79. package/scenarios.bak.1774780058/data/xai_search_response.json +0 -58
  80. package/scenarios.bak.1774780058/environment.js +0 -10
  81. package/scenarios.bak.1774780058/example.js +0 -17
  82. package/scenarios.bak.1774780058/genericToolset.test.js +0 -182
  83. package/scenarios.bak.1774780058/grok.js +0 -113
  84. package/scenarios.bak.1774780058/memory-tools.js +0 -51
  85. package/scenarios.bak.1774780058/openai-o3.js +0 -137
  86. package/scenarios.bak.1774780058/openai-prompt.js +0 -155
  87. package/scenarios.bak.1774780058/openai-session.js +0 -148
  88. package/scenarios.bak.1774780058/openai.js +0 -102
  89. package/scenarios.bak.1774780058/prompt.js +0 -118
  90. package/scenarios.bak.1774780058/promptFishbowl.js +0 -76
  91. package/scenarios.bak.1774780058/search.brave.com.js +0 -25
  92. package/scenarios.bak.1774780058/sh.js +0 -15
  93. package/scenarios.bak.1774780058/test-wsio.js +0 -26
  94. package/scenarios.bak.1774780058/testToolset.js +0 -42
  95. package/scenarios.bak.1774780058/toolset.js +0 -16
  96. package/scenarios.bak.1774780058/toolset.test.js +0 -141
  97. package/scenarios.bak.1774780058/write_file_syntax.test.js +0 -145
  98. package/scenarios.bak.1774780058/write_file_validation/README.md +0 -30
  99. package/scenarios.bak.1774780058/write_file_validation/bad.js +0 -3
  100. package/scenarios.bak.1774780058/write_file_validation/good.js +0 -4
  101. package/scenarios.bak.1774780058/write_file_validation/test.sh +0 -43
  102. package/scenarios.bak.1774780058/wsClient.js +0 -69
  103. package/scenarios.bak.1774780058/xai_responses.integration.test.js +0 -57
  104. package/scenarios.bak.1774780058/xai_responses.test.js +0 -154
  105. package/scenarios.bak.1774780058/xaicoll.js +0 -50
  106. package/scenarios.bak.1774780058/xaifiles.js +0 -48
  107. /package/{examples → bin}/spawn_agent.js +0 -0
@@ -1,263 +0,0 @@
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 = 'spawn_agent';
6
- const api = 'xai';
7
- let secret = '';
8
-
9
- const args = parseArgs();
10
- const help = args['help'] || false;
11
- const connect = args['connect'] ? args['connect'] : undefined;
12
- const serve = args['serve'] ? parseInt(args['serve']) : undefined;
13
-
14
- const options = { tools: [] };
15
-
16
- options.tools.push({ type: 'web_search' });
17
-
18
- if (args['secret']) {
19
- secret = args['secret'];
20
- }
21
-
22
- if (args['model'] || true) {
23
- options.model = args['model'] || 'grok-4-fast-reasoning'; // Up-to-date as of 2026
24
- }
25
- if (args['temperature']) {
26
- options.temperature = parseFloat(args['temperature']);
27
- }
28
- if (args['tokens']) {
29
- options.max_output_tokens = parseInt(args['tokens']);
30
- }
31
- if (args['top_p']) {
32
- options.top_p = parseFloat(args['top_p']);
33
- }
34
- options.reasoning = { effort: 'high', summary: 'auto' };
35
-
36
- const contextWindow = args['context'] ? parseInt(args['context']) : 500000;
37
- const toolsetMode = 'auto';
38
-
39
- function printHelp() {
40
- console.log(`${name} --help: Interactive AI Agent Creator (Fully Portable - Works Anywhere!)
41
-
42
- Guides you to create custom @j-o-r/hello-dave CLI agents (bin/<name>.js) w/ full support for CLI, WS Server (--serve), WS Client (--connect), hybrids, and **multi-agent CodeServer patterns**.
43
-
44
- PORTABLE: Runs in ANY project (auto-installs deps, no local docs needed). Docs: https://codeberg.org/duin/hello-dave (agent-manager.md, codeserver-pattern.md).
45
-
46
- USAGE:
47
- npx @j-o-r/hello-dave spawn_agent # Interactive creation
48
- npx @j-o-r/hello-dave spawn_agent --name myagent "Desc" # Semi-auto
49
- echo "Create CodeServer launcher" | npx @j-o-r/hello-dave spawn_agent # Multi-agent
50
-
51
- OPTIONS: --model [...] --temp [...] --secret [...]
52
-
53
- PROCESS:
54
- 1. Inspect project, auto-install deps (@j-o-r/hello-dave @j-o-r/sh).
55
- 2. Gather: name, desc, tools, prompt.
56
- 3. Generate/validate ESM script (node --check + tool rules).
57
- 4. Write ./bin/<name>.js, chmod +x, **CLI auto-test**.
58
- 5. **Server/Client Guide**: Test --serve → --connect; hybrids.
59
- 6. **CodeServer Aware**: Generates PM2 launchers (self-contained, like examples/CodeServer).
60
-
61
- EXAMPLES (Generated Agents):
62
- ./bin/myagent.js # CLI
63
- echo 'query' | ./bin/myagent.js # One-shot
64
- ./bin/myagent.js --serve 8081 # WS Server
65
- ./bin/myagent.js --connect ws://...:8081/ws --secret KEY # WS Client
66
- ./bin/myagent.js --serve 8081 --connect ws://other:8080/ws # Hybrid
67
- ./examples/MyServer 8081 mysecret # Multi-agent PM2 (generated)
68
-
69
- **Multi-Agent**: "Generate launcher script like CodeServer pattern for myagent + todoagent".
70
- `);
71
- process.exit();
72
- }
73
-
74
- if (help) printHelp();
75
-
76
- const REPO_URL = 'https://codeberg.org/duin/hello-dave';
77
- const DOCS_BASE = `${REPO_URL}/src/branch/main/docs/`;
78
- const EXAMPLES_URL = `${REPO_URL}/src/branch/main/examples/`;
79
-
80
- const promptParts = [
81
- 'You are AgentCreator, expert in @j-o-r/hello-dave. Create production-ready CLI agents (bin/<name>.js) **portably** anywhere (no local docs needed).',
82
- '',
83
- '**AGENT NAME RULE ⚠️**: name MUST be lowercase a-z0-9_ min 2 chars (/^[a-z_0-9_]{2,}$/). EX: myagent, codeagent, ws_tool.',
84
- '',
85
- '**IMPORTS CRITICAL ⚠️**: **NAMED imports ONLY** - NO default! `import { AgentManager } from \'@j-o-r/hello-dave\';` `import { parseArgs } from \'@j-o-r/sh\';`',
86
- '',
87
- '**PORTABILITY**: Auto-install deps: `@j-o-r/hello-dave @j-o-r/sh`. Absolute imports. NO local file refs (docs/examples).',
88
- '',
89
- '**MANDATORY MEMORY PROTOCOL (For EVERY query/task - NO EXCEPTIONS):**',
90
- 'Connected clients (todo_agent, readme_agent, npm_agent, docs_agent, **memory_agent**) are available as tools. **ALWAYS** use **memory_agent** FIRST and LAST:',
91
- '1. **RECALL PHASE (Step 1 of EVERY response)**:',
92
- ' - Call `memory_agent "Recall relevant memories: tasks, errors, prefs for [keywords from user query]. List recent if empty."`',
93
- ' - Incorporate recalled info (e.g., avoid known errors, resume tasks, apply prefs like temp=0.2).',
94
- '2. **CORE ACTION**:',
95
- ' - Perform coding assistance (tools: execute_bash_script, javascript_interpreter, read_file/write_file, web_search, etc.).',
96
- ' - Delegate to specialists if relevant:',
97
- ' - todo_agent: Tasks/TODO.md',
98
- ' - readme_agent: README.md',
99
- ' - npm_agent: NPM modules/package.json',
100
- ' - docs_agent: Documentation',
101
- ' - memory_agent: Persistent storage',
102
- '3. **WRITE PHASE (Step 3 of EVERY response)**:',
103
- ' - Call `memory_agent "Store updates: [new tasks/errors/prefs/decisions from this interaction]. E.g., \'Task: [next step]\', \'Error: [issue]\', \'Pref: [setting]\'"`',
104
- ' - This ensures persistence across sessions/agents, prevents loops/token burn.',
105
- '',
106
- '**PRIORITIES**:',
107
- '- Safety: CWD-only, no escapes, validate before write.',
108
- '- Efficiency: Use memories to skip repeats (e.g., "Known error: git conflict → skip").',
109
- '- Step-by-step: Clear responses with code blocks.',
110
- 'FOLLOW MEMORY PROTOCOL RIGIDLY - it\'s how multi-agent coordination works!',
111
- '',
112
- '**INITIAL INSPECT** (execute_bash_script):',
113
- '1. `npm ls @j-o-r/hello-dave @j-o-r/sh 2>/dev/null || echo MISSING` → If MISSING: `npm i @j-o-r/hello-dave @j-o-r/sh --save-exact`.',
114
- '2. `mkdir -p bin examples`.',
115
- '3. `cat package.json` (project name). `ls -la bin/`.',
116
- '',
117
- '**TOOL RULES (CRITICAL - NO MIX)**:',
118
- '- **XAI Natives** (pre-setup): `options.tools.push({ type: \'web_search\' });` etc.',
119
- '- **Generics** (post-setup): `agent.addGenericToolcall(\'read_file\');` w/ `toolsetMode: \'auto\'`.',
120
- 'Default: web_search + execute_bash_script/read_file/write_file.',
121
- '',
122
- '**PROCESS (EXACT)**:',
123
- '1. INSPECT & SETUP.',
124
- '2. GATHER (conversational): **name (validate /^[a-z_0-9_]{2,}$/ or reject)**, desc, api(\'xai\'), model/options, tools, custom prompt, CLI intro/help.',
125
- '3. GENERATE & VALIDATE: Use blueprint. Write temp_validate.js, `node --check temp_validate.js` (PASS), grep toolsetMode/auto (1x), generics/addGeneric (≥1 if used), natives/push (≥1 if used), NO options.tools.function.read_file. rm temp.',
126
- '4. REVIEW: Show ```js``` + "✅ node --check | Tools OK". Edit if needed.',
127
- '5. DEPLOY: `write_file ./bin/${name}.js FULL_CODE`, `chmod +x ./bin/${name}.js`.',
128
- '6. **TEST**: `execute_bash_script \'./bin/${name}.js "Briefly describe yourself and your modes (CLI/server/client)"\'` → Show output.',
129
- '7. **SERVER/CLIENT GUIDE**: "Test server: ./bin/${name}.js --serve 8081 (find free port). Client: echo \'query\' | ./bin/${name}.js --connect ws://localhost:8081/ws --secret SECRET".',
130
- '8. **CodeServer MULTI-AGENT**: If requested (e.g., "multi-agent", "CodeServer"), generate **self-contained Bash launcher** (PM2-managed main server + subs). Write to examples/<Name>Server (e.g., examples/CodeServer). Use blueprint below. PM2: Assume installed (`npm i -g pm2`).',
131
- '',
132
- '**AGENT BLUEPRINT** (COPY/REPLACE - Plain backticks ` NO ESCAPES):',
133
- `\`#!/usr/bin/env node
134
- import { AgentManager } from '@j-o-r/hello-dave';
135
- import { parseArgs } from '@j-o-r/sh';
136
-
137
- const name = 'AGENTNAME'; // ← REPLACE w/ lowercase /^[a-z_0-9_]{2,}$/
138
- const api = 'xai';
139
- let secret = '';
140
-
141
- const args = parseArgs();
142
- const help = args['help'] || false;
143
- const connect = args['connect'] ? args['connect'] : undefined;
144
- const serve = args['serve'] ? parseInt(args['serve']) : undefined;
145
-
146
- const options = { tools: [] };
147
-
148
- // NATIVES HERE e.g. options.tools.push({ type: 'web_search' });
149
-
150
- if (args['secret']) { secret = args['secret']; }
151
- if (args['model'] || true) { options.model = args['model'] || 'grok-4-fast-reasoning'; }
152
- if (args['temperature']) { options.temperature = parseFloat(args['temperature']); } else { options.temperature = 0.8; }
153
- options.reasoning = { effort: 'medium', summary: 'auto' };
154
-
155
- const contextWindow = args['context'] ? parseInt(args['context']) : 500000;
156
- const toolsetMode = 'auto';
157
-
158
- function printHelp() {
159
- console.log(\`AGENTNAME --help: AGENTDESC
160
-
161
- Full modes: CLI, WS Server (--serve), WS Client (--connect), Hybrid.
162
-
163
- Repo docs: https://codeberg.org/duin/hello-dave (agent-manager.md, codeserver-pattern.md).
164
-
165
- USAGE:
166
- ./bin/AGENTNAME # Interactive CLI
167
- echo "query" | ./bin/AGENTNAME # One-shot
168
- ./bin/AGENTNAME --serve 8081 # WS Server
169
- ./bin/AGENTNAME --connect ws://host:8081/ws --secret KEY # WS Client
170
- ./bin/AGENTNAME --serve 8081 --connect ws://other:8080/ws # Hybrid
171
-
172
- OPTIONS: --model ... --secret ...
173
-
174
- EXAMPLES:
175
- Chain: Server A --connect B → delegates to B.
176
- Multi-Agent: Generate/use PM2 launcher (CodeServer pattern).\`);
177
- process.exit();
178
- }
179
-
180
- if (help) printHelp();
181
-
182
- const prompt = \`You are AGENTNAME, AGENTDESC.
183
-
184
- CUSTOMPROMPT\`.trim();
185
-
186
- const agent = new AgentManager({ name, secret });
187
- agent.setup({ prompt, api, options, toolsetMode, contextWindow });
188
-
189
- // GENERICS HERE e.g. agent.addGenericToolcall('execute_bash_script');
190
-
191
- const cliIntro = \`🤖 AGENTNAME ready! Modes: CLI/Server/Client/Hybrid.
192
-
193
- CLIINTRO\`.trim();
194
-
195
- const toolName = 'agent_' + name;
196
- const toolDescription = \`AGENTDESC. Supports WS chaining/multi-agent.\`.trim();
197
-
198
- await agent.start(serve, connect, cliIntro, toolName, toolDescription);\``,
199
- '',
200
- '**CODE_SERVER BLUEPRINT** (Bash for multi-agent - Self-contained, like CodeServer pattern):',
201
- `\`#!/bin/bash
202
- # Portable Multi-Agent Launcher (PM2-managed: main server + subs)
203
- # Run: npm i -g pm2 (once)
204
- if [ $# -lt 1 ] || [ $# -gt 2 ]; then
205
- echo "Usage: $0 <PORT> [SECRET] # PORT:1024-65535, SECRET:>=3 chars (def:123)"
206
- exit 1
207
- fi
208
- PORT="$1"
209
- SECRET="\${2:-123}"
210
- if [ \${#SECRET} -lt 3 ]; then echo "SECRET too short"; exit 1; fi
211
- if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1024 ] || [ "$PORT" -gt 65535 ]; then echo "Bad PORT"; exit 1; fi
212
-
213
- SCRIPT_DIR="\$( cd "\$( dirname "\${BASH_SOURCE[0]}" )" && pwd )"
214
- PROJECT_DIR="\$( cd "\$( dirname "\${SCRIPT_DIR}" )" && pwd )"
215
- FOLDER=\$(basename "$PROJECT_DIR")
216
-
217
- echo "Starting <MainAgent>Server on port \${PORT} in '\$FOLDER' w/ SECRET '\$SECRET'..."
218
-
219
- # Cleanup old PM2
220
- pm2 delete "\${FOLDER}_mainagent_\${PORT}" 2>/dev/null || true
221
- pm2 delete "\${FOLDER}_sub1agent_\${PORT}" 2>/dev/null || true # Add per sub
222
- # ... more subs
223
-
224
- # Main server
225
- pm2 start "\${SCRIPT_DIR}/bin/mainagent.js" --name "\${FOLDER}_mainagent_\${PORT}" -- --serve "\${PORT}" --tools javascript --secret "\${SECRET}"
226
- # Subs as clients
227
- pm2 start "\${SCRIPT_DIR}/bin/sub1agent.js" --name "\${FOLDER}_sub1agent_\${PORT}" -- --connect "ws://127.0.0.1:\${PORT}/ws" --secret "\${SECRET}"
228
- # ... more: pm2 start ... sub2agent.js ...
229
-
230
- echo "Processes: pm2 list | grep '\${FOLDER}_\${PORT}'"
231
- echo "Connect: npx @j-o-r/hello-dave dave --connect ws://127.0.0.1:\${PORT}/ws --secret '\${SECRET}'"\``,
232
- '',
233
- 'Enthusiastic, step-by-step. Match portable style. **ALWAYS validate name regex before generate/deploy.** Current date: 2026. Models: grok-4-fast-reasoning/grok-beta. CodeServer pattern: https://codeberg.org/duin/hello-dave/src/branch/main/examples/CodeServer'
234
- ];
235
-
236
- const prompt = promptParts.join('\\n');
237
-
238
- const agent = new AgentManager({ name, secret });
239
- agent.setup({
240
- prompt,
241
- api,
242
- options,
243
- toolsetMode,
244
- contextWindow
245
- });
246
-
247
- agent.addGenericToolcall('execute_bash_script');
248
- agent.addGenericToolcall('read_file');
249
- agent.addGenericToolcall('write_file');
250
- agent.addGenericToolcall('javascript_interpreter');
251
-
252
- const cliIntro = `🤖 ${name} (${options.model}) ready! (context: ${contextWindow})
253
-
254
- Portable Agent Creator: Builds CLI/WS agents + CodeServer launchers **anywhere** (auto-deps, online docs).
255
-
256
- Examples:
257
- - "Create code-review agent: name=coderev, desc=Git diff analyzer, tools=read_file execute_bash_script web_search"
258
- - "Generate CodeServer launcher for coderev + tododave + npmdave"`.trim();
259
-
260
- const toolName = 'spawn_agent';
261
- const toolDescription = `Portable creator for CLI/WS agents (bin/<name>.js) + PM2 multi-agent launchers. Validates/tests/deploys. No local docs needed (uses repo: https://codeberg.org/duin/hello-dave).`.trim();
262
-
263
- await agent.start(serve, connect, cliIntro, toolName, toolDescription);
@@ -1,162 +0,0 @@
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 = 'test_dave';
6
- const api = 'xai';
7
- let secret = '';
8
-
9
- const args = parseArgs();
10
- const help = args['help'] || false;
11
- const connect = args['connect'] ? args['connect'] : undefined;
12
- const serve = args['serve'] ? parseInt(args['serve']) : undefined;
13
-
14
- /** @type {import('lib/API/x.ai/responses.js').XAIOptions} */
15
- const options = {
16
- tools: []
17
- };
18
- options.tools.push({
19
- type: 'web_search'
20
- });
21
- if (args['secret']) {
22
- secret = args['secret'];
23
- }
24
- if (args['model'] || true) {
25
- options.model = args['model'] || 'grok-4-1-fast-reasoning';
26
- }
27
- options.temperature = 0.2;
28
- if (args['tokens']) {
29
- options.max_output_tokens = parseInt(args['tokens']);
30
- }
31
- if (args['top_p']) {
32
- options.top_p = parseFloat(args['top_p']);
33
- }
34
- const reasoning = args['reasoning'] ? args['reasoning'] : 'medium';
35
- if (reasoning) {
36
- options.reasoning = {
37
- effort: reasoning,
38
- summary: 'auto'
39
- };
40
- }
41
- const toolsetMode = 'auto';
42
- const contextWindow = args['context'] ? parseInt(args['context']) : 2565000;
43
-
44
- function printHelp() {
45
- console.log(`
46
- '${name} --help' You are looking at it.
47
-
48
- OPTIONS:
49
- --tokens [number]: max generated tokens
50
- --context [number]: truncate message history to context-window size (default ${contextWindow})
51
- --temperature [float]: -2 / +2
52
- --model [string]: model name
53
- --top_p [float]: number > 0, 0.1 means no top_p
54
- --reasoning [low|medium|high]
55
- --tools [javascript,bash,nushell,ssh] comma separated list
56
-
57
- SERVER TOOLS:
58
- --serve [number]: create an Agent server on port ws://127.0.0.1:[serve]/ws
59
- --connect [url]: connect to a Server Agent e.g. ws://127.0.0.1:8080/ws (https://my.domain/ws)
60
- --secret [string]: limit access to websocket server with a secret
61
- `);
62
- process.exit();
63
- }
64
-
65
- if (help) {
66
- printHelp();
67
- }
68
-
69
- const agent = new AgentManager({ name, secret });
70
- const sys = (await agent.environment()).system;
71
-
72
- const prompt = `You are TestDave, the specialized testing agent for CodeServer projects. Your sole responsibility is to create, manage, and execute tests using the lightweight 'Test' class from '@j-o-r/sh' (already installed).
73
-
74
- **CORE MISSION**:
75
- - Write executable test scripts in ./scenarios/ folder with the extension *.test.js (e.g., scenarios/toolset.test.js).
76
- - Tests must use: \`import { Test, assert, jsType } from '@j-o-r/sh';\`
77
- - Structure: shebang \`#!/usr/bin/env node\`, fluent Test API (\`const t = new Test(); t.add('desc', () => { assert... }); await t.run();\`), exit(1) on errors.
78
- - After write_file to scenarios/MODULE.test.js, ensure executable: \`chmod +x scenarios/MODULE.test.js\`
79
- - Leverage project utilities: test existing files (examples/*.js, toolset.js, agents, SH commands, etc.) using read_file, execute_bash_script (ls/cat), npm_module_inspector.
80
-
81
- **WHAT TO TEST** (discover dynamically):
82
- 1. Project scripts: e.g., parseArgs, AgentManager flows, toolsets.
83
- 2. Utilities: SH commands, async hooks, promise tracking.
84
- 3. Agents: codeDave, npmDave, memoryDave integrations.
85
- 4. Existing: genericToolset.test.js patterns, sh.js, etc.
86
- - Query: "Write test for toolset.js" → read_file toolset.js → generate scenarios/toolset.test.js.
87
-
88
- **Test Example** (from @j-o-r/sh docs):
89
- \`\`\`
90
- #!/usr/bin/env node
91
- import { Test, assert, jsType } from '@j-o-r/sh';
92
-
93
- const t = new Test();
94
- t.add('Basic assert', () => assert.strictEqual(1 + 1, 2));
95
- t.add('Type check', () => assert.strictEqual(jsType([]), 'Array'));
96
- t.add('Async test', async () => {
97
- const p = Promise.resolve('ok');
98
- assert.strictEqual(await p, 'ok');
99
- });
100
- const report = await t.run();
101
- process.exit(report.errors > 0 ? 1 : 0);
102
- \`\`\`
103
-
104
- **WORKFLOW** (per user request, e.g., "test parseArgs"):
105
- 1. Recall memories (tasks/errors for testing).
106
- 2. Inspect target: read_file, execute_bash_script \`ls lib/\`, npm_module_inspector.
107
- 3. Generate test: Plan tests (coverage: happy path, errors, async), write to scenarios/{target}.test.js (e.g., scenarios/parseArgs.test.js).
108
- 4. Validate: execute_bash_script \`node scenarios/{target}.test.js\` or \`./scenarios/{target}.test.js\`.
109
- 5. Report results, store outcomes.
110
-
111
- **MANDATORY MEMORY PROTOCOL** (ALWAYS FIRST/LAST):
112
- 1. RECALL: memory_agent "Recall relevant memories: tasks, errors, prefs for [test target, e.g., toolset.js]."
113
- 2. CORE: Write/Run tests in scenarios/*.test.js.
114
- 3. WRITE: memory_agent "Store updates: Task: [next test], Error: [test fail], Pref: [coverage style]."
115
-
116
- **PRIORITIES**:
117
- - Safety: CWD-only, validate syntax before write (write_file auto-checks).
118
- - Coverage: assertions (strictEqual, ok, throws), types (jsType), async (promises).
119
- - Executable: shebang + chmod +x scenarios/*.test.js.
120
- - Reuse: Import project utils (e.g., import {parseArgs} from './toolset.js').
121
- - Current date: March 27, 2026.
122
-
123
- FOLLOW RIGIDLY: Memory first/last, scenarios/*.test.js only, Test class exclusively.
124
- `.trim();
125
-
126
- agent.setup({
127
- prompt,
128
- api,
129
- options,
130
- toolsetMode,
131
- contextWindow
132
- });
133
-
134
- const toolset = agent.getToolset();
135
- if (toolset) {
136
- agent.addGenericToolcall('history_search');
137
- agent.addGenericToolcall('memory_recall');
138
- agent.addGenericToolcall('memory_write');
139
- agent.addGenericToolcall('javascript_interpreter');
140
- agent.addGenericToolcall('execute_bash_script');
141
- agent.addGenericToolcall('read_file');
142
- agent.addGenericToolcall('write_file');
143
- const addTools = args['tools'] ? args['tools'].split(',') : [''];
144
- if (addTools.includes('ssh')) {
145
- agent.addGenericToolcall('execute_remote_script');
146
- }
147
- }
148
-
149
- const cliIntro = `
150
- ${name} ${options.model}
151
- - context: ${contextWindow}
152
- - **Test Agent ACTIVE**: Writes/runs @j-o-r/sh Test scripts in ./scenarios/*.test.js (auto-executable).
153
- - Example: "Write test for lib/MyClass.js"
154
- - **Memory Protocol ACTIVE**
155
- `.trim();
156
-
157
- const description = `
158
- TestDave: Generates executable tests (Test class) for project files/utils/agents in ./scenarios/*.test.js.
159
- Uses memories, delegates to code/npm/etc. agents.
160
- `.trim();
161
-
162
- await agent.start(serve, connect, cliIntro, 'test_agent', description);
@@ -1,138 +0,0 @@
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 = 'todo_dave';
6
- const api = 'xai';
7
- let secret = '';
8
-
9
- const args = parseArgs();
10
- const help = args['help'] || false;
11
- const connect = args['connect'] ? args['connect'] : undefined;
12
- const serve = args['serve'] ? parseInt(args['serve']) : undefined;
13
-
14
- /** @type {import('lib/API/x.ai/responses.js').XAIOptions} */
15
- const options = { tools : []};
16
-
17
- if (args['secret']) { // model gets default value
18
- secret= args['secret'];
19
- }
20
- // Set properties only if provided via command line (except model which has default)
21
- if (args['model'] || true) { // model gets default value
22
- // @ts-ignore
23
- options.model = args['model'] || 'grok-4-fast-reasoning';
24
- }
25
- if (args['temperature']) {
26
- options.temperature = parseFloat(args['temperature']);
27
- }
28
- if (args['tokens']) {
29
- options.max_output_tokens = parseInt(args['tokens']);
30
- }
31
- if (args['top_p']) {
32
- options.top_p = parseFloat(args['top_p']);
33
- }
34
- const reasoning = true; // args['reasoning'] ? args['reasoning'] : null;
35
- if (reasoning) {
36
- options.reasoning = {
37
- effort:'medium',
38
- summary: 'auto'
39
- }
40
- }
41
-
42
- options.tools.push({
43
- type: 'web_search'
44
- });
45
- const toolsetMode = 'auto';
46
- const contextWindow = args['context'] ? parseInt(args['context']) : 250000;
47
-
48
- // Copy from the generic toolset
49
- function printHelp() {
50
- console.log(`
51
- '${name} --help' You are looking at it.
52
- '
53
- OPTIONS:
54
- --tokens [number]: max generated tokens
55
- --context [number] : truncate message history to context-windows size default 130000
56
- --temperature [float] : -2 / +2
57
- --model [grok-4|grok-3|grok-3-mini|grok-3-mini-fast|grok-code-fast-1]
58
- --top_p [float]: number > 0, 0.1 means no top_p
59
- --reasoning [low|high]
60
- --tools [javascript,bash] comma seperated list
61
- `);
62
- process.exit()
63
- }
64
-
65
- if (help) {
66
- printHelp();
67
- }
68
-
69
- const tool_call_description = `
70
- Project TODO list manager. Maintains TODO.md with tasks in Markdown checklists.
71
- Inspects current TODO.md, adds/checks/completes tasks based on input, updates the file.
72
- Suggests next actions, stores future important tasks.
73
- `.trim();
74
- const tool_call_name = 'todo_agent';
75
- const prompt = `
76
- You are an expert TODO manager for this project. TODO.md stores tasks in Markdown format with checklists:
77
-
78
- ## TODO (high priority pending)
79
- - [ ] Task 1
80
-
81
- ## In Progress
82
- - [ ] Task 2
83
-
84
- ## Later (future tasks)
85
- - [ ] Important task to do later
86
-
87
- ## Done
88
- - [x] Completed task
89
-
90
- **CRITICAL: STRICT NO-CODING RULE** - Stick to TODO management ONLY. NEVER:
91
- - Use coding tools (e.g., javascript_interpreter, write_file, read_file, syntax_check).
92
- - Generate, execute, or edit code.
93
- - Misuse bash for anything beyond safe TODO.md ops (e.g., cat TODO.md, echo > TODO.md).
94
- If asked to code, decline: "For coding, use other agents. I'll handle TODOs only."
95
- Delegate complex tasks via suggestions; use memory_agent if available for persistence.
96
-
97
- ALWAYS:
98
-
99
- 1. Inspect the current TODO.md file if it exists (use \`cat TODO.md\` or similar).
100
-
101
- 2. Understand the user input:
102
- - Add new tasks: "add task: Fix bug in foo.js"
103
- - Complete: "done: task X" or mark specific
104
- - Check status: "status" or "what's next?"
105
- - Prioritize/reorganize
106
- - Archive old done tasks if too many
107
-
108
- 3. Update TODO.md with changes. Keep it organized, add dates if useful (e.g., - [ ] 2026-02-24: Task).
109
-
110
- 4. Write the FULL updated content to ./TODO.md.
111
-
112
- 5. In your response, summarize:
113
- - Current status (pending count, next suggested)
114
- - Changes made
115
- - Updated TODO.md preview (first 10 lines or key sections)
116
-
117
- If no TODO.md, create one inspecting the project (package.json, README.md, git status) for initial tasks like "Review code", "Add tests", etc.
118
-
119
- Use tools to inspect files as needed (ls, cat, git log, etc.).
120
- `.trim();
121
- const agent = new AgentManager({ name, secret });
122
- agent.setup({
123
- prompt,
124
- api,
125
- options,
126
- toolsetMode,
127
- contextWindow
128
- });
129
- const toolset = agent.getToolset();
130
- if (toolset) {
131
- agent.addGenericToolcall('execute_bash_script');
132
- }
133
- const cliIntro = `
134
- ${name} ${options.model}.
135
- - context: ${contextWindow}
136
- `.trim();
137
-
138
- await agent.start(serve, connect, cliIntro, tool_call_name, tool_call_description);
@@ -1,9 +0,0 @@
1
- {
2
- "type": "function_request",
3
- "function_request": {
4
- "name": "execute_javascript",
5
- "id": "fc_686284be7fec81a0af404739ec17e29f09dcb726e1aa6681",
6
- "call_id": "call_w0WnYfQiqFey5UiF4jG0XQcn",
7
- "parameters": "{\"script\": \"/*\\n * Function: parseMessages\\n * Description: Parses the 'response' object and adds messages to the given Prompt instance.\\n * The function supports two types of response items:\\n * 1. function_call: These are mapped to a function_request message with role 'assistant'.\\n * The function_request content fields are: name, id, call_id, and parameters (from arguments).\\n * 2. message: These are mapped to text messages. In case the content array contains items with type 'output_text',\\n * they are converted into PRTextMessage objects (i.e., with type \\\"text\\\") and added to the prompt.\\n * In the case where there is more than one piece of content, addMultiModal is used.\\n *\\n * Note: This function assumes that the response is already parsed (i.e., a JS object) and that prompt is an instance\\n * of the Prompt class imported from lib/Prompt.js.\\n */\\n\\nexport function parseMessages(response, prompt) {\\n if (!response || !Array.isArray(response.output)) {\\n console.warn('Invalid response format. Expected an object with an output array.');\\n return;\\n }\\n\\n response.output.forEach(item => {\\n if (item.type === 'function_call') {\\n // Convert function_call to a function_request message\\n const functionRequestContent = {\\n type: 'function_request',\\n function_request: {\\n id: item.id,\\n name: item.name,\\n call_id: item.call_id,\\n parameters: item.arguments\\n }\\n };\\n // Add as a multi-modal assistant message\\n try {\\n prompt.addMultiModal('assistant', [functionRequestContent]);\\n } catch (err) {\\n console.error('Error adding function_request message:', err);\\n }\\n } else if (item.type === 'message') {\\n // Determine the role; if not provided, use 'assistant' by default\\n const role = item.role || 'assistant';\\n let prContents = [];\\n\\n if (Array.isArray(item.content)) {\\n item.content.forEach(contentItem => {\\n if (contentItem.type === 'output_text') {\\n prContents.push({\\n type: 'text',\\n text: contentItem.text\\n });\\n } else if (contentItem.type === 'image_url') {\\n prContents.push({\\n type: 'image_url',\\n image_url: contentItem.image_url\\n });\\n } else {\\n // If another type is encountered, you may want to add additional handling here.\\n console.warn('Unhandled content type in message:', contentItem.type);\\n }\\n });\\n }\\n\\n if (prContents.length > 0) {\\n try {\\n // If there is only one text message and no multi-modal requirements, use add\\n if (prContents.length === 1 && prContents[0].type === 'text') {\\n prompt.add(role, prContents[0].text);\\n } else {\\n prompt.addMultiModal(role, prContents);\\n }\\n } catch (err) {\\n console.error('Error adding message:', err);\\n }\\n }\\n } else {\\n console.warn('Unhandled item type:', item.type);\\n }\\n });\\n}\\n\\n// Example usage:\\n// import Prompt from './lib/Prompt.js';\\n// import { parseMessages } from './parseMessages.js';\\n// \\n// const prompt = new Prompt(1000);\\n// const response = {\\n// output: [\\n// {\\n// id: 'fc_68624cb486148191b2078ec2a76e389a068902ce013ce130',\\n// type: 'function_call',\\n// status: 'completed',\\n// arguments: '{}',\\n// call_id: 'call_6YNYwCZRbmMPr5WaEo1FkbXx',\\n// name: 'get_date_time'\\n// },\\n// {\\n// id: 'msg_68624cb7c28c8191aff3106ebea965d4068902ce013ce130',\\n// type: 'message',\\n// status: 'completed',\\n// content: [\\n// {\\n// type: 'output_text',\\n// annotations: [],\\n// logprobs: [],\\n// text: 'Today is Friday, 12 May 2025. The current weather in Amsterdam, The Netherlands is 24°C.'\\n// }\\n// ],\\n// role: 'assistant'\\n// }\\n// ]\\n// };\\n// \\n// parseMessages(response, prompt);\\n// console.log(prompt.messages);\\n\"}"
8
- }
9
- }
@@ -1,66 +0,0 @@
1
- {
2
- "background": false,
3
- "include": null,
4
- "input": [
5
- {
6
- "role": "user",
7
- "content": [
8
- {
9
- "type": "input_text",
10
- "text": "What is your task?"
11
- }
12
- ]
13
- },
14
- {
15
- "role": "assistant",
16
- "content": [
17
- {
18
- "type": "output_text",
19
- "text": "My task is to assist with administrative duties, such as answering questions, scheduling, providing information, and supporting office operations efficiently."
20
- }
21
- ]
22
- },
23
- {
24
- "role": "user",
25
- "content": [
26
- {
27
- "type": "input_text",
28
- "text": "What day is today and what is the weather forcast in Amsterdam, The Netherlands"
29
- }
30
- ]
31
- }
32
- ],
33
- "instructions": "You are an assistant for an administrative office. Respond precise and concise",
34
- "max_output_tokens": 4000,
35
- "model": "gpt-4.1",
36
- "store": false,
37
- "tool_choice": "auto",
38
- "tools": [
39
- {
40
- "type": "function",
41
- "name": "get_current_weather",
42
- "description": "Get the current weather in a given location",
43
- "parameters": {
44
- "type": "object",
45
- "properties": {
46
- "location": {
47
- "type": "string",
48
- "description": "The city and country"
49
- }
50
- },
51
- "required": [
52
- "location"
53
- ]
54
- }
55
- },
56
- {
57
- "type": "function",
58
- "name": "get_date_time",
59
- "description": "Get the current date and time",
60
- "parameters": {
61
- "type": "object",
62
- "properties": {}
63
- }
64
- }
65
- ]
66
- }