symphony-github 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +341 -0
  3. package/config.example.yaml +101 -0
  4. package/dist/agents/launcher.d.ts +24 -0
  5. package/dist/agents/launcher.d.ts.map +1 -0
  6. package/dist/agents/launcher.js +152 -0
  7. package/dist/agents/launcher.js.map +1 -0
  8. package/dist/agents/registry.d.ts +10 -0
  9. package/dist/agents/registry.d.ts.map +1 -0
  10. package/dist/agents/registry.js +324 -0
  11. package/dist/agents/registry.js.map +1 -0
  12. package/dist/agents/runner.d.ts +58 -0
  13. package/dist/agents/runner.d.ts.map +1 -0
  14. package/dist/agents/runner.js +1190 -0
  15. package/dist/agents/runner.js.map +1 -0
  16. package/dist/app.d.ts +11 -0
  17. package/dist/app.d.ts.map +1 -0
  18. package/dist/app.js +829 -0
  19. package/dist/app.js.map +1 -0
  20. package/dist/components/ActivityView.d.ts +9 -0
  21. package/dist/components/ActivityView.d.ts.map +1 -0
  22. package/dist/components/ActivityView.js +73 -0
  23. package/dist/components/ActivityView.js.map +1 -0
  24. package/dist/components/Header.d.ts +12 -0
  25. package/dist/components/Header.d.ts.map +1 -0
  26. package/dist/components/Header.js +44 -0
  27. package/dist/components/Header.js.map +1 -0
  28. package/dist/components/IssueList.d.ts +10 -0
  29. package/dist/components/IssueList.d.ts.map +1 -0
  30. package/dist/components/IssueList.js +119 -0
  31. package/dist/components/IssueList.js.map +1 -0
  32. package/dist/components/Onboarding.d.ts +26 -0
  33. package/dist/components/Onboarding.d.ts.map +1 -0
  34. package/dist/components/Onboarding.js +948 -0
  35. package/dist/components/Onboarding.js.map +1 -0
  36. package/dist/components/PaneView.d.ts +9 -0
  37. package/dist/components/PaneView.d.ts.map +1 -0
  38. package/dist/components/PaneView.js +74 -0
  39. package/dist/components/PaneView.js.map +1 -0
  40. package/dist/components/StartupRecoveryView.d.ts +13 -0
  41. package/dist/components/StartupRecoveryView.d.ts.map +1 -0
  42. package/dist/components/StartupRecoveryView.js +85 -0
  43. package/dist/components/StartupRecoveryView.js.map +1 -0
  44. package/dist/components/StatusBar.d.ts +9 -0
  45. package/dist/components/StatusBar.d.ts.map +1 -0
  46. package/dist/components/StatusBar.js +70 -0
  47. package/dist/components/StatusBar.js.map +1 -0
  48. package/dist/components/TableView.d.ts +8 -0
  49. package/dist/components/TableView.d.ts.map +1 -0
  50. package/dist/components/TableView.js +87 -0
  51. package/dist/components/TableView.js.map +1 -0
  52. package/dist/config/index.d.ts +18 -0
  53. package/dist/config/index.d.ts.map +1 -0
  54. package/dist/config/index.js +357 -0
  55. package/dist/config/index.js.map +1 -0
  56. package/dist/git/merge.d.ts +23 -0
  57. package/dist/git/merge.d.ts.map +1 -0
  58. package/dist/git/merge.js +131 -0
  59. package/dist/git/merge.js.map +1 -0
  60. package/dist/git/utils.d.ts +34 -0
  61. package/dist/git/utils.d.ts.map +1 -0
  62. package/dist/git/utils.js +214 -0
  63. package/dist/git/utils.js.map +1 -0
  64. package/dist/git/worktree.d.ts +23 -0
  65. package/dist/git/worktree.d.ts.map +1 -0
  66. package/dist/git/worktree.js +116 -0
  67. package/dist/git/worktree.js.map +1 -0
  68. package/dist/index.d.ts +3 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +225 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/paths.d.ts +21 -0
  73. package/dist/paths.d.ts.map +1 -0
  74. package/dist/paths.js +59 -0
  75. package/dist/paths.js.map +1 -0
  76. package/dist/runModes.d.ts +7 -0
  77. package/dist/runModes.d.ts.map +1 -0
  78. package/dist/runModes.js +36 -0
  79. package/dist/runModes.js.map +1 -0
  80. package/dist/services/daemon.d.ts +85 -0
  81. package/dist/services/daemon.d.ts.map +1 -0
  82. package/dist/services/daemon.js +836 -0
  83. package/dist/services/daemon.js.map +1 -0
  84. package/dist/services/github.d.ts +101 -0
  85. package/dist/services/github.d.ts.map +1 -0
  86. package/dist/services/github.js +367 -0
  87. package/dist/services/github.js.map +1 -0
  88. package/dist/services/githubProgressReporter.d.ts +33 -0
  89. package/dist/services/githubProgressReporter.d.ts.map +1 -0
  90. package/dist/services/githubProgressReporter.js +272 -0
  91. package/dist/services/githubProgressReporter.js.map +1 -0
  92. package/dist/services/runtime.d.ts +43 -0
  93. package/dist/services/runtime.d.ts.map +1 -0
  94. package/dist/services/runtime.js +126 -0
  95. package/dist/services/runtime.js.map +1 -0
  96. package/dist/services/state.d.ts +43 -0
  97. package/dist/services/state.d.ts.map +1 -0
  98. package/dist/services/state.js +176 -0
  99. package/dist/services/state.js.map +1 -0
  100. package/dist/services/tmux.d.ts +50 -0
  101. package/dist/services/tmux.d.ts.map +1 -0
  102. package/dist/services/tmux.js +157 -0
  103. package/dist/services/tmux.js.map +1 -0
  104. package/dist/swarm/backlog.d.ts +25 -0
  105. package/dist/swarm/backlog.d.ts.map +1 -0
  106. package/dist/swarm/backlog.js +83 -0
  107. package/dist/swarm/backlog.js.map +1 -0
  108. package/dist/swarm/config.d.ts +14 -0
  109. package/dist/swarm/config.d.ts.map +1 -0
  110. package/dist/swarm/config.js +112 -0
  111. package/dist/swarm/config.js.map +1 -0
  112. package/dist/swarm/dependencies.d.ts +36 -0
  113. package/dist/swarm/dependencies.d.ts.map +1 -0
  114. package/dist/swarm/dependencies.js +141 -0
  115. package/dist/swarm/dependencies.js.map +1 -0
  116. package/dist/swarm/director.d.ts +67 -0
  117. package/dist/swarm/director.d.ts.map +1 -0
  118. package/dist/swarm/director.js +358 -0
  119. package/dist/swarm/director.js.map +1 -0
  120. package/dist/swarm/directorPrompt.d.ts +15 -0
  121. package/dist/swarm/directorPrompt.d.ts.map +1 -0
  122. package/dist/swarm/directorPrompt.js +60 -0
  123. package/dist/swarm/directorPrompt.js.map +1 -0
  124. package/dist/swarm/index.d.ts +7 -0
  125. package/dist/swarm/index.d.ts.map +1 -0
  126. package/dist/swarm/index.js +6 -0
  127. package/dist/swarm/index.js.map +1 -0
  128. package/dist/swarm/proposals.d.ts +29 -0
  129. package/dist/swarm/proposals.d.ts.map +1 -0
  130. package/dist/swarm/proposals.js +141 -0
  131. package/dist/swarm/proposals.js.map +1 -0
  132. package/dist/swarm/types.d.ts +65 -0
  133. package/dist/swarm/types.d.ts.map +1 -0
  134. package/dist/swarm/types.js +3 -0
  135. package/dist/swarm/types.js.map +1 -0
  136. package/dist/theme.d.ts +64 -0
  137. package/dist/theme.d.ts.map +1 -0
  138. package/dist/theme.js +161 -0
  139. package/dist/theme.js.map +1 -0
  140. package/dist/triggers/index.d.ts +17 -0
  141. package/dist/triggers/index.d.ts.map +1 -0
  142. package/dist/triggers/index.js +124 -0
  143. package/dist/triggers/index.js.map +1 -0
  144. package/dist/types.d.ts +327 -0
  145. package/dist/types.d.ts.map +1 -0
  146. package/dist/types.js +6 -0
  147. package/dist/types.js.map +1 -0
  148. package/dist/utils/duplicateDetection.d.ts +14 -0
  149. package/dist/utils/duplicateDetection.d.ts.map +1 -0
  150. package/dist/utils/duplicateDetection.js +45 -0
  151. package/dist/utils/duplicateDetection.js.map +1 -0
  152. package/dist/utils/shell.d.ts +46 -0
  153. package/dist/utils/shell.d.ts.map +1 -0
  154. package/dist/utils/shell.js +79 -0
  155. package/dist/utils/shell.js.map +1 -0
  156. package/dist/utils/slug.d.ts +13 -0
  157. package/dist/utils/slug.d.ts.map +1 -0
  158. package/dist/utils/slug.js +32 -0
  159. package/dist/utils/slug.js.map +1 -0
  160. package/dist/version.d.ts +28 -0
  161. package/dist/version.d.ts.map +1 -0
  162. package/dist/version.js +105 -0
  163. package/dist/version.js.map +1 -0
  164. package/examples/run-claude.example.sh +11 -0
  165. package/examples/run-codex.example.sh +11 -0
  166. package/package.json +68 -0
