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,176 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ const MAX_PROCESSED_COMMENTS = 500;
4
+ /**
5
+ * Thread-safe persistent state store.
6
+ * Ported from symphony Python's state.py.
7
+ */
8
+ export class StateStore {
9
+ state;
10
+ filePath;
11
+ dirty = false;
12
+ constructor(filePath) {
13
+ this.filePath = filePath;
14
+ this.state = this.load();
15
+ }
16
+ load() {
17
+ if (!existsSync(this.filePath)) {
18
+ return { repos: {} };
19
+ }
20
+ try {
21
+ const raw = readFileSync(this.filePath, 'utf-8');
22
+ return JSON.parse(raw);
23
+ }
24
+ catch {
25
+ return { repos: {} };
26
+ }
27
+ }
28
+ save() {
29
+ if (!this.dirty)
30
+ return;
31
+ const dir = dirname(this.filePath);
32
+ if (!existsSync(dir))
33
+ mkdirSync(dir, { recursive: true });
34
+ writeFileSync(this.filePath, JSON.stringify(this.state, null, 2));
35
+ this.dirty = false;
36
+ }
37
+ ensureRepo(repo) {
38
+ if (!this.state.repos[repo]) {
39
+ this.state.repos[repo] = {
40
+ handled_issues: {},
41
+ active_runs: {},
42
+ processed_comment_ids: [],
43
+ deferred_issue_numbers: [],
44
+ suppressed_issue_numbers: [],
45
+ };
46
+ }
47
+ if (!Array.isArray(this.state.repos[repo].deferred_issue_numbers)) {
48
+ this.state.repos[repo].deferred_issue_numbers = [];
49
+ }
50
+ if (!Array.isArray(this.state.repos[repo].suppressed_issue_numbers)) {
51
+ this.state.repos[repo].suppressed_issue_numbers = [];
52
+ }
53
+ return this.state.repos[repo];
54
+ }
55
+ // ── Cursors ──
56
+ getIssueCursor(repo) {
57
+ return this.ensureRepo(repo).issue_cursor;
58
+ }
59
+ setIssueCursor(repo, cursor) {
60
+ this.ensureRepo(repo).issue_cursor = cursor;
61
+ this.dirty = true;
62
+ }
63
+ getCommentCursor(repo) {
64
+ return this.ensureRepo(repo).comment_cursor;
65
+ }
66
+ setCommentCursor(repo, cursor) {
67
+ this.ensureRepo(repo).comment_cursor = cursor;
68
+ this.dirty = true;
69
+ }
70
+ getStartupIssueCursor(repo) {
71
+ return this.ensureRepo(repo).startup_issue_cursor;
72
+ }
73
+ setStartupIssueCursor(repo, cursor) {
74
+ this.ensureRepo(repo).startup_issue_cursor = cursor;
75
+ this.dirty = true;
76
+ }
77
+ getStartupCommentCursor(repo) {
78
+ return this.ensureRepo(repo).startup_comment_cursor;
79
+ }
80
+ setStartupCommentCursor(repo, cursor) {
81
+ this.ensureRepo(repo).startup_comment_cursor = cursor;
82
+ this.dirty = true;
83
+ }
84
+ // ── Handled issues ──
85
+ isHandled(repo, issueNumber) {
86
+ return !!this.ensureRepo(repo).handled_issues[issueNumber];
87
+ }
88
+ markHandled(repo, issueNumber, runId) {
89
+ this.ensureRepo(repo).handled_issues[issueNumber] = {
90
+ issue_number: issueNumber,
91
+ handled_at: new Date().toISOString(),
92
+ run_id: runId,
93
+ };
94
+ this.dirty = true;
95
+ }
96
+ unmarkHandled(repo, issueNumber) {
97
+ delete this.ensureRepo(repo).handled_issues[issueNumber];
98
+ this.dirty = true;
99
+ }
100
+ // ── Active runs ──
101
+ getActiveRuns(repo) {
102
+ return this.ensureRepo(repo).active_runs;
103
+ }
104
+ getAllActiveRuns() {
105
+ return Object.entries(this.state.repos).flatMap(([repo, repoState]) => Object.values(repoState.active_runs).map(record => ({ repo, record })));
106
+ }
107
+ hasActiveRun(repo, issueNumber) {
108
+ const runs = this.ensureRepo(repo).active_runs;
109
+ return Object.values(runs).some(r => r.issue_number === issueNumber);
110
+ }
111
+ addActiveRun(repo, record) {
112
+ this.ensureRepo(repo).active_runs[record.run_id] = record;
113
+ this.dirty = true;
114
+ }
115
+ removeActiveRun(repo, runId) {
116
+ delete this.ensureRepo(repo).active_runs[runId];
117
+ this.dirty = true;
118
+ }
119
+ // ── Processed comments ──
120
+ isCommentProcessed(repo, commentId) {
121
+ return this.ensureRepo(repo).processed_comment_ids.includes(commentId);
122
+ }
123
+ getProcessedCommentIds(repo) {
124
+ return [...this.ensureRepo(repo).processed_comment_ids];
125
+ }
126
+ markCommentProcessed(repo, commentId) {
127
+ const rs = this.ensureRepo(repo);
128
+ rs.processed_comment_ids.push(commentId);
129
+ // Keep only the last N
130
+ if (rs.processed_comment_ids.length > MAX_PROCESSED_COMMENTS) {
131
+ rs.processed_comment_ids = rs.processed_comment_ids.slice(-MAX_PROCESSED_COMMENTS);
132
+ }
133
+ this.dirty = true;
134
+ }
135
+ // ── Deferred issues ──
136
+ getDeferredIssueNumbers(repo) {
137
+ return [...(this.ensureRepo(repo).deferred_issue_numbers || [])];
138
+ }
139
+ deferIssue(repo, issueNumber) {
140
+ const rs = this.ensureRepo(repo);
141
+ if (!rs.deferred_issue_numbers?.includes(issueNumber)) {
142
+ rs.deferred_issue_numbers = [...(rs.deferred_issue_numbers || []), issueNumber];
143
+ this.dirty = true;
144
+ }
145
+ }
146
+ clearDeferredIssue(repo, issueNumber) {
147
+ const rs = this.ensureRepo(repo);
148
+ const deferred = rs.deferred_issue_numbers || [];
149
+ const next = deferred.filter(number => number !== issueNumber);
150
+ if (next.length !== deferred.length) {
151
+ rs.deferred_issue_numbers = next;
152
+ this.dirty = true;
153
+ }
154
+ }
155
+ // ── Suppressed issues ──
156
+ getSuppressedIssueNumbers(repo) {
157
+ return [...(this.ensureRepo(repo).suppressed_issue_numbers || [])];
158
+ }
159
+ suppressIssue(repo, issueNumber) {
160
+ const rs = this.ensureRepo(repo);
161
+ if (!rs.suppressed_issue_numbers?.includes(issueNumber)) {
162
+ rs.suppressed_issue_numbers = [...(rs.suppressed_issue_numbers || []), issueNumber];
163
+ this.dirty = true;
164
+ }
165
+ }
166
+ clearSuppressedIssue(repo, issueNumber) {
167
+ const rs = this.ensureRepo(repo);
168
+ const suppressed = rs.suppressed_issue_numbers || [];
169
+ const next = suppressed.filter(number => number !== issueNumber);
170
+ if (next.length !== suppressed.length) {
171
+ rs.suppressed_issue_numbers = next;
172
+ this.dirty = true;
173
+ }
174
+ }
175
+ }
176
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/services/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Simplified tmux service for Symphony.
3
+ * Manages a single tmux session with a control sidebar + swappable content pane.
4
+ */
5
+ export declare class TmuxService {
6
+ private static instance;
7
+ static getInstance(): TmuxService;
8
+ sessionExists(name: string): Promise<boolean>;
9
+ createSession(name: string, cwd: string): Promise<string>;
10
+ attachSession(name: string): Promise<void>;
11
+ killSession(name: string): Promise<void>;
12
+ getCurrentPaneId(session: string): Promise<string>;
13
+ splitPane(targetPaneId: string, direction: 'h' | 'v', options?: {
14
+ size?: number | string;
15
+ cwd?: string;
16
+ }): Promise<string>;
17
+ killPane(paneId: string): Promise<void>;
18
+ paneExists(paneId: string): Promise<boolean>;
19
+ sendShellCommand(paneId: string, command: string): Promise<void>;
20
+ sendKeys(paneId: string, ...keys: string[]): Promise<void>;
21
+ pasteText(paneId: string, text: string): Promise<void>;
22
+ getPaneContent(paneId: string, lines?: number): Promise<string>;
23
+ resizePane(paneId: string, width?: number, height?: number): Promise<void>;
24
+ selectPane(paneId: string): Promise<void>;
25
+ setPaneTitle(paneId: string, title: string): Promise<void>;
26
+ createWindow(session: string, name: string, cwd?: string): Promise<string>;
27
+ selectWindow(session: string, windowIndex: number): Promise<void>;
28
+ swapPane(srcPaneId: string, dstPaneId: string): Promise<void>;
29
+ /**
30
+ * Move a pane from a background window into the main window next to the sidebar.
31
+ */
32
+ joinPane(srcPaneId: string, targetPaneId: string, direction?: 'h' | 'v'): Promise<void>;
33
+ /**
34
+ * Break a pane out into its own background window.
35
+ */
36
+ breakPane(paneId: string): Promise<string>;
37
+ getWindowDimensions(paneId: string): Promise<{
38
+ width: number;
39
+ height: number;
40
+ }>;
41
+ setGlobalOption(option: string, value: string): Promise<void>;
42
+ setWindowOption(option: string, value: string): Promise<void>;
43
+ selectWindowByPane(paneId: string): Promise<void>;
44
+ listPanes(session: string): Promise<Array<{
45
+ paneId: string;
46
+ windowIndex: number;
47
+ active: boolean;
48
+ }>>;
49
+ }
50
+ //# sourceMappingURL=tmux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { run, runSafe, runShell } from '../utils/shell.js';
2
+ /**
3
+ * Simplified tmux service for Symphony.
4
+ * Manages a single tmux session with a control sidebar + swappable content pane.
5
+ */
6
+ export class TmuxService {
7
+ static instance = null;
8
+ static getInstance() {
9
+ if (!TmuxService.instance) {
10
+ TmuxService.instance = new TmuxService();
11
+ }
12
+ return TmuxService.instance;
13
+ }
14
+ // ── Session lifecycle ──
15
+ async sessionExists(name) {
16
+ const result = await runSafe('tmux', ['has-session', '-t', name]);
17
+ return result.exitCode === 0;
18
+ }
19
+ async createSession(name, cwd) {
20
+ await run('tmux', [
21
+ 'new-session', '-d', '-s', name, '-x', '200', '-y', '50', '-c', cwd,
22
+ ]);
23
+ const paneId = await this.getCurrentPaneId(name);
24
+ return paneId;
25
+ }
26
+ async attachSession(name) {
27
+ await runShell(`tmux attach-session -t ${name}`);
28
+ }
29
+ async killSession(name) {
30
+ await runSafe('tmux', ['kill-session', '-t', name]);
31
+ }
32
+ // ── Pane operations ──
33
+ async getCurrentPaneId(session) {
34
+ return run('tmux', [
35
+ 'display-message', '-t', session, '-p', '#{pane_id}',
36
+ ]);
37
+ }
38
+ async splitPane(targetPaneId, direction, options) {
39
+ const args = ['split-window', `-${direction}`, '-t', targetPaneId, '-P', '-F', '#{pane_id}'];
40
+ if (options?.size) {
41
+ args.push('-l', String(options.size));
42
+ }
43
+ if (options?.cwd) {
44
+ args.push('-c', options.cwd);
45
+ }
46
+ return run('tmux', args);
47
+ }
48
+ async killPane(paneId) {
49
+ await runSafe('tmux', ['kill-pane', '-t', paneId]);
50
+ }
51
+ async paneExists(paneId) {
52
+ const result = await runSafe('tmux', [
53
+ 'display-message', '-t', paneId, '-p', '#{pane_id}',
54
+ ]);
55
+ return result.exitCode === 0 && result.stdout.trim() === paneId;
56
+ }
57
+ async sendShellCommand(paneId, command) {
58
+ await run('tmux', ['send-keys', '-t', paneId, command, 'Enter']);
59
+ }
60
+ async sendKeys(paneId, ...keys) {
61
+ for (const key of keys) {
62
+ await run('tmux', ['send-keys', '-t', paneId, key]);
63
+ }
64
+ }
65
+ async pasteText(paneId, text) {
66
+ const bufferName = `symphony-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
67
+ await run('tmux', ['set-buffer', '-b', bufferName, text]);
68
+ try {
69
+ await run('tmux', ['paste-buffer', '-d', '-b', bufferName, '-t', paneId]);
70
+ }
71
+ finally {
72
+ await runSafe('tmux', ['delete-buffer', '-b', bufferName]);
73
+ }
74
+ }
75
+ async getPaneContent(paneId, lines = 100) {
76
+ const result = await runSafe('tmux', [
77
+ 'capture-pane', '-t', paneId, '-p', '-S', `-${lines}`,
78
+ ]);
79
+ return result.stdout;
80
+ }
81
+ async resizePane(paneId, width, height) {
82
+ const args = ['resize-pane', '-t', paneId];
83
+ if (width !== undefined)
84
+ args.push('-x', String(width));
85
+ if (height !== undefined)
86
+ args.push('-y', String(height));
87
+ await runSafe('tmux', args);
88
+ }
89
+ async selectPane(paneId) {
90
+ await run('tmux', ['select-pane', '-t', paneId]);
91
+ }
92
+ async setPaneTitle(paneId, title) {
93
+ await runSafe('tmux', [
94
+ 'select-pane', '-t', paneId, '-T', title,
95
+ ]);
96
+ }
97
+ // ── Window operations ──
98
+ async createWindow(session, name, cwd) {
99
+ const args = ['new-window', '-t', session, '-n', name, '-d', '-P', '-F', '#{pane_id}'];
100
+ if (cwd)
101
+ args.push('-c', cwd);
102
+ return run('tmux', args);
103
+ }
104
+ async selectWindow(session, windowIndex) {
105
+ await runSafe('tmux', ['select-window', '-t', `${session}:${windowIndex}`]);
106
+ }
107
+ // ── Swap pane (key for our single-content-pane UX) ──
108
+ async swapPane(srcPaneId, dstPaneId) {
109
+ await run('tmux', ['swap-pane', '-s', srcPaneId, '-t', dstPaneId]);
110
+ }
111
+ /**
112
+ * Move a pane from a background window into the main window next to the sidebar.
113
+ */
114
+ async joinPane(srcPaneId, targetPaneId, direction = 'h') {
115
+ await run('tmux', [
116
+ 'join-pane', `-${direction}`, '-s', srcPaneId, '-t', targetPaneId,
117
+ ]);
118
+ }
119
+ /**
120
+ * Break a pane out into its own background window.
121
+ */
122
+ async breakPane(paneId) {
123
+ return run('tmux', [
124
+ 'break-pane', '-d', '-s', paneId, '-P', '-F', '#{pane_id}',
125
+ ]);
126
+ }
127
+ // ── Layout ──
128
+ async getWindowDimensions(paneId) {
129
+ const out = await run('tmux', [
130
+ 'display-message', '-t', paneId, '-p', '#{window_width} #{window_height}',
131
+ ]);
132
+ const [w, h] = out.split(' ').map(Number);
133
+ return { width: w || 200, height: h || 50 };
134
+ }
135
+ async setGlobalOption(option, value) {
136
+ await runSafe('tmux', ['set-option', '-g', option, value]);
137
+ }
138
+ async setWindowOption(option, value) {
139
+ await runSafe('tmux', ['set-window-option', '-g', option, value]);
140
+ }
141
+ async selectWindowByPane(paneId) {
142
+ await runSafe('tmux', ['select-window', '-t', paneId]);
143
+ }
144
+ // ── List panes ──
145
+ async listPanes(session) {
146
+ const result = await runSafe('tmux', [
147
+ 'list-panes', '-s', '-t', session, '-F', '#{pane_id} #{window_index} #{pane_active}',
148
+ ]);
149
+ if (result.exitCode !== 0)
150
+ return [];
151
+ return result.stdout.split('\n').filter(Boolean).map(line => {
152
+ const [paneId, windowIndex, active] = line.split(' ');
153
+ return { paneId, windowIndex: parseInt(windowIndex, 10), active: active === '1' };
154
+ });
155
+ }
156
+ }
157
+ //# sourceMappingURL=tmux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { SymphonyPane } from '../types.js';
2
+ import type { IssueDependency, IssueProposal, BacklogSettings } from './types.js';
3
+ interface BacklogState {
4
+ activeRuns: SymphonyPane[];
5
+ blockedIssues: IssueDependency[];
6
+ pendingProposals: IssueProposal[];
7
+ recentCompletions: SymphonyPane[];
8
+ }
9
+ /**
10
+ * Manages the swarm backlog markdown file.
11
+ * Provides a human-readable summary of the swarm's state.
12
+ */
13
+ export declare class BacklogManager {
14
+ private settings;
15
+ constructor(settings: BacklogSettings);
16
+ /** Update the backlog file with current state. */
17
+ update(state: BacklogState): void;
18
+ /** Read the current backlog content. */
19
+ read(): string;
20
+ /** Build the backlog body for a GitHub issue. */
21
+ buildGitHubIssueBody(state: BacklogState): string;
22
+ private render;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=backlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../../src/swarm/backlog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElF,UAAU,YAAY;IACpB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,iBAAiB,EAAE,YAAY,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,QAAQ,EAAE,eAAe;IAIrC,kDAAkD;IAClD,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAWjC,wCAAwC;IACxC,IAAI,IAAI,MAAM;IAKd,iDAAiD;IACjD,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAIjD,OAAO,CAAC,MAAM;CAgEf"}
@@ -0,0 +1,83 @@
1
+ import { writeFileSync, readFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ /**
4
+ * Manages the swarm backlog markdown file.
5
+ * Provides a human-readable summary of the swarm's state.
6
+ */
7
+ export class BacklogManager {
8
+ settings;
9
+ constructor(settings) {
10
+ this.settings = settings;
11
+ }
12
+ /** Update the backlog file with current state. */
13
+ update(state) {
14
+ if (!this.settings.enabled)
15
+ return;
16
+ const content = this.render(state);
17
+ const dir = dirname(this.settings.file);
18
+ if (!existsSync(dir)) {
19
+ mkdirSync(dir, { recursive: true });
20
+ }
21
+ writeFileSync(this.settings.file, content);
22
+ }
23
+ /** Read the current backlog content. */
24
+ read() {
25
+ if (!existsSync(this.settings.file))
26
+ return '';
27
+ return readFileSync(this.settings.file, 'utf-8');
28
+ }
29
+ /** Build the backlog body for a GitHub issue. */
30
+ buildGitHubIssueBody(state) {
31
+ return this.render(state);
32
+ }
33
+ render(state) {
34
+ const now = new Date().toISOString();
35
+ const parts = [];
36
+ parts.push('# Symphony Swarm Backlog', '', `_Last updated: ${now}_`, '');
37
+ // Current Sprint
38
+ parts.push('## Active Work', '');
39
+ if (state.activeRuns.length > 0) {
40
+ for (const run of state.activeRuns) {
41
+ if (run.swarm_status?.is_paused)
42
+ continue;
43
+ const status = run.status === 'running' ? 'in progress' : run.status;
44
+ parts.push(`- [ ] **${run.repo}#${run.issue_number}** — ${run.issue_title || 'untitled'}`, ` Agent: ${run.agent_name || 'unknown'} | Status: ${status}`);
45
+ }
46
+ }
47
+ else {
48
+ parts.push('No active work.');
49
+ }
50
+ parts.push('');
51
+ // Blocked
52
+ const pausedRuns = state.activeRuns.filter(r => r.swarm_status?.is_paused);
53
+ if (pausedRuns.length > 0 || state.blockedIssues.length > 0) {
54
+ parts.push('## Blocked', '');
55
+ for (const dep of state.blockedIssues) {
56
+ const blockers = dep.blocked_by
57
+ .map(b => `${b.repo}#${b.number}`)
58
+ .join(', ');
59
+ parts.push(`- **${dep.issue.repo}#${dep.issue.number}** — blocked by: ${blockers}`);
60
+ }
61
+ parts.push('');
62
+ }
63
+ // Proposed
64
+ if (state.pendingProposals.length > 0) {
65
+ parts.push('## Pending Proposals', '');
66
+ for (const proposal of state.pendingProposals) {
67
+ parts.push(`- **${proposal.title}** (${proposal.type}, ${proposal.urgency})`, ` From: ${proposal.parent_issue.repo}#${proposal.parent_issue.number}`);
68
+ }
69
+ parts.push('');
70
+ }
71
+ // Recently Completed
72
+ if (state.recentCompletions.length > 0) {
73
+ parts.push('## Recently Completed', '');
74
+ for (const run of state.recentCompletions.slice(0, 20)) {
75
+ const icon = run.status === 'success' ? 'x' : ' ';
76
+ parts.push(`- [${icon}] **${run.repo}#${run.issue_number}** — ${run.issue_title || 'untitled'} (${run.status})`);
77
+ }
78
+ parts.push('');
79
+ }
80
+ return parts.join('\n');
81
+ }
82
+ }
83
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../src/swarm/backlog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SwarmSettings } from './types.js';
2
+ export declare const DEFAULT_SWARM: SwarmSettings;
3
+ /**
4
+ * Parse the `swarm` section from raw YAML config.
5
+ * Returns a fully-resolved SwarmSettings with defaults applied.
6
+ */
7
+ export declare function parseSwarmSettings(raw: any): SwarmSettings;
8
+ /** Path to the swarm data directory (~/.symphony/swarm/) */
9
+ export declare function swarmDirPath(): string;
10
+ /** Path to the proposals directory (~/.symphony/swarm/proposals/) */
11
+ export declare function proposalsDirPath(): string;
12
+ /** Path to the dependencies file (~/.symphony/swarm/dependencies.json) */
13
+ export declare function dependenciesFilePath(): string;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/swarm/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAGd,MAAM,YAAY,CAAC;AAYpB,eAAO,MAAM,aAAa,EAAE,aAqB3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,CA4D1D;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}