@rrr2010/opencode-roundtable 0.2.0 → 0.3.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.
- package/README.md +244 -198
- package/dist/index.js +139 -100
- package/dist/index.js.map +8 -8
- package/docs/SPEC.md +974 -979
- package/package.json +60 -53
- package/src/tui/tui.tsx +89 -0
package/dist/index.js.map
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["..\\index.ts", "..\\src\\config.ts", "..\\src\\state.ts", "..\\src\\utils.ts", "..\\src\\prompts.ts", "..\\src\\handlers.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { type Plugin, type PluginInput, tool } from \"@opencode-ai/plugin\"\nimport type { RoundtableArgs, Event as RoundtableEvent } from \"./src/types\"\nimport { loadConfig } from \"./src/config\"\nimport { states, timeoutHandles, pendingResults } from \"./src/state\"\nimport { getSessionIdFromEvent, validateAgents, scanOrphanRoundtables } from \"./src/utils\"\nimport { startNewRoundtable, extendRoundtable, processNextTurn, handleAgentError, handleSessionDeleted } from \"./src/handlers\"\n\nexport const RoundtablePlugin: Plugin = async (ctx) => {\n try {\n await loadConfig(ctx)\n } catch { /* best-effort */ }\n\n try {\n await scanOrphanRoundtables(ctx)\n } catch (err) {\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"error\",\n message: `scanOrphanRoundtables failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n })\n } catch { /* best-effort */ }\n }\n\n return {\n event: async ({ event }: { event: { type: string; properties: Record<string, unknown> } }) => {\n const sessionID = getSessionIdFromEvent(event)\n if (!sessionID || !states.has(sessionID)) return\n\n const state = states.get(sessionID)!\n\n switch (event.type) {\n case \"session.idle\": {\n const handle = timeoutHandles.get(sessionID)\n if (handle) { clearTimeout(handle); timeoutHandles.delete(sessionID) }\n await processNextTurn(ctx, state)\n break\n }\n case \"session.error\": {\n await handleAgentError(ctx, state, event as RoundtableEvent)\n break\n }\n case \"session.deleted\": {\n const deletedID = (event.properties.info as { id?: string })?.id\n if (deletedID) await handleSessionDeleted(ctx, state, deletedID)\n break\n }\n }\n },\n\n \"experimental.session.compacting\": async (\n _input: { sessionID: string },\n _output: { context: string[]; prompt?: string },\n ) => {\n // Phase 4: will re-inject [ROUNDTABLE META] state during compaction\n },\n\n tool: {\n roundtable: tool({\n description:\n \"Starts a multi-agent roundtable debate where agents discuss a topic turn by turn. \" +\n \"After all rounds, a built-in observer consolidates the discussion into an executive summary.\\n\\n\" +\n \"Returns an object with { sessionID, summary } after the debate concludes.\\n\\n\" +\n \"Note: this tool injects system-level prompts into each agent's context during \" +\n \"the debate (role-setting, topic, turn routing, and lifecycle signals).\\n\\n\" +\n \"Choosing agents: select agents based on their expertise (e.g., pm for product decisions, \" +\n \"dev for technical trade-offs, rv for code review). You can also specify in the prompt \" +\n \"what each agent should focus on (e.g., 'pm: focus on cost; dev: focus on maintainability').\\n\\n\" +\n \"Multiple rounds: for complex topics, use 2+ rounds and INCLUDE per-round focus \" +\n \"instructions IN the prompt itself (e.g., prompt: 'Round 1: list pros. Round 2: \" +\n \"list cons. Round 3: propose an implementation plan'). This way all agents see \" +\n \"the full agenda. The default is 1 round.\",\n\n args: {\n agents: tool.schema\n .array(tool.schema.string())\n .min(2)\n .describe(\n \"Agent names in speaking order (minimum 2). Choose agents based on \" +\n \"their expertise — each brings a different perspective. Example: [\\\"pm\\\", \\\"dev\\\", \\\"rv\\\"]\",\n ),\n prompt: tool.schema\n .string()\n .describe(\n \"Topic or challenge for the agents to debate. For multi-round debates, \" +\n \"include per-round instructions here (e.g., 'Round 1: pros. Round 2: cons. \" +\n \"Round 3: plan.'). All agents will see this and follow the round structure.\",\n ),\n rounds: tool.schema\n .number()\n .min(1)\n .max(50)\n .describe(\n \"Number of complete rounds (each round = all agents speak once). \" +\n \"Default: 1. Max: 50. For complex topics with 2+ rounds, include per-round focus \" +\n \"instructions in the prompt parameter so all agents see the agenda.\",\n ),\n observer: tool.schema\n .string()\n .optional()\n .describe(\n \"Agent name for final consolidation. The observer does not debate — it \" +\n \"summarizes after all rounds. Omit to use the built-in observer.\",\n ),\n sessionID: tool.schema\n .string()\n .optional()\n .describe(\n \"Session ID (format: ses_xxxx) from a previous roundtable call to \" +\n \"continue a concluded debate. Omit this parameter and pass agents + \" +\n \"prompt to start a fresh debate.\",\n ),\n title: tool.schema\n .string()\n .optional()\n .describe(\n \"Custom title for the session (max 200 chars). If omitted, auto-generated \" +\n \"as \\\"(Roundtable) - {first 80 chars of prompt, truncated at word boundary}\\\".\",\n ),\n },\n\n async execute(args: Record<string, unknown>, toolCtx: { sessionID: string }) {\n try {\n const rounds = (args.rounds as number) ?? 1\n\n if (args.sessionID) {\n if (typeof args.sessionID !== \"string\" || !args.sessionID.trim()) {\n return \"Error: sessionID is empty\"\n }\n if (args.agents) {\n return \"Error: pass either sessionID (extend) or agents (new), not both\"\n }\n const sid = await extendRoundtable(ctx, args as unknown as RoundtableArgs, toolCtx)\n if (sid.startsWith(\"Error:\") || sid.startsWith(\"Invalid\")) return sid\n const result = await new Promise<string>((resolve) => pendingResults.set(sid, { resolve }))\n return result\n }\n\n if (!args.agents || !Array.isArray(args.agents) || args.agents.length < 2) {\n return \"Error: 'agents' with at least 2 names is required\"\n }\n const validation = await validateAgents(ctx, args.agents as string[])\n if (!validation.valid) {\n const available = validation.available.map((a) => a.name).join(\", \")\n return [\"Invalid agent configuration:\", ...validation.errors.map((e) => ` - ${e}`), `Available agents: ${available}`].join(\"\\n\")\n }\n if (rounds > 50) {\n return \"Error: Maximum 50 rounds allowed\"\n }\n\n const sid = await startNewRoundtable(ctx, { ...args, rounds } as RoundtableArgs, toolCtx)\n const result = await new Promise<string>((resolve) => pendingResults.set(sid, { resolve }))\n return result\n } catch (err) {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"error\",\n message: `roundtable.execute error: ${err instanceof Error ? err.stack || err.message : String(err)}`,\n },\n })\n return `Error: ${err instanceof Error ? err.message : String(err)}`\n }\n },\n }),\n\n available_agents: tool({\n description:\n \"Lists all configured agents and their roles. \" +\n \"Returns a formatted list of agent names (e.g., \\\"Available agents: pm, dev, rv\\\"). \" +\n \"Use this to choose which agents should participate in a roundtable \" +\n \"based on their descriptions — then call roundtable() with your selection.\",\n\n args: {},\n\n async execute() {\n try {\n const result = await ctx.client.app.agents()\n const names = result.data.map((a: { name: string }) => a.name)\n return `Available agents: ${names.join(\", \")}`\n } catch {\n return \"Error: Could not fetch agent list. The server might not be ready.\"\n }\n },\n }),\n },\n } as unknown as ReturnType<Plugin>\n}\n",
|
|
6
|
-
"import { readFile, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\nimport os from \"os\"\nimport type { PluginConfig } from \"./types\"\nimport type { PluginInput } from \"@opencode-ai/plugin\"\n\nconst configDir = (() => {\n const xdgConfigHome = process.env.XDG_CONFIG_HOME\n if (xdgConfigHome) return join(xdgConfigHome, \"opencode\")\n return join(os.homedir(), \".config\", \"opencode\")\n})()\n\nconst configPath = join(configDir, \"roundtable.json\")\n\nconst configSchemaUrl =\n \"https://raw.githubusercontent.com/opencode-ai/roundtable/main/docs/roundtable.schema.json\"\n\nconst DEFAULT_CONFIG: PluginConfig = {\n defaultTimeoutMs: 300_000,\n loopSimilarityThreshold: 0.85,\n toolOutputPreviewMax: 500,\n defaultObserverPrompt: [\n \"You are an impartial roundtable observer.\",\n \"Consolidate the debate below into:\",\n \"\",\n \"1. **Executive summary** (2-3 sentences)\",\n \"2. **Key points** raised by each participant\",\n \"3. **Decisions or convergences** reached\",\n \"4. **Remaining open questions**\",\n \"5. **Suggested next steps**\",\n ].join(\"\\n\"),\n maxRounds: 10,\n}\n\nlet config: PluginConfig = { ...DEFAULT_CONFIG }\n\nexport function getConfig(): PluginConfig {\n return config\n}\n\nfunction validateConfig(raw: Record<string, unknown>): PluginConfig {\n return {\n defaultTimeoutMs:\n typeof raw.defaultTimeoutMs === \"number\" && raw.defaultTimeoutMs >= 30_000\n ? raw.defaultTimeoutMs\n : DEFAULT_CONFIG.defaultTimeoutMs,\n loopSimilarityThreshold:\n typeof raw.loopSimilarityThreshold === \"number\" &&\n raw.loopSimilarityThreshold >= 0 &&\n raw.loopSimilarityThreshold <= 1\n ? raw.loopSimilarityThreshold\n : DEFAULT_CONFIG.loopSimilarityThreshold,\n toolOutputPreviewMax:\n typeof raw.toolOutputPreviewMax === \"number\" && raw.toolOutputPreviewMax >= 100\n ? raw.toolOutputPreviewMax\n : DEFAULT_CONFIG.toolOutputPreviewMax,\n defaultObserverPrompt:\n typeof raw.defaultObserverPrompt === \"string\" && raw.defaultObserverPrompt.length > 0\n ? raw.defaultObserverPrompt\n : DEFAULT_CONFIG.defaultObserverPrompt,\n maxRounds:\n typeof raw.maxRounds === \"number\" && raw.maxRounds >= 1\n ? raw.maxRounds\n : DEFAULT_CONFIG.maxRounds,\n }\n}\n\nexport async function loadConfig(ctx: PluginInput): Promise<void> {\n try {\n const content = await readFile(configPath, \"utf-8\")\n const raw = JSON.parse(content)\n if (typeof raw !== \"object\" || !raw) throw new Error(\"Invalid config format\")\n config = validateConfig(raw as Record<string, unknown>)\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"info\",\n message: \"Configuration loaded\",\n extra: { configPath },\n },\n })\n } catch (err) {\n if (\n typeof err === \"object\" &&\n err !== null &&\n \"code\" in err &&\n (err as { code: string }).code === \"ENOENT\"\n ) {\n try {\n await writeFile(\n configPath,\n JSON.stringify({ $schema: configSchemaUrl, ...DEFAULT_CONFIG }, null, 2),\n \"utf-8\",\n )\n config = { ...DEFAULT_CONFIG }\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"info\",\n message: \"Created default configuration\",\n extra: { configPath },\n },\n })\n } catch {\n config = { ...DEFAULT_CONFIG }\n }\n } else {\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"warn\",\n message: `Invalid config, using defaults: ${err instanceof Error ? err.message : String(err)}`,\n extra: { configPath },\n },\n })\n } catch { /* best-effort */ }\n config = { ...DEFAULT_CONFIG }\n }\n }\n}\n",
|
|
7
|
-
"import
|
|
8
|
-
"import type { Part, HistoryEntry, ToolCallSummary, RoundtableState, RoundtableArgs } from \"./types\"\nimport { getConfig } from \"./config\"\nimport type { PluginInput } from \"@opencode-ai/plugin\"\nimport { pendingResults } from \"./state\"\n\nexport function generateDefaultTitle(args: RoundtableArgs & { agents: string[] }): string {\n if (args.title) return args.title\n const summary = args.prompt.length > 60 ? args.prompt.slice(0, 57) + \"...\" : args.prompt\n return `(Roundtable) - ${summary}`\n}\n\nexport function getSessionIdFromEvent(event: { type: string; properties: Record<string, unknown> }): string | undefined {\n if (!(\"properties\" in event)) return undefined\n const props = event.properties as Record<string, unknown>\n if (typeof props.sessionID === \"string\") return props.sessionID\n if (props.info && typeof props.info === \"object\") {\n const info = props.info as { id?: string }\n if (info.id) return info.id\n }\n return undefined\n}\n\nexport async function validateAgents(\n ctx: PluginInput,\n agentNames: string[],\n): Promise<{ valid: boolean; available: { name: string; description?: string }[]; errors: string[] }> {\n const errors: string[] = []\n if (agentNames.length < 2) {\n errors.push(\"At least 2 agents are required\")\n return { valid: false, available: [], errors }\n }\n\n let available: { name: string; description?: string }[] = []\n try {\n const result = await ctx.client.app.agents()\n available = result.data.map((a: { name: string; description?: string }) => ({\n name: a.name,\n description: a.description,\n }))\n } catch {\n errors.push(\"Failed to fetch available agents from server\")\n return { valid: false, available: [], errors }\n }\n\n const availableNames = new Set(available.map((a) => a.name))\n for (const name of agentNames) {\n if (!availableNames.has(name)) errors.push(`Agent \"${name}\" not found`)\n }\n\n return { valid: errors.length === 0, available, errors }\n}\n\nexport function arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false\n return true\n}\n\nexport function detectLoop(history: HistoryEntry[]): boolean {\n if (history.length < 2) return false\n const last = history[history.length - 1].response\n const prev = history[history.length - 2].response\n\n const bigrams = (s: string): Set<string> => {\n const set = new Set<string>()\n const cleaned = s.replace(/[\\s\\n\\r]+/g, \" \")\n for (let i = 0; i < cleaned.length - 1; i++) set.add(cleaned.slice(i, i + 2))\n return set\n }\n\n const lastBigrams = bigrams(last)\n const prevBigrams = bigrams(prev)\n let intersection = 0\n for (const b of lastBigrams) if (prevBigrams.has(b)) intersection++\n\n const union = new Set([...lastBigrams, ...prevBigrams])\n if (union.size === 0) return false\n return intersection / union.size > getConfig().loopSimilarityThreshold\n}\n\nexport function extractResponse(parts: Part[]): string | null {\n for (const part of parts) if (part.type === \"text\") return part.text\n return null\n}\n\nexport function buildToolSummary(part: Part): ToolCallSummary | null {\n if (part.type !== \"tool\") return null\n const toolName = (part as unknown as { tool: string }).tool\n const state = (part as unknown as { state: { status: string; output?: string } }).state\n let outputPreview: string\n switch (state.status) {\n case \"completed\":\n outputPreview = state.output!.slice(0, getConfig().toolOutputPreviewMax)\n break\n case \"error\":\n outputPreview = (state.output ?? \"(unknown error)\").slice(0, getConfig().toolOutputPreviewMax)\n break\n case \"running\":\n case \"pending\":\n outputPreview = `(${state.status})`\n break\n default:\n outputPreview = \"(unknown)\"\n }\n return { toolName, outputPreview }\n}\n\nexport function buildToolSummaries(parts: Part[]): ToolCallSummary[] {\n const summaries: ToolCallSummary[] = []\n for (const part of parts) {\n const summary = buildToolSummary(part)\n if (summary) summaries.push(summary)\n }\n return summaries\n}\n\nexport function buildConsolidatedSummary(state: RoundtableState): string {\n const lines: string[] = []\n lines.push(\"━━━ Roundtable Concluded ━━━\")\n lines.push(`Topic: ${state.prompt}`)\n lines.push(`Participants: ${state.agents.join(\", \")}`)\n if (state.errors.length > 0) lines.push(`Errors: ${state.errors.join(\"; \")}`)\n lines.push(\"\")\n\n for (const entry of state.history) {\n const label = entry.agent === \"observer\" ? \"Observer\" : `${entry.agent} (Round ${entry.round + 1})`\n lines.push(`── ${label} ──`)\n lines.push(entry.response)\n if (entry.toolCalls.length > 0) {\n lines.push(...entry.toolCalls.map((tc) => ` \\u2022 ${tc.toolName} \\u2192 ${tc.outputPreview.slice(0, 80)}`))\n }\n if (entry.hasError) lines.push(\" \\u26A0 This response had errors\")\n lines.push(\"\")\n }\n return lines.join(\"\\n\")\n}\n\nexport async function injectRoundtableDelimiter(\n ctx: PluginInput,\n sessionID: string,\n): Promise<void> {\n const delimiter = [\n \"━━━ Roundtable Concluded ━━━\",\n \"Messages below this line are not part of the original debate.\",\n \"The result was consolidated in the main session.\",\n ].join(\"\\n\")\n\n await ctx.client.session.prompt({\n path: { id: sessionID },\n body: { noReply: true, parts: [{ type: \"text\", text: delimiter }] },\n })\n}\n\nexport function buildExtendedPrompt(originalPrompt: string, extendPrompt: string): string {\n const continuationTriggers = [\n \"debate more\", \"continue\", \"dive deeper\", \"go deeper\",\n \"expand on\", \"elaborate\", \"further discuss\", \"keep debating\",\n ]\n const lower = extendPrompt.toLowerCase().trim()\n const isContinuation = continuationTriggers.some((trigger) => lower.startsWith(trigger))\n\n if (isContinuation) {\n return `Original topic: ${originalPrompt}\\n\\nContinuation: ${extendPrompt}`\n }\n\n return [\n \"Previous discussion history preserved. Original topic was:\",\n ` ${originalPrompt}`,\n \"\",\n `New challenge: ${extendPrompt}`,\n ].join(\"\\n\")\n}\n\nexport async function
|
|
9
|
-
"import type { RoundtableState } from \"./types\"\nimport { getConfig } from \"./config\"\n\nexport function buildAgentPrompt(state: RoundtableState, agent: string): string {\n const lines: string[] = []\n const agentList = state.agents.join(\" → \")\n const roundInfo = `Round ${state.currentRound + 1}/${state.totalRounds} | Current agent: ${agent}`\n\n if (state.currentRound === 0 && state.currentAgentIndex === 0) {\n lines.push(`[System] You are participating in a roundtable debate. Agents (${agentList}) will discuss the topic below in ${state.totalRounds} round(s).`)\
|
|
10
|
-
"import type { PluginInput } from \"@opencode-ai/plugin\"\nimport type { RoundtableArgs, RoundtableState, HistoryEntry, Event as RoundtableEvent } from \"./types\"\nimport { states, timeoutHandles, pendingResults, serializeState, deserializeState, findSerializedState } from \"./state\"\nimport { getConfig } from \"./config\"\nimport { buildAgentPrompt, buildObserverPrompt } from \"./prompts\"\nimport {\n validateAgents, arraysEqual, buildExtendedPrompt, detectLoop,\n extractResponse, buildToolSummaries, buildConsolidatedSummary,\n generateDefaultTitle, injectRoundtableDelimiter, scanOrphanRoundtables,\n} from \"./utils\"\n\n// ============================================================\n// startNewRoundtable\n// ============================================================\n\nexport async function startNewRoundtable(\n ctx: PluginInput,\n args: RoundtableArgs,\n toolCtx: { sessionID: string },\n): Promise<string> {\n const agents = args.agents!\n const newSession = await ctx.client.session.create({\n body: { title: generateDefaultTitle({ ...args, agents }) },\n })\n\n const sessionID = newSession.data.id\n const parentSessionID = toolCtx.sessionID\n\n const state: RoundtableState = {\n sessionID,\n parentSessionID,\n agents,\n totalRounds: args.rounds,\n observer: args.observer ?? \"built-in\",\n prompt: args.prompt,\n currentRound: 0,\n currentAgentIndex: 0,\n phase: \"active\",\n history: [],\n errors: [],\n createdAt: Date.now(),\n currentGeneration: 0,\n userInterjections: [],\n }\n\n states.set(sessionID, state)\n\n try {\n await ctx.client.session.prompt({\n path: { id: sessionID },\n body: { noReply: true, parts: [{ type: \"text\", text: serializeState(state) }] },\n })\n\n await sendToAgent(ctx, state)\n\n await ctx.client.session.prompt({\n path: { id: parentSessionID },\n body: {\n noReply: true,\n parts: [{\n type: \"text\",\n text: `The roundtable has started (agents: ${agents.join(\", \")}, ${args.rounds} round(s)). To extend it later, use the tool roundtable({sessionID: \"${sessionID}\", rounds: N, prompt: \"...\"})`,\n }],\n },\n })\n\n await ctx.client.tui.showToast({\n body: {\n message: `Roundtable started in #${sessionID} (${agents.join(\" → \")} · ${args.rounds} round(s))`,\n variant: \"info\",\n },\n })\n\n return sessionID\n } catch (err) {\n states.delete(sessionID)\n throw err\n }\n}\n\n// ============================================================\n// sendToAgent\n// ============================================================\n\nexport async function sendToAgent(\n ctx: PluginInput,\n state: RoundtableState,\n): Promise<void> {\n try {\n const agent = state.agents[state.currentAgentIndex]\n const prompt = buildAgentPrompt(state, agent)\n\n await ctx.client.session.prompt({\n path: { id: state.sessionID },\n body: { agent, parts: [{ type: \"text\", text: prompt }] },\n })\n\n state.currentGeneration++\n const capturedGeneration = state.currentGeneration\n\n const handle = setTimeout(async () => {\n timeoutHandles.delete(state.sessionID)\n if (state.currentGeneration !== capturedGeneration) return\n\n try {\n await ctx.client.session.abort({ path: { id: state.sessionID } })\n state.errors.push(`Agent \"${agent}\" timed out after ${getConfig().defaultTimeoutMs / 1000}s`)\n } catch { /* session may already be done */ }\n }, getConfig().defaultTimeoutMs)\n\n timeoutHandles.set(state.sessionID, handle)\n await updateSessionTitle(ctx, state)\n\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: `Turn started: ${agent} (R${state.currentRound + 1}/${state.totalRounds})`,\n extra: {\n sessionID: state.sessionID, agent,\n round: state.currentRound + 1,\n totalRounds: state.totalRounds,\n generation: state.currentGeneration,\n },\n },\n })\n } catch (err) {\n state.errors.push(\n `Failed to send to agent \"${state.agents[state.currentAgentIndex]}\": ${err instanceof Error ? err.message : String(err)}`,\n )\n const handle = timeoutHandles.get(state.sessionID)\n if (handle) { clearTimeout(handle); timeoutHandles.delete(state.sessionID) }\n }\n}\n\n// ============================================================\n// updateSessionTitle\n// ============================================================\n\nexport async function updateSessionTitle(\n ctx: PluginInput,\n state: RoundtableState,\n): Promise<void> {\n const summary = state.prompt.length > 60 ? state.prompt.slice(0, 57) + \"...\" : state.prompt\n await ctx.client.session.update({\n path: { id: state.sessionID },\n body: { title: `(Roundtable) - ${summary}` },\n })\n}\n\n// ============================================================\n// sendObserverPrompt\n// ============================================================\n\nasync function sendObserverPrompt(\n ctx: PluginInput,\n state: RoundtableState,\n): Promise<void> {\n try {\n const prompt = buildObserverPrompt(state, state.observer)\n\n if (state.observer === \"built-in\") {\n await ctx.client.session.prompt({\n path: { id: state.sessionID },\n body: { noReply: false, parts: [{ type: \"text\", text: prompt }] },\n })\n } else {\n await ctx.client.session.prompt({\n path: { id: state.sessionID },\n body: { agent: state.observer, parts: [{ type: \"text\", text: prompt }] },\n })\n }\n\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: `Observer prompt sent: ${state.observer}`,\n extra: { sessionID: state.sessionID, observer: state.observer },\n },\n })\n } catch (err) {\n state.errors.push(`Failed to send observer prompt: ${err instanceof Error ? err.message : String(err)}`)\n state.phase = \"aborted\"\n await finalizeRoundtable(ctx, state)\n }\n}\n\n// ============================================================\n// finalizeRoundtable\n// ============================================================\n\nexport async function finalizeRoundtable(\n ctx: PluginInput,\n state: RoundtableState,\n): Promise<void> {\n const sessionID = state.sessionID\n\n const timeoutHandle = timeoutHandles.get(sessionID)\n if (timeoutHandle) { clearTimeout(timeoutHandle); timeoutHandles.delete(sessionID) }\n\n try {\n const summary = buildConsolidatedSummary(state)\n\n const pending = pendingResults.get(sessionID)\n if (pending) {\n pending.resolve(summary)\n pendingResults.delete(sessionID)\n }\n\n await injectRoundtableDelimiter(ctx, sessionID)\n\n const shortPrompt = state.prompt.length > 50 ? state.prompt.slice(0, 47) + \"...\" : state.prompt\n await ctx.client.session.update({\n path: { id: sessionID },\n body: { title: `(Roundtable) - ${shortPrompt} · CONCLUDED` },\n })\n\n try {\n await ctx.client.session.prompt({\n path: { id: sessionID },\n body: { noReply: true, parts: [{ type: \"text\", text: serializeState(state) }] },\n })\n } catch { /* best-effort */ }\n\n await ctx.client.tui.showToast({\n body: { message: \"Roundtable concluded\", variant: \"success\" },\n })\n } catch (err) {\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"error\",\n message: `Failed to finalize roundtable #${sessionID}: ${err instanceof Error ? err.message : String(err)}`,\n extra: { sessionID, phase: state.phase },\n },\n })\n } catch { /* best-effort */ }\n } finally {\n states.delete(sessionID)\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: `State cleaned up for session #${sessionID}`,\n extra: { sessionID, phase: state.phase },\n },\n })\n } catch { /* best-effort */ }\n }\n}\n\n// ============================================================\n// processNextTurn\n// ============================================================\n\nexport async function processNextTurn(\n ctx: PluginInput,\n state: RoundtableState,\n): Promise<void> {\n if (state.phase === \"done\" || state.phase === \"aborted\") return\n\n const result = await ctx.client.session.messages({ path: { id: state.sessionID } })\n const messages = result.data\n\n const userMsgs = messages.filter((m: { info: { role: string } }) => m.info.role === \"user\")\n for (const msg of userMsgs) {\n for (const part of msg.parts) {\n if (part.type === \"text\" && !part.text.includes(\"[ROUNDTABLE META\")) {\n if (!state.userInterjections.includes(part.text)) {\n state.userInterjections.push(part.text)\n }\n }\n }\n }\n\n const assistantMsgs = messages.filter(\n (m: { info: { role: string } }) => m.info.role === \"assistant\",\n )\n if (assistantMsgs.length === 0) return\n\n const latestMsg = assistantMsgs[assistantMsgs.length - 1]\n if (state.lastProcessedMsgId === latestMsg.info.id) return\n state.lastProcessedMsgId = latestMsg.info.id\n\n if (state.phase === \"active\") {\n const response = extractResponse(latestMsg.parts)\n if (!response) {\n state.errors.push(\n `Agent ${state.agents[state.currentAgentIndex]} returned no text in round ${state.currentRound + 1}`,\n )\n }\n\n const toolCalls = buildToolSummaries(latestMsg.parts)\n const entry: HistoryEntry = {\n agent: state.agents[state.currentAgentIndex],\n round: state.currentRound,\n response: response ?? \"(no text response)\",\n toolCalls,\n hasError: response === null,\n }\n state.history.push(entry)\n\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: `Turn complete: ${entry.agent} (R${state.currentRound + 1})`,\n extra: {\n sessionID: state.sessionID, agent: entry.agent,\n round: state.currentRound + 1,\n responseLength: entry.response.length,\n toolCallCount: entry.toolCalls.length,\n hasError: entry.hasError,\n },\n },\n })\n\n if (detectLoop(state.history)) {\n state.errors.push(\"Loop detected — agents reached an impasse\")\n state.phase = \"done\"\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: \"Loop detected — finalizing early\",\n extra: { sessionID: state.sessionID, similarity: getConfig().loopSimilarityThreshold },\n },\n })\n await finalizeRoundtable(ctx, state)\n return\n }\n\n const nextIndex = state.currentAgentIndex + 1\n if (nextIndex < state.agents.length) {\n state.currentAgentIndex = nextIndex\n await sendToAgent(ctx, state)\n } else if (state.currentRound + 1 < state.totalRounds) {\n state.currentRound++\n state.currentAgentIndex = 0\n await sendToAgent(ctx, state)\n } else {\n state.phase = \"observing\"\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: \"All rounds complete — transitioning to observer\",\n extra: { sessionID: state.sessionID, totalRounds: state.totalRounds },\n },\n })\n await sendObserverPrompt(ctx, state)\n }\n return\n }\n\n if (state.phase === \"observing\") {\n const summary = extractResponse(latestMsg.parts)\n state.history.push({\n agent: \"observer\",\n round: state.currentRound,\n response: summary ?? \"(no summary)\",\n toolCalls: [],\n hasError: summary === null,\n })\n state.phase = \"done\"\n await finalizeRoundtable(ctx, state)\n }\n}\n\n// ============================================================\n// handleAgentError\n// ============================================================\n\nexport async function handleAgentError(\n ctx: PluginInput,\n state: RoundtableState,\n event: RoundtableEvent,\n): Promise<void> {\n if (state.phase === \"observing\" || state.phase === \"done\") {\n state.phase = \"aborted\"\n await finalizeRoundtable(ctx, state)\n return\n }\n\n const agent = state.agents[state.currentAgentIndex]\n const errorMsg =\n event.type === \"session.error\" && event.properties.error\n ? typeof event.properties.error === \"object\"\n ? (event.properties.error as { message?: string }).message ?? JSON.stringify(event.properties.error)\n : String(event.properties.error)\n : \"Unknown error\"\n\n state.errors.push(`Agent \"${agent}\" failed on round ${state.currentRound + 1}: ${errorMsg}`)\n\n const handle = timeoutHandles.get(state.sessionID)\n if (handle) { clearTimeout(handle); timeoutHandles.delete(state.sessionID) }\n\n await ctx.client.tui.showToast({\n body: {\n message: `\"${agent}\" failed on Round ${state.currentRound + 1}. Skipping to next.`,\n variant: \"warning\",\n },\n })\n\n const nextIndex = state.currentAgentIndex + 1\n if (nextIndex < state.agents.length) {\n state.currentAgentIndex = nextIndex\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: \"Agent skipped due to error\",\n extra: { sessionID: state.sessionID, failedAgent: agent, nextAgent: state.agents[state.currentAgentIndex], round: state.currentRound + 1 },\n },\n })\n } catch { /* best-effort */ }\n await sendToAgent(ctx, state)\n } else if (state.currentRound + 1 < state.totalRounds) {\n state.currentRound++\n state.currentAgentIndex = 0\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: \"Agent skipped due to error — moving to next round\",\n extra: { sessionID: state.sessionID, failedAgent: agent, round: state.currentRound + 1 },\n },\n })\n } catch { /* best-effort */ }\n await sendToAgent(ctx, state)\n } else {\n state.phase = \"aborted\"\n try {\n await ctx.client.tui.showToast({\n body: { message: \"All agents failed — roundtable aborted\", variant: \"error\" },\n })\n } catch { /* best-effort */ }\n await finalizeRoundtable(ctx, state)\n }\n}\n\n// ============================================================\n// handleSessionDeleted\n// ============================================================\n\nexport async function handleSessionDeleted(\n ctx: PluginInput,\n state: RoundtableState,\n deletedSessionID: string,\n): Promise<void> {\n const handle = timeoutHandles.get(state.sessionID)\n if (handle) { clearTimeout(handle); timeoutHandles.delete(state.sessionID) }\n\n if (deletedSessionID === state.sessionID) {\n state.phase = \"aborted\"\n const partialSummary = buildConsolidatedSummary(state)\n const output = [\n \"[Roundtable interrupted — session closed]\",\n \"Partial history up to interruption:\",\n \"\",\n partialSummary,\n ].join(\"\\n\")\n\n const pending = pendingResults.get(state.sessionID)\n if (pending) {\n pending.resolve(output)\n pendingResults.delete(state.sessionID)\n }\n\n try {\n await ctx.client.tui.showToast({\n body: { message: \"Roundtable interrupted\", variant: \"warning\" },\n })\n } catch { /* best-effort */ }\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: \"S2 deleted — pending promise resolved with partial result\",\n extra: { sessionID: deletedSessionID, parentSessionID: state.parentSessionID },\n },\n })\n } catch { /* best-effort */ }\n } else if (deletedSessionID === state.parentSessionID) {\n state.phase = \"aborted\"\n try {\n await ctx.client.session.abort({ path: { id: state.sessionID } })\n } catch { /* S2 may already be gone */ }\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"debug\",\n message: \"S1 deleted — S2 aborted\",\n extra: { sessionID: state.sessionID, parentSessionID: deletedSessionID },\n },\n })\n } catch { /* best-effort */ }\n }\n\n states.delete(state.sessionID)\n}\n\n// ============================================================\n// extendRoundtable\n// ============================================================\n\nexport async function extendRoundtable(\n ctx: PluginInput,\n args: RoundtableArgs,\n _toolCtx: { sessionID: string },\n): Promise<string> {\n const sessionID = args.sessionID!\n\n try {\n await ctx.client.session.get({ path: { id: sessionID } })\n } catch {\n return `Error: Session #${sessionID} not found or inaccessible. Cannot extend.`\n }\n\n let messagesData\n try {\n messagesData = await ctx.client.session.messages({ path: { id: sessionID } })\n } catch {\n return `Error: Could not read messages from session #${sessionID}`\n }\n\n const serializedRaw = findSerializedState(messagesData.data)\n if (!serializedRaw) {\n return [\n `Error: No roundtable state found in session #${sessionID}.`,\n \"This session is not a roundtable or the state was lost during compaction.\",\n ].join(\"\\n\")\n }\n\n const originalState = deserializeState(serializedRaw)\n if (!originalState) {\n return `Error: Corrupt roundtable state in session #${sessionID}. Cannot extend.`\n }\n\n if (originalState.phase === \"done\") {\n // proceed\n } else if (originalState.phase === \"active\") {\n const assistantCount = messagesData.data.filter(\n (m: { info: { role: string } }) => m.info.role === \"assistant\",\n ).length\n const expectedAssistantCount = originalState.totalRounds * originalState.agents.length + 1\n if (assistantCount >= expectedAssistantCount) {\n originalState.phase = \"done\"\n try {\n await ctx.client.app.log({\n body: {\n service: \"roundtable\",\n level: \"info\",\n message: `Recovered stuck session #${sessionID}: phase was active but ${assistantCount} assistant msgs suggest debate completed.`,\n extra: { sessionID, assistantCount, expectedAssistantCount },\n },\n })\n } catch { /* best-effort */ }\n } else {\n return [\n `Error: Roundtable #${sessionID} is still active (phase: ${originalState.phase}).`,\n \"Cannot extend until the roundtable concludes.\",\n ].join(\"\\n\")\n }\n } else {\n return [\n `Error: Roundtable #${sessionID} is in state \"${originalState.phase}\" and cannot be extended.`,\n ].join(\"\\n\")\n }\n\n if (args.agents && !arraysEqual(args.agents, originalState.agents)) {\n return [\n \"Error: Agent mismatch.\",\n `Original: ${originalState.agents.join(\", \")}`,\n `Provided: ${args.agents.join(\", \")}`,\n \"Extend must use the same agents as the original roundtable.\",\n ].join(\"\\n\")\n }\n\n try {\n const storedValidation = await validateAgents(ctx, originalState.agents)\n if (!storedValidation.valid) {\n return [\n \"Error: One or more agents from the original roundtable no longer exist.\",\n ...storedValidation.errors.map((e) => ` - ${e}`),\n ].join(\"\\n\")\n }\n } catch {\n return \"Error: Failed to validate agents. Cannot extend.\"\n }\n\n const extendedPrompt = buildExtendedPrompt(originalState.prompt, args.prompt)\n\n const newState: RoundtableState = {\n sessionID: originalState.sessionID,\n parentSessionID: originalState.parentSessionID,\n agents: originalState.agents,\n totalRounds: originalState.totalRounds + args.rounds,\n observer: originalState.observer,\n prompt: extendedPrompt,\n currentRound: originalState.currentRound,\n currentAgentIndex: 0,\n phase: \"active\",\n history: [...originalState.history],\n errors: [...originalState.errors],\n createdAt: Date.now(),\n currentGeneration: 0,\n userInterjections: [...(originalState.userInterjections ?? [])],\n }\n\n states.set(sessionID, newState)\n\n try {\n await ctx.client.session.prompt({\n path: { id: sessionID },\n body: { noReply: true, parts: [{ type: \"text\", text: serializeState(newState) }] },\n })\n\n const agentList = originalState.agents.join(\" vs \")\n await ctx.client.session.update({\n path: { id: sessionID },\n body: { title: `Roundtable: ${agentList} (R${newState.currentRound + 1}/${newState.totalRounds})` },\n })\n\n await ctx.client.session.prompt({\n path: { id: originalState.parentSessionID },\n body: {\n noReply: true,\n parts: [{\n type: \"text\",\n text: `The roundtable has been extended (${args.rounds} more round(s)). To extend again, use the tool roundtable({sessionID: \"${sessionID}\", rounds: N, prompt: \"...\"})`,\n }],\n },\n })\n\n await sendToAgent(ctx, newState)\n\n await ctx.client.tui.showToast({\n body: {\n message: `Roundtable #${sessionID} extended — ${args.rounds} more round(s) (${originalState.agents.join(\" → \")})`,\n variant: \"info\",\n },\n })\n\n return sessionID\n } catch (err) {\n states.delete(sessionID)\n throw err\n }\n}\n"
|
|
5
|
+
"import { type Plugin, type PluginInput, tool } from \"@opencode-ai/plugin\"\r\nimport type { RoundtableArgs, Event as RoundtableEvent } from \"./src/types\"\r\nimport { loadConfig } from \"./src/config\"\r\nimport { states, timeoutHandles, pendingResults } from \"./src/state\"\r\nimport { getSessionIdFromEvent, validateAgents, scanOrphanRoundtables } from \"./src/utils\"\r\nimport { startNewRoundtable, extendRoundtable, processNextTurn, handleAgentError, handleSessionDeleted } from \"./src/handlers\"\r\n\r\nexport const RoundtablePlugin: Plugin = async (ctx) => {\r\n try {\r\n await loadConfig(ctx)\r\n } catch { /* best-effort */ }\r\n\r\n try {\r\n await scanOrphanRoundtables(ctx)\r\n } catch (err) {\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"error\",\r\n message: `scanOrphanRoundtables failed: ${err instanceof Error ? err.message : String(err)}`,\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n }\r\n\r\n return {\r\n event: async ({ event }: { event: { type: string; properties: Record<string, unknown> } }) => {\r\n const sessionID = getSessionIdFromEvent(event)\r\n if (!sessionID || !states.has(sessionID)) return\r\n\r\n const state = states.get(sessionID)!\r\n\r\n switch (event.type) {\r\n case \"session.idle\": {\r\n const handle = timeoutHandles.get(sessionID)\r\n if (handle) { clearTimeout(handle); timeoutHandles.delete(sessionID) }\r\n await processNextTurn(ctx, state)\r\n break\r\n }\r\n case \"session.error\": {\r\n await handleAgentError(ctx, state, event as RoundtableEvent)\r\n break\r\n }\r\n case \"session.deleted\": {\r\n const deletedID = (event.properties.info as { id?: string })?.id\r\n if (deletedID) await handleSessionDeleted(ctx, state, deletedID)\r\n break\r\n }\r\n }\r\n },\r\n\r\n \"experimental.session.compacting\": async (\r\n _input: { sessionID: string },\r\n _output: { context: string[]; prompt?: string },\r\n ) => {\r\n // Phase 4: will re-inject [ROUNDTABLE META] state during compaction\r\n },\r\n\r\n tool: {\r\n roundtable: tool({\r\n description:\r\n \"Starts a multi-agent roundtable debate where agents discuss a topic turn by turn. \" +\r\n \"After all rounds, a built-in observer consolidates the discussion into an executive summary.\\n\\n\" +\r\n \"Returns an object with { sessionID, summary } after the debate concludes.\\n\\n\" +\r\n \"Note: this tool injects system-level prompts into each agent's context during \" +\r\n \"the debate (role-setting, topic, turn routing, and lifecycle signals).\\n\\n\" +\r\n \"IMPORTANT: This tool requires 2+ agents. For single-agent tasks, use a regular \" +\r\n \"session prompt instead — do NOT use roundtable.\\n\\n\" +\r\n \"Choosing agents: select agents based on their expertise (e.g., pm for product decisions, \" +\r\n \"dev for technical trade-offs, rv for code review). You can also specify in the prompt \" +\r\n \"what each agent should focus on (e.g., 'pm: focus on cost; dev: focus on maintainability').\\n\\n\" +\r\n \"Multiple rounds: for complex topics, use 2+ rounds and INCLUDE per-round focus \" +\r\n \"instructions IN the prompt itself (e.g., prompt: 'Round 1: list pros. Round 2: \" +\r\n \"list cons. Round 3: propose an implementation plan'). This way all agents see \" +\r\n \"the full agenda. The default is 1 round.\",\r\n\r\n args: {\r\n agents: tool.schema\r\n .array(tool.schema.string())\r\n .min(2)\r\n .describe(\r\n \"Agent names in speaking order (minimum 2). For single-agent tasks, use a regular \" +\r\n \"session — do NOT use roundtable. Choose agents based on their expertise — \" +\r\n \"each brings a different perspective. Example: [\\\"pm\\\", \\\"dev\\\", \\\"rv\\\"]\",\r\n ),\r\n prompt: tool.schema\r\n .string()\r\n .describe(\r\n \"Topic or challenge for the agents to debate. For multi-round debates, \" +\r\n \"include per-round instructions here (e.g., 'Round 1: pros. Round 2: cons. \" +\r\n \"Round 3: plan.'). All agents will see this and follow the round structure.\",\r\n ),\r\n rounds: tool.schema\r\n .number()\r\n .min(1)\r\n .max(50)\r\n .describe(\r\n \"Number of complete rounds (each round = all agents speak once). \" +\r\n \"Default: 1. Max: 50. For complex topics with 2+ rounds, include per-round focus \" +\r\n \"instructions in the prompt parameter so all agents see the agenda.\",\r\n ),\r\n observer: tool.schema\r\n .string()\r\n .optional()\r\n .describe(\r\n \"Agent name for final consolidation. The observer does not debate — it \" +\r\n \"summarizes after all rounds. Omit to use the built-in observer.\",\r\n ),\r\n sessionID: tool.schema\r\n .string()\r\n .optional()\r\n .describe(\r\n \"Session ID (format: ses_xxxx) from a previous roundtable call to \" +\r\n \"continue a concluded debate. Omit this parameter and pass agents + \" +\r\n \"prompt to start a fresh debate.\",\r\n ),\r\n title: tool.schema\r\n .string()\r\n .optional()\r\n .describe(\r\n \"Custom title for the session (max 200 chars). If omitted, auto-generated \" +\r\n \"as \\\"(Roundtable) - {first 80 chars of prompt, truncated at word boundary}\\\".\",\r\n ),\r\n observerPrompt: tool.schema\r\n .string()\r\n .optional()\r\n .describe(\r\n \"Override the default observer consolidation prompt. Use this to control \" +\r\n \"the format and focus of the final summary — e.g., ask the observer to \" +\r\n \"save a detailed report to file, focus on technical decisions only, \" +\r\n \"output as JSON, extract action items, etc. \" +\r\n \"If omitted, the default observer prompt is used (executive summary).\",\r\n ),\r\n },\r\n\r\n async execute(args: Record<string, unknown>, toolCtx: { sessionID: string }) {\r\n try {\r\n const rounds = (args.rounds as number) ?? 1\r\n\r\n if (args.sessionID) {\r\n if (typeof args.sessionID !== \"string\" || !args.sessionID.trim()) {\r\n return \"Error: sessionID is empty\"\r\n }\r\n if (args.agents) {\r\n return \"Error: pass either sessionID (extend) or agents (new), not both\"\r\n }\r\n const sid = await extendRoundtable(ctx, args as unknown as RoundtableArgs, toolCtx)\r\n if (sid.startsWith(\"Error:\") || sid.startsWith(\"Invalid\")) return sid\r\n const result = await new Promise<string>((resolve) => pendingResults.set(sid, { resolve }))\r\n return result\r\n }\r\n\r\n if (!args.agents || !Array.isArray(args.agents) || args.agents.length < 2) {\r\n return \"Error: 'agents' with at least 2 names is required\"\r\n }\r\n const validation = await validateAgents(ctx, args.agents as string[])\r\n if (!validation.valid) {\r\n const available = validation.available.map((a) => a.name).join(\", \")\r\n return [\"Invalid agent configuration:\", ...validation.errors.map((e) => ` - ${e}`), `Available agents: ${available}`].join(\"\\n\")\r\n }\r\n if (rounds > 50) {\r\n return \"Error: Maximum 50 rounds allowed\"\r\n }\r\n\r\n const sid = await startNewRoundtable(ctx, { ...args, rounds } as RoundtableArgs, toolCtx)\r\n const result = await new Promise<string>((resolve) => pendingResults.set(sid, { resolve }))\r\n return result\r\n } catch (err) {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"error\",\r\n message: `roundtable.execute error: ${err instanceof Error ? err.stack || err.message : String(err)}`,\r\n },\r\n })\r\n return `Error: ${err instanceof Error ? err.message : String(err)}`\r\n }\r\n },\r\n }),\r\n\r\n available_agents: tool({\r\n description:\r\n \"Lists all configured agents and their roles. \" +\r\n \"Returns a formatted list of agent names (e.g., \\\"Available agents: pm, dev, rv\\\"). \" +\r\n \"Use this to choose which agents should participate in a roundtable \" +\r\n \"based on their descriptions — then call roundtable() with your selection.\",\r\n\r\n args: {},\r\n\r\n async execute() {\r\n try {\r\n const result = await ctx.client.app.agents()\r\n const names = result.data.map((a: { name: string }) => a.name)\r\n return `Available agents: ${names.join(\", \")}`\r\n } catch {\r\n return \"Error: Could not fetch agent list. The server might not be ready.\"\r\n }\r\n },\r\n }),\r\n\r\n active_roundtables: tool({\r\n description:\r\n \"Lists all active roundtables with their status. \" +\r\n \"Each entry shows session ID, agents, current round, and phase. \" +\r\n \"Returns clickable session IDs that can be used to navigate.\",\r\n\r\n args: {},\r\n\r\n async execute() {\r\n const active: string[] = []\r\n for (const [sid, s] of states) {\r\n const status = s.phase === \"active\" ? \"debating\" :\r\n s.phase === \"observing\" ? \"consolidating\" :\r\n s.phase === \"done\" ? \"concluded\" : s.phase\r\n active.push(`- #${sid} · ${s.agents.join(\"→\")} (R${s.currentRound + 1}/${s.totalRounds}) · ${status}`)\r\n }\r\n if (active.length === 0) return \"No active roundtables.\"\r\n return `Active roundtables:\\n${active.join(\"\\n\")}`\r\n },\r\n }),\r\n },\r\n } as unknown as ReturnType<Plugin>\r\n}\r\n",
|
|
6
|
+
"import { readFile, writeFile } from \"fs/promises\"\r\nimport { join } from \"path\"\r\nimport os from \"os\"\r\nimport type { PluginConfig } from \"./types\"\r\nimport type { PluginInput } from \"@opencode-ai/plugin\"\r\n\r\nconst configDir = (() => {\r\n const xdgConfigHome = process.env.XDG_CONFIG_HOME\r\n if (xdgConfigHome) return join(xdgConfigHome, \"opencode\")\r\n return join(os.homedir(), \".config\", \"opencode\")\r\n})()\r\n\r\nconst configPath = join(configDir, \"roundtable.json\")\r\n\r\nconst configSchemaUrl =\r\n \"https://raw.githubusercontent.com/opencode-ai/roundtable/main/docs/roundtable.schema.json\"\r\n\r\nconst DEFAULT_CONFIG: PluginConfig = {\r\n defaultTimeoutMs: 300_000,\r\n loopSimilarityThreshold: 0.85,\r\n toolOutputPreviewMax: 500,\r\n defaultObserverPrompt: [\r\n \"You are an impartial roundtable observer.\",\r\n \"Consolidate the debate below into:\",\r\n \"\",\r\n \"1. **Executive summary** (2-3 sentences)\",\r\n \"2. **Key points** raised by each participant\",\r\n \"3. **Decisions or convergences** reached\",\r\n \"4. **Remaining open questions**\",\r\n \"5. **Suggested next steps**\",\r\n ].join(\"\\n\"),\r\n maxRounds: 10,\r\n navigation: \"link\",\r\n}\r\n\r\nlet config: PluginConfig = { ...DEFAULT_CONFIG }\r\n\r\nexport function getConfig(): PluginConfig {\r\n return config\r\n}\r\n\r\nfunction validateConfig(raw: Record<string, unknown>): PluginConfig {\r\n return {\r\n defaultTimeoutMs:\r\n typeof raw.defaultTimeoutMs === \"number\" && raw.defaultTimeoutMs >= 30_000\r\n ? raw.defaultTimeoutMs\r\n : DEFAULT_CONFIG.defaultTimeoutMs,\r\n loopSimilarityThreshold:\r\n typeof raw.loopSimilarityThreshold === \"number\" &&\r\n raw.loopSimilarityThreshold >= 0 &&\r\n raw.loopSimilarityThreshold <= 1\r\n ? raw.loopSimilarityThreshold\r\n : DEFAULT_CONFIG.loopSimilarityThreshold,\r\n toolOutputPreviewMax:\r\n typeof raw.toolOutputPreviewMax === \"number\" && raw.toolOutputPreviewMax >= 100\r\n ? raw.toolOutputPreviewMax\r\n : DEFAULT_CONFIG.toolOutputPreviewMax,\r\n defaultObserverPrompt:\r\n typeof raw.defaultObserverPrompt === \"string\" && raw.defaultObserverPrompt.length > 0\r\n ? raw.defaultObserverPrompt\r\n : DEFAULT_CONFIG.defaultObserverPrompt,\r\n maxRounds:\r\n typeof raw.maxRounds === \"number\" && raw.maxRounds >= 1\r\n ? raw.maxRounds\r\n : DEFAULT_CONFIG.maxRounds,\r\n navigation:\r\n raw.navigation === \"selectSession\" || raw.navigation === \"none\" || raw.navigation === \"auto\"\r\n ? raw.navigation\r\n : DEFAULT_CONFIG.navigation,\r\n }\r\n}\r\n\r\nexport async function loadConfig(ctx: PluginInput): Promise<void> {\r\n try {\r\n const content = await readFile(configPath, \"utf-8\")\r\n const raw = JSON.parse(content)\r\n if (typeof raw !== \"object\" || !raw) throw new Error(\"Invalid config format\")\r\n config = validateConfig(raw as Record<string, unknown>)\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"info\",\r\n message: \"Configuration loaded\",\r\n extra: { configPath },\r\n },\r\n })\r\n } catch (err) {\r\n if (\r\n typeof err === \"object\" &&\r\n err !== null &&\r\n \"code\" in err &&\r\n (err as { code: string }).code === \"ENOENT\"\r\n ) {\r\n try {\r\n await writeFile(\r\n configPath,\r\n JSON.stringify({ $schema: configSchemaUrl, ...DEFAULT_CONFIG }, null, 2),\r\n \"utf-8\",\r\n )\r\n config = { ...DEFAULT_CONFIG }\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"info\",\r\n message: \"Created default configuration\",\r\n extra: { configPath },\r\n },\r\n })\r\n } catch {\r\n config = { ...DEFAULT_CONFIG }\r\n }\r\n } else {\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"warn\",\r\n message: `Invalid config, using defaults: ${err instanceof Error ? err.message : String(err)}`,\r\n extra: { configPath },\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n config = { ...DEFAULT_CONFIG }\r\n }\r\n }\r\n}\r\n",
|
|
7
|
+
"import { readFile, writeFile, unlink, readdir, mkdir } from \"fs/promises\"\r\nimport { join } from \"path\"\r\nimport os from \"os\"\r\nimport type { RoundtableState } from \"./types\"\r\n\r\nconst statesDir = (() => {\r\n const xdgConfigHome = process.env.XDG_CONFIG_HOME\r\n const base = xdgConfigHome ? join(xdgConfigHome, \"opencode\") : join(os.homedir(), \".config\", \"opencode\")\r\n return join(base, \"roundtable-states\")\r\n})()\r\n\r\nexport const states = new Map<string, RoundtableState>()\r\nexport const timeoutHandles = new Map<string, ReturnType<typeof setTimeout>>()\r\nexport const pendingResults = new Map<string, {\r\n resolve: (output: string) => void\r\n}>()\r\n\r\nfunction stateFilePath(sessionID: string): string {\r\n return join(statesDir, `${sessionID}.json`)\r\n}\r\n\r\nexport async function saveStateFile(state: RoundtableState): Promise<void> {\r\n try {\r\n await mkdir(statesDir, { recursive: true })\r\n } catch { /* already exists */ }\r\n const filePath = stateFilePath(state.sessionID)\r\n await writeFile(filePath, JSON.stringify(state, null, 2), \"utf-8\")\r\n}\r\n\r\nexport async function loadStateFile(sessionID: string): Promise<RoundtableState | null> {\r\n try {\r\n const content = await readFile(stateFilePath(sessionID), \"utf-8\")\r\n const parsed = JSON.parse(content)\r\n if (typeof parsed !== \"object\" || !parsed) return null\r\n if (typeof parsed.sessionID !== \"string\") return null\r\n if (typeof parsed.parentSessionID !== \"string\") return null\r\n if (!Array.isArray(parsed.agents)) return null\r\n if (typeof parsed.totalRounds !== \"number\") return null\r\n if (typeof parsed.prompt !== \"string\") return null\r\n return {\r\n sessionID: parsed.sessionID,\r\n parentSessionID: parsed.parentSessionID,\r\n agents: parsed.agents,\r\n totalRounds: parsed.totalRounds,\r\n observer: parsed.observer ?? \"built-in\",\r\n prompt: parsed.prompt,\r\n currentRound: parsed.currentRound ?? 0,\r\n currentAgentIndex: parsed.currentAgentIndex ?? 0,\r\n phase: parsed.phase ?? \"done\",\r\n history: parsed.history ?? [],\r\n errors: parsed.errors ?? [],\r\n createdAt: parsed.createdAt ?? 0,\r\n currentGeneration: parsed.currentGeneration ?? 0,\r\n userInterjections: parsed.userInterjections ?? [],\r\n lastProcessedMsgId: parsed.lastProcessedMsgId ?? undefined,\r\n }\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport async function deleteStateFile(sessionID: string): Promise<void> {\r\n try {\r\n await unlink(stateFilePath(sessionID))\r\n } catch { /* best-effort */ }\r\n}\r\n\r\nexport async function listStateFiles(): Promise<string[]> {\r\n try {\r\n const entries = await readdir(statesDir)\r\n return entries\r\n .filter((e) => e.endsWith(\".json\"))\r\n .map((e) => e.replace(/\\.json$/, \"\"))\r\n } catch {\r\n return []\r\n }\r\n}\r\n",
|
|
8
|
+
"import type { Part, HistoryEntry, ToolCallSummary, RoundtableState, RoundtableArgs } from \"./types\"\r\nimport { getConfig } from \"./config\"\r\nimport type { PluginInput } from \"@opencode-ai/plugin\"\r\nimport { pendingResults, listStateFiles, loadStateFile, states, saveStateFile } from \"./state\"\r\n\r\nexport function generateDefaultTitle(args: RoundtableArgs & { agents: string[] }): string {\r\n if (args.title) return args.title\r\n const summary = args.prompt.length > 60 ? args.prompt.slice(0, 57) + \"...\" : args.prompt\r\n return `(Roundtable) - ${summary}`\r\n}\r\n\r\nexport function getSessionIdFromEvent(event: { type: string; properties: Record<string, unknown> }): string | undefined {\r\n if (!(\"properties\" in event)) return undefined\r\n const props = event.properties as Record<string, unknown>\r\n if (typeof props.sessionID === \"string\") return props.sessionID\r\n if (props.info && typeof props.info === \"object\") {\r\n const info = props.info as { id?: string }\r\n if (info.id) return info.id\r\n }\r\n return undefined\r\n}\r\n\r\nexport async function validateAgents(\r\n ctx: PluginInput,\r\n agentNames: string[],\r\n): Promise<{ valid: boolean; available: { name: string; description?: string }[]; errors: string[] }> {\r\n const errors: string[] = []\r\n if (agentNames.length < 2) {\r\n errors.push(\"At least 2 agents are required\")\r\n return { valid: false, available: [], errors }\r\n }\r\n\r\n let available: { name: string; description?: string }[] = []\r\n try {\r\n const result = await ctx.client.app.agents()\r\n available = result.data.map((a: { name: string; description?: string }) => ({\r\n name: a.name,\r\n description: a.description,\r\n }))\r\n } catch {\r\n errors.push(\"Failed to fetch available agents from server\")\r\n return { valid: false, available: [], errors }\r\n }\r\n\r\n const availableNames = new Set(available.map((a) => a.name))\r\n for (const name of agentNames) {\r\n if (!availableNames.has(name)) errors.push(`Agent \"${name}\" not found`)\r\n }\r\n\r\n return { valid: errors.length === 0, available, errors }\r\n}\r\n\r\nexport function arraysEqual(a: string[], b: string[]): boolean {\r\n if (a.length !== b.length) return false\r\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false\r\n return true\r\n}\r\n\r\nexport function detectLoop(history: HistoryEntry[]): boolean {\r\n if (history.length < 2) return false\r\n const last = history[history.length - 1].response\r\n const prev = history[history.length - 2].response\r\n\r\n const bigrams = (s: string): Set<string> => {\r\n const set = new Set<string>()\r\n const cleaned = s.replace(/[\\s\\n\\r]+/g, \" \")\r\n for (let i = 0; i < cleaned.length - 1; i++) set.add(cleaned.slice(i, i + 2))\r\n return set\r\n }\r\n\r\n const lastBigrams = bigrams(last)\r\n const prevBigrams = bigrams(prev)\r\n let intersection = 0\r\n for (const b of lastBigrams) if (prevBigrams.has(b)) intersection++\r\n\r\n const union = new Set([...lastBigrams, ...prevBigrams])\r\n if (union.size === 0) return false\r\n return intersection / union.size > getConfig().loopSimilarityThreshold\r\n}\r\n\r\nexport function extractResponse(parts: Part[]): string | null {\r\n for (const part of parts) if (part.type === \"text\") return part.text\r\n return null\r\n}\r\n\r\nexport function buildToolSummary(part: Part): ToolCallSummary | null {\r\n if (part.type !== \"tool\") return null\r\n const toolName = (part as unknown as { tool: string }).tool\r\n const state = (part as unknown as { state: { status: string; output?: string } }).state\r\n let outputPreview: string\r\n switch (state.status) {\r\n case \"completed\":\r\n outputPreview = state.output!.slice(0, getConfig().toolOutputPreviewMax)\r\n break\r\n case \"error\":\r\n outputPreview = (state.output ?? \"(unknown error)\").slice(0, getConfig().toolOutputPreviewMax)\r\n break\r\n case \"running\":\r\n case \"pending\":\r\n outputPreview = `(${state.status})`\r\n break\r\n default:\r\n outputPreview = \"(unknown)\"\r\n }\r\n return { toolName, outputPreview }\r\n}\r\n\r\nexport function buildToolSummaries(parts: Part[]): ToolCallSummary[] {\r\n const summaries: ToolCallSummary[] = []\r\n for (const part of parts) {\r\n const summary = buildToolSummary(part)\r\n if (summary) summaries.push(summary)\r\n }\r\n return summaries\r\n}\r\n\r\nexport function buildConsolidatedSummary(state: RoundtableState): string {\r\n const lines: string[] = []\r\n lines.push(\"━━━ Roundtable Concluded ━━━\")\r\n lines.push(`Topic: ${state.prompt}`)\r\n lines.push(`Participants: ${state.agents.join(\", \")}`)\r\n if (state.errors.length > 0) lines.push(`Errors: ${state.errors.join(\"; \")}`)\r\n lines.push(\"\")\r\n\r\n for (const entry of state.history) {\r\n const label = entry.agent === \"observer\" ? \"Observer\" : `${entry.agent} (Round ${entry.round + 1})`\r\n lines.push(`── ${label} ──`)\r\n lines.push(entry.response)\r\n if (entry.toolCalls.length > 0) {\r\n lines.push(...entry.toolCalls.map((tc) => ` \\u2022 ${tc.toolName} \\u2192 ${tc.outputPreview.slice(0, 80)}`))\r\n }\r\n if (entry.hasError) lines.push(\" \\u26A0 This response had errors\")\r\n lines.push(\"\")\r\n }\r\n return lines.join(\"\\n\")\r\n}\r\n\r\nexport async function injectRoundtableDelimiter(\r\n ctx: PluginInput,\r\n sessionID: string,\r\n): Promise<void> {\r\n const delimiter = [\r\n \"━━━ Roundtable Concluded ━━━\",\r\n \"Messages below this line are not part of the original debate.\",\r\n \"The result was consolidated in the main session.\",\r\n ].join(\"\\n\")\r\n\r\n await ctx.client.session.prompt({\r\n path: { id: sessionID },\r\n body: { noReply: true, parts: [{ type: \"text\", text: delimiter }] },\r\n })\r\n}\r\n\r\nexport function buildExtendedPrompt(originalPrompt: string, extendPrompt: string): string {\r\n const continuationTriggers = [\r\n \"debate more\", \"continue\", \"dive deeper\", \"go deeper\",\r\n \"expand on\", \"elaborate\", \"further discuss\", \"keep debating\",\r\n ]\r\n const lower = extendPrompt.toLowerCase().trim()\r\n const isContinuation = continuationTriggers.some((trigger) => lower.startsWith(trigger))\r\n\r\n if (isContinuation) {\r\n return `Original topic: ${originalPrompt}\\n\\nContinuation: ${extendPrompt}`\r\n }\r\n\r\n return [\r\n \"Previous discussion history preserved. Original topic was:\",\r\n ` ${originalPrompt}`,\r\n \"\",\r\n `New challenge: ${extendPrompt}`,\r\n ].join(\"\\n\")\r\n}\r\n\r\nexport async function navigateToSession(\r\n ctx: PluginInput,\r\n targetID: string,\r\n _parentID?: string,\r\n): Promise<boolean> {\r\n try {\r\n if (typeof (ctx.client.tui as any).selectSession === \"function\") {\r\n await (ctx.client.tui as any).selectSession({ sessionID: targetID })\r\n return true\r\n }\r\n await (ctx.client.tui.publish as any)({\r\n body: {\r\n type: \"tui.session.select\",\r\n properties: { sessionID: targetID },\r\n },\r\n })\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport async function scanOrphanRoundtables(ctx: PluginInput): Promise<void> {\r\n const sessionIDs = await listStateFiles()\r\n let loaded = 0\r\n let errors = 0\r\n for (const sid of sessionIDs) {\r\n try {\r\n const state = await loadStateFile(sid)\r\n if (state) {\r\n states.set(sid, state)\r\n loaded++\r\n }\r\n } catch {\r\n errors++\r\n }\r\n }\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: `scanOrphanRoundtables: ${loaded} state(s) loaded, ${errors} error(s)`,\r\n extra: { loaded, errors, total: sessionIDs.length },\r\n },\r\n })\r\n}\r\n",
|
|
9
|
+
"import type { RoundtableState } from \"./types\"\r\nimport { getConfig } from \"./config\"\r\n\r\nexport function buildAgentPrompt(state: RoundtableState, agent: string): string {\r\n const lines: string[] = []\r\n const agentList = state.agents.join(\" → \")\r\n const roundInfo = `Round ${state.currentRound + 1}/${state.totalRounds} | Current agent: ${agent}`\r\n\r\n if (state.currentRound === 0 && state.currentAgentIndex === 0) {\r\n lines.push(`[System] You are participating in a roundtable debate. Agents (${agentList}) will discuss the topic below in ${state.totalRounds} round(s).`)\r\n lines.push(`[Topic] ${state.prompt}`)\r\n lines.push(\"\")\r\n }\r\n\r\n lines.push(roundInfo)\r\n\r\n const isLastAgent = state.currentAgentIndex === state.agents.length - 1\r\n const isLastRound = state.currentRound === state.totalRounds - 1\r\n if (isLastAgent && isLastRound) {\r\n lines.push(\"[System] This is the last prompt — finalize your thoughts\")\r\n }\r\n\r\n return lines.join(\"\\n\")\r\n}\r\n\r\nexport function buildObserverPrompt(state: RoundtableState, observer: \"built-in\" | string): string {\r\n const observerPrompt = state.observerPrompt ?? getConfig().defaultObserverPrompt\r\n\r\n if (observer === \"built-in\") return observerPrompt\r\n\r\n return (\r\n `You are an impartial roundtable observer.\\n` +\r\n `Your role: ${observer}.\\n\\n` +\r\n observerPrompt\r\n )\r\n}\r\n",
|
|
10
|
+
"import type { PluginInput } from \"@opencode-ai/plugin\"\r\nimport type { RoundtableArgs, RoundtableState, HistoryEntry, Event as RoundtableEvent } from \"./types\"\r\nimport { states, timeoutHandles, pendingResults, saveStateFile, loadStateFile, deleteStateFile } from \"./state\"\r\nimport { getConfig } from \"./config\"\r\nimport { buildAgentPrompt, buildObserverPrompt } from \"./prompts\"\r\nimport {\r\n validateAgents, arraysEqual, buildExtendedPrompt, detectLoop,\r\n extractResponse, buildToolSummaries, buildConsolidatedSummary,\r\n generateDefaultTitle, injectRoundtableDelimiter, scanOrphanRoundtables,\r\n navigateToSession,\r\n} from \"./utils\"\r\n\r\n// ============================================================\r\n// startNewRoundtable\r\n// ============================================================\r\n\r\nexport async function startNewRoundtable(\r\n ctx: PluginInput,\r\n args: RoundtableArgs,\r\n toolCtx: { sessionID: string },\r\n): Promise<string> {\r\n const agents = args.agents!\r\n const newSession = await ctx.client.session.create({\r\n body: {\r\n title: generateDefaultTitle({ ...args, agents }),\r\n parentID: toolCtx.sessionID,\r\n },\r\n })\r\n\r\n const sessionID = newSession.data.id\r\n const parentSessionID = toolCtx.sessionID\r\n\r\n const state: RoundtableState = {\r\n sessionID,\r\n parentSessionID,\r\n agents,\r\n totalRounds: args.rounds,\r\n observer: args.observer ?? \"built-in\",\r\n prompt: args.prompt,\r\n currentRound: 0,\r\n currentAgentIndex: 0,\r\n phase: \"active\",\r\n history: [],\r\n errors: [],\r\n createdAt: Date.now(),\r\n currentGeneration: 0,\r\n userInterjections: [],\r\n observerPrompt: args.observerPrompt,\r\n }\r\n\r\n states.set(sessionID, state)\r\n\r\n try {\r\n await saveStateFile(state)\r\n await sendToAgent(ctx, state)\r\n\r\n await ctx.client.session.prompt({\r\n path: { id: parentSessionID },\r\n body: {\r\n noReply: true,\r\n parts: [{\r\n type: \"text\",\r\n text: `⚙ Roundtable started — #${sessionID} • ${agents.join(\" → \")} • ${args.rounds} round(s)`,\r\n }],\r\n },\r\n })\r\n\r\n await ctx.client.session.prompt({\r\n path: { id: sessionID },\r\n body: {\r\n noReply: true,\r\n parts: [{ type: \"text\", text: `⚙ Parent: #${parentSessionID}` }],\r\n },\r\n })\r\n\r\n if (getConfig().navigation === \"auto\") {\r\n await navigateToSession(ctx, sessionID, parentSessionID)\r\n }\r\n\r\n await ctx.client.tui.showToast({\r\n body: {\r\n message: `Roundtable started in #${sessionID} (${agents.join(\" → \")} · ${args.rounds} round(s))`,\r\n variant: \"info\",\r\n },\r\n })\r\n\r\n return sessionID\r\n } catch (err) {\r\n states.delete(sessionID)\r\n throw err\r\n }\r\n}\r\n\r\n// ============================================================\r\n// sendToAgent\r\n// ============================================================\r\n\r\nexport async function sendToAgent(\r\n ctx: PluginInput,\r\n state: RoundtableState,\r\n): Promise<void> {\r\n try {\r\n const agent = state.agents[state.currentAgentIndex]\r\n const prompt = buildAgentPrompt(state, agent)\r\n\r\n await ctx.client.session.prompt({\r\n path: { id: state.sessionID },\r\n body: { agent, parts: [{ type: \"text\", text: prompt }] },\r\n })\r\n\r\n state.currentGeneration++\r\n const capturedGeneration = state.currentGeneration\r\n\r\n const handle = setTimeout(async () => {\r\n timeoutHandles.delete(state.sessionID)\r\n if (state.currentGeneration !== capturedGeneration) return\r\n\r\n try {\r\n await ctx.client.session.abort({ path: { id: state.sessionID } })\r\n state.errors.push(`Agent \"${agent}\" timed out after ${getConfig().defaultTimeoutMs / 1000}s`)\r\n } catch { /* session may already be done */ }\r\n }, getConfig().defaultTimeoutMs)\r\n\r\n timeoutHandles.set(state.sessionID, handle)\r\n await updateSessionTitle(ctx, state)\r\n\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: `Turn started: ${agent} (R${state.currentRound + 1}/${state.totalRounds})`,\r\n extra: {\r\n sessionID: state.sessionID, agent,\r\n round: state.currentRound + 1,\r\n totalRounds: state.totalRounds,\r\n generation: state.currentGeneration,\r\n },\r\n },\r\n })\r\n } catch (err) {\r\n state.errors.push(\r\n `Failed to send to agent \"${state.agents[state.currentAgentIndex]}\": ${err instanceof Error ? err.message : String(err)}`,\r\n )\r\n const handle = timeoutHandles.get(state.sessionID)\r\n if (handle) { clearTimeout(handle); timeoutHandles.delete(state.sessionID) }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// updateSessionTitle\r\n// ============================================================\r\n\r\nexport async function updateSessionTitle(\r\n ctx: PluginInput,\r\n state: RoundtableState,\r\n): Promise<void> {\r\n const summary = state.prompt.length > 40 ? state.prompt.slice(0, 37) + \"...\" : state.prompt\r\n const agentList = state.agents.join(\"→\")\r\n const roundInfo = `R${state.currentRound + 1}/${state.totalRounds}`\r\n const title = `⚡ \"${summary}\" · ${agentList} (${roundInfo} · ↑ #${state.parentSessionID})`\r\n await ctx.client.session.update({\r\n path: { id: state.sessionID },\r\n body: { title },\r\n })\r\n}\r\n\r\n// ============================================================\r\n// sendObserverPrompt\r\n// ============================================================\r\n\r\nasync function sendObserverPrompt(\r\n ctx: PluginInput,\r\n state: RoundtableState,\r\n): Promise<void> {\r\n try {\r\n const prompt = buildObserverPrompt(state, state.observer)\r\n\r\n if (state.observer === \"built-in\") {\r\n await ctx.client.session.prompt({\r\n path: { id: state.sessionID },\r\n body: { noReply: false, parts: [{ type: \"text\", text: prompt }] },\r\n })\r\n } else {\r\n await ctx.client.session.prompt({\r\n path: { id: state.sessionID },\r\n body: { agent: state.observer, parts: [{ type: \"text\", text: prompt }] },\r\n })\r\n }\r\n\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: `Observer prompt sent: ${state.observer}`,\r\n extra: { sessionID: state.sessionID, observer: state.observer },\r\n },\r\n })\r\n } catch (err) {\r\n state.errors.push(`Failed to send observer prompt: ${err instanceof Error ? err.message : String(err)}`)\r\n state.phase = \"aborted\"\r\n await finalizeRoundtable(ctx, state)\r\n }\r\n}\r\n\r\n// ============================================================\r\n// finalizeRoundtable\r\n// ============================================================\r\n\r\nexport async function finalizeRoundtable(\r\n ctx: PluginInput,\r\n state: RoundtableState,\r\n): Promise<void> {\r\n const sessionID = state.sessionID\r\n\r\n const timeoutHandle = timeoutHandles.get(sessionID)\r\n if (timeoutHandle) { clearTimeout(timeoutHandle); timeoutHandles.delete(sessionID) }\r\n\r\n try {\r\n const summary = buildConsolidatedSummary(state)\r\n\r\n const pending = pendingResults.get(sessionID)\r\n if (pending) {\r\n pending.resolve(summary)\r\n pendingResults.delete(sessionID)\r\n }\r\n\r\n await injectRoundtableDelimiter(ctx, sessionID)\r\n\r\n const shortPrompt = state.prompt.length > 40 ? state.prompt.slice(0, 37) + \"...\" : state.prompt\r\n await ctx.client.session.update({\r\n path: { id: sessionID },\r\n body: { title: `⚡ \"${shortPrompt}\" · ${state.agents.join(\"→\")} ✓` },\r\n })\r\n\r\n try {\r\n await saveStateFile(state)\r\n } catch { /* best-effort */ }\r\n\r\n if (getConfig().navigation === \"auto\") {\r\n await navigateToSession(ctx, state.parentSessionID, sessionID)\r\n }\r\n\r\n await ctx.client.tui.showToast({\r\n body: { message: \"Roundtable concluded\", variant: \"success\" },\r\n })\r\n } catch (err) {\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"error\",\r\n message: `Failed to finalize roundtable #${sessionID}: ${err instanceof Error ? err.message : String(err)}`,\r\n extra: { sessionID, phase: state.phase },\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n } finally {\r\n states.delete(sessionID)\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: `State cleaned up for session #${sessionID}`,\r\n extra: { sessionID, phase: state.phase },\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// processNextTurn\r\n// ============================================================\r\n\r\nexport async function processNextTurn(\r\n ctx: PluginInput,\r\n state: RoundtableState,\r\n): Promise<void> {\r\n if (state.phase === \"done\" || state.phase === \"aborted\") return\r\n\r\n const result = await ctx.client.session.messages({ path: { id: state.sessionID } })\r\n const messages = result.data\r\n\r\n const userMsgs = messages.filter((m: { info: { role: string } }) => m.info.role === \"user\")\r\n for (const msg of userMsgs) {\r\n for (const part of msg.parts) {\r\n if (part.type === \"text\") {\r\n if (!state.userInterjections.includes(part.text)) {\r\n state.userInterjections.push(part.text)\r\n }\r\n }\r\n }\r\n }\r\n\r\n const assistantMsgs = messages.filter(\r\n (m: { info: { role: string } }) => m.info.role === \"assistant\",\r\n )\r\n if (assistantMsgs.length === 0) return\r\n\r\n const latestMsg = assistantMsgs[assistantMsgs.length - 1]\r\n if (state.lastProcessedMsgId === latestMsg.info.id) return\r\n state.lastProcessedMsgId = latestMsg.info.id\r\n\r\n if (state.phase === \"active\") {\r\n const response = extractResponse(latestMsg.parts)\r\n if (!response) {\r\n state.errors.push(\r\n `Agent ${state.agents[state.currentAgentIndex]} returned no text in round ${state.currentRound + 1}`,\r\n )\r\n }\r\n\r\n const toolCalls = buildToolSummaries(latestMsg.parts)\r\n const entry: HistoryEntry = {\r\n agent: state.agents[state.currentAgentIndex],\r\n round: state.currentRound,\r\n response: response ?? \"(no text response)\",\r\n toolCalls,\r\n hasError: response === null,\r\n }\r\n state.history.push(entry)\r\n await saveStateFile(state)\r\n\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: `Turn complete: ${entry.agent} (R${state.currentRound + 1})`,\r\n extra: {\r\n sessionID: state.sessionID, agent: entry.agent,\r\n round: state.currentRound + 1,\r\n responseLength: entry.response.length,\r\n toolCallCount: entry.toolCalls.length,\r\n hasError: entry.hasError,\r\n },\r\n },\r\n })\r\n\r\n if (detectLoop(state.history)) {\r\n state.errors.push(\"Loop detected — agents reached an impasse\")\r\n state.phase = \"done\"\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: \"Loop detected — finalizing early\",\r\n extra: { sessionID: state.sessionID, similarity: getConfig().loopSimilarityThreshold },\r\n },\r\n })\r\n await finalizeRoundtable(ctx, state)\r\n return\r\n }\r\n\r\n const nextIndex = state.currentAgentIndex + 1\r\n if (nextIndex < state.agents.length) {\r\n state.currentAgentIndex = nextIndex\r\n await sendToAgent(ctx, state)\r\n } else if (state.currentRound + 1 < state.totalRounds) {\r\n state.currentRound++\r\n state.currentAgentIndex = 0\r\n await sendToAgent(ctx, state)\r\n } else {\r\n state.phase = \"observing\"\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: \"All rounds complete — transitioning to observer\",\r\n extra: { sessionID: state.sessionID, totalRounds: state.totalRounds },\r\n },\r\n })\r\n await sendObserverPrompt(ctx, state)\r\n }\r\n return\r\n }\r\n\r\n if (state.phase === \"observing\") {\r\n const summary = extractResponse(latestMsg.parts)\r\n state.history.push({\r\n agent: \"observer\",\r\n round: state.currentRound,\r\n response: summary ?? \"(no summary)\",\r\n toolCalls: [],\r\n hasError: summary === null,\r\n })\r\n await saveStateFile(state)\r\n\r\n state.phase = \"done\"\r\n await finalizeRoundtable(ctx, state)\r\n }\r\n}\r\n\r\n// ============================================================\r\n// handleAgentError\r\n// ============================================================\r\n\r\nexport async function handleAgentError(\r\n ctx: PluginInput,\r\n state: RoundtableState,\r\n event: RoundtableEvent,\r\n): Promise<void> {\r\n if (state.phase === \"observing\" || state.phase === \"done\") {\r\n state.phase = \"aborted\"\r\n await saveStateFile(state)\r\n await finalizeRoundtable(ctx, state)\r\n return\r\n }\r\n\r\n const agent = state.agents[state.currentAgentIndex]\r\n const errorMsg =\r\n event.type === \"session.error\" && event.properties.error\r\n ? typeof event.properties.error === \"object\"\r\n ? (event.properties.error as { message?: string }).message ?? JSON.stringify(event.properties.error)\r\n : String(event.properties.error)\r\n : \"Unknown error\"\r\n\r\n state.errors.push(`Agent \"${agent}\" failed on round ${state.currentRound + 1}: ${errorMsg}`)\r\n\r\n const handle = timeoutHandles.get(state.sessionID)\r\n if (handle) { clearTimeout(handle); timeoutHandles.delete(state.sessionID) }\r\n\r\n await ctx.client.tui.showToast({\r\n body: {\r\n message: `\"${agent}\" failed on Round ${state.currentRound + 1}. Skipping to next.`,\r\n variant: \"warning\",\r\n },\r\n })\r\n\r\n const nextIndex = state.currentAgentIndex + 1\r\n if (nextIndex < state.agents.length) {\r\n state.currentAgentIndex = nextIndex\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: \"Agent skipped due to error\",\r\n extra: { sessionID: state.sessionID, failedAgent: agent, nextAgent: state.agents[state.currentAgentIndex], round: state.currentRound + 1 },\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n await saveStateFile(state)\r\n await sendToAgent(ctx, state)\r\n } else if (state.currentRound + 1 < state.totalRounds) {\r\n state.currentRound++\r\n state.currentAgentIndex = 0\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: \"Agent skipped due to error — moving to next round\",\r\n extra: { sessionID: state.sessionID, failedAgent: agent, round: state.currentRound + 1 },\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n await saveStateFile(state)\r\n await sendToAgent(ctx, state)\r\n } else {\r\n state.phase = \"aborted\"\r\n try {\r\n await ctx.client.tui.showToast({\r\n body: { message: \"All agents failed — roundtable aborted\", variant: \"error\" },\r\n })\r\n } catch { /* best-effort */ }\r\n await saveStateFile(state)\r\n await finalizeRoundtable(ctx, state)\r\n }\r\n}\r\n\r\n// ============================================================\r\n// handleSessionDeleted\r\n// ============================================================\r\n\r\nexport async function handleSessionDeleted(\r\n ctx: PluginInput,\r\n state: RoundtableState,\r\n deletedSessionID: string,\r\n): Promise<void> {\r\n const handle = timeoutHandles.get(state.sessionID)\r\n if (handle) { clearTimeout(handle); timeoutHandles.delete(state.sessionID) }\r\n\r\n await deleteStateFile(state.sessionID)\r\n\r\n if (deletedSessionID === state.sessionID) {\r\n state.phase = \"aborted\"\r\n const partialSummary = buildConsolidatedSummary(state)\r\n const output = [\r\n \"[Roundtable interrupted — session closed]\",\r\n \"Partial history up to interruption:\",\r\n \"\",\r\n partialSummary,\r\n ].join(\"\\n\")\r\n\r\n const pending = pendingResults.get(state.sessionID)\r\n if (pending) {\r\n pending.resolve(output)\r\n pendingResults.delete(state.sessionID)\r\n }\r\n\r\n try {\r\n await ctx.client.tui.showToast({\r\n body: { message: \"Roundtable interrupted\", variant: \"warning\" },\r\n })\r\n } catch { /* best-effort */ }\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: \"S2 deleted — pending promise resolved with partial result\",\r\n extra: { sessionID: deletedSessionID, parentSessionID: state.parentSessionID },\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n } else if (deletedSessionID === state.parentSessionID) {\r\n state.phase = \"aborted\"\r\n try {\r\n await ctx.client.session.abort({ path: { id: state.sessionID } })\r\n } catch { /* S2 may already be gone */ }\r\n try {\r\n await ctx.client.app.log({\r\n body: {\r\n service: \"roundtable\",\r\n level: \"debug\",\r\n message: \"S1 deleted — S2 aborted\",\r\n extra: { sessionID: state.sessionID, parentSessionID: deletedSessionID },\r\n },\r\n })\r\n } catch { /* best-effort */ }\r\n }\r\n\r\n states.delete(state.sessionID)\r\n}\r\n\r\n// ============================================================\r\n// extendRoundtable\r\n// ============================================================\r\n\r\nexport async function extendRoundtable(\r\n ctx: PluginInput,\r\n args: RoundtableArgs,\r\n _toolCtx: { sessionID: string },\r\n): Promise<string> {\r\n const sessionID = args.sessionID!\r\n\r\n try {\r\n await ctx.client.session.get({ path: { id: sessionID } })\r\n } catch {\r\n return `Error: Session #${sessionID} not found or inaccessible. Cannot extend.`\r\n }\r\n\r\n const originalState = await loadStateFile(sessionID)\r\n if (!originalState) {\r\n return [\r\n `Error: No roundtable state found for session #${sessionID}.`,\r\n \"This session is not a roundtable or the state file was deleted.\",\r\n ].join(\"\\n\")\r\n }\r\n\r\n if (originalState.phase !== \"done\") {\r\n return [\r\n `Error: Roundtable #${sessionID} is in state \"${originalState.phase}\" and cannot be extended.`,\r\n ].join(\"\\n\")\r\n }\r\n\r\n if (args.agents && !arraysEqual(args.agents, originalState.agents)) {\r\n return [\r\n \"Error: Agent mismatch.\",\r\n `Original: ${originalState.agents.join(\", \")}`,\r\n `Provided: ${args.agents.join(\", \")}`,\r\n \"Extend must use the same agents as the original roundtable.\",\r\n ].join(\"\\n\")\r\n }\r\n\r\n try {\r\n const storedValidation = await validateAgents(ctx, originalState.agents)\r\n if (!storedValidation.valid) {\r\n return [\r\n \"Error: One or more agents from the original roundtable no longer exist.\",\r\n ...storedValidation.errors.map((e) => ` - ${e}`),\r\n ].join(\"\\n\")\r\n }\r\n } catch {\r\n return \"Error: Failed to validate agents. Cannot extend.\"\r\n }\r\n\r\n const extendedPrompt = buildExtendedPrompt(originalState.prompt, args.prompt)\r\n\r\n const newState: RoundtableState = {\r\n sessionID: originalState.sessionID,\r\n parentSessionID: originalState.parentSessionID,\r\n agents: originalState.agents,\r\n totalRounds: originalState.totalRounds + args.rounds,\r\n observer: originalState.observer,\r\n prompt: extendedPrompt,\r\n currentRound: originalState.currentRound,\r\n currentAgentIndex: 0,\r\n phase: \"active\",\r\n history: [...originalState.history],\r\n errors: [...originalState.errors],\r\n createdAt: Date.now(),\r\n currentGeneration: 0,\r\n userInterjections: [...(originalState.userInterjections ?? [])],\r\n observerPrompt: args.observerPrompt ?? originalState.observerPrompt,\r\n }\r\n\r\n states.set(sessionID, newState)\r\n\r\n try {\r\n await saveStateFile(newState)\r\n\r\n const agentList = originalState.agents.join(\" vs \")\r\n await ctx.client.session.update({\r\n path: { id: sessionID },\r\n body: { title: `Roundtable: ${agentList} (R${newState.currentRound + 1}/${newState.totalRounds})` },\r\n })\r\n\r\n await ctx.client.session.prompt({\r\n path: { id: originalState.parentSessionID },\r\n body: {\r\n noReply: true,\r\n parts: [{\r\n type: \"text\",\r\n text: `⚙ Roundtable extended — #${sessionID} • +${args.rounds} round(s)`,\r\n }],\r\n },\r\n })\r\n\r\n await sendToAgent(ctx, newState)\r\n\r\n await ctx.client.tui.showToast({\r\n body: {\r\n message: `Roundtable #${sessionID} extended — ${args.rounds} more round(s) (${originalState.agents.join(\" → \")})`,\r\n variant: \"info\",\r\n },\r\n })\r\n\r\n return sessionID\r\n } catch (err) {\r\n states.delete(sessionID)\r\n throw err\r\n }\r\n}\r\n"
|
|
11
11
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "C8BED17810CFAA4D64756E2164756E21",
|
|
14
14
|
"names": []
|
|
15
15
|
}
|