@@ -0,0 +1,358 @@
1
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join, resolve, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { TmuxService } from '../services/tmux.js';
5
+ import { GitHubClient } from '../services/github.js';
6
+ import { buildInitialPromptCommand, isAgentName } from '../agents/registry.js';
7
+ import { buildDirectorPrompt } from './directorPrompt.js';
8
+ import { ProposalStore } from './proposals.js';
9
+ import { DependencyGraph } from './dependencies.js';
10
+ import { BacklogManager } from './backlog.js';
11
+ import { proposalsDirPath } from './config.js';
12
+ /**
13
+ * Manages the Director Agent lifecycle and swarm orchestration.
14
+ *
15
+ * The Director is a long-lived Claude agent in its own tmux pane.
16
+ * It reviews proposals, manages dependencies, and evolves the project.
17
+ */
18
+ export class DirectorService {
19
+ settings;
20
+ swarm;
21
+ tmux;
22
+ github;
23
+ proposals;
24
+ deps;
25
+ backlog;
26
+ runtime;
27
+ directorPanes = new Map(); // key → pane
28
+ recentCompletions = [];
29
+ lastEvolutionCycle = 0;
30
+ constructor(settings, runtime) {
31
+ this.settings = settings;
32
+ this.swarm = settings.swarm;
33
+ this.tmux = TmuxService.getInstance();
34
+ this.github = new GitHubClient();
35
+ this.proposals = new ProposalStore();
36
+ this.deps = new DependencyGraph();
37
+ this.backlog = new BacklogManager(this.swarm.backlog);
38
+ this.runtime = runtime;
39
+ }
40
+ /** Launch director pane(s) based on scope configuration. */
41
+ async start(sessionName) {
42
+ const panes = [];
43
+ switch (this.swarm.director.scope) {
44
+ case 'session': {
45
+ const pane = await this.launchDirectorPane(sessionName, 'all', this.settings.repos.map(r => r.repo));
46
+ panes.push(pane);
47
+ break;
48
+ }
49
+ case 'organization': {
50
+ // Group repos by org
51
+ const orgRepos = new Map();
52
+ for (const repoConfig of this.settings.repos) {
53
+ const org = repoConfig.repo.split('/')[0];
54
+ const repos = orgRepos.get(org) || [];
55
+ repos.push(repoConfig.repo);
56
+ orgRepos.set(org, repos);
57
+ }
58
+ for (const [org, repos] of orgRepos) {
59
+ const pane = await this.launchDirectorPane(sessionName, org, repos);
60
+ panes.push(pane);
61
+ }
62
+ break;
63
+ }
64
+ case 'repo': {
65
+ for (const repoConfig of this.settings.repos) {
66
+ const pane = await this.launchDirectorPane(sessionName, repoConfig.repo, [repoConfig.repo]);
67
+ panes.push(pane);
68
+ }
69
+ break;
70
+ }
71
+ }
72
+ return panes;
73
+ }
74
+ /** Get all director panes. */
75
+ getDirectorPanes() {
76
+ return Array.from(this.directorPanes.values());
77
+ }
78
+ /**
79
+ * Process approved proposals: create GitHub issues and manage dependencies.
80
+ * Called by the daemon during each poll cycle.
81
+ */
82
+ async processApprovedProposals() {
83
+ const approved = this.proposals.listByStatus('approved');
84
+ for (const proposal of approved) {
85
+ // Skip if already has a created issue number (already processed)
86
+ if (proposal.created_issue_number)
87
+ continue;
88
+ try {
89
+ await this.handleApprovedProposal(proposal);
90
+ }
91
+ catch (err) {
92
+ // Log but don't throw - continue processing other proposals
93
+ console.error(`Failed to process proposal ${proposal.id}:`, err);
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Auto-approve proposals if approval_mode is 'auto'.
99
+ * Called by the daemon during each poll cycle.
100
+ */
101
+ async autoApproveProposals() {
102
+ if (this.swarm.proposals.approval_mode !== 'auto')
103
+ return;
104
+ const pending = this.proposals.listPending();
105
+ for (const proposal of pending) {
106
+ this.proposals.approve(proposal.id);
107
+ }
108
+ }
109
+ /**
110
+ * Check blocked issues — if all blockers are resolved, resume the issue.
111
+ * Called by the daemon during each poll cycle.
112
+ */
113
+ async reconcileDependencies() {
114
+ const readyIssues = this.deps.getReadyIssues();
115
+ for (const dep of readyIssues) {
116
+ try {
117
+ const { repo, number } = dep.issue;
118
+ // Remove paused label, add trigger label to resume
119
+ await this.github.removeLabel(repo, number, this.swarm.labels.paused);
120
+ await this.github.addLabels(repo, number, [this.settings.trigger.labels[0] || 'agent']);
121
+ // Comment explaining the resumption
122
+ const resolvedBlockers = dep.blocked_by.map(b => `#${b.number}`).join(', ');
123
+ await this.github.addComment(repo, number, `**Symphony Director**: Unblocked. All blockers resolved (${resolvedBlockers || 'none remaining'}). Resuming work.`);
124
+ // Clean up the dependency entry
125
+ this.deps.remove(dep.issue);
126
+ }
127
+ catch (err) {
128
+ console.error(`Failed to resume ${dep.issue.repo}#${dep.issue.number}:`, err);
129
+ }
130
+ }
131
+ }
132
+ /**
133
+ * Update the director's context file with fresh state.
134
+ * Called by the daemon during each poll cycle.
135
+ */
136
+ async updateDirectorContext(activeRuns) {
137
+ const repos = this.settings.repos.map(r => r.repo);
138
+ const pending = this.proposals.listPending();
139
+ const blocked = this.deps.getBlockedIssues();
140
+ const promptContent = buildDirectorPrompt(this.swarm, {
141
+ repos,
142
+ activeRuns,
143
+ pendingProposals: pending,
144
+ blockedIssues: blocked,
145
+ recentCompletions: this.recentCompletions,
146
+ });
147
+ // Write context to each director's working directory
148
+ for (const pane of this.directorPanes.values()) {
149
+ if (pane.worktree_path) {
150
+ const contextDir = join(pane.worktree_path, '.symphony');
151
+ if (!existsSync(contextDir))
152
+ mkdirSync(contextDir, { recursive: true });
153
+ writeFileSync(join(contextDir, 'director-context.md'), promptContent);
154
+ }
155
+ }
156
+ // Update backlog
157
+ this.backlog.update({
158
+ activeRuns,
159
+ blockedIssues: blocked,
160
+ pendingProposals: pending,
161
+ recentCompletions: this.recentCompletions,
162
+ });
163
+ }
164
+ /** Record a completed run for backlog tracking. */
165
+ recordCompletion(pane) {
166
+ this.recentCompletions.unshift(pane);
167
+ if (this.recentCompletions.length > 50) {
168
+ this.recentCompletions = this.recentCompletions.slice(0, 50);
169
+ }
170
+ // Check if this completion resolves any blockers
171
+ if (pane.repo && pane.issue_number && pane.status === 'success') {
172
+ const unblocked = this.deps.resolveBlocker({
173
+ repo: pane.repo,
174
+ number: pane.issue_number,
175
+ });
176
+ if (unblocked.length > 0) {
177
+ // Will be handled in next reconcileDependencies() call
178
+ }
179
+ }
180
+ }
181
+ /** Get pending proposals (for TUI display in human_approval mode). */
182
+ getPendingProposals() {
183
+ return this.proposals.listPending();
184
+ }
185
+ /** Human approves a proposal from the TUI. */
186
+ async humanApproveProposal(proposalId) {
187
+ this.proposals.approve(proposalId);
188
+ }
189
+ /** Human rejects a proposal from the TUI. */
190
+ async humanRejectProposal(proposalId, reason) {
191
+ this.proposals.reject(proposalId, reason);
192
+ }
193
+ /** Check if it's time for an evolution cycle. */
194
+ shouldRunEvolution() {
195
+ const interval = this.swarm.director.analyze_interval_min * 60 * 1000;
196
+ return Date.now() - this.lastEvolutionCycle >= interval;
197
+ }
198
+ /** Mark evolution cycle as complete. */
199
+ markEvolutionComplete() {
200
+ this.lastEvolutionCycle = Date.now();
201
+ }
202
+ /**
203
+ * Trigger one director analysis/evolution cycle in every idle director pane.
204
+ * Returns the number of panes that received a new cycle prompt.
205
+ */
206
+ async runEvolutionCycle() {
207
+ let dispatched = 0;
208
+ for (const pane of this.directorPanes.values()) {
209
+ if (!pane.tmux_pane_id || !(await this.tmux.paneExists(pane.tmux_pane_id))) {
210
+ continue;
211
+ }
212
+ const content = await this.tmux.getPaneContent(pane.tmux_pane_id, 40);
213
+ if (!isShellPrompt(content)) {
214
+ continue;
215
+ }
216
+ const agentName = this.swarm.director.agent;
217
+ const prompt = [
218
+ 'Read the latest director context at .symphony/director-context.md and run one orchestration cycle.',
219
+ 'Review pending proposals, blocked work, recent completions, and current backlog state.',
220
+ 'If you discover worthwhile follow-up work, use symphony-propose to submit proposals.',
221
+ 'If no action is needed, say so briefly and exit.',
222
+ ].join('\n');
223
+ let command;
224
+ if (isAgentName(agentName)) {
225
+ command = buildInitialPromptCommand(agentName, prompt, 'bypassPermissions');
226
+ }
227
+ else {
228
+ command = `${agentName} "${prompt.replace(/"/g, '\\"')}"`;
229
+ }
230
+ await this.tmux.sendShellCommand(pane.tmux_pane_id, command);
231
+ pane.status = 'running';
232
+ pane.status_detail = `Director cycle at ${new Date().toISOString()}`;
233
+ dispatched++;
234
+ }
235
+ if (dispatched > 0) {
236
+ this.markEvolutionComplete();
237
+ }
238
+ return dispatched;
239
+ }
240
+ // ── Private helpers ──
241
+ async launchDirectorPane(sessionName, scopeLabel, repos) {
242
+ // Use the first repo's clone as the working directory
243
+ const firstRepo = repos[0];
244
+ const clonePath = join(this.settings.clone_root, firstRepo.replace('/', '__'));
245
+ // Create tmux window for director
246
+ const windowName = `director-${scopeLabel.replace('/', '-')}`;
247
+ const cwd = existsSync(clonePath) ? clonePath : this.settings.clone_root;
248
+ const paneId = await this.tmux.createWindow(sessionName, windowName, cwd);
249
+ // Set up env vars
250
+ const proposeBin = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', 'bin');
251
+ const envCmds = [
252
+ `export SYMPHONY_PROPOSE_DIR="${proposalsDirPath()}"`,
253
+ `export PATH="${proposeBin}:$PATH"`,
254
+ ];
255
+ for (const cmd of envCmds) {
256
+ await this.tmux.sendShellCommand(paneId, cmd);
257
+ }
258
+ await sleep(200);
259
+ // Build and write the initial director context
260
+ const contextDir = join(cwd, '.symphony');
261
+ if (!existsSync(contextDir))
262
+ mkdirSync(contextDir, { recursive: true });
263
+ const initialPrompt = buildDirectorPrompt(this.swarm, {
264
+ repos,
265
+ activeRuns: [],
266
+ pendingProposals: this.proposals.listPending(),
267
+ blockedIssues: this.deps.getBlockedIssues(),
268
+ recentCompletions: [],
269
+ });
270
+ writeFileSync(join(contextDir, 'director-context.md'), initialPrompt);
271
+ // Launch the director agent
272
+ const agentName = this.swarm.director.agent;
273
+ const launchPrompt = [
274
+ 'You are the Symphony Director Agent. Read your context file at .symphony/director-context.md',
275
+ 'and begin your orchestration loop. This file is updated periodically with fresh state.',
276
+ '',
277
+ 'Start by checking for pending proposals and monitoring active work.',
278
+ ].join('\n');
279
+ let command;
280
+ if (isAgentName(agentName)) {
281
+ command = buildInitialPromptCommand(agentName, launchPrompt, 'bypassPermissions');
282
+ }
283
+ else {
284
+ command = `${agentName} "${launchPrompt.replace(/"/g, '\\"')}"`;
285
+ }
286
+ await this.tmux.sendShellCommand(paneId, command);
287
+ const pane = {
288
+ id: `director-${scopeLabel}`,
289
+ slug: windowName,
290
+ type: 'director',
291
+ agent_name: agentName,
292
+ status: 'running',
293
+ status_detail: `Director for ${scopeLabel}`,
294
+ tmux_pane_id: paneId,
295
+ worktree_path: cwd,
296
+ started_at: new Date().toISOString(),
297
+ };
298
+ this.directorPanes.set(scopeLabel, pane);
299
+ return pane;
300
+ }
301
+ async handleApprovedProposal(proposal) {
302
+ const { parent_issue, title, body, labels, type, urgency } = proposal;
303
+ // Build labels for the new issue
304
+ const issueLabels = [
305
+ ...(this.settings.trigger.labels[0] ? [this.settings.trigger.labels[0]] : ['agent']),
306
+ this.swarm.labels.proposed,
307
+ ...labels,
308
+ ];
309
+ if (urgency === 'blocker') {
310
+ issueLabels.push(this.swarm.labels.blocker);
311
+ }
312
+ // Compose issue body with provenance
313
+ const issueBody = [
314
+ body,
315
+ '',
316
+ '---',
317
+ `_Proposed by agent working on ${parent_issue.repo}#${parent_issue.number}_`,
318
+ `_Type: ${type} | Urgency: ${urgency}_`,
319
+ `_Approved by Symphony Director_`,
320
+ ].join('\n');
321
+ // Create the issue on GitHub
322
+ const created = await this.github.createIssue(parent_issue.repo, {
323
+ title,
324
+ body: issueBody,
325
+ labels: issueLabels,
326
+ });
327
+ // Update proposal with created issue number
328
+ this.proposals.approve(proposal.id, created.number);
329
+ // If blocker, pause the parent issue and record dependency
330
+ if (urgency === 'blocker') {
331
+ this.deps.addBlocker(parent_issue, {
332
+ repo: parent_issue.repo,
333
+ number: created.number,
334
+ });
335
+ // Pause parent issue
336
+ await this.github.addLabels(parent_issue.repo, parent_issue.number, [this.swarm.labels.paused]);
337
+ try {
338
+ await this.github.removeLabel(parent_issue.repo, parent_issue.number, this.settings.trigger.claim_label || 'agent:running');
339
+ }
340
+ catch {
341
+ // Ignore if label doesn't exist
342
+ }
343
+ await this.github.addComment(parent_issue.repo, parent_issue.number, `**Symphony Director**: Paused. Blocker issue #${created.number} ("${title}") must be resolved first.`);
344
+ }
345
+ }
346
+ }
347
+ function sleep(ms) {
348
+ return new Promise(resolve => setTimeout(resolve, ms));
349
+ }
350
+ function isShellPrompt(content) {
351
+ const lastLine = content
352
+ .split('\n')
353
+ .map(line => line.trim())
354
+ .filter(Boolean)
355
+ .at(-1) || '';
356
+ return /^\[[^\]]+\]\s*[$#%]\s*$/.test(lastLine) || /^[^>\n]*[$#%]\s*$/.test(lastLine);
357
+ }
358
+ //# sourceMappingURL=director.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"director.js","sourceRoot":"","sources":["../../src/swarm/director.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SymphonyPane } from '../types.js';
2
+ import type { IssueProposal, IssueDependency, SwarmSettings } from './types.js';
3
+ interface DirectorState {
4
+ repos: string[];
5
+ activeRuns: SymphonyPane[];
6
+ pendingProposals: IssueProposal[];
7
+ blockedIssues: IssueDependency[];
8
+ recentCompletions: SymphonyPane[];
9
+ }
10
+ /**
11
+ * Build the system prompt / context file for the Director agent.
12
+ */
13
+ export declare function buildDirectorPrompt(settings: SwarmSettings, state: DirectorState): string;
14
+ export {};
15
+ //# sourceMappingURL=directorPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directorPrompt.d.ts","sourceRoot":"","sources":["../../src/swarm/directorPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhF,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,iBAAiB,EAAE,YAAY,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,aAAa,GACnB,MAAM,CAgIR"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Build the system prompt / context file for the Director agent.
3
+ */
4
+ export function buildDirectorPrompt(settings, state) {
5
+ const repoList = state.repos.join(', ');
6
+ const parts = [];
7
+ parts.push('# Symphony Director Agent', '', `You are the Director of an autonomous agent swarm working on: ${repoList}.`, '', '## Your Responsibilities', '', '1. **Review proposals**: Check for pending proposals from worker agents and approve or reject them.', '2. **Create issues**: When you approve a proposal or identify improvements, create GitHub issues.', '3. **Manage dependencies**: When a blocker is found, pause the blocked issue and track the dependency.', '4. **Monitor progress**: Read agent traces to understand what workers are doing.', '5. **Maintain backlog**: Update the backlog with current state and evolution plan.', '6. **Evolve the project**: Periodically analyze the codebase for improvement opportunities.', '');
8
+ // Available commands
9
+ parts.push('## Available Commands', '');
10
+ for (const repo of state.repos) {
11
+ parts.push(`- \`gh issue create --repo ${repo} --title "..." --body "..." --label agent,${settings.labels.proposed}\``, `- \`gh issue edit <number> --repo ${repo} --add-label ${settings.labels.paused} --remove-label agent:running\``, `- \`gh issue edit <number> --repo ${repo} --remove-label ${settings.labels.paused} --add-label agent\``);
12
+ }
13
+ parts.push('', '- `ls ~/.symphony/swarm/proposals/` — list proposal files', '- `cat ~/.symphony/swarm/proposals/<id>.json` — read a specific proposal', '- `symphony-approve <proposal-id>` — approve a proposal', '- `symphony-reject <proposal-id> --reason "..."` — reject a proposal', '- `cat ~/.symphony/swarm/dependencies.json` — view issue dependency graph', '- `cat ~/.symphony/swarm/backlog.md` — read current backlog', '- `tmux capture-pane -t <pane_id> -p` — read a worker agent\'s terminal output', '');
14
+ // Current state
15
+ parts.push('## Current State', '');
16
+ // Active runs
17
+ if (state.activeRuns.length > 0) {
18
+ parts.push('### Active Runs', '');
19
+ for (const run of state.activeRuns) {
20
+ const paused = run.swarm_status?.is_paused ? ' [PAUSED]' : '';
21
+ parts.push(`- **${run.repo}#${run.issue_number}**: ${run.issue_title || 'untitled'}` +
22
+ ` (${run.agent_name || 'unknown'}, status: ${run.status}${paused})` +
23
+ (run.tmux_pane_id ? ` [pane: ${run.tmux_pane_id}]` : ''));
24
+ }
25
+ parts.push('');
26
+ }
27
+ else {
28
+ parts.push('### Active Runs', '', 'No active runs.', '');
29
+ }
30
+ // Pending proposals
31
+ if (state.pendingProposals.length > 0) {
32
+ parts.push('### Pending Proposals (NEEDS YOUR ACTION)', '');
33
+ for (const proposal of state.pendingProposals) {
34
+ parts.push(`- **${proposal.id}**: "${proposal.title}"`, ` Type: ${proposal.type} | Urgency: ${proposal.urgency}`, ` From: run ${proposal.proposed_by_run_id} (${proposal.parent_issue.repo}#${proposal.parent_issue.number})`, ` Body: ${proposal.body.slice(0, 200)}${proposal.body.length > 200 ? '...' : ''}`, '');
35
+ }
36
+ }
37
+ // Blocked issues
38
+ if (state.blockedIssues.length > 0) {
39
+ parts.push('### Blocked Issues', '');
40
+ for (const dep of state.blockedIssues) {
41
+ const blockers = dep.blocked_by.map(b => `${b.repo}#${b.number}`).join(', ');
42
+ parts.push(`- **${dep.issue.repo}#${dep.issue.number}** blocked by: ${blockers}`);
43
+ }
44
+ parts.push('');
45
+ }
46
+ // Recent completions
47
+ if (state.recentCompletions.length > 0) {
48
+ parts.push('### Recently Completed', '');
49
+ for (const run of state.recentCompletions.slice(0, 10)) {
50
+ parts.push(`- ${run.repo}#${run.issue_number}: ${run.issue_title || 'untitled'} → ${run.status}`);
51
+ }
52
+ parts.push('');
53
+ }
54
+ // Rules
55
+ parts.push('## Rules', '', '- Only create issues that don\'t duplicate existing open issues or active runs.', '- Blocker-urgency bugs should pause the parent issue immediately.', '- When all blockers for a paused issue are resolved, resume it by relabeling.', '- Update the backlog after every significant action.', `- Be conservative with auto-created improvement issues (max ${settings.director.max_proposed_issues} per evolution cycle).`, '- Always add a comment on issues you pause or resume explaining why.', '- When approving a proposal, create the issue on GitHub, then run symphony-approve.', '');
56
+ // Workflow
57
+ parts.push('## Your Workflow', '', 'Continuously loop through these steps:', '1. Check for pending proposals → approve/reject each one', '2. For approved blocker proposals: create the issue, pause the parent, record dependency', '3. Check blocked issues → if their blockers are resolved (label agent:done), resume them', '4. Monitor active worker panes for problems or stuck agents', '5. Periodically analyze the codebase for improvement opportunities', '6. Update the backlog file', '7. Wait a minute, then repeat', '');
58
+ return parts.join('\n');
59
+ }
60
+ //# sourceMappingURL=directorPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directorPrompt.js","sourceRoot":"","sources":["../../src/swarm/directorPrompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { DirectorService } from './director.js';
2
+ export { ProposalStore } from './proposals.js';
3
+ export { DependencyGraph } from './dependencies.js';
4
+ export { BacklogManager } from './backlog.js';
5
+ export { parseSwarmSettings, swarmDirPath, proposalsDirPath, dependenciesFilePath } from './config.js';
6
+ export type { SwarmSettings, DirectorScope, ProposalApprovalMode, IssueProposal, IssueDependency, IssueRef, BacklogEntry, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swarm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvG,YAAY,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,YAAY,GACb,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { DirectorService } from './director.js';
2
+ export { ProposalStore } from './proposals.js';
3
+ export { DependencyGraph } from './dependencies.js';
4
+ export { BacklogManager } from './backlog.js';
5
+ export { parseSwarmSettings, swarmDirPath, proposalsDirPath, dependenciesFilePath } from './config.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swarm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { IssueProposal, ProposalStatus } from './types.js';
2
+ /**
3
+ * File-based proposal store.
4
+ * Workers write proposals to ~/.symphony/swarm/proposals/<id>.json
5
+ * Director/daemon reads and processes them.
6
+ */
7
+ export declare class ProposalStore {
8
+ private dir;
9
+ constructor(dir?: string);
10
+ /** List all proposals with a given status. */
11
+ listByStatus(status: ProposalStatus): IssueProposal[];
12
+ /** List all pending proposals. */
13
+ listPending(): IssueProposal[];
14
+ /** Get a proposal by ID. */
15
+ get(id: string): IssueProposal | null;
16
+ /** Write a new proposal. Returns the proposal with generated ID. */
17
+ write(proposal: Omit<IssueProposal, 'id' | 'status' | 'created_at'>): IssueProposal;
18
+ /** Approve a proposal. */
19
+ approve(id: string, createdIssueNumber?: number): IssueProposal | null;
20
+ /** Reject a proposal with a reason. */
21
+ reject(id: string, reason: string): IssueProposal | null;
22
+ /** Remove proposals older than the given duration in milliseconds. */
23
+ cleanup(olderThanMs: number): number;
24
+ private updateStatus;
25
+ private readProposal;
26
+ private listProposalFiles;
27
+ private generateId;
28
+ }
29
+ //# sourceMappingURL=proposals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../src/swarm/proposals.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,CAAC,EAAE,MAAM;IAOxB,8CAA8C;IAC9C,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,EAAE;IAkBrD,kCAAkC;IAClC,WAAW,IAAI,aAAa,EAAE;IAI9B,4BAA4B;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAWrC,oEAAoE;IACpE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,QAAQ,GAAG,YAAY,CAAC,GAAG,aAAa;IAcnF,0BAA0B;IAC1B,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAItE,uCAAuC;IACvC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAIxD,sEAAsE;IACtE,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAyBpC,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,UAAU;CASnB"}