@kendoo.agentdesk/agentdesk 0.8.2 → 0.8.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/README.md +6 -6
- package/bin/agentdesk.mjs +5 -5
- package/cli/orchestrator.mjs +6 -1
- package/cli/team.mjs +12 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -79,7 +79,7 @@ agentdesk update Update to the latest version
|
|
|
79
79
|
|------|-------------|
|
|
80
80
|
| `--description`, `-d` | Task description or requirements |
|
|
81
81
|
| `--cwd` | Working directory (defaults to current) |
|
|
82
|
-
| `--
|
|
82
|
+
| `--lite` | Lite mode — faster and cheaper, agents share one conversation |
|
|
83
83
|
|
|
84
84
|
## Configuration
|
|
85
85
|
|
|
@@ -126,12 +126,12 @@ Each agent runs as its own independent Claude session — not one model role-pla
|
|
|
126
126
|
6. The session streams live to [agentdesk.live](https://agentdesk.live) where you can watch and send messages to the team
|
|
127
127
|
7. Token usage is tracked and displayed per session
|
|
128
128
|
|
|
129
|
-
###
|
|
129
|
+
### Agent Modes
|
|
130
130
|
|
|
131
131
|
| Mode | Command | Description |
|
|
132
132
|
|------|---------|-------------|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
133
|
+
| Full (default) | `agentdesk team -d "..."` | Each agent thinks independently in its own Claude session. Better output. |
|
|
134
|
+
| Lite | `agentdesk team -d "..." --lite` | All agents share one conversation. Faster and cheaper. |
|
|
135
135
|
|
|
136
136
|
## Daemon (Remote Sessions)
|
|
137
137
|
|
|
@@ -141,7 +141,7 @@ The daemon lets you trigger team sessions from the web dashboard instead of the
|
|
|
141
141
|
agentdesk daemon
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
Once running, a "
|
|
144
|
+
Once running, a "Run Team" button appears on [agentdesk.live](https://agentdesk.live). Select a project, describe the task, and the daemon spawns a Claude session on your machine. Output streams back to the dashboard in real-time.
|
|
145
145
|
|
|
146
146
|
### Security
|
|
147
147
|
|
|
@@ -154,7 +154,7 @@ Once running, a "Start Session" button appears on [agentdesk.live](https://agent
|
|
|
154
154
|
### How it works
|
|
155
155
|
|
|
156
156
|
1. The daemon connects to the server via WebSocket
|
|
157
|
-
2. You click "
|
|
157
|
+
2. You click "Run Team" in the dashboard
|
|
158
158
|
3. The server relays the request to your daemon
|
|
159
159
|
4. The daemon spawns `claude` in the project directory
|
|
160
160
|
5. Output streams through the server to the dashboard
|
package/bin/agentdesk.mjs
CHANGED
|
@@ -65,7 +65,7 @@ if (!command || command === "help" || command === "--help") {
|
|
|
65
65
|
Options:
|
|
66
66
|
--description, -d Task description or requirements
|
|
67
67
|
--cwd Working directory (defaults to current)
|
|
68
|
-
--
|
|
68
|
+
--lite Lite mode — faster and cheaper, agents share one conversation
|
|
69
69
|
|
|
70
70
|
How it works:
|
|
71
71
|
With a tracker (Linear, Jira, GitHub Issues):
|
|
@@ -105,7 +105,7 @@ else if (command === "team") {
|
|
|
105
105
|
let description = "";
|
|
106
106
|
let cwd = process.cwd();
|
|
107
107
|
let taskId = null;
|
|
108
|
-
let
|
|
108
|
+
let lite = false;
|
|
109
109
|
const remaining = args.slice(1);
|
|
110
110
|
|
|
111
111
|
for (let i = 0; i < remaining.length; i++) {
|
|
@@ -113,8 +113,8 @@ else if (command === "team") {
|
|
|
113
113
|
description = remaining[++i];
|
|
114
114
|
} else if (remaining[i] === "--cwd" && remaining[i + 1]) {
|
|
115
115
|
cwd = remaining[++i];
|
|
116
|
-
} else if (remaining[i] === "--legacy") {
|
|
117
|
-
|
|
116
|
+
} else if (remaining[i] === "--lite" || remaining[i] === "--legacy") {
|
|
117
|
+
lite = true;
|
|
118
118
|
} else if (!taskId && !remaining[i].startsWith("-")) {
|
|
119
119
|
taskId = remaining[i];
|
|
120
120
|
}
|
|
@@ -127,7 +127,7 @@ else if (command === "team") {
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
const { runTeam } = await import("../cli/team.mjs");
|
|
130
|
-
const code = await runTeam(taskId, { description, cwd,
|
|
130
|
+
const code = await runTeam(taskId, { description, cwd, lite });
|
|
131
131
|
process.exit(code);
|
|
132
132
|
}
|
|
133
133
|
|
package/cli/orchestrator.mjs
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
// Orchestrator — manages agent sub-sessions across phases
|
|
2
2
|
|
|
3
3
|
import { existsSync, readFileSync } from "fs";
|
|
4
|
-
import { join } from "path";
|
|
4
|
+
import { join, dirname } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
5
6
|
import { runAgent } from "./agent-runner.mjs";
|
|
7
|
+
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const CLI_VERSION = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8")).version;
|
|
6
10
|
import { buildAgentPrompt, getAgentTools } from "./agent-prompts.mjs";
|
|
7
11
|
import { detectProject, generateContext } from "./detect.mjs";
|
|
8
12
|
|
|
@@ -125,6 +129,7 @@ export async function runOrchestrator({
|
|
|
125
129
|
project: project?.name || null,
|
|
126
130
|
sessionNumber: 1,
|
|
127
131
|
agents: teamSections.names,
|
|
132
|
+
cliVersion: CLI_VERSION,
|
|
128
133
|
});
|
|
129
134
|
|
|
130
135
|
// Build agent lookup
|
package/cli/team.mjs
CHANGED
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
import { spawn } from "child_process";
|
|
4
4
|
import { existsSync, readFileSync } from "fs";
|
|
5
5
|
import { createInterface } from "readline";
|
|
6
|
-
import { join } from "path";
|
|
6
|
+
import { join, dirname } from "path";
|
|
7
7
|
import { randomUUID } from "crypto";
|
|
8
|
+
import { fileURLToPath } from "url";
|
|
9
|
+
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const CLI_VERSION = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8")).version;
|
|
8
12
|
import WebSocket from "ws";
|
|
9
13
|
import { detectProject } from "./detect.mjs";
|
|
10
14
|
import { loadConfig } from "./config.mjs";
|
|
@@ -31,7 +35,7 @@ function loadDotEnv(dir) {
|
|
|
31
35
|
export async function runTeam(taskId, opts = {}) {
|
|
32
36
|
const cwd = opts.cwd || process.cwd();
|
|
33
37
|
const description = opts.description || "";
|
|
34
|
-
const
|
|
38
|
+
const lite = opts.lite || false;
|
|
35
39
|
|
|
36
40
|
// Detect project and resolve API key early (needed for server config fetch)
|
|
37
41
|
const project = detectProject(cwd);
|
|
@@ -121,11 +125,11 @@ export async function runTeam(taskId, opts = {}) {
|
|
|
121
125
|
vizConnected = true;
|
|
122
126
|
if (!sessionStartSent) {
|
|
123
127
|
console.log("AgentDesk: connected");
|
|
124
|
-
console.log(`
|
|
128
|
+
console.log(`Dashboard: ${agentdeskServer}`);
|
|
125
129
|
} else {
|
|
126
130
|
console.log("AgentDesk: reconnected");
|
|
127
131
|
}
|
|
128
|
-
if (!
|
|
132
|
+
if (!lite) {
|
|
129
133
|
// Orchestrator sends its own session:start — just flush queue
|
|
130
134
|
sessionStartSent = true;
|
|
131
135
|
while (vizQueue.length > 0 && vizWs.readyState === WebSocket.OPEN) {
|
|
@@ -139,6 +143,7 @@ export async function runTeam(taskId, opts = {}) {
|
|
|
139
143
|
project: project.name || null,
|
|
140
144
|
sessionNumber: 1,
|
|
141
145
|
agents: teamSections.names,
|
|
146
|
+
cliVersion: CLI_VERSION,
|
|
142
147
|
});
|
|
143
148
|
sessionStartSent = true;
|
|
144
149
|
while (vizQueue.length > 0 && vizWs.readyState === WebSocket.OPEN) {
|
|
@@ -168,10 +173,10 @@ export async function runTeam(taskId, opts = {}) {
|
|
|
168
173
|
|
|
169
174
|
connectWs();
|
|
170
175
|
|
|
171
|
-
console.log(`
|
|
176
|
+
console.log(`Agents: ${lite ? "lite (shared)" : "full (independent)"}\n`);
|
|
172
177
|
|
|
173
178
|
// --- Sub-agent mode (default) ---
|
|
174
|
-
if (!
|
|
179
|
+
if (!lite) {
|
|
175
180
|
const result = await runOrchestrator({
|
|
176
181
|
taskId, taskLink, description, createTask, tracker, config,
|
|
177
182
|
project, team, teamSections, inboxUrl, sessionUrl, cwd,
|
|
@@ -186,7 +191,7 @@ export async function runTeam(taskId, opts = {}) {
|
|
|
186
191
|
return 0;
|
|
187
192
|
}
|
|
188
193
|
|
|
189
|
-
// ---
|
|
194
|
+
// --- Lite mode (shared conversation) ---
|
|
190
195
|
const fullPrompt = buildPrompt({
|
|
191
196
|
taskId, taskLink, description, createTask, tracker, config, project,
|
|
192
197
|
teamSections, inboxUrl, sessionUrl,
|