ineedcodes 0.1.7 → 1.0.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/LICENSE +1 -1
- package/README.md +82 -84
- package/package.json +22 -28
- package/src/agent.js +106 -0
- package/src/cli.js +93 -0
- package/src/config.js +39 -0
- package/src/provider.js +59 -0
- package/src/session.js +156 -0
- package/src/tools.js +185 -0
- package/src/ui.js +74 -0
- package/src/wizard.js +111 -0
- package/docs/assets/ineed-logo.svg +0 -161
- package/docs/configuration.md +0 -71
- package/docs/skills.md +0 -58
- package/packages/agent/dist/boost.d.ts +0 -34
- package/packages/agent/dist/boost.js +0 -138
- package/packages/agent/dist/boost.js.map +0 -1
- package/packages/agent/dist/events.d.ts +0 -67
- package/packages/agent/dist/events.js +0 -16
- package/packages/agent/dist/events.js.map +0 -1
- package/packages/agent/dist/index.d.ts +0 -6
- package/packages/agent/dist/index.js +0 -7
- package/packages/agent/dist/index.js.map +0 -1
- package/packages/agent/dist/lead-agent.d.ts +0 -85
- package/packages/agent/dist/lead-agent.js +0 -235
- package/packages/agent/dist/lead-agent.js.map +0 -1
- package/packages/agent/dist/orchestrator.d.ts +0 -43
- package/packages/agent/dist/orchestrator.js +0 -135
- package/packages/agent/dist/orchestrator.js.map +0 -1
- package/packages/agent/dist/runtime.d.ts +0 -44
- package/packages/agent/dist/runtime.js +0 -265
- package/packages/agent/dist/runtime.js.map +0 -1
- package/packages/agent/dist/system-prompts.d.ts +0 -24
- package/packages/agent/dist/system-prompts.js +0 -91
- package/packages/agent/dist/system-prompts.js.map +0 -1
- package/packages/agent/package.json +0 -21
- package/packages/cli/dist/index.d.ts +0 -3
- package/packages/cli/dist/index.js +0 -11426
- package/packages/cli/dist/index.js.map +0 -1
- package/packages/cli/dist/setup.d.ts +0 -37
- package/packages/cli/dist/setup.js +0 -250
- package/packages/cli/dist/setup.js.map +0 -1
- package/packages/cli/dist/tools-setup.d.ts +0 -12
- package/packages/cli/dist/tools-setup.js +0 -28
- package/packages/cli/dist/tools-setup.js.map +0 -1
- package/packages/cli/dist/ui/approval.d.ts +0 -12
- package/packages/cli/dist/ui/approval.js +0 -52
- package/packages/cli/dist/ui/approval.js.map +0 -1
- package/packages/cli/dist/ui/colors.d.ts +0 -14
- package/packages/cli/dist/ui/colors.js +0 -21
- package/packages/cli/dist/ui/colors.js.map +0 -1
- package/packages/cli/dist/ui/prompts.d.ts +0 -46
- package/packages/cli/dist/ui/prompts.js +0 -135
- package/packages/cli/dist/ui/prompts.js.map +0 -1
- package/packages/cli/dist/ui/renderer.d.ts +0 -13
- package/packages/cli/dist/ui/renderer.js +0 -95
- package/packages/cli/dist/ui/renderer.js.map +0 -1
- package/packages/cli/package.json +0 -23
- package/packages/core/dist/config/config.d.ts +0 -32
- package/packages/core/dist/config/config.js +0 -43
- package/packages/core/dist/config/config.js.map +0 -1
- package/packages/core/dist/context/engine.d.ts +0 -25
- package/packages/core/dist/context/engine.js +0 -98
- package/packages/core/dist/context/engine.js.map +0 -1
- package/packages/core/dist/index.d.ts +0 -20
- package/packages/core/dist/index.js +0 -21
- package/packages/core/dist/index.js.map +0 -1
- package/packages/core/dist/llm/openai-compatible.d.ts +0 -23
- package/packages/core/dist/llm/openai-compatible.js +0 -177
- package/packages/core/dist/llm/openai-compatible.js.map +0 -1
- package/packages/core/dist/memory/icm-adapter.d.ts +0 -31
- package/packages/core/dist/memory/icm-adapter.js +0 -98
- package/packages/core/dist/memory/icm-adapter.js.map +0 -1
- package/packages/core/dist/permissions/permissions.d.ts +0 -28
- package/packages/core/dist/permissions/permissions.js +0 -89
- package/packages/core/dist/permissions/permissions.js.map +0 -1
- package/packages/core/dist/security/secrets.d.ts +0 -4
- package/packages/core/dist/security/secrets.js +0 -43
- package/packages/core/dist/security/secrets.js.map +0 -1
- package/packages/core/dist/session/store.d.ts +0 -16
- package/packages/core/dist/session/store.js +0 -54
- package/packages/core/dist/session/store.js.map +0 -1
- package/packages/core/dist/shell/process.d.ts +0 -26
- package/packages/core/dist/shell/process.js +0 -128
- package/packages/core/dist/shell/process.js.map +0 -1
- package/packages/core/dist/skills/loader.d.ts +0 -9
- package/packages/core/dist/skills/loader.js +0 -163
- package/packages/core/dist/skills/loader.js.map +0 -1
- package/packages/core/dist/tools/fs.d.ts +0 -10
- package/packages/core/dist/tools/fs.js +0 -409
- package/packages/core/dist/tools/fs.js.map +0 -1
- package/packages/core/dist/tools/git.d.ts +0 -7
- package/packages/core/dist/tools/git.js +0 -251
- package/packages/core/dist/tools/git.js.map +0 -1
- package/packages/core/dist/tools/mcp.d.ts +0 -42
- package/packages/core/dist/tools/mcp.js +0 -158
- package/packages/core/dist/tools/mcp.js.map +0 -1
- package/packages/core/dist/tools/registry.d.ts +0 -21
- package/packages/core/dist/tools/registry.js +0 -50
- package/packages/core/dist/tools/registry.js.map +0 -1
- package/packages/core/dist/tools/search.d.ts +0 -2
- package/packages/core/dist/tools/search.js +0 -243
- package/packages/core/dist/tools/search.js.map +0 -1
- package/packages/core/dist/tools/shell.d.ts +0 -8
- package/packages/core/dist/tools/shell.js +0 -164
- package/packages/core/dist/tools/shell.js.map +0 -1
- package/packages/core/dist/tools/web.d.ts +0 -14
- package/packages/core/dist/tools/web.js +0 -125
- package/packages/core/dist/tools/web.js.map +0 -1
- package/packages/core/dist/types.d.ts +0 -202
- package/packages/core/dist/types.js +0 -7
- package/packages/core/dist/types.js.map +0 -1
- package/packages/core/dist/util/fs.d.ts +0 -5
- package/packages/core/dist/util/fs.js +0 -33
- package/packages/core/dist/util/fs.js.map +0 -1
- package/packages/core/dist/util/shell-quote.d.ts +0 -7
- package/packages/core/dist/util/shell-quote.js +0 -20
- package/packages/core/dist/util/shell-quote.js.map +0 -1
- package/packages/core/dist/workspace/workspace.d.ts +0 -15
- package/packages/core/dist/workspace/workspace.js +0 -84
- package/packages/core/dist/workspace/workspace.js.map +0 -1
- package/packages/core/package.json +0 -22
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import type { JsonValue, LLMProvider, MemoryProvider, PermissionEngine, SessionState, ToolRegistry, WorkspaceInfo } from '@ineedcodes/core';
|
|
2
|
-
import { SkillLoader } from '@ineedcodes/core';
|
|
3
|
-
import { type ApprovalRequest, type RuntimeOutcome } from './runtime.js';
|
|
4
|
-
import { EventBus, type EventListener } from './events.js';
|
|
5
|
-
import { Orchestrator } from './orchestrator.js';
|
|
6
|
-
import { type ExplanationDepth } from './system-prompts.js';
|
|
7
|
-
import type { IneedcodesConfig } from '@ineedcodes/core';
|
|
8
|
-
export interface LeadAgentOptions {
|
|
9
|
-
config: IneedcodesConfig;
|
|
10
|
-
registry: ToolRegistry;
|
|
11
|
-
permissions: PermissionEngine;
|
|
12
|
-
provider: LLMProvider;
|
|
13
|
-
workspace: WorkspaceInfo;
|
|
14
|
-
eventBus: EventBus;
|
|
15
|
-
depth: ExplanationDepth;
|
|
16
|
-
maxTurns?: number;
|
|
17
|
-
/** plan = analysis only (read-only tools); build = full autonomy. Default: build. */
|
|
18
|
-
mode?: 'plan' | 'build';
|
|
19
|
-
reasoningEffort?: 'low' | 'medium' | 'high';
|
|
20
|
-
requestApproval?: (req: ApprovalRequest) => Promise<boolean>;
|
|
21
|
-
signal?: AbortSignal;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* The Lead Agent is the authoritative coordinator of a session.
|
|
25
|
-
*/
|
|
26
|
-
export declare class LeadAgent {
|
|
27
|
-
private readonly opts;
|
|
28
|
-
readonly eventBus: EventBus;
|
|
29
|
-
private readonly orchestrator;
|
|
30
|
-
private memory;
|
|
31
|
-
private messages;
|
|
32
|
-
private objective;
|
|
33
|
-
private depth;
|
|
34
|
-
private mode;
|
|
35
|
-
private reasoningEffort;
|
|
36
|
-
private readonly skillsLoader;
|
|
37
|
-
private skillCache;
|
|
38
|
-
constructor(opts: LeadAgentOptions);
|
|
39
|
-
init(): Promise<void>;
|
|
40
|
-
setDepth(depth: ExplanationDepth): void;
|
|
41
|
-
getMode(): 'plan' | 'build';
|
|
42
|
-
setMode(mode: 'plan' | 'build'): void;
|
|
43
|
-
getReasoningEffort(): 'low' | 'medium' | 'high';
|
|
44
|
-
setReasoningEffort(effort: 'low' | 'medium' | 'high'): void;
|
|
45
|
-
/** Hot-swap the LLM provider (e.g. after /model) without restarting the session. */
|
|
46
|
-
setProvider(provider: LLMProvider): void;
|
|
47
|
-
/**
|
|
48
|
-
* Reasoning effort changes real execution budget, not just a request flag:
|
|
49
|
-
* low = quick answers (fewer turns), high = deep work (many more turns).
|
|
50
|
-
*/
|
|
51
|
-
private effectiveMaxTurns;
|
|
52
|
-
/** Fresh session: forget conversation and sub-agents (memory is durable, it stays). */
|
|
53
|
-
resetSession(): void;
|
|
54
|
-
/** Context usage breakdown for the /context command. */
|
|
55
|
-
contextStats(): {
|
|
56
|
-
system: number;
|
|
57
|
-
conversation: number;
|
|
58
|
-
tools: number;
|
|
59
|
-
total: number;
|
|
60
|
-
limit: number;
|
|
61
|
-
compactsAt: number;
|
|
62
|
-
};
|
|
63
|
-
getMemories(): MemoryProvider;
|
|
64
|
-
getOrchestrator(): Orchestrator;
|
|
65
|
-
listSkills(): Awaited<ReturnType<SkillLoader['list']>>;
|
|
66
|
-
reloadSkills(): Promise<void>;
|
|
67
|
-
getSkillText(name: string): string | undefined;
|
|
68
|
-
on(listener: EventListener): () => void;
|
|
69
|
-
private emitEvent;
|
|
70
|
-
private systemPromptFor;
|
|
71
|
-
recallMemories(objective: string): Promise<string[]>;
|
|
72
|
-
/**
|
|
73
|
-
* Run a user objective through the full loop:
|
|
74
|
-
* recall → inspect → reason → act → observe → verify.
|
|
75
|
-
*/
|
|
76
|
-
runObjective(objective: string): Promise<RuntimeOutcome>;
|
|
77
|
-
/** Continue the current session with a new user message. */
|
|
78
|
-
continueSession(userMessage: string): Promise<RuntimeOutcome>;
|
|
79
|
-
private toolContext;
|
|
80
|
-
private recordOutcome;
|
|
81
|
-
private extractDurableKnowledge;
|
|
82
|
-
toSessionState(sessionId: string): SessionState;
|
|
83
|
-
restore(state: SessionState): void;
|
|
84
|
-
}
|
|
85
|
-
export type { RuntimeOutcome, ApprovalRequest, JsonValue };
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { createMemoryProvider, SkillLoader, ProcessManager, estimateTokens } from '@ineedcodes/core';
|
|
2
|
-
import { AgentRuntime } from './runtime.js';
|
|
3
|
-
import { Orchestrator } from './orchestrator.js';
|
|
4
|
-
import { buildSystemPrompt } from './system-prompts.js';
|
|
5
|
-
/**
|
|
6
|
-
* The Lead Agent is the authoritative coordinator of a session.
|
|
7
|
-
*/
|
|
8
|
-
export class LeadAgent {
|
|
9
|
-
opts;
|
|
10
|
-
eventBus;
|
|
11
|
-
orchestrator;
|
|
12
|
-
memory;
|
|
13
|
-
messages = [];
|
|
14
|
-
objective = '';
|
|
15
|
-
depth;
|
|
16
|
-
mode;
|
|
17
|
-
reasoningEffort;
|
|
18
|
-
skillsLoader;
|
|
19
|
-
skillCache = [];
|
|
20
|
-
constructor(opts) {
|
|
21
|
-
this.opts = opts;
|
|
22
|
-
this.eventBus = opts.eventBus;
|
|
23
|
-
this.memory = createMemoryProvider(opts.config.memory.backend, opts.workspace.projectId, opts.workspace.projectRoot);
|
|
24
|
-
this.orchestrator = new Orchestrator(opts.config.permissions.maxParallelAgents);
|
|
25
|
-
this.depth = opts.depth;
|
|
26
|
-
this.mode = opts.mode ?? 'build';
|
|
27
|
-
this.reasoningEffort = opts.reasoningEffort ?? 'medium';
|
|
28
|
-
this.skillsLoader = new SkillLoader(opts.workspace.projectRoot);
|
|
29
|
-
}
|
|
30
|
-
async init() {
|
|
31
|
-
this.skillCache = await this.skillsLoader.list();
|
|
32
|
-
}
|
|
33
|
-
setDepth(depth) {
|
|
34
|
-
this.depth = depth;
|
|
35
|
-
}
|
|
36
|
-
getMode() {
|
|
37
|
-
return this.mode;
|
|
38
|
-
}
|
|
39
|
-
setMode(mode) {
|
|
40
|
-
this.mode = mode;
|
|
41
|
-
}
|
|
42
|
-
getReasoningEffort() {
|
|
43
|
-
return this.reasoningEffort;
|
|
44
|
-
}
|
|
45
|
-
setReasoningEffort(effort) {
|
|
46
|
-
this.reasoningEffort = effort;
|
|
47
|
-
}
|
|
48
|
-
/** Hot-swap the LLM provider (e.g. after /model) without restarting the session. */
|
|
49
|
-
setProvider(provider) {
|
|
50
|
-
this.opts.provider = provider;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Reasoning effort changes real execution budget, not just a request flag:
|
|
54
|
-
* low = quick answers (fewer turns), high = deep work (many more turns).
|
|
55
|
-
*/
|
|
56
|
-
effectiveMaxTurns() {
|
|
57
|
-
if (this.opts.maxTurns !== undefined)
|
|
58
|
-
return this.opts.maxTurns;
|
|
59
|
-
if (this.reasoningEffort === 'low')
|
|
60
|
-
return 20;
|
|
61
|
-
if (this.reasoningEffort === 'high')
|
|
62
|
-
return 80;
|
|
63
|
-
return 40;
|
|
64
|
-
}
|
|
65
|
-
/** Fresh session: forget conversation and sub-agents (memory is durable, it stays). */
|
|
66
|
-
resetSession() {
|
|
67
|
-
this.messages = [];
|
|
68
|
-
this.objective = '';
|
|
69
|
-
this.orchestrator.clear();
|
|
70
|
-
}
|
|
71
|
-
/** Context usage breakdown for the /context command. */
|
|
72
|
-
contextStats() {
|
|
73
|
-
let system = 0;
|
|
74
|
-
let tools = 0;
|
|
75
|
-
let conversation = 0;
|
|
76
|
-
for (const m of this.messages) {
|
|
77
|
-
const t = estimateTokens(m.content ?? '') + (m.toolCalls ?? []).reduce((a, tc) => a + estimateTokens(tc.arguments), 0);
|
|
78
|
-
if (m.role === 'system')
|
|
79
|
-
system += t;
|
|
80
|
-
else if (m.role === 'tool')
|
|
81
|
-
tools += t;
|
|
82
|
-
else
|
|
83
|
-
conversation += t;
|
|
84
|
-
}
|
|
85
|
-
const limit = this.opts.provider.contextLimit;
|
|
86
|
-
return { system, conversation, tools, total: system + conversation + tools, limit, compactsAt: Math.round(limit * 0.75) };
|
|
87
|
-
}
|
|
88
|
-
getMemories() {
|
|
89
|
-
return this.memory;
|
|
90
|
-
}
|
|
91
|
-
getOrchestrator() {
|
|
92
|
-
return this.orchestrator;
|
|
93
|
-
}
|
|
94
|
-
listSkills() {
|
|
95
|
-
return this.skillCache;
|
|
96
|
-
}
|
|
97
|
-
async reloadSkills() {
|
|
98
|
-
this.skillCache = await this.skillsLoader.list();
|
|
99
|
-
}
|
|
100
|
-
getSkillText(name) {
|
|
101
|
-
return this.skillCache.find((s) => s.name.toLowerCase() === name.toLowerCase())?.instructions;
|
|
102
|
-
}
|
|
103
|
-
on(listener) {
|
|
104
|
-
return this.eventBus.on(listener);
|
|
105
|
-
}
|
|
106
|
-
emitEvent(event) {
|
|
107
|
-
return this.eventBus.emit(event);
|
|
108
|
-
}
|
|
109
|
-
systemPromptFor(objective, extraMemories = []) {
|
|
110
|
-
return buildSystemPrompt({
|
|
111
|
-
objective,
|
|
112
|
-
workspace: this.opts.workspace,
|
|
113
|
-
skills: this.skillCache,
|
|
114
|
-
memories: extraMemories,
|
|
115
|
-
depth: this.depth,
|
|
116
|
-
permissionMode: this.opts.permissions.currentMode,
|
|
117
|
-
mode: this.mode,
|
|
118
|
-
reasoningEffort: this.reasoningEffort
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
async recallMemories(objective) {
|
|
122
|
-
try {
|
|
123
|
-
const records = await this.memory.recall(objective, 5);
|
|
124
|
-
return records.map((r) => r.content);
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
return [];
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Run a user objective through the full loop:
|
|
132
|
-
* recall → inspect → reason → act → observe → verify.
|
|
133
|
-
*/
|
|
134
|
-
async runObjective(objective) {
|
|
135
|
-
this.objective = objective;
|
|
136
|
-
await this.emitEvent({ type: 'session-start', projectRoot: this.opts.workspace.projectRoot, model: this.opts.provider.model });
|
|
137
|
-
const memories = await this.recallMemories(objective);
|
|
138
|
-
if (memories.length) {
|
|
139
|
-
await this.emitEvent({ type: 'thinking', text: `Recalled ${memories.length} relevant memory item(s).` });
|
|
140
|
-
}
|
|
141
|
-
const runtime = new AgentRuntime({
|
|
142
|
-
provider: this.opts.provider,
|
|
143
|
-
registry: this.opts.registry,
|
|
144
|
-
memory: this.memory,
|
|
145
|
-
toolContext: this.toolContext(),
|
|
146
|
-
systemPrompt: this.systemPromptFor(objective, memories),
|
|
147
|
-
maxTurns: this.effectiveMaxTurns(),
|
|
148
|
-
mode: this.mode,
|
|
149
|
-
reasoningEffort: this.reasoningEffort
|
|
150
|
-
}, (event) => this.emitEvent(event), this.opts.requestApproval, this.messages, this.opts.signal);
|
|
151
|
-
const outcome = await runtime.run(objective);
|
|
152
|
-
this.messages = [...runtime.messages];
|
|
153
|
-
await this.recordOutcome(objective, outcome);
|
|
154
|
-
await this.emitEvent({ type: 'session-end' });
|
|
155
|
-
return outcome;
|
|
156
|
-
}
|
|
157
|
-
/** Continue the current session with a new user message. */
|
|
158
|
-
async continueSession(userMessage) {
|
|
159
|
-
return this.runObjective(userMessage);
|
|
160
|
-
}
|
|
161
|
-
toolContext() {
|
|
162
|
-
// The CLI normally registers a shared process manager on globalThis;
|
|
163
|
-
// library/embedded usage creates one on demand instead of failing.
|
|
164
|
-
let pm = globalThis['__ineedcodesProcessManager'];
|
|
165
|
-
if (!pm) {
|
|
166
|
-
pm = new ProcessManager();
|
|
167
|
-
globalThis['__ineedcodesProcessManager'] = pm;
|
|
168
|
-
}
|
|
169
|
-
return {
|
|
170
|
-
workspaceRoot: this.opts.workspace.projectRoot,
|
|
171
|
-
cwd: this.opts.workspace.root,
|
|
172
|
-
permissions: this.opts.permissions,
|
|
173
|
-
processManager: pm
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
async recordOutcome(objective, outcome) {
|
|
177
|
-
if (outcome.stopReason !== 'complete')
|
|
178
|
-
return;
|
|
179
|
-
// Store durable knowledge, not chat dumps (plan §14–15).
|
|
180
|
-
const durable = await this.extractDurableKnowledge(objective, outcome);
|
|
181
|
-
if (durable) {
|
|
182
|
-
try {
|
|
183
|
-
await this.memory.remember(durable, ['session', 'outcome']);
|
|
184
|
-
await this.emitEvent({ type: 'memory-write', content: durable });
|
|
185
|
-
}
|
|
186
|
-
catch {
|
|
187
|
-
// memory failures never break the session
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
async extractDurableKnowledge(objective, outcome) {
|
|
192
|
-
try {
|
|
193
|
-
const response = await this.opts.provider.complete({
|
|
194
|
-
messages: [
|
|
195
|
-
{
|
|
196
|
-
role: 'system',
|
|
197
|
-
content: 'Decide whether this completed task produced durable knowledge worth remembering for future sessions ' +
|
|
198
|
-
'in this project (conventions, solved errors, environment facts, decisions). If yes, output one ' +
|
|
199
|
-
'concise memory sentence. If nothing is durable, output exactly NONE.'
|
|
200
|
-
},
|
|
201
|
-
{ role: 'user', content: `Objective: ${objective}\nOutcome: ${outcome.finalMessage.slice(0, 2000)}` }
|
|
202
|
-
],
|
|
203
|
-
temperature: 0,
|
|
204
|
-
maxTokens: 200
|
|
205
|
-
});
|
|
206
|
-
const text = (response.content ?? 'NONE').trim();
|
|
207
|
-
if (!text || text.toUpperCase().startsWith('NONE'))
|
|
208
|
-
return null;
|
|
209
|
-
return `Objective: ${objective.slice(0, 200)}: ${text.slice(0, 500)}`;
|
|
210
|
-
}
|
|
211
|
-
catch {
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
toSessionState(sessionId) {
|
|
216
|
-
return {
|
|
217
|
-
sessionId,
|
|
218
|
-
projectRoot: this.opts.workspace.projectRoot,
|
|
219
|
-
model: this.opts.provider.model,
|
|
220
|
-
objective: this.objective,
|
|
221
|
-
messages: this.messages,
|
|
222
|
-
agents: this.orchestrator.list(),
|
|
223
|
-
createdAt: new Date().toISOString(),
|
|
224
|
-
updatedAt: new Date().toISOString()
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
restore(state) {
|
|
228
|
-
this.messages = state.messages ?? [];
|
|
229
|
-
this.objective = state.objective ?? '';
|
|
230
|
-
for (const agent of state.agents ?? []) {
|
|
231
|
-
this.orchestrator.restore(agent);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
//# sourceMappingURL=lead-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lead-agent.js","sourceRoot":"","sources":["../src/lead-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { AgentCapability, AgentRecord, TaskPacket, TaskResult } from '@ineedcodes/core';
|
|
2
|
-
/**
|
|
3
|
-
* Native multi-agent orchestrator (plan §9–11).
|
|
4
|
-
* Sub-agents are real isolated contexts, not simulated personas in one prompt.
|
|
5
|
-
* The Lead Agent remains the authoritative coordinator.
|
|
6
|
-
*/
|
|
7
|
-
export declare class Orchestrator {
|
|
8
|
-
private maxParallel;
|
|
9
|
-
private agents;
|
|
10
|
-
constructor(maxParallel?: number);
|
|
11
|
-
setMaxParallel(n: number): void;
|
|
12
|
-
get runningCount(): number;
|
|
13
|
-
createTask(opts: {
|
|
14
|
-
capability: AgentCapability;
|
|
15
|
-
objective: string;
|
|
16
|
-
parentAgentId: string;
|
|
17
|
-
context?: string;
|
|
18
|
-
constraints?: string[];
|
|
19
|
-
availableTools?: string[];
|
|
20
|
-
workspace?: string;
|
|
21
|
-
expectedResult?: string;
|
|
22
|
-
}): TaskPacket;
|
|
23
|
-
canStartMore(): boolean;
|
|
24
|
-
setStatus(taskId: string, status: AgentRecord['status']): void;
|
|
25
|
-
finish(taskId: string, result: TaskResult): void;
|
|
26
|
-
get(taskId: string): AgentRecord | undefined;
|
|
27
|
-
list(): AgentRecord[];
|
|
28
|
-
/** Forget all agents (used by /clear). */
|
|
29
|
-
clear(): void;
|
|
30
|
-
pendingTasks(): AgentRecord[];
|
|
31
|
-
restore(record: AgentRecord): void;
|
|
32
|
-
/**
|
|
33
|
-
* Run a set of task packets in parallel (bounded by maxParallel).
|
|
34
|
-
* Each worker gets its own AgentRuntime instance via the factory.
|
|
35
|
-
*/
|
|
36
|
-
runParallel(packets: TaskPacket[], worker: (packet: TaskPacket) => Promise<TaskResult>, hooks?: {
|
|
37
|
-
onStatus?: (taskId: string, status: AgentRecord['status']) => Promise<void>;
|
|
38
|
-
onResult?: (taskId: string, result: TaskResult) => Promise<void>;
|
|
39
|
-
}): Promise<Map<string, TaskResult>>;
|
|
40
|
-
}
|
|
41
|
-
/** Serialize a task result into compact text for the Lead Agent context. */
|
|
42
|
-
export declare function summarizeTaskResults(results: Map<string, TaskResult>): string;
|
|
43
|
-
export declare function worktreePathFor(projectRoot: string, label: string): string;
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
/**
|
|
4
|
-
* Native multi-agent orchestrator (plan §9–11).
|
|
5
|
-
* Sub-agents are real isolated contexts, not simulated personas in one prompt.
|
|
6
|
-
* The Lead Agent remains the authoritative coordinator.
|
|
7
|
-
*/
|
|
8
|
-
export class Orchestrator {
|
|
9
|
-
maxParallel;
|
|
10
|
-
agents = new Map();
|
|
11
|
-
constructor(maxParallel = 4) {
|
|
12
|
-
this.maxParallel = maxParallel;
|
|
13
|
-
}
|
|
14
|
-
setMaxParallel(n) {
|
|
15
|
-
this.maxParallel = Math.max(1, n);
|
|
16
|
-
}
|
|
17
|
-
get runningCount() {
|
|
18
|
-
return [...this.agents.values()].filter((a) => a.status === 'running').length;
|
|
19
|
-
}
|
|
20
|
-
createTask(opts) {
|
|
21
|
-
const taskId = randomUUID();
|
|
22
|
-
const agentId = `agent-${taskId.slice(0, 8)}`;
|
|
23
|
-
const packet = {
|
|
24
|
-
taskId,
|
|
25
|
-
agentId,
|
|
26
|
-
parentAgentId: opts.parentAgentId,
|
|
27
|
-
objective: opts.objective,
|
|
28
|
-
context: opts.context ?? '',
|
|
29
|
-
constraints: opts.constraints ?? [
|
|
30
|
-
'Stay strictly within your task scope.',
|
|
31
|
-
'Do not commit or push.',
|
|
32
|
-
'Report evidence for every claim.'
|
|
33
|
-
],
|
|
34
|
-
availableTools: opts.availableTools ?? ['*'],
|
|
35
|
-
workspace: opts.workspace ?? '.',
|
|
36
|
-
expectedResult: opts.expectedResult ?? 'A clear summary with evidence.'
|
|
37
|
-
};
|
|
38
|
-
this.agents.set(taskId, {
|
|
39
|
-
agentId,
|
|
40
|
-
parentAgentId: opts.parentAgentId,
|
|
41
|
-
capability: opts.capability,
|
|
42
|
-
status: 'pending',
|
|
43
|
-
task: packet
|
|
44
|
-
});
|
|
45
|
-
return packet;
|
|
46
|
-
}
|
|
47
|
-
canStartMore() {
|
|
48
|
-
return this.runningCount < this.maxParallel;
|
|
49
|
-
}
|
|
50
|
-
setStatus(taskId, status) {
|
|
51
|
-
const record = this.agents.get(taskId);
|
|
52
|
-
if (record)
|
|
53
|
-
record.status = status;
|
|
54
|
-
}
|
|
55
|
-
finish(taskId, result) {
|
|
56
|
-
const record = this.agents.get(taskId);
|
|
57
|
-
if (record) {
|
|
58
|
-
record.status = result.status === 'completed' ? 'completed' : 'failed';
|
|
59
|
-
record.result = result;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
get(taskId) {
|
|
63
|
-
return this.agents.get(taskId);
|
|
64
|
-
}
|
|
65
|
-
list() {
|
|
66
|
-
return [...this.agents.values()];
|
|
67
|
-
}
|
|
68
|
-
/** Forget all agents (used by /clear). */
|
|
69
|
-
clear() {
|
|
70
|
-
this.agents.clear();
|
|
71
|
-
}
|
|
72
|
-
pendingTasks() {
|
|
73
|
-
return this.list().filter((a) => a.status === 'pending');
|
|
74
|
-
}
|
|
75
|
-
restore(record) {
|
|
76
|
-
this.agents.set(record.task.taskId, record);
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Run a set of task packets in parallel (bounded by maxParallel).
|
|
80
|
-
* Each worker gets its own AgentRuntime instance via the factory.
|
|
81
|
-
*/
|
|
82
|
-
async runParallel(packets, worker, hooks) {
|
|
83
|
-
const results = new Map();
|
|
84
|
-
const queue = [...packets];
|
|
85
|
-
const launchNext = async () => {
|
|
86
|
-
const packet = queue.shift();
|
|
87
|
-
if (!packet)
|
|
88
|
-
return;
|
|
89
|
-
this.setStatus(packet.taskId, 'running');
|
|
90
|
-
await hooks?.onStatus?.(packet.taskId, 'running');
|
|
91
|
-
let result;
|
|
92
|
-
try {
|
|
93
|
-
result = await worker(packet);
|
|
94
|
-
}
|
|
95
|
-
catch (err) {
|
|
96
|
-
result = {
|
|
97
|
-
status: 'failed',
|
|
98
|
-
summary: err instanceof Error ? err.message : String(err),
|
|
99
|
-
evidence: [],
|
|
100
|
-
filesChanged: [],
|
|
101
|
-
commandsExecuted: [],
|
|
102
|
-
unresolvedIssues: ['Worker crashed before returning a result.']
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
this.finish(packet.taskId, result);
|
|
106
|
-
results.set(packet.taskId, result);
|
|
107
|
-
await hooks?.onResult?.(packet.taskId, result);
|
|
108
|
-
if (queue.length > 0)
|
|
109
|
-
await launchNext();
|
|
110
|
-
};
|
|
111
|
-
const lanes = Math.min(this.maxParallel, Math.max(1, packets.length));
|
|
112
|
-
await Promise.all(Array.from({ length: lanes }, () => launchNext()));
|
|
113
|
-
return results;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/** Serialize a task result into compact text for the Lead Agent context. */
|
|
117
|
-
export function summarizeTaskResults(results) {
|
|
118
|
-
const lines = [];
|
|
119
|
-
for (const [taskId, result] of results) {
|
|
120
|
-
lines.push(`Task ${taskId.slice(0, 8)} [${result.status}]: ${result.summary}`);
|
|
121
|
-
for (const ev of result.evidence.slice(0, 5))
|
|
122
|
-
lines.push(` evidence: ${ev}`);
|
|
123
|
-
if (result.filesChanged.length)
|
|
124
|
-
lines.push(` files: ${result.filesChanged.join(', ')}`);
|
|
125
|
-
if (result.tests)
|
|
126
|
-
lines.push(` tests: ${result.tests}`);
|
|
127
|
-
for (const issue of result.unresolvedIssues)
|
|
128
|
-
lines.push(` unresolved: ${issue}`);
|
|
129
|
-
}
|
|
130
|
-
return lines.join('\n');
|
|
131
|
-
}
|
|
132
|
-
export function worktreePathFor(projectRoot, label) {
|
|
133
|
-
return path.join(projectRoot, '.ineedcodes', label);
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { ChatMessage, LLMProvider, MemoryProvider, ToolContext, ToolRegistry } from '@ineedcodes/core';
|
|
2
|
-
export interface RuntimeServices {
|
|
3
|
-
provider: LLMProvider;
|
|
4
|
-
registry: ToolRegistry;
|
|
5
|
-
memory: MemoryProvider;
|
|
6
|
-
toolContext: ToolContext;
|
|
7
|
-
systemPrompt: string;
|
|
8
|
-
maxTurns: number;
|
|
9
|
-
/** plan = read-only exploration; build = full tool access. */
|
|
10
|
-
mode?: 'plan' | 'build';
|
|
11
|
-
reasoningEffort?: 'low' | 'medium' | 'high';
|
|
12
|
-
}
|
|
13
|
-
export type StopReason = 'complete' | 'needs_approval' | 'needs_information' | 'max_turns' | 'aborted' | 'error';
|
|
14
|
-
export interface RuntimeOutcome {
|
|
15
|
-
stopReason: StopReason;
|
|
16
|
-
finalMessage: string;
|
|
17
|
-
turns: number;
|
|
18
|
-
toolCalls: number;
|
|
19
|
-
}
|
|
20
|
-
export interface ApprovalRequest {
|
|
21
|
-
tool: string;
|
|
22
|
-
reason: string;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* The real iterative agent loop (plan §7):
|
|
26
|
-
* reason → tool call → observe actual result → update state → repeat → verify.
|
|
27
|
-
*/
|
|
28
|
-
export declare class AgentRuntime {
|
|
29
|
-
private readonly services;
|
|
30
|
-
private readonly emit;
|
|
31
|
-
private readonly requestApproval?;
|
|
32
|
-
private signal?;
|
|
33
|
-
private engine;
|
|
34
|
-
constructor(services: RuntimeServices, emit: (event: import('./events.js').RuntimeEvent) => Promise<void>, requestApproval?: ((req: ApprovalRequest) => Promise<boolean>) | undefined, initialMessages?: ChatMessage[], signal?: AbortSignal | undefined);
|
|
35
|
-
get messages(): readonly ChatMessage[];
|
|
36
|
-
run(objective: string): Promise<RuntimeOutcome>;
|
|
37
|
-
/**
|
|
38
|
-
* Second-chance verification: when the model stops calling tools, require it
|
|
39
|
-
* to either present evidence of completion or state what is missing.
|
|
40
|
-
* Returns the single final answer (never duplicated to the UI).
|
|
41
|
-
*/
|
|
42
|
-
private verifyCompletion;
|
|
43
|
-
private summarize;
|
|
44
|
-
}
|