@gjczone/pi-swarm 0.1.2

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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/dist/index.d.ts +13 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +99 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/shared/controller.d.ts +86 -0
  8. package/dist/shared/controller.d.ts.map +1 -0
  9. package/dist/shared/controller.js +662 -0
  10. package/dist/shared/controller.js.map +1 -0
  11. package/dist/shared/pi-invoke.d.ts +31 -0
  12. package/dist/shared/pi-invoke.d.ts.map +1 -0
  13. package/dist/shared/pi-invoke.js +54 -0
  14. package/dist/shared/pi-invoke.js.map +1 -0
  15. package/dist/shared/render.d.ts +44 -0
  16. package/dist/shared/render.d.ts.map +1 -0
  17. package/dist/shared/render.js +116 -0
  18. package/dist/shared/render.js.map +1 -0
  19. package/dist/shared/spawner.d.ts +26 -0
  20. package/dist/shared/spawner.d.ts.map +1 -0
  21. package/dist/shared/spawner.js +226 -0
  22. package/dist/shared/spawner.js.map +1 -0
  23. package/dist/shared/types.d.ts +182 -0
  24. package/dist/shared/types.d.ts.map +1 -0
  25. package/dist/shared/types.js +8 -0
  26. package/dist/shared/types.js.map +1 -0
  27. package/dist/state/persistence.d.ts +83 -0
  28. package/dist/state/persistence.d.ts.map +1 -0
  29. package/dist/state/persistence.js +215 -0
  30. package/dist/state/persistence.js.map +1 -0
  31. package/dist/state/recovery.d.ts +35 -0
  32. package/dist/state/recovery.d.ts.map +1 -0
  33. package/dist/state/recovery.js +149 -0
  34. package/dist/state/recovery.js.map +1 -0
  35. package/dist/swarm/command.d.ts +36 -0
  36. package/dist/swarm/command.d.ts.map +1 -0
  37. package/dist/swarm/command.js +113 -0
  38. package/dist/swarm/command.js.map +1 -0
  39. package/dist/swarm/mode.d.ts +58 -0
  40. package/dist/swarm/mode.d.ts.map +1 -0
  41. package/dist/swarm/mode.js +87 -0
  42. package/dist/swarm/mode.js.map +1 -0
  43. package/dist/swarm/tool.d.ts +11 -0
  44. package/dist/swarm/tool.d.ts.map +1 -0
  45. package/dist/swarm/tool.js +190 -0
  46. package/dist/swarm/tool.js.map +1 -0
  47. package/dist/team/command.d.ts +11 -0
  48. package/dist/team/command.d.ts.map +1 -0
  49. package/dist/team/command.js +32 -0
  50. package/dist/team/command.js.map +1 -0
  51. package/dist/team/mailbox.d.ts +61 -0
  52. package/dist/team/mailbox.d.ts.map +1 -0
  53. package/dist/team/mailbox.js +160 -0
  54. package/dist/team/mailbox.js.map +1 -0
  55. package/dist/team/supervisor.d.ts +77 -0
  56. package/dist/team/supervisor.d.ts.map +1 -0
  57. package/dist/team/supervisor.js +195 -0
  58. package/dist/team/supervisor.js.map +1 -0
  59. package/dist/team/task-graph.d.ts +61 -0
  60. package/dist/team/task-graph.d.ts.map +1 -0
  61. package/dist/team/task-graph.js +193 -0
  62. package/dist/team/task-graph.js.map +1 -0
  63. package/dist/team/tool.d.ts +11 -0
  64. package/dist/team/tool.d.ts.map +1 -0
  65. package/dist/team/tool.js +210 -0
  66. package/dist/team/tool.js.map +1 -0
  67. package/dist/tui/permission-prompt.d.ts +26 -0
  68. package/dist/tui/permission-prompt.d.ts.map +1 -0
  69. package/dist/tui/permission-prompt.js +94 -0
  70. package/dist/tui/permission-prompt.js.map +1 -0
  71. package/dist/tui/progress.d.ts +64 -0
  72. package/dist/tui/progress.d.ts.map +1 -0
  73. package/dist/tui/progress.js +260 -0
  74. package/dist/tui/progress.js.map +1 -0
  75. package/dist/tui/swarm-markers.d.ts +20 -0
  76. package/dist/tui/swarm-markers.d.ts.map +1 -0
  77. package/dist/tui/swarm-markers.js +61 -0
  78. package/dist/tui/swarm-markers.js.map +1 -0
  79. package/package.json +58 -0
