myuru 0.1.0 → 0.2.0
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 +1 -6
- package/bin/myuru.js +1 -1
- package/package.json +1 -1
- package/src/commands/run.js +6 -20
- package/src/index.js +0 -3
- package/src/lib/tiers.js +0 -76
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ Multi-provider AI agent orchestrator. Coordinate Claude, GPT, and Gemini agents
|
|
|
11
11
|
- **Council Mode**: Agents deliberate in a chatroom, then execute tasks together
|
|
12
12
|
- **Session Persistence**: Agents maintain context across invocations
|
|
13
13
|
- **Terminal Dashboard**: Real-time ANSI UI showing agent status
|
|
14
|
-
- **
|
|
14
|
+
- **Concurrent Execution**: Run agents in parallel or sequentially
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
@@ -85,11 +85,6 @@ Create `.myuru.json`:
|
|
|
85
85
|
}
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
## Pricing
|
|
89
|
-
|
|
90
|
-
**Free**: 2 sequential agents, basic reporting
|
|
91
|
-
**Pro**: 5 concurrent agents, config packs, priority support — $29 one-time
|
|
92
|
-
|
|
93
88
|
## Requirements
|
|
94
89
|
|
|
95
90
|
- Node.js >= 18
|
package/bin/myuru.js
CHANGED
|
@@ -28,7 +28,7 @@ program
|
|
|
28
28
|
.option('--provider <name>', 'Single provider: claude, openai, gemini', 'claude')
|
|
29
29
|
.option('--model <name>', 'Model override')
|
|
30
30
|
.option('--agents <n>', 'Number of builder agents', '2')
|
|
31
|
-
.option('--
|
|
31
|
+
.option('--concurrent', 'Run agents concurrently instead of sequentially')
|
|
32
32
|
.option('--budget <usd>', 'Max budget in USD')
|
|
33
33
|
.option('--dry-run', 'Show what would run without executing')
|
|
34
34
|
.action(async (opts) => {
|
package/package.json
CHANGED
package/src/commands/run.js
CHANGED
|
@@ -4,8 +4,6 @@ const { createProvider } = require("../providers");
|
|
|
4
4
|
const AgentRunner = require("../lib/agent-runner");
|
|
5
5
|
const TaskDB = require("../lib/task-db");
|
|
6
6
|
const Dashboard = require("../lib/dashboard");
|
|
7
|
-
const { TierManager } = require("../lib/tiers");
|
|
8
|
-
|
|
9
7
|
async function run(opts) {
|
|
10
8
|
const cwd = process.cwd();
|
|
11
9
|
const stateDir = path.join(cwd, ".myuru");
|
|
@@ -26,23 +24,13 @@ async function run(opts) {
|
|
|
26
24
|
const agentCount = parseInt(opts.agents) || config.agents || 2;
|
|
27
25
|
const budget = opts.budget || config.budget || "5";
|
|
28
26
|
const maxTurns = config.maxTurns || 10;
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
// Tier enforcement
|
|
32
|
-
const tier = new TierManager(isPro ? "PRO" : "FREE");
|
|
33
|
-
const tierInfo = tier.info();
|
|
27
|
+
const concurrent = opts.concurrent || config.concurrent || false;
|
|
34
28
|
|
|
35
|
-
|
|
36
|
-
console.log(`
|
|
29
|
+
const execMode = concurrent ? "concurrent" : "sequential";
|
|
30
|
+
console.log(`MyUru v0.1.0 | ${providerName}/${model}`);
|
|
31
|
+
console.log(`Agents: ${agentCount} | Execution: ${execMode}`);
|
|
37
32
|
console.log("─".repeat(50));
|
|
38
33
|
|
|
39
|
-
try {
|
|
40
|
-
tier.enforceLimit(agentCount, isPro);
|
|
41
|
-
} catch (err) {
|
|
42
|
-
console.error(err.message);
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
34
|
// Resolve task
|
|
47
35
|
let task = opts.task;
|
|
48
36
|
if (!task && opts.file) {
|
|
@@ -104,7 +92,7 @@ async function run(opts) {
|
|
|
104
92
|
const running = agents.filter(a => a.busy).length;
|
|
105
93
|
const done = agents.filter(a => a.invocationCount > 0 && !a.busy).length;
|
|
106
94
|
return [
|
|
107
|
-
`\x1b[36mMyUru\x1b[0m | ${providerName}/${model} | ${
|
|
95
|
+
`\x1b[36mMyUru\x1b[0m | ${providerName}/${model} | ${execMode}`,
|
|
108
96
|
`Task: ${task.substring(0, 60)}`,
|
|
109
97
|
`Agents: ${running} running, ${done} done | ${elapsed}s elapsed`,
|
|
110
98
|
"─".repeat(dashboard.cols),
|
|
@@ -140,11 +128,9 @@ async function run(opts) {
|
|
|
140
128
|
};
|
|
141
129
|
|
|
142
130
|
let results;
|
|
143
|
-
if (
|
|
144
|
-
// Concurrent execution (PRO)
|
|
131
|
+
if (concurrent && agentCount > 1) {
|
|
145
132
|
results = await Promise.all(agents.map((a, i) => runAgent(a, i)));
|
|
146
133
|
} else {
|
|
147
|
-
// Sequential execution (FREE)
|
|
148
134
|
results = [];
|
|
149
135
|
for (let i = 0; i < agents.length; i++) {
|
|
150
136
|
results.push(await runAgent(agents[i], i));
|
package/src/index.js
CHANGED
|
@@ -2,7 +2,6 @@ const AgentRunner = require("./lib/agent-runner");
|
|
|
2
2
|
const TaskDB = require("./lib/task-db");
|
|
3
3
|
const Dashboard = require("./lib/dashboard");
|
|
4
4
|
const CouncilServer = require("./lib/council-server");
|
|
5
|
-
const { TierManager, TIERS } = require("./lib/tiers");
|
|
6
5
|
const { createProvider, ClaudeProvider, OpenAIProvider } = require("./providers");
|
|
7
6
|
|
|
8
7
|
module.exports = {
|
|
@@ -10,8 +9,6 @@ module.exports = {
|
|
|
10
9
|
TaskDB,
|
|
11
10
|
Dashboard,
|
|
12
11
|
CouncilServer,
|
|
13
|
-
TierManager,
|
|
14
|
-
TIERS,
|
|
15
12
|
createProvider,
|
|
16
13
|
ClaudeProvider,
|
|
17
14
|
OpenAIProvider,
|
package/src/lib/tiers.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tier enforcement for MyUru.
|
|
3
|
-
* FREE: 2 sequential agents. PRO: 5 concurrent + config packs.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const TIERS = {
|
|
7
|
-
FREE: {
|
|
8
|
-
name: "Free",
|
|
9
|
-
maxAgents: 2,
|
|
10
|
-
maxConcurrency: 1,
|
|
11
|
-
configPacks: false,
|
|
12
|
-
price: 0,
|
|
13
|
-
},
|
|
14
|
-
PRO: {
|
|
15
|
-
name: "Pro",
|
|
16
|
-
maxAgents: 5,
|
|
17
|
-
maxConcurrency: 5,
|
|
18
|
-
configPacks: true,
|
|
19
|
-
price: 2900,
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
class TierManager {
|
|
24
|
-
constructor(tier = "FREE") {
|
|
25
|
-
this.tier = TIERS[tier] || TIERS.FREE;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
canRunAgents(count) {
|
|
29
|
-
if (count > this.tier.maxAgents) {
|
|
30
|
-
return {
|
|
31
|
-
allowed: false,
|
|
32
|
-
reason: `Tier "${this.tier.name}" allows max ${this.tier.maxAgents} agents. You requested ${count}.`,
|
|
33
|
-
upgrade: `Upgrade to Pro ($29) for up to ${TIERS.PRO.maxAgents} agents.`,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
return { allowed: true };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
canUseConcurrency() {
|
|
40
|
-
if (this.tier.maxConcurrency === 1) {
|
|
41
|
-
return {
|
|
42
|
-
allowed: false,
|
|
43
|
-
reason: "Free tier only supports sequential execution.",
|
|
44
|
-
upgrade: "Upgrade to Pro ($29) for concurrent orchestration.",
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
return { allowed: true };
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
enforceLimit(agentCount, concurrent = false) {
|
|
51
|
-
const check = this.canRunAgents(agentCount);
|
|
52
|
-
if (!check.allowed) throw new Error(`${check.reason}\n${check.upgrade}`);
|
|
53
|
-
|
|
54
|
-
if (concurrent) {
|
|
55
|
-
const concCheck = this.canUseConcurrency();
|
|
56
|
-
if (!concCheck.allowed) {
|
|
57
|
-
console.warn(` ${concCheck.reason} Running sequentially.`);
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
info() {
|
|
66
|
-
return {
|
|
67
|
-
tier: this.tier.name,
|
|
68
|
-
price: this.tier.price === 0 ? "Free" : `$${(this.tier.price / 100).toFixed(2)}`,
|
|
69
|
-
maxAgents: this.tier.maxAgents,
|
|
70
|
-
concurrency: this.tier.maxConcurrency > 1 ? "concurrent" : "sequential",
|
|
71
|
-
configPacks: this.tier.configPacks,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
module.exports = { TierManager, TIERS };
|