@astralyn/pi 0.82.6 → 0.82.7
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/CHANGELOG.md +27 -0
- package/README.md +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +11 -13
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/core/extensions/types.d.ts +4 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -5
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -41
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +42 -11
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +6 -7
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +17 -8
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +3 -3
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -4
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +7 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +11 -0
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -3
- package/dist/core/tools/write.js.map +1 -1
- package/dist/extensions/deepwiki/render.d.ts.map +1 -1
- package/dist/extensions/deepwiki/render.js +34 -22
- package/dist/extensions/deepwiki/render.js.map +1 -1
- package/dist/extensions/plan/constants.d.ts +32 -4
- package/dist/extensions/plan/constants.d.ts.map +1 -1
- package/dist/extensions/plan/constants.js +37 -6
- package/dist/extensions/plan/constants.js.map +1 -1
- package/dist/extensions/plan/index.d.ts +27 -0
- package/dist/extensions/plan/index.d.ts.map +1 -1
- package/dist/extensions/plan/index.js +150 -44
- package/dist/extensions/plan/index.js.map +1 -1
- package/dist/extensions/plan/schema.d.ts +5 -0
- package/dist/extensions/plan/schema.d.ts.map +1 -1
- package/dist/extensions/plan/schema.js.map +1 -1
- package/dist/extensions/plan/state.d.ts +11 -2
- package/dist/extensions/plan/state.d.ts.map +1 -1
- package/dist/extensions/plan/state.js +31 -9
- package/dist/extensions/plan/state.js.map +1 -1
- package/dist/extensions/plan/storage.d.ts +11 -3
- package/dist/extensions/plan/storage.d.ts.map +1 -1
- package/dist/extensions/plan/storage.js +45 -20
- package/dist/extensions/plan/storage.js.map +1 -1
- package/dist/extensions/plan/view.d.ts +15 -7
- package/dist/extensions/plan/view.d.ts.map +1 -1
- package/dist/extensions/plan/view.js +91 -16
- package/dist/extensions/plan/view.js.map +1 -1
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +29 -10
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js +7 -2
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/render.d.ts +4 -8
- package/dist/extensions/question/render.d.ts.map +1 -1
- package/dist/extensions/question/render.js +202 -29
- package/dist/extensions/question/render.js.map +1 -1
- package/dist/extensions/question/results.d.ts.map +1 -1
- package/dist/extensions/question/results.js +1 -0
- package/dist/extensions/question/results.js.map +1 -1
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js +2 -2
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/question/types.d.ts +1 -0
- package/dist/extensions/question/types.d.ts.map +1 -1
- package/dist/extensions/question/types.js +1 -1
- package/dist/extensions/question/types.js.map +1 -1
- package/dist/extensions/router/stream.d.ts +1 -0
- package/dist/extensions/router/stream.d.ts.map +1 -1
- package/dist/extensions/router/stream.js +44 -13
- package/dist/extensions/router/stream.js.map +1 -1
- package/dist/extensions/subagent/constants.d.ts +1 -0
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/constants.js +1 -0
- package/dist/extensions/subagent/constants.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +2 -0
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +121 -48
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/retry.d.ts +17 -0
- package/dist/extensions/subagent/retry.d.ts.map +1 -0
- package/dist/extensions/subagent/retry.js +41 -0
- package/dist/extensions/subagent/retry.js.map +1 -0
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +33 -5
- package/dist/extensions/subagent/runner.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts +6 -0
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +46 -24
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/types.d.ts +7 -0
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/todo/index.d.ts.map +1 -1
- package/dist/extensions/todo/index.js +1 -1
- package/dist/extensions/todo/index.js.map +1 -1
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js +10 -2
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts +1 -1
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +179 -34
- package/dist/extensions/todo/view.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +2 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +5 -0
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -2
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +13 -6
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +54 -17
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +10 -6
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +11 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +56 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +3 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +52 -2
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +133 -18
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts +1 -0
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +5 -0
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +10 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +55 -2
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +72 -18
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +3 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/utils/paths.d.ts +6 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +8 -0
- package/dist/utils/paths.js.map +1 -1
- package/docs/bundled/README.md +1 -0
- package/docs/bundled/extensions/deepwiki.md +1 -1
- package/docs/bundled/extensions/plan.md +10 -9
- package/docs/bundled/extensions/question.md +7 -5
- package/docs/bundled/extensions/router.md +3 -4
- package/docs/bundled/extensions/statusline.md +0 -1
- package/docs/bundled/extensions/subagent.md +4 -3
- package/docs/bundled/extensions/todo.md +1 -1
- package/docs/bundled/tool-presentation.md +17 -16
- package/docs/extensions.md +20 -5
- package/docs/rpc.md +1 -1
- package/docs/usage.md +1 -1
- package/npm-shrinkwrap.json +6 -6
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@ import { SessionManager } from "../../core/session-manager.js";
|
|
|
4
4
|
import { SettingsManager } from "../../core/settings-manager.js";
|
|
5
5
|
import { activitySummary, addUsage, appendActivity, assistantText, boundText, finalAssistantText, resultSummary, setLiveText, } from "./activity.js";
|
|
6
6
|
import { ERROR_TEXT_LIMIT, LIVE_TEXT_LIMIT, SINGLE_OUTPUT_LIMIT } from "./constants.js";
|
|
7
|
+
import { beginSubagentRetry, clearSubagentRetry } from "./retry.js";
|
|
7
8
|
function workerSystemPrompt(base, task) {
|
|
8
9
|
return [
|
|
9
10
|
base,
|
|
@@ -53,6 +54,18 @@ function createThrottledEmitter(onProgress) {
|
|
|
53
54
|
},
|
|
54
55
|
};
|
|
55
56
|
}
|
|
57
|
+
export function applySubagentAutoRetryEvent(run, event) {
|
|
58
|
+
if (event.type === "auto_retry_start") {
|
|
59
|
+
beginSubagentRetry(run, {
|
|
60
|
+
attempt: event.attempt,
|
|
61
|
+
maxAttempts: event.maxAttempts,
|
|
62
|
+
delayMs: event.delayMs,
|
|
63
|
+
error: event.errorMessage,
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
clearSubagentRetry(run);
|
|
68
|
+
}
|
|
56
69
|
export async function runSdkTask(options) {
|
|
57
70
|
const { task, run, modelRuntime, agentDir, projectTrusted, signal, onProgress } = options;
|
|
58
71
|
const throttled = createThrottledEmitter(onProgress);
|
|
@@ -62,16 +75,27 @@ export async function runSdkTask(options) {
|
|
|
62
75
|
const activeActivities = new Map();
|
|
63
76
|
const seenAssistantMessages = new Set();
|
|
64
77
|
const markAbort = async () => {
|
|
78
|
+
clearSubagentRetry(run);
|
|
65
79
|
run.status = "aborted";
|
|
80
|
+
run.error ??= "Subagent was aborted.";
|
|
66
81
|
if (session)
|
|
67
82
|
await session.abort();
|
|
68
83
|
};
|
|
84
|
+
const isAborted = () => signal?.aborted === true || run.status === "aborted";
|
|
85
|
+
const abortListener = () => {
|
|
86
|
+
void markAbort().catch(() => undefined);
|
|
87
|
+
};
|
|
88
|
+
unregisterAbort = options.registerAbort?.(markAbort);
|
|
89
|
+
if (signal)
|
|
90
|
+
signal.addEventListener("abort", abortListener, { once: true });
|
|
69
91
|
try {
|
|
70
|
-
if (
|
|
92
|
+
if (isAborted()) {
|
|
93
|
+
clearSubagentRetry(run);
|
|
71
94
|
run.status = "aborted";
|
|
72
95
|
run.error = "Subagent was aborted before it started.";
|
|
73
96
|
return run;
|
|
74
97
|
}
|
|
98
|
+
clearSubagentRetry(run);
|
|
75
99
|
run.status = "running";
|
|
76
100
|
run.startedAt = Date.now();
|
|
77
101
|
onProgress?.();
|
|
@@ -90,6 +114,10 @@ export async function runSdkTask(options) {
|
|
|
90
114
|
systemPromptOverride: (base) => workerSystemPrompt(base, task),
|
|
91
115
|
});
|
|
92
116
|
await resourceLoader.reload();
|
|
117
|
+
if (isAborted()) {
|
|
118
|
+
run.error ??= "Subagent was aborted during initialization.";
|
|
119
|
+
return run;
|
|
120
|
+
}
|
|
93
121
|
const created = await createAgentSession({
|
|
94
122
|
cwd: task.cwd,
|
|
95
123
|
agentDir,
|
|
@@ -102,29 +130,28 @@ export async function runSdkTask(options) {
|
|
|
102
130
|
settingsManager,
|
|
103
131
|
});
|
|
104
132
|
session = created.session;
|
|
133
|
+
if (isAborted()) {
|
|
134
|
+
run.error ??= "Subagent was aborted during initialization.";
|
|
135
|
+
await session.abort();
|
|
136
|
+
return run;
|
|
137
|
+
}
|
|
105
138
|
const emitImmediate = () => onProgress?.();
|
|
106
139
|
const emitText = throttled.emit;
|
|
107
140
|
unsubscribe = session.subscribe((event) => {
|
|
108
|
-
if (event.type === "auto_retry_start") {
|
|
109
|
-
|
|
110
|
-
// stale "Thinking…" for the whole retry window.
|
|
111
|
-
const seconds = Math.max(1, Math.round(event.delayMs / 1000));
|
|
112
|
-
run.currentActivity = `Retrying (${event.attempt}/${event.maxAttempts}) in ${seconds}s — ${boundText(event.errorMessage.replace(/\s+/gu, " ").trim(), 160)}`;
|
|
113
|
-
emitImmediate();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (event.type === "auto_retry_end") {
|
|
117
|
-
run.currentActivity = event.success ? undefined : run.currentActivity;
|
|
141
|
+
if (event.type === "auto_retry_start" || event.type === "auto_retry_end") {
|
|
142
|
+
applySubagentAutoRetryEvent(run, event);
|
|
118
143
|
emitImmediate();
|
|
119
144
|
return;
|
|
120
145
|
}
|
|
121
146
|
if (event.type === "turn_end") {
|
|
147
|
+
clearSubagentRetry(run);
|
|
122
148
|
run.usage.turns++;
|
|
123
149
|
run.currentActivity = undefined;
|
|
124
150
|
emitImmediate();
|
|
125
151
|
return;
|
|
126
152
|
}
|
|
127
153
|
if (event.type === "message_end" && event.message.role === "assistant") {
|
|
154
|
+
clearSubagentRetry(run);
|
|
128
155
|
if (!seenAssistantMessages.has(event.message)) {
|
|
129
156
|
seenAssistantMessages.add(event.message);
|
|
130
157
|
addUsage(run.usage, event.message.usage);
|
|
@@ -134,6 +161,7 @@ export async function runSdkTask(options) {
|
|
|
134
161
|
return;
|
|
135
162
|
}
|
|
136
163
|
if (event.type === "message_update") {
|
|
164
|
+
clearSubagentRetry(run);
|
|
137
165
|
if (event.message.role === "assistant")
|
|
138
166
|
run.liveText = setLiveText(assistantText(event.message));
|
|
139
167
|
if (event.assistantMessageEvent.type === "thinking_delta")
|
|
@@ -144,6 +172,7 @@ export async function runSdkTask(options) {
|
|
|
144
172
|
return;
|
|
145
173
|
}
|
|
146
174
|
if (event.type === "tool_execution_start") {
|
|
175
|
+
clearSubagentRetry(run);
|
|
147
176
|
run.usage.toolUses++;
|
|
148
177
|
const activity = {
|
|
149
178
|
id: event.toolCallId,
|
|
@@ -159,11 +188,13 @@ export async function runSdkTask(options) {
|
|
|
159
188
|
return;
|
|
160
189
|
}
|
|
161
190
|
if (event.type === "tool_execution_update") {
|
|
191
|
+
clearSubagentRetry(run);
|
|
162
192
|
run.currentActivity = activitySummary(event.toolName, event.args);
|
|
163
193
|
emitText();
|
|
164
194
|
return;
|
|
165
195
|
}
|
|
166
196
|
if (event.type === "tool_execution_end") {
|
|
197
|
+
clearSubagentRetry(run);
|
|
167
198
|
const activity = activeActivities.get(event.toolCallId);
|
|
168
199
|
if (activity) {
|
|
169
200
|
activity.status = event.isError ? "failed" : "succeeded";
|
|
@@ -174,19 +205,7 @@ export async function runSdkTask(options) {
|
|
|
174
205
|
emitImmediate();
|
|
175
206
|
}
|
|
176
207
|
});
|
|
177
|
-
|
|
178
|
-
void markAbort().catch(() => undefined);
|
|
179
|
-
};
|
|
180
|
-
unregisterAbort = options.registerAbort?.(markAbort);
|
|
181
|
-
if (signal)
|
|
182
|
-
signal.addEventListener("abort", abortListener, { once: true });
|
|
183
|
-
try {
|
|
184
|
-
await session.prompt(task.prompt);
|
|
185
|
-
}
|
|
186
|
-
finally {
|
|
187
|
-
if (signal)
|
|
188
|
-
signal.removeEventListener("abort", abortListener);
|
|
189
|
-
}
|
|
208
|
+
await session.prompt(task.prompt);
|
|
190
209
|
const finalMessage = lastAssistantMessage(session);
|
|
191
210
|
run.finalOutput = finalAssistantText(session.messages);
|
|
192
211
|
const error = assistantError(finalMessage);
|
|
@@ -215,6 +234,8 @@ export async function runSdkTask(options) {
|
|
|
215
234
|
run.finalOutput = finalAssistantText(session.messages);
|
|
216
235
|
}
|
|
217
236
|
finally {
|
|
237
|
+
if (signal)
|
|
238
|
+
signal.removeEventListener("abort", abortListener);
|
|
218
239
|
throttled.cancel();
|
|
219
240
|
unregisterAbort?.();
|
|
220
241
|
unsubscribe?.();
|
|
@@ -223,6 +244,7 @@ export async function runSdkTask(options) {
|
|
|
223
244
|
run.finalOutput = boundText(run.finalOutput, SINGLE_OUTPUT_LIMIT);
|
|
224
245
|
if (run.error)
|
|
225
246
|
run.error = boundText(run.error, ERROR_TEXT_LIMIT);
|
|
247
|
+
clearSubagentRetry(run);
|
|
226
248
|
run.endedAt = Date.now();
|
|
227
249
|
onProgress?.();
|
|
228
250
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport {\n\tactivitySummary,\n\taddUsage,\n\tappendActivity,\n\tassistantText,\n\tboundText,\n\tfinalAssistantText,\n\tresultSummary,\n\tsetLiveText,\n} from \"./activity.ts\";\nimport { ERROR_TEXT_LIMIT, LIVE_TEXT_LIMIT, SINGLE_OUTPUT_LIMIT } from \"./constants.ts\";\nimport type { ResolvedSubagentTask, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\trun: SubagentRunDetails;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tsignal?: AbortSignal;\n\tonProgress?: () => void;\n\tregisterAbort?: (abort: () => Promise<void>) => () => void;\n}\n\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use absolute paths so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<SubagentRunDetails> {\n\tconst { task, run, modelRuntime, agentDir, projectTrusted, signal, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\tconst activeActivities = new Map<string, ToolActivity>();\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst markAbort = async (): Promise<void> => {\n\t\trun.status = \"aborted\";\n\t\tif (session) await session.abort();\n\t};\n\n\ttry {\n\t\tif (signal?.aborted) {\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = \"Subagent was aborted before it started.\";\n\t\t\treturn run;\n\t\t}\n\n\t\trun.status = \"running\";\n\t\trun.startedAt = Date.now();\n\t\tonProgress?.();\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\t// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need\n\t\t\t// commit/PR/style rules, and the parent interprets their results.\n\t\t\tnoContextFiles: task.agent.omitContextFiles ?? false,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tawait resourceLoader.reload();\n\t\tconst created = await createAgentSession({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tmodelRuntime,\n\t\t\tmodel: task.model,\n\t\t\tthinkingLevel: task.thinking,\n\t\t\ttools: task.agent.tools,\n\t\t\tresourceLoader,\n\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\tsettingsManager,\n\t\t});\n\t\tsession = created.session;\n\t\tconst emitImmediate = () => onProgress?.();\n\t\tconst emitText = throttled.emit;\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type === \"auto_retry_start\") {\n\t\t\t\t// Session-level auto-retry backoff: without this the UI shows a\n\t\t\t\t// stale \"Thinking…\" for the whole retry window.\n\t\t\t\tconst seconds = Math.max(1, Math.round(event.delayMs / 1000));\n\t\t\t\trun.currentActivity = `Retrying (${event.attempt}/${event.maxAttempts}) in ${seconds}s — ${boundText(\n\t\t\t\t\tevent.errorMessage.replace(/\\s+/gu, \" \").trim(),\n\t\t\t\t\t160,\n\t\t\t\t)}`;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"auto_retry_end\") {\n\t\t\t\trun.currentActivity = event.success ? undefined : run.currentActivity;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"turn_end\") {\n\t\t\t\trun.usage.turns++;\n\t\t\t\trun.currentActivity = undefined;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\tif (!seenAssistantMessages.has(event.message)) {\n\t\t\t\t\tseenAssistantMessages.add(event.message);\n\t\t\t\t\taddUsage(run.usage, event.message.usage);\n\t\t\t\t}\n\t\t\t\trun.liveText = setLiveText(assistantText(event.message));\n\t\t\t\temitText();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_update\") {\n\t\t\t\tif (event.message.role === \"assistant\") run.liveText = setLiveText(assistantText(event.message));\n\t\t\t\tif (event.assistantMessageEvent.type === \"thinking_delta\") run.currentActivity = \"Thinking…\";\n\t\t\t\tif (event.assistantMessageEvent.type === \"text_delta\") run.currentActivity = \"Writing response…\";\n\t\t\t\temitText();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\trun.usage.toolUses++;\n\t\t\t\tconst activity: ToolActivity = {\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\tsummary: activitySummary(event.toolName, event.args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t};\n\t\t\t\tactiveActivities.set(event.toolCallId, activity);\n\t\t\t\tappendActivity(run.activities, activity);\n\t\t\t\trun.currentActivity = activity.summary;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_update\") {\n\t\t\t\trun.currentActivity = activitySummary(event.toolName, event.args);\n\t\t\t\temitText();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\tconst activity = activeActivities.get(event.toolCallId);\n\t\t\t\tif (activity) {\n\t\t\t\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = Date.now();\n\t\t\t\t\tactivity.resultSummary = resultSummary(event.result);\n\t\t\t\t}\n\t\t\t\trun.currentActivity = undefined;\n\t\t\t\temitImmediate();\n\t\t\t}\n\t\t});\n\t\tconst abortListener = () => {\n\t\t\tvoid markAbort().catch(() => undefined);\n\t\t};\n\t\tunregisterAbort = options.registerAbort?.(markAbort);\n\t\tif (signal) signal.addEventListener(\"abort\", abortListener, { once: true });\n\t\ttry {\n\t\t\tawait session.prompt(task.prompt);\n\t\t} finally {\n\t\t\tif (signal) signal.removeEventListener(\"abort\", abortListener);\n\t\t}\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\trun.finalOutput = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (signal?.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = boundText(error ?? \"Subagent was aborted.\", ERROR_TEXT_LIMIT);\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\trun.status = \"failed\";\n\t\t\trun.error = boundText(error ?? \"Subagent failed.\", ERROR_TEXT_LIMIT);\n\t\t} else {\n\t\t\trun.status = \"completed\";\n\t\t}\n\t} catch (error) {\n\t\tif (signal?.aborted || run.status === \"aborted\") {\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = run.error ?? \"Subagent was aborted.\";\n\t\t} else {\n\t\t\trun.status = \"failed\";\n\t\t\trun.error = boundText(error instanceof Error ? error.message : String(error), ERROR_TEXT_LIMIT);\n\t\t}\n\t\tif (session) run.finalOutput = finalAssistantText(session.messages);\n\t} finally {\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\trun.liveText = boundText(run.liveText, LIVE_TEXT_LIMIT);\n\t\trun.finalOutput = boundText(run.finalOutput, SINGLE_OUTPUT_LIMIT);\n\t\tif (run.error) run.error = boundText(run.error, ERROR_TEXT_LIMIT);\n\t\trun.endedAt = Date.now();\n\t\tonProgress?.();\n\t}\n\treturn run;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport {\n\tactivitySummary,\n\taddUsage,\n\tappendActivity,\n\tassistantText,\n\tboundText,\n\tfinalAssistantText,\n\tresultSummary,\n\tsetLiveText,\n} from \"./activity.ts\";\nimport { ERROR_TEXT_LIMIT, LIVE_TEXT_LIMIT, SINGLE_OUTPUT_LIMIT } from \"./constants.ts\";\nimport { beginSubagentRetry, clearSubagentRetry } from \"./retry.ts\";\nimport type { ResolvedSubagentTask, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\trun: SubagentRunDetails;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tsignal?: AbortSignal;\n\tonProgress?: () => void;\n\tregisterAbort?: (abort: () => Promise<void>) => () => void;\n}\n\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use absolute paths so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\ntype AutoRetryEvent = Extract<AgentSessionEvent, { type: \"auto_retry_start\" | \"auto_retry_end\" }>;\n\nexport function applySubagentAutoRetryEvent(run: SubagentRunDetails, event: AutoRetryEvent): void {\n\tif (event.type === \"auto_retry_start\") {\n\t\tbeginSubagentRetry(run, {\n\t\t\tattempt: event.attempt,\n\t\t\tmaxAttempts: event.maxAttempts,\n\t\t\tdelayMs: event.delayMs,\n\t\t\terror: event.errorMessage,\n\t\t});\n\t\treturn;\n\t}\n\tclearSubagentRetry(run);\n}\n\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<SubagentRunDetails> {\n\tconst { task, run, modelRuntime, agentDir, projectTrusted, signal, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\tconst activeActivities = new Map<string, ToolActivity>();\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst markAbort = async (): Promise<void> => {\n\t\tclearSubagentRetry(run);\n\t\trun.status = \"aborted\";\n\t\trun.error ??= \"Subagent was aborted.\";\n\t\tif (session) await session.abort();\n\t};\n\tconst isAborted = (): boolean => signal?.aborted === true || run.status === \"aborted\";\n\tconst abortListener = () => {\n\t\tvoid markAbort().catch(() => undefined);\n\t};\n\tunregisterAbort = options.registerAbort?.(markAbort);\n\tif (signal) signal.addEventListener(\"abort\", abortListener, { once: true });\n\n\ttry {\n\t\tif (isAborted()) {\n\t\t\tclearSubagentRetry(run);\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = \"Subagent was aborted before it started.\";\n\t\t\treturn run;\n\t\t}\n\n\t\tclearSubagentRetry(run);\n\t\trun.status = \"running\";\n\t\trun.startedAt = Date.now();\n\t\tonProgress?.();\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\t// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need\n\t\t\t// commit/PR/style rules, and the parent interprets their results.\n\t\t\tnoContextFiles: task.agent.omitContextFiles ?? false,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tawait resourceLoader.reload();\n\t\tif (isAborted()) {\n\t\t\trun.error ??= \"Subagent was aborted during initialization.\";\n\t\t\treturn run;\n\t\t}\n\t\tconst created = await createAgentSession({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tmodelRuntime,\n\t\t\tmodel: task.model,\n\t\t\tthinkingLevel: task.thinking,\n\t\t\ttools: task.agent.tools,\n\t\t\tresourceLoader,\n\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\tsettingsManager,\n\t\t});\n\t\tsession = created.session;\n\t\tif (isAborted()) {\n\t\t\trun.error ??= \"Subagent was aborted during initialization.\";\n\t\t\tawait session.abort();\n\t\t\treturn run;\n\t\t}\n\t\tconst emitImmediate = () => onProgress?.();\n\t\tconst emitText = throttled.emit;\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type === \"auto_retry_start\" || event.type === \"auto_retry_end\") {\n\t\t\t\tapplySubagentAutoRetryEvent(run, event);\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"turn_end\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\trun.usage.turns++;\n\t\t\t\trun.currentActivity = undefined;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\tif (!seenAssistantMessages.has(event.message)) {\n\t\t\t\t\tseenAssistantMessages.add(event.message);\n\t\t\t\t\taddUsage(run.usage, event.message.usage);\n\t\t\t\t}\n\t\t\t\trun.liveText = setLiveText(assistantText(event.message));\n\t\t\t\temitText();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_update\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\tif (event.message.role === \"assistant\") run.liveText = setLiveText(assistantText(event.message));\n\t\t\t\tif (event.assistantMessageEvent.type === \"thinking_delta\") run.currentActivity = \"Thinking…\";\n\t\t\t\tif (event.assistantMessageEvent.type === \"text_delta\") run.currentActivity = \"Writing response…\";\n\t\t\t\temitText();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\trun.usage.toolUses++;\n\t\t\t\tconst activity: ToolActivity = {\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\tsummary: activitySummary(event.toolName, event.args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t};\n\t\t\t\tactiveActivities.set(event.toolCallId, activity);\n\t\t\t\tappendActivity(run.activities, activity);\n\t\t\t\trun.currentActivity = activity.summary;\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_update\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\trun.currentActivity = activitySummary(event.toolName, event.args);\n\t\t\t\temitText();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\tclearSubagentRetry(run);\n\t\t\t\tconst activity = activeActivities.get(event.toolCallId);\n\t\t\t\tif (activity) {\n\t\t\t\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = Date.now();\n\t\t\t\t\tactivity.resultSummary = resultSummary(event.result);\n\t\t\t\t}\n\t\t\t\trun.currentActivity = undefined;\n\t\t\t\temitImmediate();\n\t\t\t}\n\t\t});\n\t\tawait session.prompt(task.prompt);\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\trun.finalOutput = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (signal?.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = boundText(error ?? \"Subagent was aborted.\", ERROR_TEXT_LIMIT);\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\trun.status = \"failed\";\n\t\t\trun.error = boundText(error ?? \"Subagent failed.\", ERROR_TEXT_LIMIT);\n\t\t} else {\n\t\t\trun.status = \"completed\";\n\t\t}\n\t} catch (error) {\n\t\tif (signal?.aborted || run.status === \"aborted\") {\n\t\t\trun.status = \"aborted\";\n\t\t\trun.error = run.error ?? \"Subagent was aborted.\";\n\t\t} else {\n\t\t\trun.status = \"failed\";\n\t\t\trun.error = boundText(error instanceof Error ? error.message : String(error), ERROR_TEXT_LIMIT);\n\t\t}\n\t\tif (session) run.finalOutput = finalAssistantText(session.messages);\n\t} finally {\n\t\tif (signal) signal.removeEventListener(\"abort\", abortListener);\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\trun.liveText = boundText(run.liveText, LIVE_TEXT_LIMIT);\n\t\trun.finalOutput = boundText(run.finalOutput, SINGLE_OUTPUT_LIMIT);\n\t\tif (run.error) run.error = boundText(run.error, ERROR_TEXT_LIMIT);\n\t\tclearSubagentRetry(run);\n\t\trun.endedAt = Date.now();\n\t\tonProgress?.();\n\t}\n\treturn run;\n}\n"]}
|
|
@@ -70,6 +70,12 @@ export interface SubagentUsage {
|
|
|
70
70
|
/** Context watermark: total tokens of the latest request, not a running sum. */
|
|
71
71
|
contextTokens?: number;
|
|
72
72
|
}
|
|
73
|
+
export interface SubagentRetryDetails {
|
|
74
|
+
attempt: number;
|
|
75
|
+
maxAttempts: number;
|
|
76
|
+
deadline: number;
|
|
77
|
+
error: string;
|
|
78
|
+
}
|
|
73
79
|
export interface SubagentRunDetails {
|
|
74
80
|
id: string;
|
|
75
81
|
agent: string;
|
|
@@ -83,6 +89,7 @@ export interface SubagentRunDetails {
|
|
|
83
89
|
startedAt?: number;
|
|
84
90
|
endedAt?: number;
|
|
85
91
|
currentActivity?: string;
|
|
92
|
+
retry?: SubagentRetryDetails;
|
|
86
93
|
activities: ToolActivity[];
|
|
87
94
|
liveText: string;
|
|
88
95
|
finalOutput: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\n\nexport type AgentSource = \"builtin\" | \"user\" | \"project\";\nexport type SubagentMode = \"single\" | \"parallel\";\nexport type SubagentRunStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"aborted\";\nexport type ToolActivityStatus = \"running\" | \"succeeded\" | \"failed\";\n\nexport interface AgentDefinition {\n\tname: string;\n\tdescription: string;\n\ttools: string[];\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tbackend: \"sdk\";\n\t/**\n\t * Skip loading AGENTS.md/CLAUDE.md into the worker's system prompt.\n\t * Read-only exploration doesn't need commit/PR/style rules; the parent\n\t * has full context to interpret results. Builtin-only, not a\n\t * frontmatter field.\n\t */\n\tomitContextFiles?: boolean;\n}\n\nexport interface AgentDiagnostic {\n\tpath: string;\n\tmessage: string;\n\tsource: Exclude<AgentSource, \"builtin\">;\n}\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentDefinition[];\n\tdiagnostics: AgentDiagnostic[];\n\tprojectAgentsDir?: string;\n\tprojectAgentsTrusted: boolean;\n}\n\nexport interface SubagentProfileOverride {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport interface SubagentConfigFile {\n\tversion: 1;\n\tprofiles: Record<string, SubagentProfileOverride>;\n}\n\nexport interface ResolvedSubagentTask {\n\tagent: AgentDefinition;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: Model<Api>;\n\tthinking: ThinkingLevel;\n\tmodelSource: \"profile\" | \"parent\";\n\tthinkingSource: \"profile\" | \"parent\";\n}\n\nexport interface ToolActivity {\n\tid: string;\n\ttoolName: string;\n\tsummary: string;\n\tstatus: ToolActivityStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tresultSummary?: string;\n}\n\nexport interface SubagentUsage {\n\tturns: number;\n\ttoolUses: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tcost: number;\n\t/** Context watermark: total tokens of the latest request, not a running sum. */\n\tcontextTokens?: number;\n}\n\nexport interface SubagentRunDetails {\n\tid: string;\n\tagent: string;\n\tagentSource: AgentSource;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: string;\n\tthinking: ThinkingLevel;\n\tstatus: SubagentRunStatus;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tcurrentActivity?: string;\n\tactivities: ToolActivity[];\n\tliveText: string;\n\tfinalOutput: string;\n\terror?: string;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentDetails {\n\tmode: SubagentMode;\n\tstatus: SubagentRunStatus;\n\truns: SubagentRunDetails[];\n\tstartedAt: number;\n\tendedAt?: number;\n\tusage: SubagentUsage;\n\terror?: string;\n}\n\nexport interface SubagentExecutionResult {\n\tcontent: string;\n\tdetails: SubagentDetails;\n\tusage?: Usage;\n\tisError: boolean;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\n\nexport type AgentSource = \"builtin\" | \"user\" | \"project\";\nexport type SubagentMode = \"single\" | \"parallel\";\nexport type SubagentRunStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"aborted\";\nexport type ToolActivityStatus = \"running\" | \"succeeded\" | \"failed\";\n\nexport interface AgentDefinition {\n\tname: string;\n\tdescription: string;\n\ttools: string[];\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tbackend: \"sdk\";\n\t/**\n\t * Skip loading AGENTS.md/CLAUDE.md into the worker's system prompt.\n\t * Read-only exploration doesn't need commit/PR/style rules; the parent\n\t * has full context to interpret results. Builtin-only, not a\n\t * frontmatter field.\n\t */\n\tomitContextFiles?: boolean;\n}\n\nexport interface AgentDiagnostic {\n\tpath: string;\n\tmessage: string;\n\tsource: Exclude<AgentSource, \"builtin\">;\n}\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentDefinition[];\n\tdiagnostics: AgentDiagnostic[];\n\tprojectAgentsDir?: string;\n\tprojectAgentsTrusted: boolean;\n}\n\nexport interface SubagentProfileOverride {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport interface SubagentConfigFile {\n\tversion: 1;\n\tprofiles: Record<string, SubagentProfileOverride>;\n}\n\nexport interface ResolvedSubagentTask {\n\tagent: AgentDefinition;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: Model<Api>;\n\tthinking: ThinkingLevel;\n\tmodelSource: \"profile\" | \"parent\";\n\tthinkingSource: \"profile\" | \"parent\";\n}\n\nexport interface ToolActivity {\n\tid: string;\n\ttoolName: string;\n\tsummary: string;\n\tstatus: ToolActivityStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tresultSummary?: string;\n}\n\nexport interface SubagentUsage {\n\tturns: number;\n\ttoolUses: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tcost: number;\n\t/** Context watermark: total tokens of the latest request, not a running sum. */\n\tcontextTokens?: number;\n}\n\nexport interface SubagentRetryDetails {\n\tattempt: number;\n\tmaxAttempts: number;\n\tdeadline: number;\n\terror: string;\n}\n\nexport interface SubagentRunDetails {\n\tid: string;\n\tagent: string;\n\tagentSource: AgentSource;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: string;\n\tthinking: ThinkingLevel;\n\tstatus: SubagentRunStatus;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tcurrentActivity?: string;\n\tretry?: SubagentRetryDetails;\n\tactivities: ToolActivity[];\n\tliveText: string;\n\tfinalOutput: string;\n\terror?: string;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentDetails {\n\tmode: SubagentMode;\n\tstatus: SubagentRunStatus;\n\truns: SubagentRunDetails[];\n\tstartedAt: number;\n\tendedAt?: number;\n\tusage: SubagentUsage;\n\terror?: string;\n}\n\nexport interface SubagentExecutionResult {\n\tcontent: string;\n\tdetails: SubagentDetails;\n\tusage?: Usage;\n\tisError: boolean;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\n\nexport type AgentSource = \"builtin\" | \"user\" | \"project\";\nexport type SubagentMode = \"single\" | \"parallel\";\nexport type SubagentRunStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"aborted\";\nexport type ToolActivityStatus = \"running\" | \"succeeded\" | \"failed\";\n\nexport interface AgentDefinition {\n\tname: string;\n\tdescription: string;\n\ttools: string[];\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tbackend: \"sdk\";\n\t/**\n\t * Skip loading AGENTS.md/CLAUDE.md into the worker's system prompt.\n\t * Read-only exploration doesn't need commit/PR/style rules; the parent\n\t * has full context to interpret results. Builtin-only, not a\n\t * frontmatter field.\n\t */\n\tomitContextFiles?: boolean;\n}\n\nexport interface AgentDiagnostic {\n\tpath: string;\n\tmessage: string;\n\tsource: Exclude<AgentSource, \"builtin\">;\n}\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentDefinition[];\n\tdiagnostics: AgentDiagnostic[];\n\tprojectAgentsDir?: string;\n\tprojectAgentsTrusted: boolean;\n}\n\nexport interface SubagentProfileOverride {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport interface SubagentConfigFile {\n\tversion: 1;\n\tprofiles: Record<string, SubagentProfileOverride>;\n}\n\nexport interface ResolvedSubagentTask {\n\tagent: AgentDefinition;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: Model<Api>;\n\tthinking: ThinkingLevel;\n\tmodelSource: \"profile\" | \"parent\";\n\tthinkingSource: \"profile\" | \"parent\";\n}\n\nexport interface ToolActivity {\n\tid: string;\n\ttoolName: string;\n\tsummary: string;\n\tstatus: ToolActivityStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tresultSummary?: string;\n}\n\nexport interface SubagentUsage {\n\tturns: number;\n\ttoolUses: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tcost: number;\n\t/** Context watermark: total tokens of the latest request, not a running sum. */\n\tcontextTokens?: number;\n}\n\nexport interface SubagentRunDetails {\n\tid: string;\n\tagent: string;\n\tagentSource: AgentSource;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: string;\n\tthinking: ThinkingLevel;\n\tstatus: SubagentRunStatus;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tcurrentActivity?: string;\n\tactivities: ToolActivity[];\n\tliveText: string;\n\tfinalOutput: string;\n\terror?: string;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentDetails {\n\tmode: SubagentMode;\n\tstatus: SubagentRunStatus;\n\truns: SubagentRunDetails[];\n\tstartedAt: number;\n\tendedAt?: number;\n\tusage: SubagentUsage;\n\terror?: string;\n}\n\nexport interface SubagentExecutionResult {\n\tcontent: string;\n\tdetails: SubagentDetails;\n\tusage?: Usage;\n\tisError: boolean;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\n\nexport type AgentSource = \"builtin\" | \"user\" | \"project\";\nexport type SubagentMode = \"single\" | \"parallel\";\nexport type SubagentRunStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"aborted\";\nexport type ToolActivityStatus = \"running\" | \"succeeded\" | \"failed\";\n\nexport interface AgentDefinition {\n\tname: string;\n\tdescription: string;\n\ttools: string[];\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\tbackend: \"sdk\";\n\t/**\n\t * Skip loading AGENTS.md/CLAUDE.md into the worker's system prompt.\n\t * Read-only exploration doesn't need commit/PR/style rules; the parent\n\t * has full context to interpret results. Builtin-only, not a\n\t * frontmatter field.\n\t */\n\tomitContextFiles?: boolean;\n}\n\nexport interface AgentDiagnostic {\n\tpath: string;\n\tmessage: string;\n\tsource: Exclude<AgentSource, \"builtin\">;\n}\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentDefinition[];\n\tdiagnostics: AgentDiagnostic[];\n\tprojectAgentsDir?: string;\n\tprojectAgentsTrusted: boolean;\n}\n\nexport interface SubagentProfileOverride {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport interface SubagentConfigFile {\n\tversion: 1;\n\tprofiles: Record<string, SubagentProfileOverride>;\n}\n\nexport interface ResolvedSubagentTask {\n\tagent: AgentDefinition;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: Model<Api>;\n\tthinking: ThinkingLevel;\n\tmodelSource: \"profile\" | \"parent\";\n\tthinkingSource: \"profile\" | \"parent\";\n}\n\nexport interface ToolActivity {\n\tid: string;\n\ttoolName: string;\n\tsummary: string;\n\tstatus: ToolActivityStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tresultSummary?: string;\n}\n\nexport interface SubagentUsage {\n\tturns: number;\n\ttoolUses: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\ttotalTokens: number;\n\tcost: number;\n\t/** Context watermark: total tokens of the latest request, not a running sum. */\n\tcontextTokens?: number;\n}\n\nexport interface SubagentRetryDetails {\n\tattempt: number;\n\tmaxAttempts: number;\n\tdeadline: number;\n\terror: string;\n}\n\nexport interface SubagentRunDetails {\n\tid: string;\n\tagent: string;\n\tagentSource: AgentSource;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: string;\n\tthinking: ThinkingLevel;\n\tstatus: SubagentRunStatus;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tcurrentActivity?: string;\n\tretry?: SubagentRetryDetails;\n\tactivities: ToolActivity[];\n\tliveText: string;\n\tfinalOutput: string;\n\terror?: string;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentDetails {\n\tmode: SubagentMode;\n\tstatus: SubagentRunStatus;\n\truns: SubagentRunDetails[];\n\tstartedAt: number;\n\tendedAt?: number;\n\tusage: SubagentUsage;\n\terror?: string;\n}\n\nexport interface SubagentExecutionResult {\n\tcontent: string;\n\tdetails: SubagentDetails;\n\tusage?: Usage;\n\tisError: boolean;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AAyCxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAuFnD","sourcesContent":["/**\n * todo — Pi-native task tracking for multi-step work.\n *\n * The state is intentionally conversation-backed: every tool result carries a\n * full snapshot in `details`, and lifecycle handlers replay the current branch.\n * This keeps /reload, compaction, and session-tree navigation aligned with the\n * conversation without adding a separate disk database. (Compaction-safe by\n * design: sessionManager.getBranch() returns the FULL branch history including\n * pre-compaction toolResult entries — only buildSessionContext summarizes.)\n *\n * State is keyed per session id (see state.ts): resume and /tree switches can\n * change the session within one process, and execute + lifecycle handlers\n * re-point the active bucket before touching state.\n */\nimport { Text } from \"@earendil-works/pi-tui\";\nimport {\n\ttype AgentToolResult,\n\ttype ExtensionAPI,\n\tisStaleExtensionContextError,\n\ttype ToolExecutionMode,\n} from \"../../core/extensions/types.ts\";\nimport {\n\tTODO_PROMPT_GUIDELINES,\n\tTODO_PROMPT_SNIPPET,\n\tTODO_TOOL_DESCRIPTION,\n\tTODO_TOOL_LABEL,\n\tTODO_TOOL_NAME,\n\tTODOS_COMMAND_NAME,\n} from \"./constants.ts\";\nimport { TodoOverlay } from \"./overlay.ts\";\nimport { type TodoDetails, TodoParamsSchema } from \"./schema.ts\";\nimport {\n\tapplyTodoMutation,\n\tbuildTodoDetails,\n\tcommitTodoState,\n\tdisposeTodoSession,\n\tformatTodoContent,\n\tgetTodoState,\n\treplaceTodoState,\n\treplayTodosFromBranch,\n\tsetActiveTodoSession,\n} from \"./state.ts\";\nimport { formatCommandList, formatTodoCall, formatTodoGroupCall } from \"./view.ts\";\n\ninterface TodoSessionCtx {\n\tsessionManager: { getBranch(): Iterable<unknown>; getSessionId(): string };\n}\n\nfunction safeReplay(ctx: TodoSessionCtx): void {\n\t// Every ctx.sessionManager access goes through a stale guard, so the whole\n\t// body stays inside the try: a lifecycle event can race session replacement\n\t// (resume, /tree, /reload), and a stale ctx just means another session took\n\t// over — nothing left to replay for it.\n\ttry {\n\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\treplaceTodoState(replayTodosFromBranch(ctx));\n\t} catch (error) {\n\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t}\n}\n\nexport default function todo(pi: ExtensionAPI): void {\n\tlet overlay: TodoOverlay | undefined;\n\n\tpi.registerTool({\n\t\tname: TODO_TOOL_NAME,\n\t\tlabel: TODO_TOOL_LABEL,\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: TODO_PROMPT_SNIPPET,\n\t\tpromptGuidelines: TODO_PROMPT_GUIDELINES,\n\t\tparameters: TodoParamsSchema,\n\t\texecutionMode: \"sequential\" as ToolExecutionMode,\n\t\t// Consecutive todo calls collapse into one run like read/find's `explore`\n\t\t// group; the overlay already carries the live list, so the transcript only\n\t\t// needs the sequence of operations.\n\t\ttoolGroup: TODO_TOOL_NAME,\n\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<AgentToolResult<TodoDetails>> {\n\t\t\t// Re-point the active bucket: resume//tree can switch sessions between\n\t\t\t// lifecycle events and this call.\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tconst result = applyTodoMutation(getTodoState(), params);\n\t\t\tif (result.operation.kind === \"error\") {\n\t\t\t\tthrow new Error(result.operation.message);\n\t\t\t}\n\t\t\tcommitTodoState(result.state);\n\t\t\tconst text = formatTodoContent(result.operation, result.state);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\tdetails: buildTodoDetails(params, result.state),\n\t\t\t};\n\t\t},\n\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tcontext.toolGroupSummary\n\t\t\t\t\t? formatTodoGroupCall(args, theme, context)\n\t\t\t\t\t: formatTodoCall(args, theme, context.expanded),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t});\n\n\tpi.registerCommand(TODOS_COMMAND_NAME, {\n\t\tdescription: \"Show todos for the current conversation branch\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"/todos requires an interactive UI.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tctx.ui.notify(formatCommandList(getTodoState()), \"info\");\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\tif (ctx.hasUI) {\n\t\t\toverlay ??= new TodoOverlay();\n\t\t\toverlay.setUI(ctx.ui);\n\t\t\toverlay.resetVisibility();\n\t\t\toverlay.update();\n\t\t}\n\t});\n\n\tpi.on(\"session_compact\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tdisposeTodoSession(ctx.sessionManager.getSessionId());\n\t\toverlay?.dispose();\n\t\toverlay = undefined;\n\t});\n\n\tpi.on(\"tool_execution_end\", async (event) => {\n\t\tif (event.toolName !== TODO_TOOL_NAME || event.isError) return;\n\t\toverlay?.update();\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AAyCxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAuFnD","sourcesContent":["/**\n * todo — Pi-native task tracking for multi-step work.\n *\n * The state is intentionally conversation-backed: every tool result carries a\n * full snapshot in `details`, and lifecycle handlers replay the current branch.\n * This keeps /reload, compaction, and session-tree navigation aligned with the\n * conversation without adding a separate disk database. (Compaction-safe by\n * design: sessionManager.getBranch() returns the FULL branch history including\n * pre-compaction toolResult entries — only buildSessionContext summarizes.)\n *\n * State is keyed per session id (see state.ts): resume and /tree switches can\n * change the session within one process, and execute + lifecycle handlers\n * re-point the active bucket before touching state.\n */\nimport { Text } from \"@earendil-works/pi-tui\";\nimport {\n\ttype AgentToolResult,\n\ttype ExtensionAPI,\n\tisStaleExtensionContextError,\n\ttype ToolExecutionMode,\n} from \"../../core/extensions/types.ts\";\nimport {\n\tTODO_PROMPT_GUIDELINES,\n\tTODO_PROMPT_SNIPPET,\n\tTODO_TOOL_DESCRIPTION,\n\tTODO_TOOL_LABEL,\n\tTODO_TOOL_NAME,\n\tTODOS_COMMAND_NAME,\n} from \"./constants.ts\";\nimport { TodoOverlay } from \"./overlay.ts\";\nimport { type TodoDetails, TodoParamsSchema } from \"./schema.ts\";\nimport {\n\tapplyTodoMutation,\n\tbuildTodoDetails,\n\tcommitTodoState,\n\tdisposeTodoSession,\n\tformatTodoContent,\n\tgetTodoState,\n\treplaceTodoState,\n\treplayTodosFromBranch,\n\tsetActiveTodoSession,\n} from \"./state.ts\";\nimport { formatCommandList, formatTodoCall, formatTodoGroupCall } from \"./view.ts\";\n\ninterface TodoSessionCtx {\n\tsessionManager: { getBranch(): Iterable<unknown>; getSessionId(): string };\n}\n\nfunction safeReplay(ctx: TodoSessionCtx): void {\n\t// Every ctx.sessionManager access goes through a stale guard, so the whole\n\t// body stays inside the try: a lifecycle event can race session replacement\n\t// (resume, /tree, /reload), and a stale ctx just means another session took\n\t// over — nothing left to replay for it.\n\ttry {\n\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\treplaceTodoState(replayTodosFromBranch(ctx));\n\t} catch (error) {\n\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t}\n}\n\nexport default function todo(pi: ExtensionAPI): void {\n\tlet overlay: TodoOverlay | undefined;\n\n\tpi.registerTool({\n\t\tname: TODO_TOOL_NAME,\n\t\tlabel: TODO_TOOL_LABEL,\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: TODO_PROMPT_SNIPPET,\n\t\tpromptGuidelines: TODO_PROMPT_GUIDELINES,\n\t\tparameters: TodoParamsSchema,\n\t\texecutionMode: \"sequential\" as ToolExecutionMode,\n\t\t// Consecutive todo calls collapse into one run like read/find's `explore`\n\t\t// group; the overlay already carries the live list, so the transcript only\n\t\t// needs the sequence of operations.\n\t\ttoolGroup: TODO_TOOL_NAME,\n\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<AgentToolResult<TodoDetails>> {\n\t\t\t// Re-point the active bucket: resume//tree can switch sessions between\n\t\t\t// lifecycle events and this call.\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tconst result = applyTodoMutation(getTodoState(), params);\n\t\t\tif (result.operation.kind === \"error\") {\n\t\t\t\tthrow new Error(result.operation.message);\n\t\t\t}\n\t\t\tcommitTodoState(result.state);\n\t\t\tconst text = formatTodoContent(result.operation, result.state);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\tdetails: buildTodoDetails(params, result.state),\n\t\t\t};\n\t\t},\n\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tcontext.toolGroupSummary\n\t\t\t\t\t? formatTodoGroupCall(args, theme, context)\n\t\t\t\t\t: formatTodoCall(args, theme, context.expanded, context.result),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t});\n\n\tpi.registerCommand(TODOS_COMMAND_NAME, {\n\t\tdescription: \"Show todos for the current conversation branch\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"/todos requires an interactive UI.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tctx.ui.notify(formatCommandList(getTodoState()), \"info\");\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\tif (ctx.hasUI) {\n\t\t\toverlay ??= new TodoOverlay();\n\t\t\toverlay.setUI(ctx.ui);\n\t\t\toverlay.resetVisibility();\n\t\t\toverlay.update();\n\t\t}\n\t});\n\n\tpi.on(\"session_compact\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tdisposeTodoSession(ctx.sessionManager.getSessionId());\n\t\toverlay?.dispose();\n\t\toverlay = undefined;\n\t});\n\n\tpi.on(\"tool_execution_end\", async (event) => {\n\t\tif (event.toolName !== TODO_TOOL_NAME || event.isError) return;\n\t\toverlay?.update();\n\t});\n}\n"]}
|
|
@@ -66,7 +66,7 @@ export default function todo(pi) {
|
|
|
66
66
|
const text = context.lastComponent ?? new Text("", 0, 0);
|
|
67
67
|
text.setText(context.toolGroupSummary
|
|
68
68
|
? formatTodoGroupCall(args, theme, context)
|
|
69
|
-
: formatTodoCall(args, theme, context.expanded));
|
|
69
|
+
: formatTodoCall(args, theme, context.expanded, context.result));
|
|
70
70
|
return text;
|
|
71
71
|
},
|
|
72
72
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo — Pi-native task tracking for multi-step work.\n *\n * The state is intentionally conversation-backed: every tool result carries a\n * full snapshot in `details`, and lifecycle handlers replay the current branch.\n * This keeps /reload, compaction, and session-tree navigation aligned with the\n * conversation without adding a separate disk database. (Compaction-safe by\n * design: sessionManager.getBranch() returns the FULL branch history including\n * pre-compaction toolResult entries — only buildSessionContext summarizes.)\n *\n * State is keyed per session id (see state.ts): resume and /tree switches can\n * change the session within one process, and execute + lifecycle handlers\n * re-point the active bucket before touching state.\n */\nimport { Text } from \"@earendil-works/pi-tui\";\nimport {\n\ttype AgentToolResult,\n\ttype ExtensionAPI,\n\tisStaleExtensionContextError,\n\ttype ToolExecutionMode,\n} from \"../../core/extensions/types.ts\";\nimport {\n\tTODO_PROMPT_GUIDELINES,\n\tTODO_PROMPT_SNIPPET,\n\tTODO_TOOL_DESCRIPTION,\n\tTODO_TOOL_LABEL,\n\tTODO_TOOL_NAME,\n\tTODOS_COMMAND_NAME,\n} from \"./constants.ts\";\nimport { TodoOverlay } from \"./overlay.ts\";\nimport { type TodoDetails, TodoParamsSchema } from \"./schema.ts\";\nimport {\n\tapplyTodoMutation,\n\tbuildTodoDetails,\n\tcommitTodoState,\n\tdisposeTodoSession,\n\tformatTodoContent,\n\tgetTodoState,\n\treplaceTodoState,\n\treplayTodosFromBranch,\n\tsetActiveTodoSession,\n} from \"./state.ts\";\nimport { formatCommandList, formatTodoCall, formatTodoGroupCall } from \"./view.ts\";\n\ninterface TodoSessionCtx {\n\tsessionManager: { getBranch(): Iterable<unknown>; getSessionId(): string };\n}\n\nfunction safeReplay(ctx: TodoSessionCtx): void {\n\t// Every ctx.sessionManager access goes through a stale guard, so the whole\n\t// body stays inside the try: a lifecycle event can race session replacement\n\t// (resume, /tree, /reload), and a stale ctx just means another session took\n\t// over — nothing left to replay for it.\n\ttry {\n\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\treplaceTodoState(replayTodosFromBranch(ctx));\n\t} catch (error) {\n\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t}\n}\n\nexport default function todo(pi: ExtensionAPI): void {\n\tlet overlay: TodoOverlay | undefined;\n\n\tpi.registerTool({\n\t\tname: TODO_TOOL_NAME,\n\t\tlabel: TODO_TOOL_LABEL,\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: TODO_PROMPT_SNIPPET,\n\t\tpromptGuidelines: TODO_PROMPT_GUIDELINES,\n\t\tparameters: TodoParamsSchema,\n\t\texecutionMode: \"sequential\" as ToolExecutionMode,\n\t\t// Consecutive todo calls collapse into one run like read/find's `explore`\n\t\t// group; the overlay already carries the live list, so the transcript only\n\t\t// needs the sequence of operations.\n\t\ttoolGroup: TODO_TOOL_NAME,\n\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<AgentToolResult<TodoDetails>> {\n\t\t\t// Re-point the active bucket: resume//tree can switch sessions between\n\t\t\t// lifecycle events and this call.\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tconst result = applyTodoMutation(getTodoState(), params);\n\t\t\tif (result.operation.kind === \"error\") {\n\t\t\t\tthrow new Error(result.operation.message);\n\t\t\t}\n\t\t\tcommitTodoState(result.state);\n\t\t\tconst text = formatTodoContent(result.operation, result.state);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\tdetails: buildTodoDetails(params, result.state),\n\t\t\t};\n\t\t},\n\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tcontext.toolGroupSummary\n\t\t\t\t\t? formatTodoGroupCall(args, theme, context)\n\t\t\t\t\t: formatTodoCall(args, theme, context.expanded, context.result),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t});\n\n\tpi.registerCommand(TODOS_COMMAND_NAME, {\n\t\tdescription: \"Show todos for the current conversation branch\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"/todos requires an interactive UI.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetActiveTodoSession(ctx.sessionManager.getSessionId());\n\t\t\tctx.ui.notify(formatCommandList(getTodoState()), \"info\");\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\tif (ctx.hasUI) {\n\t\t\toverlay ??= new TodoOverlay();\n\t\t\toverlay.setUI(ctx.ui);\n\t\t\toverlay.resetVisibility();\n\t\t\toverlay.update();\n\t\t}\n\t});\n\n\tpi.on(\"session_compact\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsafeReplay(ctx);\n\t\toverlay?.resetVisibility();\n\t\toverlay?.update();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tdisposeTodoSession(ctx.sessionManager.getSessionId());\n\t\toverlay?.dispose();\n\t\toverlay = undefined;\n\t});\n\n\tpi.on(\"tool_execution_end\", async (event) => {\n\t\tif (event.toolName !== TODO_TOOL_NAME || event.isError) return;\n\t\toverlay?.update();\n\t});\n}\n"]}
|