@leing2021/super-pi 0.22.1 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +66 -293
  2. package/extensions/ce-core/index.ts +276 -48
  3. package/extensions/ce-core/tools/parallel-subagent.ts +3 -3
  4. package/extensions/ce-core/tools/subagent.ts +2 -2
  5. package/package.json +4 -20
  6. package/rules/common/naming.md +154 -0
  7. package/skills/01-brainstorm/SKILL.md +42 -79
  8. package/skills/01-brainstorm/references/ce-brainstorm-mode.md +47 -0
  9. package/skills/02-plan/SKILL.md +43 -61
  10. package/skills/02-plan/references/solution-search.md +46 -0
  11. package/skills/03-work/SKILL.md +34 -52
  12. package/skills/03-work/references/completion-report.md +51 -0
  13. package/skills/04-review/SKILL.md +44 -51
  14. package/skills/04-review/references/solution-search.md +46 -0
  15. package/skills/06-next/SKILL.md +35 -20
  16. package/skills/06-next/references/recommendation-logic.md +47 -2
  17. package/skills/07-worktree/SKILL.md +21 -20
  18. package/skills/08-help/SKILL.md +46 -0
  19. package/skills/08-help/references/workflow-sequence.md +135 -0
  20. package/skills/references/language-detection.md +44 -0
  21. package/LICENSE +0 -21
  22. package/THIRD-PARTY-NOTICES.md +0 -35
  23. package/extensions/subagent/__tests__/async-job-tracker.test.ts +0 -21
  24. package/extensions/subagent/__tests__/execution-activity.test.ts +0 -15
  25. package/extensions/subagent/__tests__/parallel-render-stress.test.ts +0 -82
  26. package/extensions/subagent/__tests__/render-dedup.test.ts +0 -98
  27. package/extensions/subagent/__tests__/render-widget.test.ts +0 -28
  28. package/extensions/subagent/__tests__/throttle.test.ts +0 -90
  29. package/extensions/subagent/agent-management.ts +0 -596
  30. package/extensions/subagent/agent-manager-chain-detail.ts +0 -163
  31. package/extensions/subagent/agent-manager-detail.ts +0 -232
  32. package/extensions/subagent/agent-manager-edit.ts +0 -391
  33. package/extensions/subagent/agent-manager-list.ts +0 -279
  34. package/extensions/subagent/agent-manager-parallel.ts +0 -305
  35. package/extensions/subagent/agent-manager.ts +0 -706
  36. package/extensions/subagent/agent-scope.ts +0 -9
  37. package/extensions/subagent/agent-selection.ts +0 -26
  38. package/extensions/subagent/agent-serializer.ts +0 -124
  39. package/extensions/subagent/agent-templates.ts +0 -63
  40. package/extensions/subagent/agents/context-builder.md +0 -37
  41. package/extensions/subagent/agents/delegate.md +0 -9
  42. package/extensions/subagent/agents/oracle.md +0 -73
  43. package/extensions/subagent/agents/planner.md +0 -52
  44. package/extensions/subagent/agents/researcher.md +0 -50
  45. package/extensions/subagent/agents/reviewer.md +0 -38
  46. package/extensions/subagent/agents/scout.md +0 -48
  47. package/extensions/subagent/agents/worker.md +0 -52
  48. package/extensions/subagent/agents.ts +0 -762
  49. package/extensions/subagent/artifacts.ts +0 -101
  50. package/extensions/subagent/async-execution.ts +0 -521
  51. package/extensions/subagent/async-job-tracker.ts +0 -240
  52. package/extensions/subagent/async-status.ts +0 -242
  53. package/extensions/subagent/chain-clarify.ts +0 -1365
  54. package/extensions/subagent/chain-execution.ts +0 -854
  55. package/extensions/subagent/chain-serializer.ts +0 -127
  56. package/extensions/subagent/completion-dedupe.ts +0 -66
  57. package/extensions/subagent/doctor.ts +0 -201
  58. package/extensions/subagent/execution.ts +0 -748
  59. package/extensions/subagent/file-coalescer.ts +0 -43
  60. package/extensions/subagent/fork-context.ts +0 -64
  61. package/extensions/subagent/formatters.ts +0 -123
  62. package/extensions/subagent/frontmatter.ts +0 -32
  63. package/extensions/subagent/index.ts +0 -586
  64. package/extensions/subagent/intercom-bridge.ts +0 -241
  65. package/extensions/subagent/jsonl-writer.ts +0 -84
  66. package/extensions/subagent/model-fallback.ts +0 -109
  67. package/extensions/subagent/notify.ts +0 -111
  68. package/extensions/subagent/parallel-utils.ts +0 -109
  69. package/extensions/subagent/pi-args.ts +0 -139
  70. package/extensions/subagent/pi-spawn.ts +0 -101
  71. package/extensions/subagent/post-exit-stdio-guard.ts +0 -88
  72. package/extensions/subagent/prompt-template-bridge.ts +0 -400
  73. package/extensions/subagent/prompts/gather-context-and-clarify.md +0 -13
  74. package/extensions/subagent/prompts/parallel-cleanup.md +0 -42
  75. package/extensions/subagent/prompts/parallel-research.md +0 -50
  76. package/extensions/subagent/prompts/parallel-review.md +0 -40
  77. package/extensions/subagent/render-helpers.ts +0 -83
  78. package/extensions/subagent/render.ts +0 -908
  79. package/extensions/subagent/result-intercom.ts +0 -238
  80. package/extensions/subagent/result-watcher.ts +0 -172
  81. package/extensions/subagent/run-history.ts +0 -58
  82. package/extensions/subagent/run-status.ts +0 -137
  83. package/extensions/subagent/schemas.ts +0 -165
  84. package/extensions/subagent/session-tokens.ts +0 -51
  85. package/extensions/subagent/settings.ts +0 -368
  86. package/extensions/subagent/single-output.ts +0 -98
  87. package/extensions/subagent/skills.ts +0 -627
  88. package/extensions/subagent/slash-bridge.ts +0 -177
  89. package/extensions/subagent/slash-commands.ts +0 -304
  90. package/extensions/subagent/slash-live-state.ts +0 -295
  91. package/extensions/subagent/subagent-control.ts +0 -151
  92. package/extensions/subagent/subagent-executor.ts +0 -1915
  93. package/extensions/subagent/subagent-prompt-runtime.ts +0 -76
  94. package/extensions/subagent/subagent-runner.ts +0 -1471
  95. package/extensions/subagent/subagents-status.ts +0 -473
  96. package/extensions/subagent/text-editor.ts +0 -273
  97. package/extensions/subagent/throttle.ts +0 -77
  98. package/extensions/subagent/top-level-async.ts +0 -16
  99. package/extensions/subagent/types.ts +0 -624
  100. package/extensions/subagent/utils.ts +0 -457
  101. package/extensions/subagent/worktree.ts +0 -580
  102. package/extensions/super-pi-extension/agents/ce-oracle.md +0 -109
  103. package/extensions/super-pi-extension/agents/ce-planner.md +0 -116
  104. package/extensions/super-pi-extension/agents/ce-reviewer.md +0 -99
  105. package/extensions/super-pi-extension/agents/ce-scout.md +0 -80
  106. package/extensions/super-pi-extension/agents/ce-worker.md +0 -78
  107. package/extensions/super-pi-extension/chains/ce-parallel-review.chain.md +0 -34
  108. package/extensions/super-pi-extension/chains/ce-review-only.chain.md +0 -12
  109. package/extensions/super-pi-extension/chains/ce-standard.chain.md +0 -28
  110. package/extensions/super-pi-extension/index.ts +0 -129
  111. package/extensions/super-pi-extension/model-sync.ts +0 -204
  112. package/skills/08-status/SKILL.md +0 -41
  113. package/skills/08-status/references/artifact-locations.md +0 -10
  114. package/skills/09-help/SKILL.md +0 -37
  115. package/skills/09-help/references/workflow-sequence.md +0 -9
  116. package/skills/10-rules/SKILL.md +0 -76
  117. package/skills/pi-subagents/SKILL.md +0 -566
