cmdr-agent 2.1.1 → 2.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/dist/bin/cmdr.js +4 -0
- package/dist/bin/cmdr.js.map +1 -1
- package/dist/package.json +69 -0
- package/dist/src/cli/args.d.ts +4 -0
- package/dist/src/cli/args.d.ts.map +1 -1
- package/dist/src/cli/args.js +15 -0
- package/dist/src/cli/args.js.map +1 -1
- package/dist/src/cli/commands.js +20 -0
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/ink/App.d.ts.map +1 -1
- package/dist/src/cli/ink/App.js +15 -0
- package/dist/src/cli/ink/App.js.map +1 -1
- package/dist/src/cli/repl.d.ts +4 -0
- package/dist/src/cli/repl.d.ts.map +1 -1
- package/dist/src/cli/repl.js +48 -19
- package/dist/src/cli/repl.js.map +1 -1
- package/dist/src/core/agent-runner.d.ts +5 -0
- package/dist/src/core/agent-runner.d.ts.map +1 -1
- package/dist/src/core/agent-runner.js +12 -2
- package/dist/src/core/agent-runner.js.map +1 -1
- package/dist/src/core/agent.d.ts +2 -1
- package/dist/src/core/agent.d.ts.map +1 -1
- package/dist/src/core/agent.js +5 -1
- package/dist/src/core/agent.js.map +1 -1
- package/dist/src/core/content-replacement.d.ts +44 -0
- package/dist/src/core/content-replacement.d.ts.map +1 -0
- package/dist/src/core/content-replacement.js +67 -0
- package/dist/src/core/content-replacement.js.map +1 -0
- package/dist/src/core/event-bus.d.ts +129 -0
- package/dist/src/core/event-bus.d.ts.map +1 -0
- package/dist/src/core/event-bus.js +103 -0
- package/dist/src/core/event-bus.js.map +1 -0
- package/dist/src/core/orchestrator.d.ts +17 -1
- package/dist/src/core/orchestrator.d.ts.map +1 -1
- package/dist/src/core/orchestrator.js +95 -1
- package/dist/src/core/orchestrator.js.map +1 -1
- package/dist/src/core/permissions.d.ts +31 -3
- package/dist/src/core/permissions.d.ts.map +1 -1
- package/dist/src/core/permissions.js +122 -11
- package/dist/src/core/permissions.js.map +1 -1
- package/dist/src/core/presets.d.ts.map +1 -1
- package/dist/src/core/presets.js +1 -0
- package/dist/src/core/presets.js.map +1 -1
- package/dist/src/core/types.d.ts +17 -1
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/llm/anthropic.d.ts +27 -0
- package/dist/src/llm/anthropic.d.ts.map +1 -0
- package/dist/src/llm/anthropic.js +269 -0
- package/dist/src/llm/anthropic.js.map +1 -0
- package/dist/src/llm/ollama.d.ts.map +1 -1
- package/dist/src/llm/ollama.js +16 -4
- package/dist/src/llm/ollama.js.map +1 -1
- package/dist/src/llm/openai.d.ts +25 -0
- package/dist/src/llm/openai.d.ts.map +1 -0
- package/dist/src/llm/openai.js +299 -0
- package/dist/src/llm/openai.js.map +1 -0
- package/dist/src/llm/provider-factory.d.ts +35 -0
- package/dist/src/llm/provider-factory.d.ts.map +1 -0
- package/dist/src/llm/provider-factory.js +73 -0
- package/dist/src/llm/provider-factory.js.map +1 -0
- package/dist/src/memory/consolidation.d.ts +37 -0
- package/dist/src/memory/consolidation.d.ts.map +1 -0
- package/dist/src/memory/consolidation.js +148 -0
- package/dist/src/memory/consolidation.js.map +1 -0
- package/dist/src/memory/memory-manager.d.ts +39 -0
- package/dist/src/memory/memory-manager.d.ts.map +1 -0
- package/dist/src/memory/memory-manager.js +96 -0
- package/dist/src/memory/memory-manager.js.map +1 -0
- package/dist/src/plugins/mcp-client.d.ts +14 -5
- package/dist/src/plugins/mcp-client.d.ts.map +1 -1
- package/dist/src/plugins/mcp-client.js +197 -43
- package/dist/src/plugins/mcp-client.js.map +1 -1
- package/dist/src/scheduling/task-scheduler.d.ts +51 -0
- package/dist/src/scheduling/task-scheduler.d.ts.map +1 -0
- package/dist/src/scheduling/task-scheduler.js +127 -0
- package/dist/src/scheduling/task-scheduler.js.map +1 -0
- package/dist/src/session/prompt-builder.d.ts +6 -0
- package/dist/src/session/prompt-builder.d.ts.map +1 -1
- package/dist/src/session/prompt-builder.js +21 -2
- package/dist/src/session/prompt-builder.js.map +1 -1
- package/dist/src/session/prompt-cache.d.ts +33 -0
- package/dist/src/session/prompt-cache.d.ts.map +1 -0
- package/dist/src/session/prompt-cache.js +54 -0
- package/dist/src/session/prompt-cache.js.map +1 -0
- package/dist/src/tools/built-in/diagnostics.d.ts +12 -0
- package/dist/src/tools/built-in/diagnostics.d.ts.map +1 -0
- package/dist/src/tools/built-in/diagnostics.js +119 -0
- package/dist/src/tools/built-in/diagnostics.js.map +1 -0
- package/dist/src/tools/built-in/git-worktree.d.ts +13 -0
- package/dist/src/tools/built-in/git-worktree.d.ts.map +1 -0
- package/dist/src/tools/built-in/git-worktree.js +75 -0
- package/dist/src/tools/built-in/git-worktree.js.map +1 -0
- package/dist/src/tools/built-in/index.d.ts +5 -1
- package/dist/src/tools/built-in/index.d.ts.map +1 -1
- package/dist/src/tools/built-in/index.js +8 -2
- package/dist/src/tools/built-in/index.js.map +1 -1
- package/dist/src/tools/built-in/memory.d.ts +15 -0
- package/dist/src/tools/built-in/memory.d.ts.map +1 -0
- package/dist/src/tools/built-in/memory.js +58 -0
- package/dist/src/tools/built-in/memory.js.map +1 -0
- package/dist/src/tools/built-in/notebook.d.ts +22 -0
- package/dist/src/tools/built-in/notebook.d.ts.map +1 -0
- package/dist/src/tools/built-in/notebook.js +207 -0
- package/dist/src/tools/built-in/notebook.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventBus — typed pub/sub event system for cmdr lifecycle events.
|
|
3
|
+
*
|
|
4
|
+
* Provides a decoupled communication layer beyond plugin hooks.
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Typed event emission and subscription
|
|
7
|
+
* - One-time listeners
|
|
8
|
+
* - Wildcard subscriptions
|
|
9
|
+
* - Async handlers
|
|
10
|
+
*/
|
|
11
|
+
import type { TokenUsage, ToolResult } from './types.js';
|
|
12
|
+
export interface CmdrEvents {
|
|
13
|
+
'session:start': {
|
|
14
|
+
sessionId: string;
|
|
15
|
+
};
|
|
16
|
+
'session:end': {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
messageCount: number;
|
|
19
|
+
totalTokens: TokenUsage;
|
|
20
|
+
};
|
|
21
|
+
'session:compact': {
|
|
22
|
+
before: number;
|
|
23
|
+
after: number;
|
|
24
|
+
tokensSaved: number;
|
|
25
|
+
};
|
|
26
|
+
'turn:start': {
|
|
27
|
+
turn: number;
|
|
28
|
+
model: string;
|
|
29
|
+
};
|
|
30
|
+
'turn:end': {
|
|
31
|
+
turn: number;
|
|
32
|
+
tokenUsage: TokenUsage;
|
|
33
|
+
toolCallCount: number;
|
|
34
|
+
};
|
|
35
|
+
'tool:before': {
|
|
36
|
+
name: string;
|
|
37
|
+
input: Record<string, unknown>;
|
|
38
|
+
};
|
|
39
|
+
'tool:after': {
|
|
40
|
+
name: string;
|
|
41
|
+
result: ToolResult;
|
|
42
|
+
durationMs: number;
|
|
43
|
+
};
|
|
44
|
+
'tool:error': {
|
|
45
|
+
name: string;
|
|
46
|
+
error: string;
|
|
47
|
+
};
|
|
48
|
+
'tool:denied': {
|
|
49
|
+
name: string;
|
|
50
|
+
reason: string;
|
|
51
|
+
};
|
|
52
|
+
'llm:request': {
|
|
53
|
+
model: string;
|
|
54
|
+
messageCount: number;
|
|
55
|
+
};
|
|
56
|
+
'llm:response': {
|
|
57
|
+
model: string;
|
|
58
|
+
usage: TokenUsage;
|
|
59
|
+
stopReason: string;
|
|
60
|
+
};
|
|
61
|
+
'llm:stream:text': {
|
|
62
|
+
chunk: string;
|
|
63
|
+
};
|
|
64
|
+
'llm:error': {
|
|
65
|
+
model: string;
|
|
66
|
+
error: string;
|
|
67
|
+
};
|
|
68
|
+
'memory:read': {
|
|
69
|
+
scope: string;
|
|
70
|
+
};
|
|
71
|
+
'memory:write': {
|
|
72
|
+
scope: string;
|
|
73
|
+
bytes: number;
|
|
74
|
+
};
|
|
75
|
+
'memory:consolidate': {
|
|
76
|
+
entriesBefore: number;
|
|
77
|
+
entriesAfter: number;
|
|
78
|
+
};
|
|
79
|
+
'agent:start': {
|
|
80
|
+
name: string;
|
|
81
|
+
task: string;
|
|
82
|
+
};
|
|
83
|
+
'agent:complete': {
|
|
84
|
+
name: string;
|
|
85
|
+
success: boolean;
|
|
86
|
+
turns: number;
|
|
87
|
+
};
|
|
88
|
+
'agent:error': {
|
|
89
|
+
name: string;
|
|
90
|
+
error: string;
|
|
91
|
+
};
|
|
92
|
+
'user:message': {
|
|
93
|
+
text: string;
|
|
94
|
+
tokenEstimate: number;
|
|
95
|
+
};
|
|
96
|
+
'user:command': {
|
|
97
|
+
command: string;
|
|
98
|
+
args: string;
|
|
99
|
+
};
|
|
100
|
+
'user:abort': {};
|
|
101
|
+
}
|
|
102
|
+
export type EventName = keyof CmdrEvents;
|
|
103
|
+
type Listener<T> = (data: T) => void | Promise<void>;
|
|
104
|
+
export declare class EventBus {
|
|
105
|
+
private listeners;
|
|
106
|
+
private wildcardListeners;
|
|
107
|
+
/** Subscribe to a specific event. Returns an unsubscribe function. */
|
|
108
|
+
on<E extends EventName>(event: E, handler: Listener<CmdrEvents[E]>): () => void;
|
|
109
|
+
/** Subscribe to a specific event, auto-remove after first fire. */
|
|
110
|
+
once<E extends EventName>(event: E, handler: Listener<CmdrEvents[E]>): () => void;
|
|
111
|
+
/** Subscribe to ALL events (wildcard). */
|
|
112
|
+
onAny(handler: Listener<{
|
|
113
|
+
event: string;
|
|
114
|
+
data: unknown;
|
|
115
|
+
}>): () => void;
|
|
116
|
+
/** Emit an event to all listeners. */
|
|
117
|
+
emit<E extends EventName>(event: E, data: CmdrEvents[E]): Promise<void>;
|
|
118
|
+
/** Remove all listeners for a specific event. */
|
|
119
|
+
off<E extends EventName>(event: E): void;
|
|
120
|
+
/** Remove ALL listeners. */
|
|
121
|
+
removeAll(): void;
|
|
122
|
+
/** Get count of listeners for an event. */
|
|
123
|
+
listenerCount(event: EventName): number;
|
|
124
|
+
private addListener;
|
|
125
|
+
}
|
|
126
|
+
/** Singleton event bus for the cmdr process. */
|
|
127
|
+
export declare const globalEventBus: EventBus;
|
|
128
|
+
export {};
|
|
129
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/core/event-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventBus — typed pub/sub event system for cmdr lifecycle events.
|
|
3
|
+
*
|
|
4
|
+
* Provides a decoupled communication layer beyond plugin hooks.
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Typed event emission and subscription
|
|
7
|
+
* - One-time listeners
|
|
8
|
+
* - Wildcard subscriptions
|
|
9
|
+
* - Async handlers
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// EventBus implementation
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
export class EventBus {
|
|
15
|
+
listeners = new Map();
|
|
16
|
+
wildcardListeners = [];
|
|
17
|
+
/** Subscribe to a specific event. Returns an unsubscribe function. */
|
|
18
|
+
on(event, handler) {
|
|
19
|
+
return this.addListener(event, handler, false);
|
|
20
|
+
}
|
|
21
|
+
/** Subscribe to a specific event, auto-remove after first fire. */
|
|
22
|
+
once(event, handler) {
|
|
23
|
+
return this.addListener(event, handler, true);
|
|
24
|
+
}
|
|
25
|
+
/** Subscribe to ALL events (wildcard). */
|
|
26
|
+
onAny(handler) {
|
|
27
|
+
const entry = { handler, once: false };
|
|
28
|
+
this.wildcardListeners.push(entry);
|
|
29
|
+
return () => {
|
|
30
|
+
const idx = this.wildcardListeners.indexOf(entry);
|
|
31
|
+
if (idx !== -1)
|
|
32
|
+
this.wildcardListeners.splice(idx, 1);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Emit an event to all listeners. */
|
|
36
|
+
async emit(event, data) {
|
|
37
|
+
// Specific listeners
|
|
38
|
+
const entries = this.listeners.get(event);
|
|
39
|
+
if (entries) {
|
|
40
|
+
const toRemove = [];
|
|
41
|
+
for (let i = 0; i < entries.length; i++) {
|
|
42
|
+
try {
|
|
43
|
+
await entries[i].handler(data);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Don't let listener errors propagate
|
|
47
|
+
}
|
|
48
|
+
if (entries[i].once)
|
|
49
|
+
toRemove.push(i);
|
|
50
|
+
}
|
|
51
|
+
// Remove one-time listeners in reverse order
|
|
52
|
+
for (let i = toRemove.length - 1; i >= 0; i--) {
|
|
53
|
+
entries.splice(toRemove[i], 1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Wildcard listeners
|
|
57
|
+
const wcToRemove = [];
|
|
58
|
+
for (let i = 0; i < this.wildcardListeners.length; i++) {
|
|
59
|
+
try {
|
|
60
|
+
await this.wildcardListeners[i].handler({ event, data });
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Don't let listener errors propagate
|
|
64
|
+
}
|
|
65
|
+
if (this.wildcardListeners[i].once)
|
|
66
|
+
wcToRemove.push(i);
|
|
67
|
+
}
|
|
68
|
+
for (let i = wcToRemove.length - 1; i >= 0; i--) {
|
|
69
|
+
this.wildcardListeners.splice(wcToRemove[i], 1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Remove all listeners for a specific event. */
|
|
73
|
+
off(event) {
|
|
74
|
+
this.listeners.delete(event);
|
|
75
|
+
}
|
|
76
|
+
/** Remove ALL listeners. */
|
|
77
|
+
removeAll() {
|
|
78
|
+
this.listeners.clear();
|
|
79
|
+
this.wildcardListeners = [];
|
|
80
|
+
}
|
|
81
|
+
/** Get count of listeners for an event. */
|
|
82
|
+
listenerCount(event) {
|
|
83
|
+
return (this.listeners.get(event)?.length ?? 0);
|
|
84
|
+
}
|
|
85
|
+
addListener(event, handler, once) {
|
|
86
|
+
if (!this.listeners.has(event)) {
|
|
87
|
+
this.listeners.set(event, []);
|
|
88
|
+
}
|
|
89
|
+
const entry = { handler: handler, once };
|
|
90
|
+
this.listeners.get(event).push(entry);
|
|
91
|
+
return () => {
|
|
92
|
+
const entries = this.listeners.get(event);
|
|
93
|
+
if (entries) {
|
|
94
|
+
const idx = entries.indexOf(entry);
|
|
95
|
+
if (idx !== -1)
|
|
96
|
+
entries.splice(idx, 1);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Singleton event bus for the cmdr process. */
|
|
102
|
+
export const globalEventBus = new EventBus();
|
|
103
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/core/event-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Orchestrator — top-level coordinator for multi-agent workflows.
|
|
3
3
|
*
|
|
4
|
-
* Provides runAgent(), runTeam(), and
|
|
4
|
+
* Provides runAgent(), runTeam(), runTasks(), and coordinate() entry points.
|
|
5
|
+
* The coordinate() method adds a planning phase where an LLM decomposes a
|
|
6
|
+
* complex goal into tasks with dependencies before executing them.
|
|
5
7
|
*/
|
|
6
8
|
import type { AgentConfig, AgentRunResult, TeamConfig, TeamRunResult, Task, LLMAdapter, OrchestratorConfig, TokenUsage } from './types.js';
|
|
7
9
|
import type { ToolRegistry } from '../tools/registry.js';
|
|
8
10
|
import type { PermissionManager } from './permissions.js';
|
|
9
11
|
import { Team } from './team.js';
|
|
10
12
|
import { TaskQueue } from '../communication/task-queue.js';
|
|
13
|
+
export interface CoordinateResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
taskResults: Map<string, AgentRunResult>;
|
|
16
|
+
totalTokenUsage: TokenUsage;
|
|
17
|
+
plannedTasks: number;
|
|
18
|
+
completedTasks: number;
|
|
19
|
+
}
|
|
11
20
|
export declare class Orchestrator {
|
|
12
21
|
private readonly adapter;
|
|
13
22
|
private readonly toolRegistry;
|
|
@@ -30,6 +39,13 @@ export declare class Orchestrator {
|
|
|
30
39
|
}>;
|
|
31
40
|
/** Get the active team (if any). */
|
|
32
41
|
getActiveTeam(): Team | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Coordinator mode: LLM-driven task decomposition + parallel execution.
|
|
44
|
+
* Uses the adapter to plan tasks, then executes them via runTasks().
|
|
45
|
+
*/
|
|
46
|
+
coordinate(goal: string, agentConfigs: readonly AgentConfig[], options?: {
|
|
47
|
+
maxTokenBudget?: number;
|
|
48
|
+
}): Promise<CoordinateResult>;
|
|
33
49
|
/** Get status of the active team. */
|
|
34
50
|
getStatus(): {
|
|
35
51
|
agents: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EACtD,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAqB,UAAU,EAEpE,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAsB1D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACxC,eAAe,EAAE,UAAU,CAAA;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAM;gBAGvB,OAAO,EAAE,UAAU,EACnB,YAAY,EAAE,YAAY,EAC1B,MAAM,GAAE,kBAAuB,EAC/B,GAAG,CAAC,EAAE,MAAM,EACZ,iBAAiB,CAAC,EAAE,iBAAiB;IASvC,oCAAoC;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgB/E,wEAAwE;IAClE,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkB3E;;;OAGG;IACG,QAAQ,CACZ,KAAK,EAAE,IAAI,EAAE,EACb,YAAY,EAAE,SAAS,WAAW,EAAE,GACnC,OAAO,CAAC;QAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,CAAC;IAwD5E,oCAAoC;IACpC,aAAa,IAAI,IAAI,GAAG,SAAS;IAIjC;;;OAGG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACpC,OAAO,CAAC,gBAAgB,CAAC;IAsF5B,qCAAqC;IACrC,SAAS,IAAI;QAAE,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAA;KAAE,GAAG,IAAI;IAKjH,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -1,13 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Orchestrator — top-level coordinator for multi-agent workflows.
|
|
3
3
|
*
|
|
4
|
-
* Provides runAgent(), runTeam(), and
|
|
4
|
+
* Provides runAgent(), runTeam(), runTasks(), and coordinate() entry points.
|
|
5
|
+
* The coordinate() method adds a planning phase where an LLM decomposes a
|
|
6
|
+
* complex goal into tasks with dependencies before executing them.
|
|
5
7
|
*/
|
|
6
8
|
import { Agent } from './agent.js';
|
|
7
9
|
import { Team } from './team.js';
|
|
8
10
|
import { TaskQueue } from '../communication/task-queue.js';
|
|
9
11
|
import { Semaphore } from '../scheduling/semaphore.js';
|
|
10
12
|
const ZERO_USAGE = { input_tokens: 0, output_tokens: 0 };
|
|
13
|
+
const COORDINATOR_SYSTEM_PROMPT = `You are a task decomposition coordinator. Given a complex goal and a list of available agents, break the goal into concrete tasks.
|
|
14
|
+
|
|
15
|
+
Output a JSON array of tasks. Each task has:
|
|
16
|
+
- "id": unique short string (e.g. "t1", "t2")
|
|
17
|
+
- "title": brief task description (1 line)
|
|
18
|
+
- "description": detailed instructions for the agent
|
|
19
|
+
- "assignee": name of the agent best suited for this task
|
|
20
|
+
- "dependsOn": array of task IDs that must complete first (or empty array)
|
|
21
|
+
|
|
22
|
+
Rules:
|
|
23
|
+
- Minimize dependencies — parallelize when possible
|
|
24
|
+
- Each task should be self-contained enough for one agent to handle
|
|
25
|
+
- Assign tasks to agents based on their roles/specializations
|
|
26
|
+
- Keep the total number of tasks reasonable (2-8)
|
|
27
|
+
|
|
28
|
+
Output ONLY the JSON array, no other text.`;
|
|
11
29
|
export class Orchestrator {
|
|
12
30
|
adapter;
|
|
13
31
|
toolRegistry;
|
|
@@ -96,6 +114,82 @@ export class Orchestrator {
|
|
|
96
114
|
getActiveTeam() {
|
|
97
115
|
return this.activeTeam;
|
|
98
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Coordinator mode: LLM-driven task decomposition + parallel execution.
|
|
119
|
+
* Uses the adapter to plan tasks, then executes them via runTasks().
|
|
120
|
+
*/
|
|
121
|
+
async coordinate(goal, agentConfigs, options) {
|
|
122
|
+
this.emit({ type: 'message', data: 'Coordinator: planning tasks...' });
|
|
123
|
+
// Step 1: Plan — ask LLM to decompose the goal into tasks
|
|
124
|
+
const agentList = agentConfigs.map(a => `- ${a.name}: ${a.systemPrompt?.slice(0, 100) ?? 'general assistant'}`).join('\n');
|
|
125
|
+
const planMessages = [{
|
|
126
|
+
role: 'user',
|
|
127
|
+
content: [{
|
|
128
|
+
type: 'text',
|
|
129
|
+
text: `Available agents:\n${agentList}\n\nGoal: ${goal}`,
|
|
130
|
+
}],
|
|
131
|
+
}];
|
|
132
|
+
const planOptions = {
|
|
133
|
+
model: this.config.defaultModel ?? agentConfigs[0]?.model ?? 'qwen3',
|
|
134
|
+
systemPrompt: COORDINATOR_SYSTEM_PROMPT,
|
|
135
|
+
maxTokens: 1024,
|
|
136
|
+
temperature: 0.3,
|
|
137
|
+
};
|
|
138
|
+
let tasks;
|
|
139
|
+
let planUsage = ZERO_USAGE;
|
|
140
|
+
try {
|
|
141
|
+
const response = await this.adapter.chat(planMessages, planOptions);
|
|
142
|
+
planUsage = response.usage;
|
|
143
|
+
const text = response.content
|
|
144
|
+
.filter((b) => b.type === 'text')
|
|
145
|
+
.map(b => b.text)
|
|
146
|
+
.join('');
|
|
147
|
+
// Parse JSON from response (handle markdown code blocks)
|
|
148
|
+
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
149
|
+
if (!jsonMatch)
|
|
150
|
+
throw new Error('No JSON array in planner response');
|
|
151
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
152
|
+
tasks = parsed.map(t => ({
|
|
153
|
+
id: t.id,
|
|
154
|
+
title: t.title,
|
|
155
|
+
description: t.description,
|
|
156
|
+
status: 'pending',
|
|
157
|
+
assignee: t.assignee,
|
|
158
|
+
dependsOn: t.dependsOn,
|
|
159
|
+
createdAt: new Date(),
|
|
160
|
+
updatedAt: new Date(),
|
|
161
|
+
}));
|
|
162
|
+
this.emit({ type: 'message', data: `Coordinator: planned ${tasks.length} tasks` });
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
// Fallback: single task assigned to first agent
|
|
166
|
+
tasks = [{
|
|
167
|
+
id: 't1',
|
|
168
|
+
title: goal.slice(0, 80),
|
|
169
|
+
description: goal,
|
|
170
|
+
status: 'pending',
|
|
171
|
+
assignee: agentConfigs[0]?.name,
|
|
172
|
+
createdAt: new Date(),
|
|
173
|
+
updatedAt: new Date(),
|
|
174
|
+
}];
|
|
175
|
+
this.emit({ type: 'message', data: 'Coordinator: plan failed, using single-task fallback' });
|
|
176
|
+
}
|
|
177
|
+
// Step 2: Execute
|
|
178
|
+
const { results: taskResults, totalUsage: execUsage } = await this.runTasks(tasks, agentConfigs);
|
|
179
|
+
const totalUsage = addUsage(planUsage, execUsage);
|
|
180
|
+
const completed = Array.from(taskResults.values()).filter(r => r.success).length;
|
|
181
|
+
// Check token budget
|
|
182
|
+
if (options?.maxTokenBudget && (totalUsage.input_tokens + totalUsage.output_tokens) > options.maxTokenBudget) {
|
|
183
|
+
this.emit({ type: 'message', data: 'Coordinator: token budget exceeded' });
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
success: completed === tasks.length,
|
|
187
|
+
taskResults,
|
|
188
|
+
totalTokenUsage: totalUsage,
|
|
189
|
+
plannedTasks: tasks.length,
|
|
190
|
+
completedTasks: completed,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
99
193
|
/** Get status of the active team. */
|
|
100
194
|
getStatus() {
|
|
101
195
|
if (!this.activeTeam)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Classifies tools by risk level and gates execution on user approval
|
|
5
5
|
* depending on the current permission mode.
|
|
6
|
+
*
|
|
7
|
+
* Supports fine-grained rules:
|
|
8
|
+
* - Glob patterns for file paths (e.g. "src/**" allows all file writes under src/)
|
|
9
|
+
* - Prefix matching for bash commands (e.g. "npm test" allows "npm test --watch")
|
|
6
10
|
*/
|
|
7
11
|
import type { PermissionMode, ToolRiskLevel, ApprovalCallback } from './types.js';
|
|
8
12
|
export declare function classifyTool(toolName: string): ToolRiskLevel;
|
|
@@ -12,19 +16,43 @@ export declare class PermissionManager {
|
|
|
12
16
|
private sessionAllowed;
|
|
13
17
|
/** Tools persisted in ~/.cmdr/settings.json. */
|
|
14
18
|
private persistedAllowed;
|
|
19
|
+
/** Path-based rules for file tools. */
|
|
20
|
+
private pathRules;
|
|
21
|
+
/** Command-prefix rules for bash tool. */
|
|
22
|
+
private bashRules;
|
|
23
|
+
/** Project root for resolving relative paths in rules. */
|
|
24
|
+
private projectRoot;
|
|
15
25
|
constructor(mode?: PermissionMode);
|
|
26
|
+
setProjectRoot(root: string): void;
|
|
16
27
|
/** Load persisted settings from ~/.cmdr/settings.json. */
|
|
17
28
|
loadSettings(): Promise<void>;
|
|
18
29
|
/** Save current persisted allow-list to disk. */
|
|
19
30
|
private saveSettings;
|
|
20
31
|
getMode(): PermissionMode;
|
|
21
32
|
setMode(mode: PermissionMode): void;
|
|
33
|
+
/** Add a path rule (e.g. allow writes to "src/**"). */
|
|
34
|
+
addPathRule(pattern: string, allow?: boolean): void;
|
|
35
|
+
/** Add a bash command rule (e.g. allow "npm test"). */
|
|
36
|
+
addBashRule(prefix: string, allow?: boolean): void;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a specific file path is allowed by path rules.
|
|
39
|
+
* Returns true (allowed), false (denied), or undefined (no matching rule).
|
|
40
|
+
*/
|
|
41
|
+
private checkPathRules;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a bash command matches any bash rules.
|
|
44
|
+
* Returns true (allowed), false (denied), or undefined (no matching rule).
|
|
45
|
+
*/
|
|
46
|
+
private checkBashRules;
|
|
47
|
+
/**
|
|
48
|
+
* Check fine-grained rules for a specific tool invocation.
|
|
49
|
+
* Returns true if auto-approved by rules, false otherwise.
|
|
50
|
+
*/
|
|
51
|
+
private checkFineGrainedRules;
|
|
22
52
|
/**
|
|
23
53
|
* Decide whether a tool call should proceed.
|
|
24
|
-
*
|
|
25
|
-
* Returns true if auto-approved, false if the user must be prompted.
|
|
26
54
|
*/
|
|
27
|
-
needsApproval(toolName: string): boolean;
|
|
55
|
+
needsApproval(toolName: string, input?: Record<string, unknown>): boolean;
|
|
28
56
|
/**
|
|
29
57
|
* Gate a tool call. If approval is needed, calls the approvalCallback.
|
|
30
58
|
* Returns the decision (allow/deny). Handles 'allow-always' by recording it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/core/permissions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/core/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAoB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAoDnG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAI5D;AAyBD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAgB;IAC5B,+DAA+D;IAC/D,OAAO,CAAC,cAAc,CAAoB;IAC1C,gDAAgD;IAChD,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,uCAAuC;IACvC,OAAO,CAAC,SAAS,CAAiB;IAClC,0CAA0C;IAC1C,OAAO,CAAC,SAAS,CAAiB;IAClC,0DAA0D;IAC1D,OAAO,CAAC,WAAW,CAAwB;gBAE/B,IAAI,GAAE,cAAyB;IAI3C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,0DAA0D;IACpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBnC,iDAAiD;YACnC,YAAY;IAe1B,OAAO,IAAI,cAAc;IAIzB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKnC,uDAAuD;IACvD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,OAAc,GAAG,IAAI;IAIzD,uDAAuD;IACvD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,OAAc,GAAG,IAAI;IAIxD;;;OAGG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAWtB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAsBzE;;;OAGG;IACG,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAkB5B,kDAAkD;IAClD,YAAY,IAAI,IAAI;CAGrB"}
|