@suzuke/agend 1.0.0 → 1.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 (71) hide show
  1. package/README.md +50 -528
  2. package/README.zh-TW.md +49 -474
  3. package/dist/channel/adapters/discord.js +1 -1
  4. package/dist/channel/adapters/discord.js.map +1 -1
  5. package/dist/channel/factory.js +2 -2
  6. package/dist/channel/factory.js.map +1 -1
  7. package/dist/channel/mcp-tools.js +3 -3
  8. package/dist/channel/mcp-tools.js.map +1 -1
  9. package/dist/cli.js +1 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/daemon.d.ts +14 -2
  12. package/dist/daemon.js +119 -46
  13. package/dist/daemon.js.map +1 -1
  14. package/dist/export-import.js +2 -2
  15. package/dist/export-import.js.map +1 -1
  16. package/dist/fleet-manager.d.ts +1 -0
  17. package/dist/fleet-manager.js +15 -9
  18. package/dist/fleet-manager.js.map +1 -1
  19. package/dist/setup-wizard.js +2 -2
  20. package/dist/setup-wizard.js.map +1 -1
  21. package/dist/tmux-control.d.ts +49 -0
  22. package/dist/tmux-control.js +184 -0
  23. package/dist/tmux-control.js.map +1 -0
  24. package/dist/tmux-manager.js +3 -2
  25. package/dist/tmux-manager.js.map +1 -1
  26. package/package.json +3 -5
  27. package/dist/approval/approval-server.d.ts +0 -30
  28. package/dist/approval/approval-server.js +0 -156
  29. package/dist/approval/approval-server.js.map +0 -1
  30. package/dist/approval/tmux-prompt-detector.d.ts +0 -34
  31. package/dist/approval/tmux-prompt-detector.js +0 -264
  32. package/dist/approval/tmux-prompt-detector.js.map +0 -1
  33. package/dist/backend/approval-strategy.d.ts +0 -14
  34. package/dist/backend/approval-strategy.js +0 -2
  35. package/dist/backend/approval-strategy.js.map +0 -1
  36. package/dist/backend/hook-based-approval.d.ts +0 -20
  37. package/dist/backend/hook-based-approval.js +0 -41
  38. package/dist/backend/hook-based-approval.js.map +0 -1
  39. package/dist/container-manager.d.ts +0 -24
  40. package/dist/container-manager.js +0 -148
  41. package/dist/container-manager.js.map +0 -1
  42. package/dist/db.d.ts +0 -10
  43. package/dist/db.js +0 -43
  44. package/dist/db.js.map +0 -1
  45. package/dist/install-recorder.d.ts +0 -30
  46. package/dist/install-recorder.js +0 -159
  47. package/dist/install-recorder.js.map +0 -1
  48. package/dist/meeting/orchestrator.d.ts +0 -30
  49. package/dist/meeting/orchestrator.js +0 -355
  50. package/dist/meeting/orchestrator.js.map +0 -1
  51. package/dist/meeting/prompt-builder.d.ts +0 -12
  52. package/dist/meeting/prompt-builder.js +0 -96
  53. package/dist/meeting/prompt-builder.js.map +0 -1
  54. package/dist/meeting/role-assigner.d.ts +0 -2
  55. package/dist/meeting/role-assigner.js +0 -25
  56. package/dist/meeting/role-assigner.js.map +0 -1
  57. package/dist/meeting/types.d.ts +0 -21
  58. package/dist/meeting/types.js +0 -2
  59. package/dist/meeting/types.js.map +0 -1
  60. package/dist/meeting-manager.d.ts +0 -10
  61. package/dist/meeting-manager.js +0 -38
  62. package/dist/meeting-manager.js.map +0 -1
  63. package/dist/memory-layer.d.ts +0 -13
  64. package/dist/memory-layer.js +0 -44
  65. package/dist/memory-layer.js.map +0 -1
  66. package/dist/plugin/agend/.mcp.json +0 -9
  67. package/dist/plugin/ccd-channel/.claude-plugin/plugin.json +0 -5
  68. package/dist/plugin/ccd-channel/.mcp.json +0 -9
  69. package/dist/process-manager.d.ts +0 -31
  70. package/dist/process-manager.js +0 -264
  71. package/dist/process-manager.js.map +0 -1