@@ -0,0 +1,190 @@
1
+ /**
2
+ * swarm/tool — AgentSwarm tool registration.
3
+ *
4
+ * Registers the `AgentSwarm` tool that the LLM can call to launch
5
+ * multiple subagents from a shared prompt template.
6
+ *
7
+ * Ported from MoonshotAI/kimi-code's AgentSwarmTool.
8
+ */
9
+ import { Type } from "typebox";
10
+ import { SubagentBatchController, resolveSwarmMaxConcurrency, } from "../shared/controller.js";
11
+ import { renderSwarmResults, toSwarmRunResults } from "../shared/render.js";
12
+ import { spawnSubagent, resumeSubagent, retrySubagent, } from "../shared/spawner.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Constants
15
+ // ---------------------------------------------------------------------------
16
+ const DEFAULT_SUBAGENT_TYPE = "coder";
17
+ const PROMPT_TEMPLATE_PLACEHOLDER = "{{item}}";
18
+ const MAX_AGENT_SWARM_SUBAGENTS = 128;
19
+ const DEFAULT_SUBAGENT_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
20
+ const AGENT_SWARM_DESCRIPTION = `Launch multiple subagents from one prompt template, existing agent resumes, or both.
21
+
22
+ Use AgentSwarm when many subagents should run the same kind of task over different inputs. The placeholder is exactly \`{{item}}\`. For example, with \`prompt_template\` set to \`Review {{item}} for likely regressions.\` and \`items\` set to \`["src/a.ts", "src/b.ts"]\`, AgentSwarm launches two new subagents with those two concrete prompts.
23
+
24
+ Use \`resume_agent_ids\` to continue subagents that already exist from earlier work, such as ones that failed or timed out: map each agent id to the prompt for that resumed subagent (usually \`continue\` if no extra information is needed). You may combine \`resume_agent_ids\` with \`items\` in the same call to resume existing subagents and launch new ones. Do not duplicate resumed work in \`items\`.
25
+
26
+ Use enough subagents to keep the work focused and parallel. AgentSwarm supports up to 128 subagents, and launches are queued automatically, so it is safe to split large tasks into many clear, independent items.
27
+
28
+ If \`AgentSwarm\` is called, that call must be the only tool call in the response.`;
29
+ // ---------------------------------------------------------------------------
30
+ // Registration
31
+ // ---------------------------------------------------------------------------
32
+ export function registerAgentSwarmTool(pi) {
33
+ pi.registerTool({
34
+ name: "AgentSwarm",
35
+ label: "Agent Swarm",
36
+ description: AGENT_SWARM_DESCRIPTION,
37
+ parameters: Type.Object({
38
+ description: Type.String({
39
+ description: "Short description for the whole swarm.",
40
+ }),
41
+ subagent_type: Type.Optional(Type.String({
42
+ description: "Subagent type used for every spawned subagent. Defaults to coder when omitted.",
43
+ })),
44
+ prompt_template: Type.Optional(Type.String({
45
+ description: `Prompt template for each subagent. The ${PROMPT_TEMPLATE_PLACEHOLDER} placeholder is replaced with each item value.`,
46
+ })),
47
+ items: Type.Optional(Type.Array(Type.String(), {
48
+ maxItems: MAX_AGENT_SWARM_SUBAGENTS,
49
+ description: "Values used to fill the {{item}} placeholder. Each item launches one new subagent.",
50
+ })),
51
+ resume_agent_ids: Type.Optional(Type.Record(Type.String(), Type.String(), {
52
+ description: "Map of existing subagent agent_id to the prompt used to resume that subagent. Resumed subagents launch before new item-based subagents.",
53
+ })),
54
+ }, { additionalProperties: false }),
55
+ execute: async (toolCallId, params, signal, _onUpdate, _ctx) => {
56
+ const { description, subagent_type, prompt_template, items, resume_agent_ids } = params;
57
+ try {
58
+ const profileName = normalizeOptionalString(subagent_type) ??
59
+ DEFAULT_SUBAGENT_TYPE;
60
+ // Build specs
61
+ const specs = createAgentSwarmSpecs({
62
+ items,
63
+ resume_agent_ids,
64
+ prompt_template,
65
+ });
66
+ // Convert to queued tasks
67
+ const tasks = specs.map((spec) => {
68
+ const descriptionName = spec.kind === "resume" ? "resume" : profileName;
69
+ const common = {
70
+ data: spec,
71
+ profileName: spec.kind === "resume" ? "subagent" : profileName,
72
+ parentToolCallId: toolCallId,
73
+ prompt: spec.prompt,
74
+ description: childDescription(description, spec.index, descriptionName),
75
+ swarmIndex: spec.index,
76
+ runInBackground: false,
77
+ swarmItem: spec.item,
78
+ signal,
79
+ timeout: DEFAULT_SUBAGENT_TIMEOUT_MS,
80
+ };
81
+ if (spec.kind === "resume") {
82
+ return {
83
+ ...common,
84
+ kind: "resume",
85
+ resumeAgentId: spec.agentId,
86
+ };
87
+ }
88
+ return {
89
+ ...common,
90
+ kind: "spawn",
91
+ };
92
+ });
93
+ // Run with controller
94
+ const maxConcurrency = resolveSwarmMaxConcurrency(process.cwd());
95
+ const controller = new SubagentBatchController({ spawn: spawnSubagent, resume: resumeSubagent, retry: retrySubagent }, tasks, { maxConcurrency });
96
+ const results = await controller.run();
97
+ // Render output
98
+ const swarmResults = toSwarmRunResults(results);
99
+ const output = renderSwarmResults(swarmResults);
100
+ return {
101
+ content: [{ type: "text", text: output }],
102
+ details: undefined,
103
+ };
104
+ }
105
+ catch (error) {
106
+ const message = error instanceof Error ? error.message : String(error);
107
+ return {
108
+ content: [{ type: "text", text: `AgentSwarm failed: ${message}` }],
109
+ isError: true,
110
+ details: undefined,
111
+ };
112
+ }
113
+ },
114
+ });
115
+ }
116
+ // ---------------------------------------------------------------------------
117
+ // Spec creation (from kimi-code)
118
+ // ---------------------------------------------------------------------------
119
+ function createAgentSwarmSpecs(args) {
120
+ const resumeEntries = Object.entries(args.resume_agent_ids ?? {}).map(([agentId, prompt]) => ({
121
+ agentId: agentId.trim(),
122
+ prompt: prompt.trim(),
123
+ }));
124
+ const items = (args.items ?? []).map((item) => item.trim());
125
+ const itemCount = items.length;
126
+ const resumeCount = resumeEntries.length;
127
+ const totalCount = resumeCount + itemCount;
128
+ if (!hasMinimumAgentSwarmInputs(itemCount, resumeCount)) {
129
+ throw new Error("AgentSwarm requires at least 2 items unless resume_agent_ids is provided.");
130
+ }
131
+ if (totalCount > MAX_AGENT_SWARM_SUBAGENTS) {
132
+ throw new Error(`AgentSwarm supports at most ${String(MAX_AGENT_SWARM_SUBAGENTS)} subagents.`);
133
+ }
134
+ const promptTemplate = normalizeOptionalString(args.prompt_template);
135
+ if (items.length > 0 && promptTemplate === undefined) {
136
+ throw new Error("prompt_template is required when items are provided.");
137
+ }
138
+ if (promptTemplate !== undefined &&
139
+ !promptTemplate.includes(PROMPT_TEMPLATE_PLACEHOLDER)) {
140
+ throw new Error(`prompt_template must include the ${PROMPT_TEMPLATE_PLACEHOLDER} placeholder.`);
141
+ }
142
+ const seenPrompts = new Map();
143
+ const specs = [];
144
+ // Resume entries first
145
+ for (const entry of resumeEntries) {
146
+ specs.push({
147
+ kind: "resume",
148
+ index: specs.length + 1,
149
+ agentId: entry.agentId,
150
+ prompt: entry.prompt,
151
+ });
152
+ }
153
+ // Item-based spawns
154
+ if (items.length > 0) {
155
+ const itemPromptTemplate = promptTemplate;
156
+ items.forEach((item, index) => {
157
+ const prompt = itemPromptTemplate
158
+ .split(PROMPT_TEMPLATE_PLACEHOLDER)
159
+ .join(item);
160
+ const previousIndex = seenPrompts.get(prompt);
161
+ if (previousIndex !== undefined) {
162
+ throw new Error(`Duplicate subagent prompts from items ${String(previousIndex)} and ${String(index + 1)}. AgentSwarm requires distinct subagents.`);
163
+ }
164
+ seenPrompts.set(prompt, index + 1);
165
+ specs.push({
166
+ kind: "spawn",
167
+ index: specs.length + 1,
168
+ item,
169
+ prompt,
170
+ });
171
+ });
172
+ }
173
+ return specs;
174
+ }
175
+ // ---------------------------------------------------------------------------
176
+ // Helpers
177
+ // ---------------------------------------------------------------------------
178
+ function hasMinimumAgentSwarmInputs(itemCount, resumeCount) {
179
+ return resumeCount > 0 || itemCount >= 2;
180
+ }
181
+ function childDescription(swarmDescription, index, profileName) {
182
+ return `${swarmDescription} #${String(index)} (${profileName})`;
183
+ }
184
+ function normalizeOptionalString(value) {
185
+ if (value === undefined)
186
+ return undefined;
187
+ const trimmed = value.trim();
188
+ return trimmed.length > 0 ? trimmed : undefined;
189
+ }
190
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/swarm/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * team/command — /swarm-team slash command handler.
3
+ *
4
+ * Supports:
5
+ * /swarm-team <goal> — launch a team run for the given goal
6
+ *
7
+ * The command delegates to the AgentTeam tool internally.
8
+ */
9
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
10
+ export declare function registerTeamCommand(pi: ExtensionAPI): void;
11
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/team/command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,iCAAiC,CAAC;AAM7F,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,YAAY,GACf,IAAI,CAyBN"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * team/command — /swarm-team slash command handler.
3
+ *
4
+ * Supports:
5
+ * /swarm-team <goal> — launch a team run for the given goal
6
+ *
7
+ * The command delegates to the AgentTeam tool internally.
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Registration
11
+ // ---------------------------------------------------------------------------
12
+ export function registerTeamCommand(pi) {
13
+ pi.registerCommand("swarm-team", {
14
+ description: "Launch a collaborative team of role-based agents to complete a complex task. " +
15
+ "Usage: /swarm-team <goal>",
16
+ async handler(args, ctx) {
17
+ const prompt = args.trim();
18
+ if (prompt.length === 0) {
19
+ ctx.ui?.notify?.("Usage: /swarm-team <goal>", "warning");
20
+ return;
21
+ }
22
+ // Send the goal as a user prompt — the LLM can then decide
23
+ // whether to call AgentTeam or handle it differently.
24
+ pi.sendMessage({
25
+ customType: "swarm_team:prompt",
26
+ content: `Launch a team to: ${prompt}`,
27
+ display: true,
28
+ });
29
+ },
30
+ });
31
+ }
32
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/team/command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,mBAAmB,CACjC,EAAgB;IAEhB,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE;QAC/B,WAAW,EACT,+EAA+E;YAC/E,2BAA2B;QAC7B,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,GAA4B;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE3B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CACd,2BAA2B,EAC3B,SAAS,CACV,CAAC;gBACF,OAAO;YACT,CAAC;YAED,2DAA2D;YAC3D,sDAAsD;YACtD,EAAE,CAAC,WAAW,CAAC;gBACb,UAAU,EAAE,mBAAmB;gBAC/B,OAAO,EAAE,qBAAqB,MAAM,EAAE;gBACtC,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * team/mailbox — JSONL-based mailbox for inter-agent communication.
3
+ *
4
+ * Each team run has a shared mailbox directory under .pi/swarm/mailbox/
5
+ * where agents write messages (outbox) and read messages (inbox).
6
+ *
7
+ * Inspired by pi-crew's mailbox system.
8
+ */
9
+ import type { MailboxMessage } from "../shared/types.js";
10
+ /**
11
+ * Resolve mailbox paths for a team run.
12
+ *
13
+ * {crewRoot}/state/runs/{runId}/mailbox/
14
+ * inbox.jsonl — team-level inbox
15
+ * outbox.jsonl — team-level outbox
16
+ * delivery.json — delivery state
17
+ * tasks/{taskId}/
18
+ * inbox.jsonl — per-task inbox
19
+ * outbox.jsonl — per-task outbox
20
+ */
21
+ export interface MailboxPaths {
22
+ readonly root: string;
23
+ readonly inbox: string;
24
+ readonly outbox: string;
25
+ readonly delivery: string;
26
+ readonly taskDir: string;
27
+ }
28
+ export declare function resolveMailboxPaths(crewRoot: string, runId: string): MailboxPaths;
29
+ export declare function resolveTaskMailboxPaths(crewRoot: string, runId: string, taskId: string): {
30
+ inbox: string;
31
+ outbox: string;
32
+ };
33
+ /**
34
+ * Ensure the mailbox directory structure exists.
35
+ */
36
+ export declare function ensureMailbox(paths: MailboxPaths): void;
37
+ /**
38
+ * Send a message to the team outbox and the recipient's per-task inbox.
39
+ */
40
+ export declare function sendMessage(paths: MailboxPaths, message: MailboxMessage): void;
41
+ /**
42
+ * Read unacknowledged messages from the team inbox.
43
+ */
44
+ export declare function readInbox(paths: MailboxPaths): MailboxMessage[];
45
+ /**
46
+ * Read messages from a task-specific inbox.
47
+ */
48
+ export declare function readTaskInbox(paths: MailboxPaths, taskId: string): MailboxMessage[];
49
+ /**
50
+ * Acknowledge (delete) messages from the team inbox.
51
+ */
52
+ export declare function ackMessages(paths: MailboxPaths, messageIds: string[]): void;
53
+ /**
54
+ * Get delivery state (which messages have been delivered/read).
55
+ */
56
+ export declare function getDeliveryState(paths: MailboxPaths): Record<string, string>;
57
+ /**
58
+ * Update delivery state for a message.
59
+ */
60
+ export declare function updateDeliveryState(paths: MailboxPaths, messageId: string, status: string): void;
61
+ //# sourceMappingURL=mailbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../src/team/mailbox.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMzD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,YAAY,CAed;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAcnC;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CASvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,GACtB,IAAI,CAmBN;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,EAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,GACb,cAAc,EAAE,CAOlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,IAAI,CAQN"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * team/mailbox — JSONL-based mailbox for inter-agent communication.
3
+ *
4
+ * Each team run has a shared mailbox directory under .pi/swarm/mailbox/
5
+ * where agents write messages (outbox) and read messages (inbox).
6
+ *
7
+ * Inspired by pi-crew's mailbox system.
8
+ */
9
+ import * as fs from "node:fs";
10
+ import * as path from "node:path";
11
+ export function resolveMailboxPaths(crewRoot, runId) {
12
+ const root = path.join(crewRoot, "state", "runs", runId, "mailbox");
13
+ return {
14
+ root,
15
+ inbox: path.join(root, "inbox.jsonl"),
16
+ outbox: path.join(root, "outbox.jsonl"),
17
+ delivery: path.join(root, "delivery.json"),
18
+ taskDir: path.join(root, "tasks"),
19
+ };
20
+ }
21
+ export function resolveTaskMailboxPaths(crewRoot, runId, taskId) {
22
+ const base = path.join(crewRoot, "state", "runs", runId, "mailbox", "tasks", taskId);
23
+ return {
24
+ inbox: path.join(base, "inbox.jsonl"),
25
+ outbox: path.join(base, "outbox.jsonl"),
26
+ };
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Mailbox operations
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Ensure the mailbox directory structure exists.
33
+ */
34
+ export function ensureMailbox(paths) {
35
+ fs.mkdirSync(paths.root, { recursive: true });
36
+ fs.mkdirSync(paths.taskDir, { recursive: true });
37
+ // Create files if they don't exist
38
+ for (const file of [paths.inbox, paths.outbox, paths.delivery]) {
39
+ if (!fs.existsSync(file)) {
40
+ fs.writeFileSync(file, "", "utf-8");
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * Send a message to the team outbox and the recipient's per-task inbox.
46
+ */
47
+ export function sendMessage(paths, message) {
48
+ ensureMailbox(paths);
49
+ // Append to team outbox
50
+ appendJsonLine(paths.outbox, message);
51
+ // If addressed to a specific agent, also put in their task inbox
52
+ if (message.to && message.to !== "broadcast") {
53
+ const taskPaths = resolveTaskMailboxPaths(paths.root.replace(/\/state\/runs\/[^/]+\/mailbox$/, ""), // extract crewRoot
54
+ extractRunId(paths.root), message.to);
55
+ // Actually, we need proper path derivation. Let's use a simpler approach:
56
+ // The task inbox is under the taskDir.
57
+ const taskInbox = path.join(paths.taskDir, message.to, "inbox.jsonl");
58
+ fs.mkdirSync(path.dirname(taskInbox), { recursive: true });
59
+ appendJsonLine(taskInbox, message);
60
+ }
61
+ }
62
+ /**
63
+ * Read unacknowledged messages from the team inbox.
64
+ */
65
+ export function readInbox(paths) {
66
+ return readJsonLines(paths.inbox);
67
+ }
68
+ /**
69
+ * Read messages from a task-specific inbox.
70
+ */
71
+ export function readTaskInbox(paths, taskId) {
72
+ const taskPaths = resolveTaskMailboxPaths(extractCrewRoot(paths.root), extractRunId(paths.root), taskId);
73
+ return readJsonLines(taskPaths.inbox);
74
+ }
75
+ /**
76
+ * Acknowledge (delete) messages from the team inbox.
77
+ */
78
+ export function ackMessages(paths, messageIds) {
79
+ const messages = readJsonLines(paths.inbox);
80
+ const idSet = new Set(messageIds);
81
+ const remaining = messages.filter((m) => !idSet.has(m.messageId));
82
+ writeJsonLines(paths.inbox, remaining);
83
+ }
84
+ /**
85
+ * Get delivery state (which messages have been delivered/read).
86
+ */
87
+ export function getDeliveryState(paths) {
88
+ try {
89
+ const raw = fs.readFileSync(paths.delivery, "utf-8");
90
+ if (!raw.trim())
91
+ return {};
92
+ return JSON.parse(raw);
93
+ }
94
+ catch {
95
+ return {};
96
+ }
97
+ }
98
+ /**
99
+ * Update delivery state for a message.
100
+ */
101
+ export function updateDeliveryState(paths, messageId, status) {
102
+ const state = getDeliveryState(paths);
103
+ state[messageId] = status;
104
+ fs.writeFileSync(paths.delivery, JSON.stringify(state, null, 2), "utf-8");
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Helpers
108
+ // ---------------------------------------------------------------------------
109
+ function appendJsonLine(filePath, data) {
110
+ const line = JSON.stringify(data) + "\n";
111
+ fs.appendFileSync(filePath, line, "utf-8");
112
+ }
113
+ function readJsonLines(filePath) {
114
+ try {
115
+ const raw = fs.readFileSync(filePath, "utf-8");
116
+ if (!raw.trim())
117
+ return [];
118
+ return raw
119
+ .trim()
120
+ .split("\n")
121
+ .filter((line) => line.trim())
122
+ .map((line) => {
123
+ try {
124
+ return JSON.parse(line);
125
+ }
126
+ catch {
127
+ return null;
128
+ }
129
+ })
130
+ .filter((m) => m !== null);
131
+ }
132
+ catch {
133
+ return [];
134
+ }
135
+ }
136
+ function writeJsonLines(filePath, messages) {
137
+ const content = messages
138
+ .map((m) => JSON.stringify(m))
139
+ .join("\n");
140
+ fs.writeFileSync(filePath, content + (content ? "\n" : ""), "utf-8");
141
+ }
142
+ function extractRunId(mailboxRoot) {
143
+ // mailboxRoot = .../state/runs/{runId}/mailbox
144
+ const parts = mailboxRoot.split(path.sep);
145
+ const mailboxIdx = parts.lastIndexOf("mailbox");
146
+ if (mailboxIdx >= 2 && parts[mailboxIdx - 2] === "runs") {
147
+ return parts[mailboxIdx - 1];
148
+ }
149
+ return "unknown";
150
+ }
151
+ function extractCrewRoot(mailboxRoot) {
152
+ // mailboxRoot = {crewRoot}/state/runs/{runId}/mailbox
153
+ const parts = mailboxRoot.split(path.sep);
154
+ const stateIdx = parts.lastIndexOf("state");
155
+ if (stateIdx >= 0) {
156
+ return parts.slice(0, stateIdx).join(path.sep);
157
+ }
158
+ return mailboxRoot;
159
+ }
160
+ //# sourceMappingURL=mailbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../src/team/mailbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * team/supervisor — team supervisor agent.
3
+ *
4
+ * The supervisor decomposes a high-level goal into phases, assigns
5
+ * each phase to a role agent, monitors progress via the mailbox,
6
+ * and synthesizes the final result.
7
+ */
8
+ import type { AgentRole, TeamPhase, AgentRoleConfig } from "../shared/types.js";
9
+ import { TaskGraph, type PhaseState } from "./task-graph.js";
10
+ import { type MailboxPaths } from "./mailbox.js";
11
+ export interface TeamSupervisorConfig {
12
+ /** Working directory for the team run. */
13
+ readonly cwd: string;
14
+ /** Crew root for state persistence. */
15
+ readonly crewRoot: string;
16
+ /** Unique run identifier. */
17
+ readonly runId: string;
18
+ /** High-level goal. */
19
+ readonly goal: string;
20
+ /** Custom phases (defaults to explore/plan/implement/review/test). */
21
+ readonly phases?: readonly TeamPhase[];
22
+ /** Custom role configs. */
23
+ readonly roles?: readonly AgentRoleConfig[];
24
+ /** Max concurrent agents. */
25
+ readonly maxAgents?: number;
26
+ }
27
+ export interface TeamRunState {
28
+ readonly runId: string;
29
+ readonly goal: string;
30
+ status: "running" | "completed" | "failed";
31
+ taskGraph: TaskGraph;
32
+ agentIds: Map<string, string>;
33
+ startedAt: number;
34
+ completedAt?: number;
35
+ }
36
+ export declare class TeamSupervisor {
37
+ readonly config: TeamSupervisorConfig;
38
+ readonly state: TeamRunState;
39
+ readonly mailboxPaths: MailboxPaths;
40
+ constructor(config: TeamSupervisorConfig);
41
+ /**
42
+ * Get the next phase that is ready to execute (dependencies satisfied,
43
+ * not yet started or assigned).
44
+ */
45
+ getNextReadyPhase(): PhaseState | undefined;
46
+ /**
47
+ * Start the next ready phase and return the role + prompt for the agent.
48
+ */
49
+ startNextPhase(): {
50
+ phase: PhaseState;
51
+ role: AgentRole;
52
+ prompt: string;
53
+ } | null;
54
+ /**
55
+ * Mark a phase as completed with its result.
56
+ */
57
+ completePhase(name: string, result: string): void;
58
+ /**
59
+ * Mark a phase as failed.
60
+ */
61
+ failPhase(name: string, error: string): void;
62
+ /**
63
+ * Assign an agent to a phase.
64
+ */
65
+ assignAgent(phaseName: string, agentId: string): void;
66
+ /** Check if the entire run is complete. */
67
+ isComplete(): boolean;
68
+ /** Finalize the run with an overall status. */
69
+ finalize(): void;
70
+ /**
71
+ * Synthesize the final team result from all completed phases.
72
+ */
73
+ synthesizeResult(): string;
74
+ private buildPhasePrompt;
75
+ private buildSummary;
76
+ }
77
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/team/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EAET,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAMtB,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,qBAAa,cAAc;IACzB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;gBAExB,MAAM,EAAE,oBAAoB;IAwBxC;;;OAGG;IACH,iBAAiB,IAAI,UAAU,GAAG,SAAS;IAmB3C;;OAEG;IACH,cAAc,IAAI;QAChB,KAAK,EAAE,UAAU,CAAC;QAClB,IAAI,EAAE,SAAS,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI;IAeR;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMjD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAc5C;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASrD,2CAA2C;IAC3C,UAAU,IAAI,OAAO;IAIrB,+CAA+C;IAC/C,QAAQ,IAAI,IAAI;IAKhB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAkC1B,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,YAAY;CAkBrB"}