Compare commits
5 Commits
e1516c44c6
...
61fac63409
| Author | SHA1 | Date |
|---|---|---|
|
|
61fac63409 | |
|
|
f7f9dca6b2 | |
|
|
246af50c08 | |
|
|
81e5cb83bc | |
|
|
87986ddf6e |
|
|
@ -245,7 +245,8 @@ export class FanoutController {
|
||||||
}
|
}
|
||||||
|
|
||||||
private getJobPreview(job: FanoutJob, maxChars = 500): string {
|
private getJobPreview(job: FanoutJob, maxChars = 500): string {
|
||||||
const output = this.readJobOutput(job);
|
// Use cached preview if available (updated in processOutputLine)
|
||||||
|
const output = job.lastPreview || this.readJobOutput(job);
|
||||||
if (!output) return "";
|
if (!output) return "";
|
||||||
if (output.length <= maxChars) return output;
|
if (output.length <= maxChars) return output;
|
||||||
return output.slice(0, maxChars) + "\n… (truncated)";
|
return output.slice(0, maxChars) + "\n… (truncated)";
|
||||||
|
|
@ -257,6 +258,7 @@ export class FanoutController {
|
||||||
if (event.type === "message_end" && event.message) {
|
if (event.type === "message_end" && event.message) {
|
||||||
const msg = event.message as Message;
|
const msg = event.message as Message;
|
||||||
if (msg.role === "assistant") {
|
if (msg.role === "assistant") {
|
||||||
|
// Cache latest assistant text for live preview
|
||||||
job.usage.turns++;
|
job.usage.turns++;
|
||||||
const usage = msg.usage;
|
const usage = msg.usage;
|
||||||
if (usage) {
|
if (usage) {
|
||||||
|
|
@ -269,6 +271,21 @@ export class FanoutController {
|
||||||
if (!job.modelUsed && msg.model) job.modelUsed = msg.model;
|
if (!job.modelUsed && msg.model) job.modelUsed = msg.model;
|
||||||
if (msg.stopReason) job.stopReason = msg.stopReason;
|
if (msg.stopReason) job.stopReason = msg.stopReason;
|
||||||
if (msg.errorMessage) job.errorMessage = msg.errorMessage;
|
if (msg.errorMessage) job.errorMessage = msg.errorMessage;
|
||||||
|
|
||||||
|
// Cache last assistant text output for live preview
|
||||||
|
let previewUpdated = false;
|
||||||
|
for (const part of msg.content) {
|
||||||
|
if (part.type === "text") {
|
||||||
|
job.lastPreview = part.text;
|
||||||
|
previewUpdated = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Persist cache to enable live previews after restart
|
||||||
|
if (previewUpdated) {
|
||||||
|
this.persist(job);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
index.ts
12
index.ts
|
|
@ -51,7 +51,7 @@ export default function (pi: ExtensionAPI) {
|
||||||
promptGuidelines: [
|
promptGuidelines: [
|
||||||
"Use fanout_dispatch to run multiple agents in parallel without blocking the main session.",
|
"Use fanout_dispatch to run multiple agents in parallel without blocking the main session.",
|
||||||
"After dispatching, you may do other work. Check status later with fanout_status.",
|
"After dispatching, you may do other work. Check status later with fanout_status.",
|
||||||
"When jobs complete, the system will send a follow-up message. Retrieve output with fanout_collect.",
|
"Completed jobs deliver their output automatically via follow-up messages. Use fanout_collect if you need the full, untruncated result or to archive old jobs.",
|
||||||
],
|
],
|
||||||
|
|
||||||
execute: async (
|
execute: async (
|
||||||
|
|
@ -126,12 +126,14 @@ export default function (pi: ExtensionAPI) {
|
||||||
result.jobs.length > 0
|
result.jobs.length > 0
|
||||||
? "\n\n" +
|
? "\n\n" +
|
||||||
result.jobs
|
result.jobs
|
||||||
.map(
|
.map((j) => {
|
||||||
(j) =>
|
let jobLine =
|
||||||
`- ${j.id} | ${j.agent} | ${j.status}` +
|
`- ${j.id} | ${j.agent} | ${j.status}` +
|
||||||
(j.exitCode !== undefined ? ` (exit ${j.exitCode})` : "") +
|
(j.exitCode !== undefined ? ` (exit ${j.exitCode})` : "") +
|
||||||
(j.turns ? ` | ${j.turns} turns` : ""),
|
(j.turns ? ` | ${j.turns} turns` : "") +
|
||||||
)
|
(j.preview ? `\n Preview: ${j.preview.slice(0, 120).replace(/\n/g, " ")}${j.preview.length > 120 ? "…" : ""}` : "");
|
||||||
|
return jobLine;
|
||||||
|
})
|
||||||
.join("\n")
|
.join("\n")
|
||||||
: "";
|
: "";
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
2
types.ts
2
types.ts
|
|
@ -26,6 +26,8 @@ export interface FanoutJob {
|
||||||
usage: JobUsage;
|
usage: JobUsage;
|
||||||
modelUsed?: string;
|
modelUsed?: string;
|
||||||
stopReason?: string;
|
stopReason?: string;
|
||||||
|
/** Last assistant text output seen while running (for live previews) */
|
||||||
|
lastPreview?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DispatchResult {
|
export interface DispatchResult {
|
||||||
|
|
|
||||||
Reference in New Issue