@@ -1,177 +0,0 @@
1
- // SPDX-FileCopyrightText: 2025 Nico Bailon
2
- // SPDX-License-Identifier: MIT
3
- // Source: https://github.com/nicobailon/pi-subagents
4
- import type { AgentToolResult } from "@mariozechner/pi-agent-core";
5
- import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
6
- import type { SubagentParamsLike } from "./subagent-executor.js";
7
- import {
8
- SLASH_SUBAGENT_CANCEL_EVENT,
9
- SLASH_SUBAGENT_REQUEST_EVENT,
10
- SLASH_SUBAGENT_RESPONSE_EVENT,
11
- SLASH_SUBAGENT_STARTED_EVENT,
12
- SLASH_SUBAGENT_UPDATE_EVENT,
13
- type Details,
14
- } from "./types.js";
15
-
16
- export interface SlashSubagentRequest {
17
- requestId: string;
18
- params: SubagentParamsLike;
19
- }
20
-
21
- export interface SlashSubagentResponse {
22
- requestId: string;
23
- result: AgentToolResult<Details>;
24
- isError: boolean;
25
- errorText?: string;
26
- }
27
-
28
- export interface SlashSubagentUpdate {
29
- requestId: string;
30
- progress?: Details["progress"];
31
- currentTool?: string;
32
- toolCount?: number;
33
- }
34
-
35
- interface EventBus {
36
- on(event: string, handler: (data: unknown) => void): (() => void) | void;
37
- emit(event: string, data: unknown): void;
38
- }
39
-
40
- interface SlashBridgeOptions {
41
- events: EventBus;
42
- getContext: () => ExtensionContext | null;
43
- execute: (
44
- id: string,
45
- params: SubagentParamsLike,
46
- signal: AbortSignal,
47
- onUpdate: ((r: AgentToolResult<Details>) => void) | undefined,
48
- ctx: ExtensionContext,
49
- ) => Promise<AgentToolResult<Details>>;
50
- }
51
-
52
- export function registerSlashSubagentBridge(options: SlashBridgeOptions): {
53
- cancelAll: () => void;
54
- dispose: () => void;
55
- } {
56
- const controllers = new Map<string, AbortController>();
57
- const pendingCancels = new Set<string>();
58
- const subscriptions: Array<() => void> = [];
59
-
60
- const subscribe = (event: string, handler: (data: unknown) => void): void => {
61
- const unsubscribe = options.events.on(event, handler);
62
- if (typeof unsubscribe === "function") subscriptions.push(unsubscribe);
63
- };
64
-
65
- subscribe(SLASH_SUBAGENT_CANCEL_EVENT, (data) => {
66
- if (!data || typeof data !== "object") return;
67
- const requestId = (data as { requestId?: unknown }).requestId;
68
- if (typeof requestId !== "string") return;
69
- const controller = controllers.get(requestId);
70
- if (controller) {
71
- controller.abort();
72
- return;
73
- }
74
- pendingCancels.add(requestId);
75
- });
76
-
77
- subscribe(SLASH_SUBAGENT_REQUEST_EVENT, async (data) => {
78
- if (!data || typeof data !== "object") return;
79
- const request = data as Partial<SlashSubagentRequest>;
80
- if (typeof request.requestId !== "string" || !request.params) return;
81
- const { requestId, params } = request as SlashSubagentRequest;
82
-
83
- const ctx = options.getContext();
84
- if (!ctx) {
85
- const response: SlashSubagentResponse = {
86
- requestId,
87
- result: {
88
- content: [{ type: "text", text: "No active extension context for slash subagent execution." }],
89
- details: { mode: "single" as const, results: [] },
90
- },
91
- isError: true,
92
- errorText: "No active extension context.",
93
- };
94
- options.events.emit(SLASH_SUBAGENT_RESPONSE_EVENT, response);
95
- return;
96
- }
97
-
98
- const controller = new AbortController();
99
- controllers.set(requestId, controller);
100
-
101
- if (pendingCancels.delete(requestId)) {
102
- controller.abort();
103
- const response: SlashSubagentResponse = {
104
- requestId,
105
- result: {
106
- content: [{ type: "text", text: "Cancelled." }],
107
- details: { mode: "single" as const, results: [] },
108
- },
109
- isError: true,
110
- errorText: "Cancelled before start.",
111
- };
112
- options.events.emit(SLASH_SUBAGENT_RESPONSE_EVENT, response);
113
- controllers.delete(requestId);
114
- return;
115
- }
116
-
117
- options.events.emit(SLASH_SUBAGENT_STARTED_EVENT, { requestId });
118
-
119
- try {
120
- const result = await options.execute(
121
- requestId,
122
- params,
123
- controller.signal,
124
- (update) => {
125
- const progress = update.details?.progress;
126
- const first = progress?.[0];
127
- const payload: SlashSubagentUpdate = {
128
- requestId,
129
- progress,
130
- currentTool: first?.currentTool,
131
- toolCount: first?.toolCount,
132
- };
133
- options.events.emit(SLASH_SUBAGENT_UPDATE_EVENT, payload);
134
- },
135
- ctx,
136
- );
137
-
138
- const response: SlashSubagentResponse = {
139
- requestId,
140
- result,
141
- isError: (result as { isError?: boolean }).isError === true,
142
- errorText: (result as { isError?: boolean }).isError
143
- ? result.content.find((c) => c.type === "text")?.text
144
- : undefined,
145
- };
146
- options.events.emit(SLASH_SUBAGENT_RESPONSE_EVENT, response);
147
- } catch (error) {
148
- const response: SlashSubagentResponse = {
149
- requestId,
150
- result: {
151
- content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }],
152
- details: { mode: "single" as const, results: [] },
153
- },
154
- isError: true,
155
- errorText: error instanceof Error ? error.message : String(error),
156
- };
157
- options.events.emit(SLASH_SUBAGENT_RESPONSE_EVENT, response);
158
- } finally {
159
- controllers.delete(requestId);
160
- }
161
- });
162
-
163
- return {
164
- cancelAll: () => {
165
- for (const controller of controllers.values()) {
166
- controller.abort();
167
- }
168
- controllers.clear();
169
- pendingCancels.clear();
170
- },
171
- dispose: () => {
172
- for (const unsubscribe of subscriptions) unsubscribe();
173
- subscriptions.length = 0;
174
- pendingCancels.clear();
175
- },
176
- };
177
- }
@@ -1,304 +0,0 @@
1
- // SPDX-FileCopyrightText: 2025 Nico Bailon
2
- // SPDX-License-Identifier: MIT
3
- // Source: https://github.com/nicobailon/pi-subagents
4
- import { randomUUID } from "node:crypto";
5
- import * as fs from "node:fs";
6
- import * as path from "node:path";
7
- import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
8
- import { Key, matchesKey } from "@mariozechner/pi-tui";
9
- import { discoverAgentsAll } from "./agents.ts";
10
- import { AgentManagerComponent, type ManagerResult } from "./agent-manager.ts";
11
- import { SubagentsStatusComponent } from "./subagents-status.ts";
12
- import { discoverAvailableSkills } from "./skills.ts";
13
- import type { SubagentParamsLike } from "./subagent-executor.ts";
14
- import type { SlashSubagentResponse, SlashSubagentUpdate } from "./slash-bridge.ts";
15
- import {
16
- applySlashUpdate,
17
- buildSlashInitialResult,
18
- failSlashResult,
19
- finalizeSlashResult,
20
- } from "./slash-live-state.ts";
21
- import {
22
- SLASH_RESULT_TYPE,
23
- SLASH_SUBAGENT_CANCEL_EVENT,
24
- SLASH_SUBAGENT_REQUEST_EVENT,
25
- SLASH_SUBAGENT_RESPONSE_EVENT,
26
- SLASH_SUBAGENT_STARTED_EVENT,
27
- SLASH_SUBAGENT_UPDATE_EVENT,
28
- type SingleResult,
29
- type SubagentState,
30
- } from "./types.ts";
31
-
32
- function extractSlashMessageText(content: string | Array<{ type?: string; text?: string }>): string {
33
- if (typeof content === "string") return content;
34
- if (!Array.isArray(content)) return "";
35
- return content
36
- .filter((part): part is { type: "text"; text: string } => part?.type === "text" && typeof part.text === "string")
37
- .map((part) => part.text)
38
- .join("\n");
39
- }
40
-
41
- function formatExportPathList(paths: string[]): string {
42
- return paths.map((file) => `- \`${file}\``).join("\n");
43
- }
44
-
45
- function collectResultPaths(results: SingleResult[], getPath: (result: SingleResult) => string | undefined): string[] {
46
- return results
47
- .map(getPath)
48
- .filter((file): file is string => typeof file === "string" && file.length > 0);
49
- }
50
-
51
- function buildSlashExportText(response: SlashSubagentResponse): string {
52
- const output = extractSlashMessageText(response.result.content) || response.errorText || "(no output)";
53
- const results = response.result.details?.results ?? [];
54
- const sessionFiles = collectResultPaths(results, (result) => result.sessionFile);
55
- const savedOutputs = collectResultPaths(results, (result) => result.savedOutputPath);
56
- const artifactOutputs = collectResultPaths(results, (result) => result.artifactPaths?.outputPath);
57
- const sections = ["## Subagent result", output];
58
- if (sessionFiles.length > 0) sections.push("## Child session exports", formatExportPathList(sessionFiles));
59
- if (savedOutputs.length > 0) sections.push("## Saved outputs", formatExportPathList(savedOutputs));
60
- if (artifactOutputs.length > 0) sections.push("## Artifact outputs", formatExportPathList(artifactOutputs));
61
- return sections.join("\n\n");
62
- }
63
-
64
- function persistSlashSessionSnapshot(ctx: ExtensionContext): void {
65
- try {
66
- if (!ctx.sessionManager) return;
67
- const sessionManager = ctx.sessionManager as typeof ctx.sessionManager & {
68
- _rewriteFile?: () => void;
69
- flushed?: boolean;
70
- };
71
- const sessionFile = sessionManager.getSessionFile();
72
- if (!sessionFile || typeof sessionManager._rewriteFile !== "function") return;
73
- fs.mkdirSync(path.dirname(sessionFile), { recursive: true });
74
- sessionManager._rewriteFile();
75
- sessionManager.flushed = true;
76
- } catch (error) {
77
- console.error("Failed to persist slash session snapshot for export:", error);
78
- }
79
- }
80
-
81
- async function requestSlashRun(
82
- pi: ExtensionAPI,
83
- ctx: ExtensionContext,
84
- requestId: string,
85
- params: SubagentParamsLike,
86
- ): Promise<SlashSubagentResponse> {
87
- return new Promise((resolve, reject) => {
88
- let done = false;
89
- let started = false;
90
-
91
- const startTimeoutMs = 15_000;
92
- const startTimeout = setTimeout(() => {
93
- finish(() => reject(new Error(
94
- "Slash subagent bridge did not start within 15s. Ensure the extension is loaded correctly.",
95
- )));
96
- }, startTimeoutMs);
97
-
98
- const onStarted = (data: unknown) => {
99
- if (done || !data || typeof data !== "object") return;
100
- if ((data as { requestId?: unknown }).requestId !== requestId) return;
101
- started = true;
102
- clearTimeout(startTimeout);
103
- if (ctx.hasUI) ctx.ui.setStatus("subagent-slash", "running...");
104
- };
105
-
106
- const onResponse = (data: unknown) => {
107
- if (done || !data || typeof data !== "object") return;
108
- const response = data as Partial<SlashSubagentResponse>;
109
- if (response.requestId !== requestId) return;
110
- clearTimeout(startTimeout);
111
- finish(() => resolve(response as SlashSubagentResponse));
112
- };
113
-
114
- const onUpdate = (data: unknown) => {
115
- if (done || !data || typeof data !== "object") return;
116
- const update = data as SlashSubagentUpdate;
117
- if (update.requestId !== requestId) return;
118
- applySlashUpdate(requestId, update);
119
- if (!ctx.hasUI) return;
120
- const tool = update.currentTool ? ` ${update.currentTool}` : "";
121
- const count = update.toolCount ?? 0;
122
- ctx.ui.setStatus("subagent-slash", `${count} tools${tool} | Ctrl+O live detail`);
123
- };
124
-
125
- const onTerminalInput = ctx.hasUI
126
- ? ctx.ui.onTerminalInput((input) => {
127
- if (!matchesKey(input, Key.escape)) return undefined;
128
- pi.events.emit(SLASH_SUBAGENT_CANCEL_EVENT, { requestId });
129
- finish(() => reject(new Error("Cancelled")));
130
- return { consume: true };
131
- })
132
- : undefined;
133
-
134
- const unsubStarted = pi.events.on(SLASH_SUBAGENT_STARTED_EVENT, onStarted);
135
- const unsubResponse = pi.events.on(SLASH_SUBAGENT_RESPONSE_EVENT, onResponse);
136
- const unsubUpdate = pi.events.on(SLASH_SUBAGENT_UPDATE_EVENT, onUpdate);
137
-
138
- const finish = (next: () => void) => {
139
- if (done) return;
140
- done = true;
141
- clearTimeout(startTimeout);
142
- unsubStarted();
143
- unsubResponse();
144
- unsubUpdate();
145
- onTerminalInput?.();
146
- next();
147
- };
148
-
149
- pi.events.emit(SLASH_SUBAGENT_REQUEST_EVENT, { requestId, params });
150
-
151
- // Bridge emits STARTED synchronously during REQUEST emit.
152
- // If not started, no bridge received the request.
153
- if (!started && done) return;
154
- if (!started) {
155
- finish(() => reject(new Error(
156
- "No slash subagent bridge responded. Ensure the subagent extension is loaded correctly.",
157
- )));
158
- }
159
- });
160
- }
161
-
162
- async function runSlashSubagent(
163
- pi: ExtensionAPI,
164
- ctx: ExtensionContext,
165
- params: SubagentParamsLike,
166
- ): Promise<void> {
167
- const requestId = randomUUID();
168
- const initialDetails = buildSlashInitialResult(requestId, params);
169
- const initialText = extractSlashMessageText(initialDetails.result.content) || "Running subagent...";
170
- pi.sendMessage({
171
- customType: SLASH_RESULT_TYPE,
172
- content: initialText,
173
- display: true,
174
- details: initialDetails,
175
- });
176
- persistSlashSessionSnapshot(ctx);
177
-
178
- try {
179
- const response = await requestSlashRun(pi, ctx, requestId, params);
180
- const finalDetails = finalizeSlashResult(response);
181
- pi.sendMessage({
182
- customType: SLASH_RESULT_TYPE,
183
- content: buildSlashExportText(response),
184
- display: true,
185
- details: finalDetails,
186
- });
187
- persistSlashSessionSnapshot(ctx);
188
- if (ctx.hasUI) {
189
- ctx.ui.setStatus("subagent-slash", undefined);
190
- }
191
- if (response.isError && ctx.hasUI) {
192
- ctx.ui.notify(response.errorText || "Subagent failed", "error");
193
- }
194
- } catch (error) {
195
- const message = error instanceof Error ? error.message : String(error);
196
- const failedDetails = failSlashResult(requestId, params, message);
197
- pi.sendMessage({
198
- customType: SLASH_RESULT_TYPE,
199
- content: `## Subagent result\n\n${message}`,
200
- display: true,
201
- details: failedDetails,
202
- });
203
- persistSlashSessionSnapshot(ctx);
204
- if (ctx.hasUI) {
205
- ctx.ui.setStatus("subagent-slash", undefined);
206
- }
207
- if (message === "Cancelled") {
208
- if (ctx.hasUI) ctx.ui.notify("Cancelled", "warning");
209
- return;
210
- }
211
- if (ctx.hasUI) ctx.ui.notify(message, "error");
212
- }
213
- }
214
-
215
- async function openAgentManager(
216
- pi: ExtensionAPI,
217
- ctx: ExtensionContext,
218
- ): Promise<void> {
219
- const agentData = { ...discoverAgentsAll(ctx.cwd), cwd: ctx.cwd };
220
- const models = ctx.modelRegistry.getAvailable().map((m) => ({
221
- provider: m.provider,
222
- id: m.id,
223
- fullId: `${m.provider}/${m.id}`,
224
- }));
225
- const skills = discoverAvailableSkills(ctx.cwd);
226
-
227
- const result = await ctx.ui.custom<ManagerResult>(
228
- (tui, theme, _kb, done) => new AgentManagerComponent(tui, theme, agentData, models, skills, done),
229
- { overlay: true, overlayOptions: { anchor: "center", width: 84, maxHeight: "80%" } },
230
- );
231
- if (!result) return;
232
-
233
- const launchOptions: SubagentParamsLike = {
234
- clarify: !result.skipClarify && !result.background,
235
- agentScope: "both",
236
- ...(result.fork ? { context: "fork" as const } : {}),
237
- ...(result.background ? { async: true } : {}),
238
- };
239
-
240
- if (result.action === "chain") {
241
- const chain = result.agents.map((name, i) => ({
242
- agent: name,
243
- ...(i === 0 ? { task: result.task } : {}),
244
- }));
245
- await runSlashSubagent(pi, ctx, { chain, task: result.task, ...launchOptions });
246
- return;
247
- }
248
-
249
- if (result.action === "launch") {
250
- await runSlashSubagent(pi, ctx, { agent: result.agent, task: result.task, ...launchOptions });
251
- } else if (result.action === "launch-chain") {
252
- const chain = result.chain.steps.map((step) => ({
253
- agent: step.agent,
254
- task: step.task || undefined,
255
- output: step.output,
256
- reads: step.reads,
257
- progress: step.progress,
258
- skill: step.skills,
259
- model: step.model,
260
- }));
261
- await runSlashSubagent(pi, ctx, { chain, task: result.task, ...launchOptions, ...(result.worktree ? { worktree: true } : {}) });
262
- } else if (result.action === "parallel") {
263
- await runSlashSubagent(pi, ctx, {
264
- tasks: result.tasks,
265
- ...launchOptions,
266
- ...(result.worktree ? { worktree: true } : {}),
267
- });
268
- }
269
- }
270
-
271
- export function registerSlashCommands(
272
- pi: ExtensionAPI,
273
- state: SubagentState,
274
- ): void {
275
- pi.registerCommand("agents", {
276
- description: "Open the Agents Manager",
277
- handler: async (_args, ctx) => {
278
- await openAgentManager(pi, ctx);
279
- },
280
- });
281
-
282
- pi.registerCommand("subagents-status", {
283
- description: "Show active and recent async subagent runs",
284
- handler: async (_args, ctx) => {
285
- await ctx.ui.custom<void>(
286
- (tui, theme, _kb, done) => new SubagentsStatusComponent(tui, theme, () => done(undefined)),
287
- { overlay: true, overlayOptions: { anchor: "center", width: 84, maxHeight: "80%" } },
288
- );
289
- },
290
- });
291
-
292
- pi.registerCommand("subagents-doctor", {
293
- description: "Show subagent diagnostics",
294
- handler: async (_args, ctx) => {
295
- await runSlashSubagent(pi, ctx, { action: "doctor" });
296
- },
297
- });
298
-
299
- pi.registerShortcut("ctrl+shift+a", {
300
- handler: async (ctx) => {
301
- await openAgentManager(pi, ctx);
302
- },
303
- });
304
- }