@pi-unipi/subagents 0.1.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/agent-manager.d.ts +69 -0
- package/dist/agent-manager.d.ts.map +1 -0
- package/dist/agent-manager.js +240 -0
- package/dist/agent-manager.js.map +1 -0
- package/dist/agent-runner.d.ts +50 -0
- package/dist/agent-runner.d.ts.map +1 -0
- package/dist/agent-runner.js +238 -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 +115 -0
- package/dist/config.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 +94 -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 +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +270 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +13 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +31 -0
- package/dist/prompts.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/widget.d.ts +22 -0
- package/dist/widget.d.ts.map +1 -0
- package/dist/widget.js +108 -0
- package/dist/widget.js.map +1 -0
- package/package.json +30 -0
- package/src/agent-manager.ts +302 -0
- package/src/agent-runner.ts +306 -0
- package/src/config.ts +128 -0
- package/src/custom-agents.ts +106 -0
- package/src/file-lock.ts +102 -0
- package/src/index.ts +323 -0
- package/src/prompts.ts +39 -0
- package/src/skills/explore/SKILL.md +32 -0
- package/src/skills/work/SKILL.md +40 -0
- package/src/types.ts +86 -0
- package/src/widget.ts +123 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,69 @@
|
|
|
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 "@mariozechner/pi-ai";
|
|
8
|
+
import type { AgentSession, ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
|
|
9
|
+
import { type ToolActivity } from "./agent-runner.js";
|
|
10
|
+
import type { AgentRecord, AgentType, ThinkingLevel } from "./types.js";
|
|
11
|
+
import { FileLock } from "./file-lock.js";
|
|
12
|
+
export type OnAgentComplete = (record: AgentRecord) => void;
|
|
13
|
+
export type OnAgentStart = (record: AgentRecord) => void;
|
|
14
|
+
interface SpawnOptions {
|
|
15
|
+
description: string;
|
|
16
|
+
model?: Model<any>;
|
|
17
|
+
maxTurns?: number;
|
|
18
|
+
isolated?: boolean;
|
|
19
|
+
inheritContext?: boolean;
|
|
20
|
+
thinkingLevel?: ThinkingLevel;
|
|
21
|
+
isBackground?: boolean;
|
|
22
|
+
onToolActivity?: (activity: ToolActivity) => void;
|
|
23
|
+
onTextDelta?: (delta: string, fullText: string) => void;
|
|
24
|
+
onSessionCreated?: (session: AgentSession) => void;
|
|
25
|
+
onTurnEnd?: (turnCount: number) => void;
|
|
26
|
+
}
|
|
27
|
+
export declare class AgentManager {
|
|
28
|
+
private agents;
|
|
29
|
+
private cleanupInterval;
|
|
30
|
+
private onComplete?;
|
|
31
|
+
private onStart?;
|
|
32
|
+
private maxConcurrent;
|
|
33
|
+
/** Per-file transparent locking for write agents. */
|
|
34
|
+
readonly fileLock: FileLock;
|
|
35
|
+
/** Queue of background agents waiting to start. */
|
|
36
|
+
private queue;
|
|
37
|
+
/** Number of currently running background agents. */
|
|
38
|
+
private runningBackground;
|
|
39
|
+
constructor(onComplete?: OnAgentComplete, maxConcurrent?: number, onStart?: OnAgentStart);
|
|
40
|
+
setMaxConcurrent(n: number): void;
|
|
41
|
+
getMaxConcurrent(): number;
|
|
42
|
+
/**
|
|
43
|
+
* Spawn an agent. Returns ID immediately for background, waits for foreground.
|
|
44
|
+
*/
|
|
45
|
+
spawn(pi: ExtensionAPI, ctx: ExtensionContext, type: AgentType, prompt: string, options: SpawnOptions): string;
|
|
46
|
+
/** Actually start an agent. */
|
|
47
|
+
private startAgent;
|
|
48
|
+
/** Start queued agents up to concurrency limit. */
|
|
49
|
+
private drainQueue;
|
|
50
|
+
/**
|
|
51
|
+
* Spawn and wait (foreground).
|
|
52
|
+
*/
|
|
53
|
+
spawnAndWait(pi: ExtensionAPI, ctx: ExtensionContext, type: AgentType, prompt: string, options: Omit<SpawnOptions, "isBackground">): Promise<AgentRecord>;
|
|
54
|
+
getRecord(id: string): AgentRecord | undefined;
|
|
55
|
+
listAgents(): AgentRecord[];
|
|
56
|
+
abort(id: string): boolean;
|
|
57
|
+
/** Abort all agents (for ESC propagation). */
|
|
58
|
+
abortAll(): number;
|
|
59
|
+
/** Wait for all agents. */
|
|
60
|
+
waitForAll(): Promise<void>;
|
|
61
|
+
/** Whether any agents running or queued. */
|
|
62
|
+
hasRunning(): boolean;
|
|
63
|
+
/** Remove completed records. */
|
|
64
|
+
clearCompleted(): void;
|
|
65
|
+
private cleanup;
|
|
66
|
+
dispose(): void;
|
|
67
|
+
}
|
|
68
|
+
export {};
|
|
69
|
+
//# 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":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;AAazD,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,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,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,UAAU,CAAC,CAAkB;IACrC,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,aAAa,CAAS;IAE9B,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,WAAkB;IAEnC,mDAAmD;IACnD,OAAO,CAAC,KAAK,CAAyC;IACtD,qDAAqD;IACrD,OAAO,CAAC,iBAAiB,CAAK;gBAElB,UAAU,CAAC,EAAE,eAAe,EAAE,aAAa,SAAyB,EAAE,OAAO,CAAC,EAAE,YAAY;IAOxG,gBAAgB,CAAC,CAAC,EAAE,MAAM;IAK1B,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,KAAK,CACH,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,MAAM;IA0BT,+BAA+B;IAC/B,OAAO,CAAC,UAAU;IAkElB,mDAAmD;IACnD,OAAO,CAAC,UAAU;IASlB;;OAEG;IACG,YAAY,CAChB,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,GAC1C,OAAO,CAAC,WAAW,CAAC;IAOvB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI9C,UAAU,IAAI,WAAW,EAAE;IAI3B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAoB1B,8CAA8C;IAC9C,QAAQ,IAAI,MAAM;IAuBlB,2BAA2B;IACrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,4CAA4C;IAC5C,UAAU,IAAI,OAAO;IAIrB,gCAAgC;IAChC,cAAc,IAAI,IAAI;IAStB,OAAO,CAAC,OAAO;IAWf,OAAO;CASR"}
|
|
@@ -0,0 +1,240 @@
|
|
|
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 { FileLock } from "./file-lock.js";
|
|
10
|
+
/** Default max concurrent background agents. */
|
|
11
|
+
const DEFAULT_MAX_CONCURRENT = 4;
|
|
12
|
+
export class AgentManager {
|
|
13
|
+
agents = new Map();
|
|
14
|
+
cleanupInterval;
|
|
15
|
+
onComplete;
|
|
16
|
+
onStart;
|
|
17
|
+
maxConcurrent;
|
|
18
|
+
/** Per-file transparent locking for write agents. */
|
|
19
|
+
fileLock = new FileLock();
|
|
20
|
+
/** Queue of background agents waiting to start. */
|
|
21
|
+
queue = [];
|
|
22
|
+
/** Number of currently running background agents. */
|
|
23
|
+
runningBackground = 0;
|
|
24
|
+
constructor(onComplete, maxConcurrent = DEFAULT_MAX_CONCURRENT, onStart) {
|
|
25
|
+
this.onComplete = onComplete;
|
|
26
|
+
this.onStart = onStart;
|
|
27
|
+
this.maxConcurrent = maxConcurrent;
|
|
28
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60_000);
|
|
29
|
+
}
|
|
30
|
+
setMaxConcurrent(n) {
|
|
31
|
+
this.maxConcurrent = Math.max(1, n);
|
|
32
|
+
this.drainQueue();
|
|
33
|
+
}
|
|
34
|
+
getMaxConcurrent() {
|
|
35
|
+
return this.maxConcurrent;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Spawn an agent. Returns ID immediately for background, waits for foreground.
|
|
39
|
+
*/
|
|
40
|
+
spawn(pi, ctx, type, prompt, options) {
|
|
41
|
+
const id = randomUUID().slice(0, 17);
|
|
42
|
+
const abortController = new AbortController();
|
|
43
|
+
const record = {
|
|
44
|
+
id,
|
|
45
|
+
type,
|
|
46
|
+
description: options.description,
|
|
47
|
+
status: options.isBackground ? "queued" : "running",
|
|
48
|
+
toolUses: 0,
|
|
49
|
+
startedAt: Date.now(),
|
|
50
|
+
abortController,
|
|
51
|
+
lockedFiles: new Set(),
|
|
52
|
+
};
|
|
53
|
+
this.agents.set(id, record);
|
|
54
|
+
const args = { pi, ctx, type, prompt, options };
|
|
55
|
+
if (options.isBackground && this.runningBackground >= this.maxConcurrent) {
|
|
56
|
+
this.queue.push({ id, args });
|
|
57
|
+
return id;
|
|
58
|
+
}
|
|
59
|
+
this.startAgent(id, record, args);
|
|
60
|
+
return id;
|
|
61
|
+
}
|
|
62
|
+
/** Actually start an agent. */
|
|
63
|
+
startAgent(id, record, { pi, ctx, type, prompt, options }) {
|
|
64
|
+
record.status = "running";
|
|
65
|
+
record.startedAt = Date.now();
|
|
66
|
+
if (options.isBackground)
|
|
67
|
+
this.runningBackground++;
|
|
68
|
+
this.onStart?.(record);
|
|
69
|
+
const promise = runAgent(ctx, type, prompt, {
|
|
70
|
+
pi,
|
|
71
|
+
model: options.model,
|
|
72
|
+
maxTurns: options.maxTurns,
|
|
73
|
+
isolated: options.isolated,
|
|
74
|
+
inheritContext: options.inheritContext,
|
|
75
|
+
thinkingLevel: options.thinkingLevel,
|
|
76
|
+
signal: record.abortController.signal,
|
|
77
|
+
onToolActivity: (activity) => {
|
|
78
|
+
if (activity.type === "end")
|
|
79
|
+
record.toolUses++;
|
|
80
|
+
options.onToolActivity?.(activity);
|
|
81
|
+
},
|
|
82
|
+
onTurnEnd: options.onTurnEnd,
|
|
83
|
+
onTextDelta: options.onTextDelta,
|
|
84
|
+
onSessionCreated: (session) => {
|
|
85
|
+
record.session = session;
|
|
86
|
+
options.onSessionCreated?.(session);
|
|
87
|
+
},
|
|
88
|
+
})
|
|
89
|
+
.then(({ responseText, session, aborted, steered }) => {
|
|
90
|
+
if (record.status !== "stopped") {
|
|
91
|
+
record.status = aborted ? "aborted" : steered ? "completed" : "completed";
|
|
92
|
+
}
|
|
93
|
+
record.result = responseText;
|
|
94
|
+
record.session = session;
|
|
95
|
+
record.completedAt ??= Date.now();
|
|
96
|
+
// Release any held file locks
|
|
97
|
+
this.fileLock.releaseAll(id);
|
|
98
|
+
record.lockedFiles.clear();
|
|
99
|
+
if (options.isBackground) {
|
|
100
|
+
this.runningBackground--;
|
|
101
|
+
this.onComplete?.(record);
|
|
102
|
+
this.drainQueue();
|
|
103
|
+
}
|
|
104
|
+
return responseText;
|
|
105
|
+
})
|
|
106
|
+
.catch((err) => {
|
|
107
|
+
if (record.status !== "stopped") {
|
|
108
|
+
record.status = "error";
|
|
109
|
+
}
|
|
110
|
+
record.error = err instanceof Error ? err.message : String(err);
|
|
111
|
+
record.completedAt ??= Date.now();
|
|
112
|
+
// Release any held file locks
|
|
113
|
+
this.fileLock.releaseAll(id);
|
|
114
|
+
record.lockedFiles.clear();
|
|
115
|
+
if (options.isBackground) {
|
|
116
|
+
this.runningBackground--;
|
|
117
|
+
this.onComplete?.(record);
|
|
118
|
+
this.drainQueue();
|
|
119
|
+
}
|
|
120
|
+
return "";
|
|
121
|
+
});
|
|
122
|
+
record.promise = promise;
|
|
123
|
+
}
|
|
124
|
+
/** Start queued agents up to concurrency limit. */
|
|
125
|
+
drainQueue() {
|
|
126
|
+
while (this.queue.length > 0 && this.runningBackground < this.maxConcurrent) {
|
|
127
|
+
const next = this.queue.shift();
|
|
128
|
+
const record = this.agents.get(next.id);
|
|
129
|
+
if (!record || record.status !== "queued")
|
|
130
|
+
continue;
|
|
131
|
+
this.startAgent(next.id, record, next.args);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Spawn and wait (foreground).
|
|
136
|
+
*/
|
|
137
|
+
async spawnAndWait(pi, ctx, type, prompt, options) {
|
|
138
|
+
const id = this.spawn(pi, ctx, type, prompt, { ...options, isBackground: false });
|
|
139
|
+
const record = this.agents.get(id);
|
|
140
|
+
await record.promise;
|
|
141
|
+
return record;
|
|
142
|
+
}
|
|
143
|
+
getRecord(id) {
|
|
144
|
+
return this.agents.get(id);
|
|
145
|
+
}
|
|
146
|
+
listAgents() {
|
|
147
|
+
return [...this.agents.values()].sort((a, b) => b.startedAt - a.startedAt);
|
|
148
|
+
}
|
|
149
|
+
abort(id) {
|
|
150
|
+
const record = this.agents.get(id);
|
|
151
|
+
if (!record)
|
|
152
|
+
return false;
|
|
153
|
+
if (record.status === "queued") {
|
|
154
|
+
this.queue = this.queue.filter((q) => q.id !== id);
|
|
155
|
+
record.status = "stopped";
|
|
156
|
+
record.completedAt = Date.now();
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
if (record.status !== "running")
|
|
160
|
+
return false;
|
|
161
|
+
record.abortController?.abort();
|
|
162
|
+
record.status = "stopped";
|
|
163
|
+
record.completedAt = Date.now();
|
|
164
|
+
this.fileLock.releaseAll(id);
|
|
165
|
+
record.lockedFiles.clear();
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
/** Abort all agents (for ESC propagation). */
|
|
169
|
+
abortAll() {
|
|
170
|
+
let count = 0;
|
|
171
|
+
for (const queued of this.queue) {
|
|
172
|
+
const record = this.agents.get(queued.id);
|
|
173
|
+
if (record) {
|
|
174
|
+
record.status = "stopped";
|
|
175
|
+
record.completedAt = Date.now();
|
|
176
|
+
count++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
this.queue = [];
|
|
180
|
+
for (const record of this.agents.values()) {
|
|
181
|
+
if (record.status === "running") {
|
|
182
|
+
record.abortController?.abort();
|
|
183
|
+
record.status = "stopped";
|
|
184
|
+
record.completedAt = Date.now();
|
|
185
|
+
count++;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
this.fileLock.clear();
|
|
189
|
+
return count;
|
|
190
|
+
}
|
|
191
|
+
/** Wait for all agents. */
|
|
192
|
+
async waitForAll() {
|
|
193
|
+
while (true) {
|
|
194
|
+
this.drainQueue();
|
|
195
|
+
const pending = [...this.agents.values()]
|
|
196
|
+
.filter((r) => r.status === "running" || r.status === "queued")
|
|
197
|
+
.map((r) => r.promise)
|
|
198
|
+
.filter(Boolean);
|
|
199
|
+
if (pending.length === 0)
|
|
200
|
+
break;
|
|
201
|
+
await Promise.allSettled(pending);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Whether any agents running or queued. */
|
|
205
|
+
hasRunning() {
|
|
206
|
+
return [...this.agents.values()].some((r) => r.status === "running" || r.status === "queued");
|
|
207
|
+
}
|
|
208
|
+
/** Remove completed records. */
|
|
209
|
+
clearCompleted() {
|
|
210
|
+
for (const [id, record] of this.agents) {
|
|
211
|
+
if (record.status === "running" || record.status === "queued")
|
|
212
|
+
continue;
|
|
213
|
+
record.session?.dispose?.();
|
|
214
|
+
record.session = undefined;
|
|
215
|
+
this.agents.delete(id);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
cleanup() {
|
|
219
|
+
const cutoff = Date.now() - 10 * 60_000;
|
|
220
|
+
for (const [id, record] of this.agents) {
|
|
221
|
+
if (record.status === "running" || record.status === "queued")
|
|
222
|
+
continue;
|
|
223
|
+
if ((record.completedAt ?? 0) >= cutoff)
|
|
224
|
+
continue;
|
|
225
|
+
record.session?.dispose?.();
|
|
226
|
+
record.session = undefined;
|
|
227
|
+
this.agents.delete(id);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
dispose() {
|
|
231
|
+
clearInterval(this.cleanupInterval);
|
|
232
|
+
this.queue = [];
|
|
233
|
+
this.abortAll();
|
|
234
|
+
for (const record of this.agents.values()) {
|
|
235
|
+
record.session?.dispose();
|
|
236
|
+
}
|
|
237
|
+
this.agents.clear();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=agent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../src/agent-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,QAAQ,EAAqB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK1C,gDAAgD;AAChD,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAwBjC,MAAM,OAAO,YAAY;IACf,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IACxC,eAAe,CAAiC;IAChD,UAAU,CAAmB;IAC7B,OAAO,CAAgB;IACvB,aAAa,CAAS;IAE9B,qDAAqD;IAC5C,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEnC,mDAAmD;IAC3C,KAAK,GAAsC,EAAE,CAAC;IACtD,qDAAqD;IAC7C,iBAAiB,GAAG,CAAC,CAAC;IAE9B,YAAY,UAA4B,EAAE,aAAa,GAAG,sBAAsB,EAAE,OAAsB;QACtG,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IAED,gBAAgB,CAAC,CAAS;QACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CACH,EAAgB,EAChB,GAAqB,EACrB,IAAe,EACf,MAAc,EACd,OAAqB;QAErB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAgB;YAC1B,EAAE;YACF,IAAI;YACJ,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACnD,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,eAAe;YACf,WAAW,EAAE,IAAI,GAAG,EAAE;SACvB,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE5B,MAAM,IAAI,GAAc,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAE3D,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACzE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,+BAA+B;IACvB,UAAU,CAAC,EAAU,EAAE,MAAmB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAa;QAC/F,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,YAAY;YAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;YAC1C,EAAE;YACF,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,MAAM,CAAC,eAAgB,CAAC,MAAM;YACtC,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC3B,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;oBAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC/C,OAAO,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YACD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC5B,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;gBACzB,OAAO,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;SACF,CAAC;aACC,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;YACpD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;YAC5E,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;YAC7B,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YACzB,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YAElC,8BAA8B;YAC9B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAE3B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;gBAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;YAC1B,CAAC;YACD,MAAM,CAAC,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YAElC,8BAA8B;YAC9B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAE3B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;gBAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEL,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,mDAAmD;IAC3C,UAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,EAAgB,EAChB,GAAqB,EACrB,IAAe,EACf,MAAc,EACd,OAA2C;QAE3C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QACpC,MAAM,MAAM,CAAC,OAAO,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,EAAU;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;YAC1B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC9C,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8CAA8C;IAC9C,QAAQ;QACN,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;iBACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;iBAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;iBACrB,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAChC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IAChG,CAAC;IAED,gCAAgC;IAChC,cAAc;QACZ,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACxE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,OAAO;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QACxC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACxE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,MAAM;gBAAE,SAAS;YAClD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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 "@mariozechner/pi-ai";
|
|
8
|
+
import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
|
|
9
|
+
import { type AgentSession, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
10
|
+
import type { AgentType, 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
|
+
maxTurns?: number;
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
isolated?: boolean;
|
|
27
|
+
inheritContext?: boolean;
|
|
28
|
+
thinkingLevel?: ThinkingLevel;
|
|
29
|
+
cwd?: string;
|
|
30
|
+
onToolActivity?: (activity: ToolActivity) => void;
|
|
31
|
+
onTextDelta?: (delta: string, fullText: string) => void;
|
|
32
|
+
onSessionCreated?: (session: AgentSession) => void;
|
|
33
|
+
onTurnEnd?: (turnCount: number) => void;
|
|
34
|
+
}
|
|
35
|
+
/** Result from running an agent. */
|
|
36
|
+
export interface RunResult {
|
|
37
|
+
responseText: string;
|
|
38
|
+
session: AgentSession;
|
|
39
|
+
aborted: boolean;
|
|
40
|
+
steered: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run an agent session.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runAgent(ctx: ExtensionContext, type: AgentType, prompt: string, options: RunOptions): Promise<RunResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Get conversation text from a session.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getAgentConversation(session: AgentSession): string;
|
|
50
|
+
//# 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,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,KAAK,YAAY,EAIjB,KAAK,YAAY,EAIlB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAe,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAWxE,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,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;AAwDD;;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,CAwHpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAuClE"}
|
|
@@ -0,0 +1,238 @@
|
|
|
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 { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent";
|
|
8
|
+
/** Tools excluded from subagents to prevent nesting. */
|
|
9
|
+
const EXCLUDED_TOOL_NAMES = ["Agent", "get_result"];
|
|
10
|
+
/** All known built-in tool names. */
|
|
11
|
+
const BUILTIN_TOOL_NAMES = ["read", "bash", "edit", "write", "grep", "find", "ls"];
|
|
12
|
+
/** Default max turns. undefined = unlimited. */
|
|
13
|
+
let defaultMaxTurns;
|
|
14
|
+
export function getDefaultMaxTurns() {
|
|
15
|
+
return defaultMaxTurns;
|
|
16
|
+
}
|
|
17
|
+
export function setDefaultMaxTurns(n) {
|
|
18
|
+
defaultMaxTurns = n == null || n === 0 ? undefined : Math.max(1, n);
|
|
19
|
+
}
|
|
20
|
+
/** Grace turns after soft limit. */
|
|
21
|
+
let graceTurns = 5;
|
|
22
|
+
export function getGraceTurns() {
|
|
23
|
+
return graceTurns;
|
|
24
|
+
}
|
|
25
|
+
export function setGraceTurns(n) {
|
|
26
|
+
graceTurns = Math.max(1, n);
|
|
27
|
+
}
|
|
28
|
+
/** Collect last assistant message text. */
|
|
29
|
+
function collectResponseText(session) {
|
|
30
|
+
let text = "";
|
|
31
|
+
const unsubscribe = session.subscribe((event) => {
|
|
32
|
+
if (event.type === "message_start") {
|
|
33
|
+
text = "";
|
|
34
|
+
}
|
|
35
|
+
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
|
36
|
+
text += event.assistantMessageEvent.delta;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return { getText: () => text, unsubscribe };
|
|
40
|
+
}
|
|
41
|
+
/** Get last assistant text from session history. */
|
|
42
|
+
function getLastAssistantText(session) {
|
|
43
|
+
for (let i = session.messages.length - 1; i >= 0; i--) {
|
|
44
|
+
const msg = session.messages[i];
|
|
45
|
+
if (msg.role !== "assistant")
|
|
46
|
+
continue;
|
|
47
|
+
const text = msg.content
|
|
48
|
+
.filter((c) => c.type === "text")
|
|
49
|
+
.map((c) => c.text)
|
|
50
|
+
.join("")
|
|
51
|
+
.trim();
|
|
52
|
+
if (text)
|
|
53
|
+
return text;
|
|
54
|
+
}
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
/** Wire abort signal to session. */
|
|
58
|
+
function forwardAbortSignal(session, signal) {
|
|
59
|
+
if (!signal)
|
|
60
|
+
return () => { };
|
|
61
|
+
const onAbort = () => session.abort();
|
|
62
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
63
|
+
return () => signal.removeEventListener("abort", onAbort);
|
|
64
|
+
}
|
|
65
|
+
/** Get tool names for agent type. */
|
|
66
|
+
function getToolNamesForType(type, config) {
|
|
67
|
+
if (config?.builtinToolNames?.length) {
|
|
68
|
+
return [...config.builtinToolNames];
|
|
69
|
+
}
|
|
70
|
+
return [...BUILTIN_TOOL_NAMES];
|
|
71
|
+
}
|
|
72
|
+
/** Resolve model from config. */
|
|
73
|
+
function resolveDefaultModel(parentModel, configModel) {
|
|
74
|
+
// For now, just use parent model. Full model resolution requires registry.
|
|
75
|
+
return parentModel;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Run an agent session.
|
|
79
|
+
*/
|
|
80
|
+
export async function runAgent(ctx, type, prompt, options) {
|
|
81
|
+
const effectiveCwd = options.cwd ?? ctx.cwd;
|
|
82
|
+
// Build system prompt
|
|
83
|
+
const agentConfig = options; // Will be properly typed later
|
|
84
|
+
const parentSystemPrompt = ctx.getSystemPrompt();
|
|
85
|
+
let systemPrompt;
|
|
86
|
+
if (options.isolated) {
|
|
87
|
+
systemPrompt = `You are a ${type} agent. Follow the task instructions precisely. Do not ask questions.`;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
systemPrompt = parentSystemPrompt + `\n\nYou are a ${type} agent. Follow the task instructions precisely.`;
|
|
91
|
+
}
|
|
92
|
+
// Get tool names
|
|
93
|
+
let toolNames = getToolNamesForType(type);
|
|
94
|
+
// Create resource loader
|
|
95
|
+
const agentDir = getAgentDir();
|
|
96
|
+
const loader = new DefaultResourceLoader({
|
|
97
|
+
cwd: effectiveCwd,
|
|
98
|
+
agentDir,
|
|
99
|
+
noExtensions: options.isolated,
|
|
100
|
+
noSkills: options.isolated,
|
|
101
|
+
noPromptTemplates: true,
|
|
102
|
+
noThemes: true,
|
|
103
|
+
noContextFiles: true,
|
|
104
|
+
systemPromptOverride: () => systemPrompt,
|
|
105
|
+
appendSystemPromptOverride: () => [],
|
|
106
|
+
});
|
|
107
|
+
await loader.reload();
|
|
108
|
+
// Resolve model
|
|
109
|
+
const model = options.model ?? resolveDefaultModel(ctx.model);
|
|
110
|
+
// Create session
|
|
111
|
+
const sessionOpts = {
|
|
112
|
+
cwd: effectiveCwd,
|
|
113
|
+
agentDir,
|
|
114
|
+
sessionManager: SessionManager.inMemory(effectiveCwd),
|
|
115
|
+
settingsManager: SettingsManager.create(effectiveCwd, agentDir),
|
|
116
|
+
modelRegistry: ctx.modelRegistry,
|
|
117
|
+
model,
|
|
118
|
+
tools: toolNames,
|
|
119
|
+
resourceLoader: loader,
|
|
120
|
+
};
|
|
121
|
+
if (options.thinkingLevel) {
|
|
122
|
+
sessionOpts.thinkingLevel = options.thinkingLevel;
|
|
123
|
+
}
|
|
124
|
+
const { session } = await createAgentSession(sessionOpts);
|
|
125
|
+
// Filter out our tools to prevent nesting
|
|
126
|
+
const activeTools = session.getActiveToolNames().filter((t) => {
|
|
127
|
+
if (EXCLUDED_TOOL_NAMES.includes(t))
|
|
128
|
+
return false;
|
|
129
|
+
return true;
|
|
130
|
+
});
|
|
131
|
+
session.setActiveToolsByName(activeTools);
|
|
132
|
+
// Bind extensions
|
|
133
|
+
await session.bindExtensions({
|
|
134
|
+
onError: (err) => {
|
|
135
|
+
options.onToolActivity?.({
|
|
136
|
+
type: "end",
|
|
137
|
+
toolName: `extension-error:${err.extensionPath}`,
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
options.onSessionCreated?.(session);
|
|
142
|
+
// Track turns
|
|
143
|
+
let turnCount = 0;
|
|
144
|
+
const maxTurns = options.maxTurns ?? defaultMaxTurns;
|
|
145
|
+
let softLimitReached = false;
|
|
146
|
+
let aborted = false;
|
|
147
|
+
let currentMessageText = "";
|
|
148
|
+
const unsubTurns = session.subscribe((event) => {
|
|
149
|
+
if (event.type === "turn_end") {
|
|
150
|
+
turnCount++;
|
|
151
|
+
options.onTurnEnd?.(turnCount);
|
|
152
|
+
if (maxTurns != null) {
|
|
153
|
+
if (!softLimitReached && turnCount >= maxTurns) {
|
|
154
|
+
softLimitReached = true;
|
|
155
|
+
session.steer("You have reached your turn limit. Wrap up immediately — provide your final answer now.");
|
|
156
|
+
}
|
|
157
|
+
else if (softLimitReached && turnCount >= maxTurns + graceTurns) {
|
|
158
|
+
aborted = true;
|
|
159
|
+
session.abort();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (event.type === "message_start") {
|
|
164
|
+
currentMessageText = "";
|
|
165
|
+
}
|
|
166
|
+
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
|
167
|
+
currentMessageText += event.assistantMessageEvent.delta;
|
|
168
|
+
options.onTextDelta?.(event.assistantMessageEvent.delta, currentMessageText);
|
|
169
|
+
}
|
|
170
|
+
if (event.type === "tool_execution_start") {
|
|
171
|
+
options.onToolActivity?.({ type: "start", toolName: event.toolName });
|
|
172
|
+
}
|
|
173
|
+
if (event.type === "tool_execution_end") {
|
|
174
|
+
options.onToolActivity?.({ type: "end", toolName: event.toolName });
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
const collector = collectResponseText(session);
|
|
178
|
+
const cleanupAbort = forwardAbortSignal(session, options.signal);
|
|
179
|
+
try {
|
|
180
|
+
await session.prompt(prompt);
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
unsubTurns();
|
|
184
|
+
collector.unsubscribe();
|
|
185
|
+
cleanupAbort();
|
|
186
|
+
}
|
|
187
|
+
const responseText = collector.getText().trim() || getLastAssistantText(session);
|
|
188
|
+
return { responseText, session, aborted, steered: softLimitReached };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get conversation text from a session.
|
|
192
|
+
*/
|
|
193
|
+
export function getAgentConversation(session) {
|
|
194
|
+
const parts = [];
|
|
195
|
+
for (const msg of session.messages) {
|
|
196
|
+
if (msg.role === "user") {
|
|
197
|
+
const content = msg.content;
|
|
198
|
+
const text = typeof content === "string"
|
|
199
|
+
? content
|
|
200
|
+
: content
|
|
201
|
+
.filter((c) => c.type === "text")
|
|
202
|
+
.map((c) => c.text)
|
|
203
|
+
.join("");
|
|
204
|
+
if (text.trim())
|
|
205
|
+
parts.push(`[User]: ${text.trim()}`);
|
|
206
|
+
}
|
|
207
|
+
else if (msg.role === "assistant") {
|
|
208
|
+
const textParts = [];
|
|
209
|
+
const toolCalls = [];
|
|
210
|
+
const content = msg.content;
|
|
211
|
+
if (typeof content !== "string") {
|
|
212
|
+
for (const c of content) {
|
|
213
|
+
if (c.type === "text" && c.text)
|
|
214
|
+
textParts.push(c.text);
|
|
215
|
+
else if (c.type === "toolCall")
|
|
216
|
+
toolCalls.push(` Tool: ${c.name ?? "unknown"}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (textParts.length > 0)
|
|
220
|
+
parts.push(`[Assistant]: ${textParts.join("\n")}`);
|
|
221
|
+
if (toolCalls.length > 0)
|
|
222
|
+
parts.push(`[Tool Calls]:\n${toolCalls.join("\n")}`);
|
|
223
|
+
}
|
|
224
|
+
else if (msg.role === "toolResult") {
|
|
225
|
+
const content = msg.content;
|
|
226
|
+
const text = typeof content === "string"
|
|
227
|
+
? content
|
|
228
|
+
: content
|
|
229
|
+
.filter((c) => c.type === "text")
|
|
230
|
+
.map((c) => c.text)
|
|
231
|
+
.join("");
|
|
232
|
+
const truncated = text.length > 200 ? text.slice(0, 200) + "..." : text;
|
|
233
|
+
parts.push(`[Tool Result (${msg.toolName})]: ${truncated}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return parts.join("\n\n");
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=agent-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../src/agent-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pi-unipi/subagents — Config management
|
|
3
|
+
*
|
|
4
|
+
* Loads config from ~/.unipc/config/subagents.json (global)
|
|
5
|
+
* and <workspace>/.unipi/config/subagents.json (override).
|
|
6
|
+
* Auto-generates on first run. Repairs corrupted files.
|
|
7
|
+
*/
|
|
8
|
+
import type { SubagentsConfig } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Initialize config on extension start.
|
|
11
|
+
* - If missing: generate with defaults
|
|
12
|
+
* - If corrupted: rename to .bak, generate fresh
|
|
13
|
+
* - If valid: load
|
|
14
|
+
*/
|
|
15
|
+
export declare function initConfig(cwd: string): SubagentsConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Save global config.
|
|
18
|
+
*/
|
|
19
|
+
export declare function saveGlobalConfig(config: SubagentsConfig): void;
|
|
20
|
+
/**
|
|
21
|
+
* Save workspace config.
|
|
22
|
+
*/
|
|
23
|
+
export declare function saveWorkspaceConfig(cwd: string, config: SubagentsConfig): void;
|
|
24
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+DlD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CA6BvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAI9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAI9E"}
|