@@ -1,159 +0,0 @@
1
- import { appendFileSync, readFileSync, writeFileSync, existsSync } from "node:fs";
2
- const INSTALL_PATTERNS = [
3
- {
4
- type: "pip",
5
- pattern: /pip3?\s+install\s+(.+)/,
6
- extract: (m) => {
7
- const tokens = m[1].split(/\s+/);
8
- const skipNext = new Set(["-r", "-c", "-e", "--requirement", "--constraint", "--editable"]);
9
- const packages = [];
10
- let skip = false;
11
- for (const t of tokens) {
12
- if (skip) {
13
- skip = false;
14
- continue;
15
- }
16
- if (skipNext.has(t)) {
17
- skip = true;
18
- continue;
19
- }
20
- if (t.startsWith("-") || t.startsWith("--"))
21
- continue;
22
- if (t === "." || t.startsWith("./") || t.startsWith("/"))
23
- continue; // local paths
24
- if (t.includes("://") || t.includes("+https"))
25
- continue; // URLs
26
- if (t.endsWith(".txt") || t.endsWith(".cfg") || t.endsWith(".toml"))
27
- continue; // files
28
- packages.push(t);
29
- }
30
- return packages;
31
- },
32
- },
33
- {
34
- type: "apt",
35
- pattern: /apt(?:-get)?\s+install\s+(.+)/,
36
- extract: (m) => m[1].split(/\s+/).filter(p => !p.startsWith("-") && !p.startsWith("--")),
37
- },
38
- {
39
- type: "cargo",
40
- pattern: /cargo\s+install\s+(.+)/,
41
- extract: (m) => {
42
- const tokens = m[1].split(/\s+/);
43
- const skipNext = new Set(["--path", "--git", "--branch", "--tag", "--rev", "--root", "--index", "--registry"]);
44
- const packages = [];
45
- let skip = false;
46
- for (const t of tokens) {
47
- if (skip) {
48
- skip = false;
49
- continue;
50
- }
51
- if (skipNext.has(t)) {
52
- skip = true;
53
- continue;
54
- }
55
- if (t.startsWith("-") || t.startsWith("--"))
56
- continue;
57
- if (t.includes("://") || t.includes("/"))
58
- continue; // URLs and paths
59
- packages.push(t);
60
- }
61
- return packages;
62
- },
63
- },
64
- {
65
- type: "npm",
66
- pattern: /npm\s+install\s+-g\s+(.+)/,
67
- extract: (m) => m[1].split(/\s+/).filter(p => !p.startsWith("-") && !p.startsWith("--")),
68
- },
69
- ];
70
- /** Strip shell syntax (pipes, redirects, semicolons) from end of command */
71
- function stripShellSuffix(cmd) {
72
- return cmd.replace(/\s*(?:\||\d*>[>&]?\s*\S+|;).*$/, "");
73
- }
74
- /**
75
- * Parse a shell command and detect if it's a package install command.
76
- * For multiline / chained commands (&&), each segment is checked.
77
- * Returns the first matching install command, or null.
78
- */
79
- export function parseInstallCommand(command) {
80
- // Split on && to handle chained commands like "apt-get update && apt-get install -y ffmpeg"
81
- const segments = command.split(/\s*&&\s*/);
82
- for (const segment of segments) {
83
- // Strip leading sudo and trailing shell syntax (pipes, redirects)
84
- const stripped = stripShellSuffix(segment.replace(/^\s*sudo\s+/, ""));
85
- for (const { type, pattern, extract } of INSTALL_PATTERNS) {
86
- const match = stripped.match(pattern);
87
- if (match) {
88
- const packages = extract(match);
89
- if (packages.length > 0)
90
- return { type, packages };
91
- }
92
- }
93
- }
94
- return null;
95
- }
96
- /**
97
- * Record an install command to a file, deduplicating against existing entries.
98
- */
99
- export function recordInstall(filePath, install) {
100
- const ts = new Date().toISOString();
101
- // Deduplicate: check existing records before appending
102
- const existing = new Set();
103
- if (existsSync(filePath)) {
104
- for (const line of readFileSync(filePath, "utf-8").split("\n")) {
105
- const [type, pkg] = line.split("|");
106
- if (type && pkg)
107
- existing.add(`${type}|${pkg}`);
108
- }
109
- }
110
- const newLines = install.packages
111
- .filter(pkg => !existing.has(`${install.type}|${pkg}`))
112
- .map(pkg => `${install.type}|${pkg}|${ts}`);
113
- if (newLines.length > 0) {
114
- appendFileSync(filePath, newLines.join("\n") + "\n");
115
- }
116
- }
117
- /**
118
- * Read pending packages from the record file.
119
- */
120
- export function readPendingPackages(filePath) {
121
- const result = { apt: [], pip: [], cargo: [], npm: [], count: 0, oldestTs: null };
122
- if (!existsSync(filePath))
123
- return result;
124
- const content = readFileSync(filePath, "utf-8").trim();
125
- if (!content)
126
- return result;
127
- const seen = new Set();
128
- for (const line of content.split("\n")) {
129
- const [type, pkg, ts] = line.split("|");
130
- if (!type || !pkg)
131
- continue;
132
- const key = `${type}|${pkg}`;
133
- if (seen.has(key))
134
- continue;
135
- seen.add(key);
136
- if (type === "apt")
137
- result.apt.push(pkg);
138
- else if (type === "pip")
139
- result.pip.push(pkg);
140
- else if (type === "cargo")
141
- result.cargo.push(pkg);
142
- else if (type === "npm")
143
- result.npm.push(pkg);
144
- if (ts) {
145
- const date = new Date(ts);
146
- if (!result.oldestTs || date < result.oldestTs)
147
- result.oldestTs = date;
148
- }
149
- }
150
- result.count = result.apt.length + result.pip.length + result.cargo.length + result.npm.length;
151
- return result;
152
- }
153
- /**
154
- * Clear all pending packages by truncating the file.
155
- */
156
- export function clearPendingPackages(filePath) {
157
- writeFileSync(filePath, "");
158
- }
159
- //# sourceMappingURL=install-recorder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-recorder.js","sourceRoot":"","sources":["../src/install-recorder.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import type { MeetingConfig, ParticipantConfig, FleetManagerMeetingAPI, MeetingChannelOutput, MeetingState } from "./types.js";
2
- import type { InboundMessage } from "../channel/types.js";
3
- export declare class MeetingOrchestrator {
4
- private config;
5
- private fm;
6
- private output;
7
- private participants;
8
- private roundHistory;
9
- private currentRound;
10
- private state;
11
- private userContext;
12
- private abortController;
13
- private resolveUserInput;
14
- private directAddress;
15
- /** Cancellation signal — the single source of truth for "should we stop?" */
16
- private get cancelled();
17
- constructor(config: MeetingConfig, fm: FleetManagerMeetingAPI, output: MeetingChannelOutput);
18
- start(participantConfigs: ParticipantConfig[]): Promise<void>;
19
- private runCollabFlow;
20
- private runDiscussionFlow;
21
- private runDebateLoop;
22
- private getSpeakingOrder;
23
- private generateSummary;
24
- handleUserMessage(msg: InboundMessage): void;
25
- addParticipant(config: ParticipantConfig): Promise<void>;
26
- removeParticipant(label: string): Promise<void>;
27
- end(): Promise<void>;
28
- private cleanup;
29
- getState(): MeetingState;
30
- }
@@ -1,355 +0,0 @@
1
- import { buildSystemPrompt, buildRoundPrompt, buildSummaryPrompt, buildCollabSystemPrompt, buildCollabSummaryPrompt, buildDiscussionSystemPrompt, buildIndependentAnalysisPrompt, buildCrossDiscussionPrompt, buildConsensusPrompt, roleLabel } from "./prompt-builder.js";
2
- const ROLE_EMOJI = { pro: "🟢", con: "🔴", arbiter: "⚖️" };
3
- const REPLY_TIMEOUT_MS = 120_000;
4
- const REPLY_BUFFER_CAP = 32 * 1024;
5
- export class MeetingOrchestrator {
6
- config;
7
- fm;
8
- output;
9
- participants = [];
10
- roundHistory = [];
11
- currentRound = 0;
12
- state = "booting";
13
- userContext;
14
- abortController = new AbortController();
15
- resolveUserInput = null;
16
- directAddress = null;
17
- /** Cancellation signal — the single source of truth for "should we stop?" */
18
- get cancelled() { return this.abortController.signal.aborted; }
19
- constructor(config, fm, output) {
20
- this.config = config;
21
- this.fm = fm;
22
- this.output = output;
23
- }
24
- async start(participantConfigs) {
25
- this.state = "booting";
26
- // Spawn instances sequentially to avoid port/IPC race conditions
27
- for (let i = 0; i < participantConfigs.length; i++) {
28
- const p = participantConfigs[i];
29
- try {
30
- const systemPrompt = this.config.mode === "collab"
31
- ? buildCollabSystemPrompt(p.label, this.config.topic)
32
- : this.config.mode === "discussion"
33
- ? buildDiscussionSystemPrompt(p.label, this.config.angles?.[i] ?? "general", this.config.topic)
34
- : buildSystemPrompt(p.role, this.config.topic);
35
- const instanceName = await this.fm.spawnEphemeralInstance({
36
- systemPrompt,
37
- workingDirectory: this.config.mode === "collab" ? this.config.repo ?? "/tmp" : "/tmp",
38
- lightweight: this.config.mode === "debate" || this.config.mode === "discussion",
39
- skipPermissions: this.config.mode === "debate" || this.config.mode === "discussion",
40
- }, this.abortController.signal);
41
- this.participants.push({ ...p, instanceName });
42
- }
43
- catch (err) {
44
- await this.output.postMessage(`⚠️ Instance 啟動失敗: ${err}`);
45
- }
46
- }
47
- if (this.participants.length === 0) {
48
- await this.output.postMessage("❌ 所有 instance 啟動失敗,會議結束");
49
- await this.end();
50
- return;
51
- }
52
- this.state = "running";
53
- const participantList = this.config.mode === "discussion"
54
- ? this.participants.map((p, i) => `${p.label}(${this.config.angles?.[i] ?? "general"})`).join("、")
55
- : this.participants.map(p => `${p.label}(${roleLabel(p.role)})`).join("、");
56
- const modeLabel = this.config.mode === "discussion" ? "討論" : this.config.mode === "collab" ? "協作" : "辯論";
57
- await this.output.postMessage(`📋 ${modeLabel}:${this.config.topic}\n參與者:${participantList}\n輪次:${this.config.maxRounds} | 指令:/end /more /pause`);
58
- try {
59
- if (this.config.mode === "collab") {
60
- await this.runCollabFlow();
61
- }
62
- else if (this.config.mode === "discussion") {
63
- await this.runDiscussionFlow();
64
- }
65
- else {
66
- await this.runDebateLoop();
67
- }
68
- }
69
- catch (err) {
70
- if (err.name === "AbortError")
71
- return;
72
- throw err;
73
- }
74
- }
75
- async runCollabFlow() {
76
- // Phase 1: Discussion — each participant proposes their work plan
77
- await this.output.postMessage("\n━━ 討論分工 ━━");
78
- for (const participant of this.participants) {
79
- if (this.cancelled)
80
- return;
81
- while (this.state === "paused") {
82
- await new Promise(resolve => { this.resolveUserInput = resolve; });
83
- }
84
- if (this.cancelled)
85
- return;
86
- try {
87
- const prompt = `任務:${this.config.topic}\n\n團隊成員:${this.participants.map(p => p.label).join("、")}\n你是 ${participant.label}。請提出你的分工建議,說明你打算負責哪個部分。用 reply 工具回覆。`;
88
- const reply = await this.fm.sendAndWaitReply(participant.instanceName, prompt, REPLY_TIMEOUT_MS);
89
- const cappedReply = reply.length > REPLY_BUFFER_CAP
90
- ? reply.slice(0, REPLY_BUFFER_CAP) + "\n[...truncated]"
91
- : reply;
92
- this.roundHistory.push({
93
- round: 0, speaker: participant.label, role: participant.role, content: cappedReply,
94
- });
95
- await this.output.postMessage(`💬 ${participant.label}:\n${cappedReply}`);
96
- }
97
- catch (err) {
98
- if (err.name === "AbortError")
99
- throw err;
100
- await this.output.postMessage(`⚠️ ${participant.label} 回覆逾時`);
101
- }
102
- }
103
- // Phase 2: Development — tell each participant to start working
104
- await this.output.postMessage("\n━━ 開始開發 ━━");
105
- // Collect all plans for context
106
- const allPlans = this.roundHistory
107
- .filter(e => e.round === 0)
108
- .map(e => `[${e.speaker}] ${e.content}`)
109
- .join("\n\n");
110
- // Send development instruction to all participants in parallel
111
- const devPromises = this.participants.map(async (participant) => {
112
- if (this.cancelled)
113
- return;
114
- try {
115
- const prompt = `以下是所有人的分工計劃:\n\n${allPlans}\n\n請開始你負責的部分。完成後用 reply 工具回報你做了什麼(包含修改了哪些檔案、實作了什麼功能)。`;
116
- const reply = await this.fm.sendAndWaitReply(participant.instanceName, prompt, 300_000); // 5 min timeout for dev work
117
- const cappedReply = reply.length > REPLY_BUFFER_CAP
118
- ? reply.slice(0, REPLY_BUFFER_CAP) + "\n[...truncated]"
119
- : reply;
120
- this.roundHistory.push({
121
- round: 1, speaker: participant.label, role: participant.role, content: cappedReply,
122
- });
123
- await this.output.postMessage(`✅ ${participant.label} 完成:\n${cappedReply}`);
124
- }
125
- catch (err) {
126
- if (err.name === "AbortError")
127
- return;
128
- await this.output.postMessage(`⚠️ ${participant.label} 開發逾時或失敗`);
129
- }
130
- });
131
- await Promise.allSettled(devPromises);
132
- if (this.cancelled)
133
- return;
134
- await this.generateSummary();
135
- await this.cleanup();
136
- }
137
- async runDiscussionFlow() {
138
- const angles = this.config.angles ?? this.participants.map((_, i) => `角度 ${i + 1}`);
139
- // Phase 1: Independent analysis (parallel)
140
- await this.output.postMessage("\n━━ 獨立分析 ━━");
141
- const analysisPromises = this.participants.map(async (participant, i) => {
142
- if (this.cancelled)
143
- return;
144
- try {
145
- const prompt = buildIndependentAnalysisPrompt(this.config.topic, angles[i]);
146
- const reply = await this.fm.sendAndWaitReply(participant.instanceName, prompt, REPLY_TIMEOUT_MS);
147
- const cappedReply = reply.length > REPLY_BUFFER_CAP ? reply.slice(0, REPLY_BUFFER_CAP) + "\n[...truncated]" : reply;
148
- this.roundHistory.push({ round: 0, speaker: participant.label, role: angles[i], content: cappedReply });
149
- await this.output.postMessage(`💬 ${participant.label}(${angles[i]}):\n${cappedReply}`);
150
- }
151
- catch (err) {
152
- if (err.name === "AbortError")
153
- return;
154
- await this.output.postMessage(`⚠️ ${participant.label} 分析逾時`);
155
- }
156
- });
157
- await Promise.allSettled(analysisPromises);
158
- if (this.cancelled)
159
- return;
160
- // Phase 2: Cross discussion (sequential rounds)
161
- const independentAnalyses = this.roundHistory.filter(e => e.round === 0);
162
- for (let round = 1; round <= this.config.maxRounds; round++) {
163
- if (this.cancelled)
164
- return;
165
- this.currentRound = round;
166
- await this.output.postMessage(`\n━━ 交叉討論 Round ${round} ━━`);
167
- for (let i = 0; i < this.participants.length; i++) {
168
- const participant = this.participants[i];
169
- if (this.cancelled)
170
- return;
171
- while (this.state === "paused") {
172
- await new Promise(resolve => { this.resolveUserInput = resolve; });
173
- }
174
- if (this.cancelled)
175
- return;
176
- try {
177
- const prevRoundEntries = round === 1 ? independentAnalyses : this.roundHistory.filter(e => e.round === round - 1);
178
- const prompt = buildCrossDiscussionPrompt(this.config.topic, angles[i], prevRoundEntries);
179
- const reply = await this.fm.sendAndWaitReply(participant.instanceName, prompt, REPLY_TIMEOUT_MS);
180
- const cappedReply = reply.length > REPLY_BUFFER_CAP ? reply.slice(0, REPLY_BUFFER_CAP) + "\n[...truncated]" : reply;
181
- this.roundHistory.push({ round, speaker: participant.label, role: angles[i], content: cappedReply });
182
- await this.output.postMessage(`💬 ${participant.label}(${angles[i]}):\n${cappedReply}`);
183
- }
184
- catch (err) {
185
- if (err.name === "AbortError")
186
- throw err;
187
- await this.output.postMessage(`⚠️ ${participant.label} 回覆逾時`);
188
- }
189
- }
190
- }
191
- // Phase 3: Consensus
192
- await this.output.postMessage("\n━━ 收斂結論 ━━");
193
- const lastParticipant = this.participants[this.participants.length - 1];
194
- if (lastParticipant) {
195
- try {
196
- const prompt = buildConsensusPrompt(this.config.topic, this.roundHistory);
197
- const reply = await this.fm.sendAndWaitReply(lastParticipant.instanceName, prompt, REPLY_TIMEOUT_MS);
198
- await this.output.postMessage(reply);
199
- }
200
- catch {
201
- await this.output.postMessage("⚠️ 結論產生失敗");
202
- }
203
- }
204
- await this.cleanup();
205
- }
206
- async runDebateLoop() {
207
- for (let round = 1; round <= this.config.maxRounds; round++) {
208
- if (this.cancelled)
209
- return;
210
- this.currentRound = round;
211
- await this.output.postMessage(`\n━━ Round ${round} ━━`);
212
- const prevRound = this.roundHistory.filter(e => e.round === round - 1);
213
- const speakers = this.getSpeakingOrder();
214
- for (const participant of speakers) {
215
- if (this.cancelled)
216
- return;
217
- while (this.state === "paused") {
218
- await new Promise(resolve => { this.resolveUserInput = resolve; });
219
- }
220
- if (this.cancelled)
221
- return;
222
- let prompt;
223
- if (this.directAddress && this.directAddress.label === participant.label) {
224
- prompt = this.directAddress.prompt;
225
- this.directAddress = null;
226
- }
227
- else if (this.directAddress) {
228
- continue;
229
- }
230
- else {
231
- prompt = buildRoundPrompt(this.config.topic, round, prevRound, this.userContext);
232
- this.userContext = undefined;
233
- }
234
- try {
235
- const reply = await this.fm.sendAndWaitReply(participant.instanceName, prompt, REPLY_TIMEOUT_MS);
236
- const cappedReply = reply.length > REPLY_BUFFER_CAP
237
- ? reply.slice(0, REPLY_BUFFER_CAP) + "\n[...truncated]"
238
- : reply;
239
- this.roundHistory.push({
240
- round, speaker: participant.label, role: participant.role, content: cappedReply,
241
- });
242
- const emoji = ROLE_EMOJI[participant.role] ?? "💬";
243
- await this.output.postMessage(`${emoji} ${participant.label}(${roleLabel(participant.role)}):\n${cappedReply}`);
244
- }
245
- catch (err) {
246
- if (err.name === "AbortError")
247
- throw err;
248
- await this.output.postMessage(`⚠️ ${participant.label} 回覆逾時,跳過本輪`);
249
- }
250
- }
251
- }
252
- await this.generateSummary();
253
- await this.cleanup();
254
- }
255
- getSpeakingOrder() {
256
- const order = [];
257
- order.push(...this.participants.filter(p => p.role === "pro"));
258
- order.push(...this.participants.filter(p => p.role === "con"));
259
- order.push(...this.participants.filter(p => p.role === "arbiter"));
260
- order.push(...this.participants.filter(p => !["pro", "con", "arbiter"].includes(p.role)));
261
- return order;
262
- }
263
- async generateSummary() {
264
- if (this.cancelled)
265
- return;
266
- this.state = "summarizing";
267
- await this.output.postMessage("\n━━ 會議摘要 ━━");
268
- const summaryGenerator = this.participants.find(p => p.role === "arbiter") ??
269
- this.participants[this.participants.length - 1];
270
- if (!summaryGenerator)
271
- return;
272
- try {
273
- const summaryPrompt = this.config.mode === "collab"
274
- ? buildCollabSummaryPrompt(this.config.topic, this.roundHistory)
275
- : buildSummaryPrompt(this.config.topic, this.roundHistory);
276
- const summary = await this.fm.sendAndWaitReply(summaryGenerator.instanceName, summaryPrompt, REPLY_TIMEOUT_MS);
277
- await this.output.postMessage(summary);
278
- }
279
- catch {
280
- await this.output.postMessage("⚠️ 摘要產生失敗");
281
- }
282
- }
283
- handleUserMessage(msg) {
284
- const text = msg.text.trim();
285
- if (text === "/end") {
286
- this.state = "ended";
287
- this.abortController.abort();
288
- this.generateSummary().then(() => this.cleanup()).catch(() => this.cleanup());
289
- return;
290
- }
291
- if (text === "/pause") {
292
- this.state = "paused";
293
- return;
294
- }
295
- if (text === "/resume") {
296
- this.state = "running";
297
- this.resolveUserInput?.();
298
- this.resolveUserInput = null;
299
- return;
300
- }
301
- const moreMatch = text.match(/^\/more(?:\s+(\d+))?$/);
302
- if (moreMatch) {
303
- this.config.maxRounds += parseInt(moreMatch[1] ?? "1", 10);
304
- return;
305
- }
306
- const kickMatch = text.match(/^\/kick\s+(\S+)$/);
307
- if (kickMatch) {
308
- this.removeParticipant(kickMatch[1]);
309
- return;
310
- }
311
- const redirectMatch = text.match(/^\/redirect\s+(\S+)\s+"(.+)"$/);
312
- if (redirectMatch) {
313
- this.directAddress = { label: redirectMatch[1], prompt: redirectMatch[2] };
314
- return;
315
- }
316
- const atMatch = text.match(/^@(\S+)\s+(.+)$/);
317
- if (atMatch) {
318
- this.directAddress = { label: atMatch[1], prompt: atMatch[2] };
319
- return;
320
- }
321
- this.userContext = text;
322
- }
323
- async addParticipant(config) {
324
- const instanceName = await this.fm.spawnEphemeralInstance({
325
- systemPrompt: buildSystemPrompt(config.role, this.config.topic),
326
- workingDirectory: "/tmp",
327
- lightweight: this.config.mode === "debate",
328
- skipPermissions: this.config.mode === "debate",
329
- });
330
- this.participants.push({ ...config, instanceName });
331
- await this.output.postMessage(`➕ ${config.label}(${roleLabel(config.role)})加入會議`);
332
- }
333
- async removeParticipant(label) {
334
- const idx = this.participants.findIndex(p => p.label === label);
335
- if (idx === -1)
336
- return;
337
- const [removed] = this.participants.splice(idx, 1);
338
- await this.fm.destroyEphemeralInstance(removed.instanceName);
339
- await this.output.postMessage(`➖ ${removed.label}(${roleLabel(removed.role)})已離開會議`);
340
- }
341
- async end() {
342
- if (this.state !== "ended") {
343
- await this.generateSummary();
344
- }
345
- await this.cleanup();
346
- }
347
- async cleanup() {
348
- this.state = "ended";
349
- this.abortController.abort();
350
- await Promise.allSettled(this.participants.map(p => this.fm.destroyEphemeralInstance(p.instanceName)));
351
- await this.output.postMessage("📋 會議結束");
352
- }
353
- getState() { return this.state; }
354
- }
355
- //# sourceMappingURL=orchestrator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/meeting/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { MeetingRole, RoundEntry } from "./types.js";
2
- export declare function roleLabel(role: MeetingRole): string;
3
- export declare function buildSystemPrompt(role: MeetingRole, topic: string): string;
4
- export declare function buildRoundPrompt(topic: string, round: number, previousRounds: RoundEntry[], userContext?: string): string;
5
- export declare function buildCollabSystemPrompt(label: string, topic: string): string;
6
- export declare function buildCollabSummaryPrompt(topic: string, allRounds: RoundEntry[]): string;
7
- export declare function buildAngleGenerationPrompt(topic: string, count: number): string;
8
- export declare function buildDiscussionSystemPrompt(label: string, angle: string, topic: string): string;
9
- export declare function buildIndependentAnalysisPrompt(topic: string, angle: string): string;
10
- export declare function buildCrossDiscussionPrompt(topic: string, myAngle: string, allAnalyses: RoundEntry[]): string;
11
- export declare function buildConsensusPrompt(topic: string, allRounds: RoundEntry[]): string;
12
- export declare function buildSummaryPrompt(topic: string, allRounds: RoundEntry[]): string;