@pi-unipi/subagents 2.3.0 → 2.4.1
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 +3 -1
- package/dist/agent-manager.d.ts +81 -0
- package/dist/agent-manager.d.ts.map +1 -0
- package/dist/agent-manager.js +292 -0
- package/dist/agent-manager.js.map +1 -0
- package/dist/agent-runner.d.ts +51 -0
- package/dist/agent-runner.d.ts.map +1 -0
- package/dist/agent-runner.js +262 -0
- package/dist/agent-runner.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +132 -0
- package/dist/config.js.map +1 -0
- package/dist/conversation-viewer.d.ts +40 -0
- package/dist/conversation-viewer.d.ts.map +1 -0
- package/dist/conversation-viewer.js +276 -0
- package/dist/conversation-viewer.js.map +1 -0
- package/dist/core-compat.d.ts +14 -0
- package/dist/core-compat.d.ts.map +1 -0
- package/dist/core-compat.js +24 -0
- package/dist/core-compat.js.map +1 -0
- package/dist/custom-agents.d.ts +14 -0
- package/dist/custom-agents.d.ts.map +1 -0
- package/dist/custom-agents.js +106 -0
- package/dist/custom-agents.js.map +1 -0
- package/dist/file-lock.d.ts +42 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +91 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +751 -0
- package/dist/index.js.map +1 -0
- package/dist/model-resolver.d.ts +19 -0
- package/dist/model-resolver.d.ts.map +1 -0
- package/dist/model-resolver.js +61 -0
- package/dist/model-resolver.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +47 -0
- package/dist/types.js.map +1 -0
- package/dist/widget.d.ts +56 -0
- package/dist/widget.d.ts.map +1 -0
- package/dist/widget.js +396 -0
- package/dist/widget.js.map +1 -0
- package/package.json +10 -6
- package/src/__tests__/badge-generation.test.ts +0 -315
- package/src/__tests__/config.test.ts +0 -240
- package/src/__tests__/esc-propagation.test.ts +0 -162
- package/src/__tests__/file-lock.test.ts +0 -244
- package/src/__tests__/shutdown-stale-ctx.test.ts +0 -185
- package/src/__tests__/workflow-integration.test.ts +0 -334
- package/src/agent-manager.ts +0 -334
- package/src/agent-runner.ts +0 -329
- package/src/config.ts +0 -147
- package/src/conversation-viewer.ts +0 -299
- package/src/custom-agents.ts +0 -118
- package/src/file-lock.ts +0 -102
- package/src/index.ts +0 -862
- package/src/model-resolver.ts +0 -79
- package/src/prompts.ts +0 -39
- package/src/skills/explore/SKILL.md +0 -32
- package/src/skills/work/SKILL.md +0 -40
- package/src/types.ts +0 -146
- package/src/widget.ts +0 -454
- package/tsconfig.json +0 -19
package/README.md
CHANGED
|
@@ -99,7 +99,9 @@ Create markdown files defining agent behavior:
|
|
|
99
99
|
|---------|---------|--------------|
|
|
100
100
|
| `enabled` | true | Enable/disable subagents |
|
|
101
101
|
| `maxConcurrent` | 3 | Max agents running at once |
|
|
102
|
-
| `types.{name}.enabled` | true |
|
|
102
|
+
| `types.{name}.enabled` | true | Disable built-in or custom agent types. Disabled types are omitted from tool guidance and rejected before queueing. |
|
|
103
|
+
|
|
104
|
+
For custom agents, JSON configuration and Markdown frontmatter are both enforced: the type can run only when neither source sets `enabled: false`. Configuration is loaded when the extension starts, so reload the session after changing enablement.
|
|
103
105
|
|
|
104
106
|
## License
|
|
105
107
|
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pi-unipi/subagents — Agent manager
|
|
3
|
+
*
|
|
4
|
+
* Tracks agents, manages concurrency queue, handles spawn/resume/abort.
|
|
5
|
+
* Background agents subject to concurrency limit. Foreground bypass queue.
|
|
6
|
+
*/
|
|
7
|
+
import type { Model } from "@earendil-works/pi-ai";
|
|
8
|
+
import type { AgentSession, ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
import { type ToolActivity } from "./agent-runner.js";
|
|
10
|
+
import { type ModelRegistry } from "./model-resolver.js";
|
|
11
|
+
import type { AgentRecord, AgentConfig, AgentType, ThinkingLevel, SubagentsConfig } from "./types.js";
|
|
12
|
+
import { FileLock } from "./file-lock.js";
|
|
13
|
+
export type OnAgentComplete = (record: AgentRecord) => void;
|
|
14
|
+
export type OnAgentStart = (record: AgentRecord) => void;
|
|
15
|
+
interface SpawnOptions {
|
|
16
|
+
description: string;
|
|
17
|
+
model?: Model<any>;
|
|
18
|
+
modelInput?: string;
|
|
19
|
+
modelRegistry?: ModelRegistry;
|
|
20
|
+
thinkingLevel?: ThinkingLevel;
|
|
21
|
+
maxTurns?: number;
|
|
22
|
+
isolated?: boolean;
|
|
23
|
+
inheritContext?: boolean;
|
|
24
|
+
isBackground?: boolean;
|
|
25
|
+
onToolActivity?: (activity: ToolActivity) => void;
|
|
26
|
+
onTextDelta?: (delta: string, fullText: string) => void;
|
|
27
|
+
onSessionCreated?: (session: AgentSession) => void;
|
|
28
|
+
onTurnEnd?: (turnCount: number) => void;
|
|
29
|
+
}
|
|
30
|
+
export declare class AgentManager {
|
|
31
|
+
private agents;
|
|
32
|
+
private cleanupInterval;
|
|
33
|
+
private onComplete?;
|
|
34
|
+
private onStart?;
|
|
35
|
+
private maxConcurrent;
|
|
36
|
+
private customAgents;
|
|
37
|
+
private typeSettings;
|
|
38
|
+
/** Per-file transparent locking for write agents. */
|
|
39
|
+
readonly fileLock: FileLock;
|
|
40
|
+
/** Queue of background agents waiting to start. */
|
|
41
|
+
private queue;
|
|
42
|
+
/** Number of currently running background agents. */
|
|
43
|
+
private runningBackground;
|
|
44
|
+
constructor(onComplete?: OnAgentComplete, maxConcurrent?: number, onStart?: OnAgentStart, typeSettings?: SubagentsConfig["types"], agentsCwd?: string);
|
|
45
|
+
/** Get resolved agent config for a type. */
|
|
46
|
+
getAgentConfig(type: AgentType): AgentConfig | undefined;
|
|
47
|
+
/** Public agent types known from built-ins, custom files, or JSON config. */
|
|
48
|
+
getKnownTypes(): string[];
|
|
49
|
+
/** A type is enabled only when both JSON config and agent frontmatter allow it. */
|
|
50
|
+
isTypeEnabled(type: AgentType): boolean;
|
|
51
|
+
private assertTypeEnabled;
|
|
52
|
+
setMaxConcurrent(n: number): void;
|
|
53
|
+
getMaxConcurrent(): number;
|
|
54
|
+
/**
|
|
55
|
+
* Spawn an agent. Returns ID immediately for background, waits for foreground.
|
|
56
|
+
*/
|
|
57
|
+
spawn(pi: ExtensionAPI, ctx: ExtensionContext, type: AgentType, prompt: string, options: SpawnOptions): string;
|
|
58
|
+
/** Actually start an agent. */
|
|
59
|
+
private startAgent;
|
|
60
|
+
/** Start queued agents up to concurrency limit. */
|
|
61
|
+
private drainQueue;
|
|
62
|
+
/**
|
|
63
|
+
* Spawn and wait (foreground).
|
|
64
|
+
*/
|
|
65
|
+
spawnAndWait(pi: ExtensionAPI, ctx: ExtensionContext, type: AgentType, prompt: string, options: Omit<SpawnOptions, "isBackground">): Promise<AgentRecord>;
|
|
66
|
+
getRecord(id: string): AgentRecord | undefined;
|
|
67
|
+
listAgents(): AgentRecord[];
|
|
68
|
+
abort(id: string): boolean;
|
|
69
|
+
/** Abort all agents (for ESC propagation). */
|
|
70
|
+
abortAll(): number;
|
|
71
|
+
/** Wait for all agents. */
|
|
72
|
+
waitForAll(): Promise<void>;
|
|
73
|
+
/** Whether any agents running or queued. */
|
|
74
|
+
hasRunning(): boolean;
|
|
75
|
+
/** Remove completed records. */
|
|
76
|
+
clearCompleted(): void;
|
|
77
|
+
private cleanup;
|
|
78
|
+
dispose(): void;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=agent-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../src/agent-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pi-unipi/subagents — Agent manager
|
|
3
|
+
*
|
|
4
|
+
* Tracks agents, manages concurrency queue, handles spawn/resume/abort.
|
|
5
|
+
* Background agents subject to concurrency limit. Foreground bypass queue.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
8
|
+
import { runAgent } from "./agent-runner.js";
|
|
9
|
+
import { resolveModel } from "./model-resolver.js";
|
|
10
|
+
import { BUILTIN_CONFIGS } from "./types.js";
|
|
11
|
+
import { loadCustomAgents } from "./custom-agents.js";
|
|
12
|
+
import { FileLock } from "./file-lock.js";
|
|
13
|
+
/** Default max concurrent background agents. */
|
|
14
|
+
const DEFAULT_MAX_CONCURRENT = 4;
|
|
15
|
+
export class AgentManager {
|
|
16
|
+
agents = new Map();
|
|
17
|
+
cleanupInterval;
|
|
18
|
+
onComplete;
|
|
19
|
+
onStart;
|
|
20
|
+
maxConcurrent;
|
|
21
|
+
customAgents;
|
|
22
|
+
typeSettings;
|
|
23
|
+
/** Per-file transparent locking for write agents. */
|
|
24
|
+
fileLock = new FileLock();
|
|
25
|
+
/** Queue of background agents waiting to start. */
|
|
26
|
+
queue = [];
|
|
27
|
+
/** Number of currently running background agents. */
|
|
28
|
+
runningBackground = 0;
|
|
29
|
+
constructor(onComplete, maxConcurrent = DEFAULT_MAX_CONCURRENT, onStart, typeSettings = {}, agentsCwd = process.cwd()) {
|
|
30
|
+
this.onComplete = onComplete;
|
|
31
|
+
this.onStart = onStart;
|
|
32
|
+
this.maxConcurrent = maxConcurrent;
|
|
33
|
+
this.typeSettings = typeSettings;
|
|
34
|
+
this.customAgents = loadCustomAgents(agentsCwd);
|
|
35
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60_000);
|
|
36
|
+
}
|
|
37
|
+
/** Get resolved agent config for a type. */
|
|
38
|
+
getAgentConfig(type) {
|
|
39
|
+
return this.customAgents.get(type) ?? BUILTIN_CONFIGS[type];
|
|
40
|
+
}
|
|
41
|
+
/** Public agent types known from built-ins, custom files, or JSON config. */
|
|
42
|
+
getKnownTypes() {
|
|
43
|
+
return [...new Set([
|
|
44
|
+
...Object.keys(BUILTIN_CONFIGS).filter((type) => type !== "name-gen"),
|
|
45
|
+
...this.customAgents.keys(),
|
|
46
|
+
...Object.keys(this.typeSettings),
|
|
47
|
+
])];
|
|
48
|
+
}
|
|
49
|
+
/** A type is enabled only when both JSON config and agent frontmatter allow it. */
|
|
50
|
+
isTypeEnabled(type) {
|
|
51
|
+
const agentConfig = this.getAgentConfig(type);
|
|
52
|
+
return this.typeSettings[type]?.enabled !== false && agentConfig?.enabled !== false;
|
|
53
|
+
}
|
|
54
|
+
assertTypeEnabled(type) {
|
|
55
|
+
if (!this.isTypeEnabled(type)) {
|
|
56
|
+
throw new Error(`Agent type "${type}" is disabled by configuration.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
setMaxConcurrent(n) {
|
|
60
|
+
this.maxConcurrent = Math.max(1, n);
|
|
61
|
+
this.drainQueue();
|
|
62
|
+
}
|
|
63
|
+
getMaxConcurrent() {
|
|
64
|
+
return this.maxConcurrent;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Spawn an agent. Returns ID immediately for background, waits for foreground.
|
|
68
|
+
*/
|
|
69
|
+
spawn(pi, ctx, type, prompt, options) {
|
|
70
|
+
// Reject before allocating a record or queue entry. This applies equally to
|
|
71
|
+
// foreground and background spawns and avoids ghost disabled agents.
|
|
72
|
+
this.assertTypeEnabled(type);
|
|
73
|
+
const id = randomUUID().slice(0, 17);
|
|
74
|
+
const abortController = new AbortController();
|
|
75
|
+
const record = {
|
|
76
|
+
id,
|
|
77
|
+
type,
|
|
78
|
+
description: options.description,
|
|
79
|
+
status: options.isBackground ? "queued" : "running",
|
|
80
|
+
toolUses: 0,
|
|
81
|
+
startedAt: Date.now(),
|
|
82
|
+
abortController,
|
|
83
|
+
lockedFiles: new Set(),
|
|
84
|
+
};
|
|
85
|
+
this.agents.set(id, record);
|
|
86
|
+
const args = { pi, ctx, type, prompt, options };
|
|
87
|
+
if (options.isBackground && this.runningBackground >= this.maxConcurrent) {
|
|
88
|
+
this.queue.push({ id, args });
|
|
89
|
+
return id;
|
|
90
|
+
}
|
|
91
|
+
this.startAgent(id, record, args);
|
|
92
|
+
return id;
|
|
93
|
+
}
|
|
94
|
+
/** Actually start an agent. */
|
|
95
|
+
startAgent(id, record, { pi, ctx, type, prompt, options }) {
|
|
96
|
+
record.status = "running";
|
|
97
|
+
record.startedAt = Date.now();
|
|
98
|
+
if (options.isBackground)
|
|
99
|
+
this.runningBackground++;
|
|
100
|
+
this.onStart?.(record);
|
|
101
|
+
const agentConfig = this.getAgentConfig(type);
|
|
102
|
+
// Resolve model: explicit input > per-agent config > parent model.
|
|
103
|
+
let model = options.model;
|
|
104
|
+
const modelInput = options.modelInput ?? agentConfig?.model;
|
|
105
|
+
if (!model && modelInput && options.modelRegistry) {
|
|
106
|
+
const resolved = resolveModel(modelInput, options.modelRegistry);
|
|
107
|
+
if (typeof resolved === "string") {
|
|
108
|
+
// Error message — return early with error
|
|
109
|
+
record.status = "error";
|
|
110
|
+
record.error = resolved;
|
|
111
|
+
record.completedAt = Date.now();
|
|
112
|
+
if (options.isBackground) {
|
|
113
|
+
this.runningBackground--;
|
|
114
|
+
this.onComplete?.(record);
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
model = resolved;
|
|
119
|
+
}
|
|
120
|
+
const promise = runAgent(ctx, type, prompt, {
|
|
121
|
+
pi,
|
|
122
|
+
model,
|
|
123
|
+
agentConfig,
|
|
124
|
+
maxTurns: options.maxTurns ?? agentConfig?.maxTurns,
|
|
125
|
+
isolated: options.isolated ?? agentConfig?.isolated,
|
|
126
|
+
inheritContext: options.inheritContext ?? agentConfig?.inheritContext,
|
|
127
|
+
thinkingLevel: options.thinkingLevel ?? agentConfig?.thinking,
|
|
128
|
+
signal: record.abortController.signal,
|
|
129
|
+
onToolActivity: (activity) => {
|
|
130
|
+
if (activity.type === "end")
|
|
131
|
+
record.toolUses++;
|
|
132
|
+
options.onToolActivity?.(activity);
|
|
133
|
+
},
|
|
134
|
+
onTurnEnd: options.onTurnEnd,
|
|
135
|
+
onTextDelta: options.onTextDelta,
|
|
136
|
+
onSessionCreated: (session) => {
|
|
137
|
+
record.session = session;
|
|
138
|
+
options.onSessionCreated?.(session);
|
|
139
|
+
},
|
|
140
|
+
})
|
|
141
|
+
.then(({ responseText, session, aborted, steered }) => {
|
|
142
|
+
if (record.status !== "stopped") {
|
|
143
|
+
record.status = aborted ? "aborted" : steered ? "completed" : "completed";
|
|
144
|
+
}
|
|
145
|
+
record.result = responseText;
|
|
146
|
+
record.session = session;
|
|
147
|
+
record.completedAt ??= Date.now();
|
|
148
|
+
// Release any held file locks
|
|
149
|
+
this.fileLock.releaseAll(id);
|
|
150
|
+
record.lockedFiles.clear();
|
|
151
|
+
if (options.isBackground) {
|
|
152
|
+
this.runningBackground--;
|
|
153
|
+
this.onComplete?.(record);
|
|
154
|
+
this.drainQueue();
|
|
155
|
+
}
|
|
156
|
+
return responseText;
|
|
157
|
+
})
|
|
158
|
+
.catch((err) => {
|
|
159
|
+
if (record.status !== "stopped") {
|
|
160
|
+
record.status = "error";
|
|
161
|
+
}
|
|
162
|
+
record.error = err instanceof Error ? err.message : String(err);
|
|
163
|
+
record.completedAt ??= Date.now();
|
|
164
|
+
// Release any held file locks
|
|
165
|
+
this.fileLock.releaseAll(id);
|
|
166
|
+
record.lockedFiles.clear();
|
|
167
|
+
if (options.isBackground) {
|
|
168
|
+
this.runningBackground--;
|
|
169
|
+
this.onComplete?.(record);
|
|
170
|
+
this.drainQueue();
|
|
171
|
+
}
|
|
172
|
+
return "";
|
|
173
|
+
});
|
|
174
|
+
record.promise = promise;
|
|
175
|
+
}
|
|
176
|
+
/** Start queued agents up to concurrency limit. */
|
|
177
|
+
drainQueue() {
|
|
178
|
+
while (this.queue.length > 0 && this.runningBackground < this.maxConcurrent) {
|
|
179
|
+
const next = this.queue.shift();
|
|
180
|
+
const record = this.agents.get(next.id);
|
|
181
|
+
if (!record || record.status !== "queued")
|
|
182
|
+
continue;
|
|
183
|
+
this.startAgent(next.id, record, next.args);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Spawn and wait (foreground).
|
|
188
|
+
*/
|
|
189
|
+
async spawnAndWait(pi, ctx, type, prompt, options) {
|
|
190
|
+
const id = this.spawn(pi, ctx, type, prompt, { ...options, isBackground: false });
|
|
191
|
+
const record = this.agents.get(id);
|
|
192
|
+
await record.promise;
|
|
193
|
+
return record;
|
|
194
|
+
}
|
|
195
|
+
getRecord(id) {
|
|
196
|
+
return this.agents.get(id);
|
|
197
|
+
}
|
|
198
|
+
listAgents() {
|
|
199
|
+
return [...this.agents.values()].sort((a, b) => b.startedAt - a.startedAt);
|
|
200
|
+
}
|
|
201
|
+
abort(id) {
|
|
202
|
+
const record = this.agents.get(id);
|
|
203
|
+
if (!record)
|
|
204
|
+
return false;
|
|
205
|
+
if (record.status === "queued") {
|
|
206
|
+
this.queue = this.queue.filter((q) => q.id !== id);
|
|
207
|
+
record.status = "stopped";
|
|
208
|
+
record.completedAt = Date.now();
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
if (record.status !== "running")
|
|
212
|
+
return false;
|
|
213
|
+
record.abortController?.abort();
|
|
214
|
+
record.status = "stopped";
|
|
215
|
+
record.completedAt = Date.now();
|
|
216
|
+
this.fileLock.releaseAll(id);
|
|
217
|
+
record.lockedFiles.clear();
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
/** Abort all agents (for ESC propagation). */
|
|
221
|
+
abortAll() {
|
|
222
|
+
let count = 0;
|
|
223
|
+
for (const queued of this.queue) {
|
|
224
|
+
const record = this.agents.get(queued.id);
|
|
225
|
+
if (record) {
|
|
226
|
+
record.status = "stopped";
|
|
227
|
+
record.completedAt = Date.now();
|
|
228
|
+
count++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
this.queue = [];
|
|
232
|
+
for (const record of this.agents.values()) {
|
|
233
|
+
if (record.status === "running") {
|
|
234
|
+
record.abortController?.abort();
|
|
235
|
+
record.status = "stopped";
|
|
236
|
+
record.completedAt = Date.now();
|
|
237
|
+
count++;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
this.fileLock.clear();
|
|
241
|
+
return count;
|
|
242
|
+
}
|
|
243
|
+
/** Wait for all agents. */
|
|
244
|
+
async waitForAll() {
|
|
245
|
+
while (true) {
|
|
246
|
+
this.drainQueue();
|
|
247
|
+
const pending = [...this.agents.values()]
|
|
248
|
+
.filter((r) => r.status === "running" || r.status === "queued")
|
|
249
|
+
.map((r) => r.promise)
|
|
250
|
+
.filter(Boolean);
|
|
251
|
+
if (pending.length === 0)
|
|
252
|
+
break;
|
|
253
|
+
await Promise.allSettled(pending);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/** Whether any agents running or queued. */
|
|
257
|
+
hasRunning() {
|
|
258
|
+
return [...this.agents.values()].some((r) => r.status === "running" || r.status === "queued");
|
|
259
|
+
}
|
|
260
|
+
/** Remove completed records. */
|
|
261
|
+
clearCompleted() {
|
|
262
|
+
for (const [id, record] of this.agents) {
|
|
263
|
+
if (record.status === "running" || record.status === "queued")
|
|
264
|
+
continue;
|
|
265
|
+
record.session?.dispose?.();
|
|
266
|
+
record.session = undefined;
|
|
267
|
+
this.agents.delete(id);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
cleanup() {
|
|
271
|
+
const cutoff = Date.now() - 10 * 60_000;
|
|
272
|
+
for (const [id, record] of this.agents) {
|
|
273
|
+
if (record.status === "running" || record.status === "queued")
|
|
274
|
+
continue;
|
|
275
|
+
if ((record.completedAt ?? 0) >= cutoff)
|
|
276
|
+
continue;
|
|
277
|
+
record.session?.dispose?.();
|
|
278
|
+
record.session = undefined;
|
|
279
|
+
this.agents.delete(id);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
dispose() {
|
|
283
|
+
clearInterval(this.cleanupInterval);
|
|
284
|
+
this.queue = [];
|
|
285
|
+
this.abortAll();
|
|
286
|
+
for (const record of this.agents.values()) {
|
|
287
|
+
record.session?.dispose();
|
|
288
|
+
}
|
|
289
|
+
this.agents.clear();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=agent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../src/agent-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pi-unipi/subagents — Agent runner
|
|
3
|
+
*
|
|
4
|
+
* Creates sessions, runs agents, collects results.
|
|
5
|
+
* Forwards abort signals for ESC propagation.
|
|
6
|
+
*/
|
|
7
|
+
import type { Model } from "@earendil-works/pi-ai";
|
|
8
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
import { type AgentSession, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
10
|
+
import { type AgentConfig, type AgentType, type ThinkingLevel } from "./types.js";
|
|
11
|
+
export declare function getDefaultMaxTurns(): number | undefined;
|
|
12
|
+
export declare function setDefaultMaxTurns(n: number | undefined): void;
|
|
13
|
+
export declare function getGraceTurns(): number;
|
|
14
|
+
export declare function setGraceTurns(n: number): void;
|
|
15
|
+
/** Tool activity info. */
|
|
16
|
+
export interface ToolActivity {
|
|
17
|
+
type: "start" | "end";
|
|
18
|
+
toolName: string;
|
|
19
|
+
}
|
|
20
|
+
/** Options for running an agent. */
|
|
21
|
+
export interface RunOptions {
|
|
22
|
+
pi: ExtensionAPI;
|
|
23
|
+
model?: Model<any>;
|
|
24
|
+
agentConfig?: AgentConfig;
|
|
25
|
+
maxTurns?: number;
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
isolated?: boolean;
|
|
28
|
+
inheritContext?: boolean;
|
|
29
|
+
thinkingLevel?: ThinkingLevel;
|
|
30
|
+
cwd?: string;
|
|
31
|
+
onToolActivity?: (activity: ToolActivity) => void;
|
|
32
|
+
onTextDelta?: (delta: string, fullText: string) => void;
|
|
33
|
+
onSessionCreated?: (session: AgentSession) => void;
|
|
34
|
+
onTurnEnd?: (turnCount: number) => void;
|
|
35
|
+
}
|
|
36
|
+
/** Result from running an agent. */
|
|
37
|
+
export interface RunResult {
|
|
38
|
+
responseText: string;
|
|
39
|
+
session: AgentSession;
|
|
40
|
+
aborted: boolean;
|
|
41
|
+
steered: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run an agent session.
|
|
45
|
+
*/
|
|
46
|
+
export declare function runAgent(ctx: ExtensionContext, type: AgentType, prompt: string, options: RunOptions): Promise<RunResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Get conversation text from a session.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getAgentConversation(session: AgentSession): string;
|
|
51
|
+
//# sourceMappingURL=agent-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../src/agent-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EACL,KAAK,YAAY,EAIjB,KAAK,YAAY,EAIlB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAWnG,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE9D;AAKD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,0BAA0B;AAC1B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,YAAY,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,oCAAoC;AACpC,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAiED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,CAAC,CAqIpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAuClE"}
|