@debatetalk/mcp 1.0.1 → 1.0.4
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/.claude-plugin/plugin.json +9 -0
- package/.mcp.json +9 -0
- package/README.md +8 -3
- package/dist/{chunk-MEP3QJFT.js → chunk-XVI4IIO6.js} +8 -7
- package/dist/{chunk-MEP3QJFT.js.map → chunk-XVI4IIO6.js.map} +1 -1
- package/dist/cli/index.js +6 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/mcp/server.js +8 -5
- package/dist/mcp/server.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "debatetalk",
|
|
3
|
+
"description": "Run structured multi-model AI debates from your AI assistant. Multiple models argue independently, deliberate, and converge on a 4-part synthesis: Strong Ground, Fault Lines, Blind Spots, and Your Call.",
|
|
4
|
+
"version": "1.0.4",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "DebateTalk",
|
|
7
|
+
"email": "support@debatetalk.ai"
|
|
8
|
+
}
|
|
9
|
+
}
|
package/.mcp.json
ADDED
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ DebateTalk makes multiple AI models argue a question independently, challenge ea
|
|
|
17
17
|
|
|
18
18
|
## Quickstart
|
|
19
19
|
|
|
20
|
-
### MCP (Claude Desktop
|
|
20
|
+
### MCP (Claude Desktop, Cursor, Cline, Goose, and any MCP-compatible client)
|
|
21
21
|
|
|
22
22
|
**1. Get an API key**
|
|
23
23
|
|
|
@@ -42,11 +42,16 @@ Create a key at [console.debatetalk.ai/api-keys](https://console.debatetalk.ai/a
|
|
|
42
42
|
Config file locations:
|
|
43
43
|
- **Claude Desktop (Mac):** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
44
44
|
- **Claude Desktop (Windows):** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
45
|
+
- **Claude Code:** `~/.claude/settings.json` (under `mcpServers`)
|
|
45
46
|
- **Cursor:** `.cursor/mcp.json` in your project root
|
|
47
|
+
- **Windsurf:** `~/.codeium/windsurf/mcp_config.json`
|
|
48
|
+
- **Cline / Roo Code:** MCP settings panel in VS Code extension
|
|
49
|
+
- **Goose:** `~/.config/goose/config.yaml` (under `extensions`)
|
|
50
|
+
- **Other clients:** refer to your client's MCP documentation
|
|
46
51
|
|
|
47
|
-
**3. Ask
|
|
52
|
+
**3. Ask your AI assistant to run a debate**
|
|
48
53
|
|
|
49
|
-
|
|
54
|
+
MCP clients read the tool description to decide when to call it — no exact phrasing required. Any of these work:
|
|
50
55
|
|
|
51
56
|
> *"debate whether we should rewrite our backend in Go"*
|
|
52
57
|
> *"use DT — should we raise our Series A now?"*
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
1
|
// src/client.ts
|
|
4
2
|
import { EventSourceParserStream } from "eventsource-parser/stream";
|
|
5
3
|
var BASE_URL = "https://engine.debatetalk.ai";
|
|
@@ -105,14 +103,17 @@ var DebateTalkClient = class {
|
|
|
105
103
|
for await (const event of this.streamDebate(params)) {
|
|
106
104
|
events.push(event);
|
|
107
105
|
if (event.type === "debate_start") {
|
|
108
|
-
debateId = event.data["debate_id"]
|
|
109
|
-
models = event.data["models"]
|
|
106
|
+
debateId = typeof event.data["debate_id"] === "string" ? event.data["debate_id"] : "";
|
|
107
|
+
models = Array.isArray(event.data["models"]) ? event.data["models"] : [];
|
|
110
108
|
}
|
|
111
109
|
if (event.type === "classification") {
|
|
112
|
-
questionType = event.data["question_type"]
|
|
110
|
+
questionType = typeof event.data["question_type"] === "string" ? event.data["question_type"] : "";
|
|
113
111
|
}
|
|
114
112
|
if (event.type === "synthesis") {
|
|
115
|
-
|
|
113
|
+
const d = event.data;
|
|
114
|
+
if (typeof d["strong_ground"] === "string" && typeof d["fault_lines"] === "string" && typeof d["blind_spots"] === "string" && typeof d["your_call"] === "string") {
|
|
115
|
+
synthesis = d;
|
|
116
|
+
}
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
119
|
return {
|
|
@@ -130,4 +131,4 @@ export {
|
|
|
130
131
|
DebateTalkError,
|
|
131
132
|
DebateTalkClient
|
|
132
133
|
};
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
134
|
+
//# sourceMappingURL=chunk-XVI4IIO6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type {\n ModelStatusResponse,\n RecommendResponse,\n EstimateCostParams,\n CostEstimate,\n HistoryResponse,\n DebateParams,\n DebateEvent,\n DebateResult,\n ApiErrorBody,\n SynthesisData,\n} from \"./types.js\";\n\nconst BASE_URL = \"https://engine.debatetalk.ai\";\n\nexport class DebateTalkError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly code?: string\n ) {\n super(message);\n this.name = \"DebateTalkError\";\n }\n}\n\nexport class DebateTalkClient {\n private readonly apiKey: string | undefined;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey ?? process.env[\"DEBATETALK_API_KEY\"];\n }\n\n private get authHeaders(): Record<string, string> {\n if (!this.apiKey) return {};\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n private get baseHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/json\", ...this.authHeaders };\n }\n\n private requireAuth(): void {\n if (!this.apiKey) {\n throw new Error(\n \"DEBATETALK_API_KEY is required for this operation. \" +\n \"Create one at https://console.debatetalk.ai/api-keys\"\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const res = await fetch(`${BASE_URL}${path}`, {\n method,\n headers: this.baseHeaders,\n ...(body !== undefined && { body: JSON.stringify(body) }),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n return res.json() as Promise<T>;\n }\n\n // ── Public endpoints (no auth required) ──────────────────────────────────\n\n async getModelStatus(): Promise<ModelStatusResponse> {\n return this.request<ModelStatusResponse>(\"GET\", \"/v1/public/model-status\");\n }\n\n async recommendModels(question: string): Promise<RecommendResponse> {\n return this.request<RecommendResponse>(\"POST\", \"/v1/models/recommend\", {\n question,\n });\n }\n\n // ── Authenticated endpoints ───────────────────────────────────────────────\n\n async estimateCost(params: EstimateCostParams): Promise<CostEstimate> {\n this.requireAuth();\n return this.request<CostEstimate>(\"POST\", \"/v1/user/estimate-cost\", params);\n }\n\n async getHistory(limit = 20): Promise<HistoryResponse> {\n this.requireAuth();\n return this.request<HistoryResponse>(\n \"GET\",\n `/v1/user/history?limit=${limit}`\n );\n }\n\n async *streamDebate(params: DebateParams): AsyncGenerator<DebateEvent> {\n this.requireAuth();\n\n const res = await fetch(`${BASE_URL}/debate`, {\n method: \"POST\",\n headers: { ...this.baseHeaders, Accept: \"text/event-stream\" },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n if (!res.body) throw new DebateTalkError(0, \"No response body\");\n\n const stream = res.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n for await (const event of stream) {\n if (!event.data || event.data === \"[DONE]\") continue;\n try {\n yield JSON.parse(event.data) as DebateEvent;\n } catch {\n // skip malformed events\n }\n }\n }\n\n async runDebate(params: DebateParams): Promise<DebateResult> {\n const events: DebateEvent[] = [];\n let debateId = \"\";\n let questionType = \"\";\n let models: string[] = [];\n let synthesis: SynthesisData | null = null;\n\n for await (const event of this.streamDebate(params)) {\n events.push(event);\n\n if (event.type === \"debate_start\") {\n debateId =
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["import { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type {\n ModelStatusResponse,\n RecommendResponse,\n EstimateCostParams,\n CostEstimate,\n HistoryResponse,\n DebateParams,\n DebateEvent,\n DebateResult,\n ApiErrorBody,\n SynthesisData,\n} from \"./types.js\";\n\nconst BASE_URL = \"https://engine.debatetalk.ai\";\n\nexport class DebateTalkError extends Error {\n constructor(\n public readonly status: number,\n message: string,\n public readonly code?: string\n ) {\n super(message);\n this.name = \"DebateTalkError\";\n }\n}\n\nexport class DebateTalkClient {\n private readonly apiKey: string | undefined;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey ?? process.env[\"DEBATETALK_API_KEY\"];\n }\n\n private get authHeaders(): Record<string, string> {\n if (!this.apiKey) return {};\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n\n private get baseHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/json\", ...this.authHeaders };\n }\n\n private requireAuth(): void {\n if (!this.apiKey) {\n throw new Error(\n \"DEBATETALK_API_KEY is required for this operation. \" +\n \"Create one at https://console.debatetalk.ai/api-keys\"\n );\n }\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const res = await fetch(`${BASE_URL}${path}`, {\n method,\n headers: this.baseHeaders,\n ...(body !== undefined && { body: JSON.stringify(body) }),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n return res.json() as Promise<T>;\n }\n\n // ── Public endpoints (no auth required) ──────────────────────────────────\n\n async getModelStatus(): Promise<ModelStatusResponse> {\n return this.request<ModelStatusResponse>(\"GET\", \"/v1/public/model-status\");\n }\n\n async recommendModels(question: string): Promise<RecommendResponse> {\n return this.request<RecommendResponse>(\"POST\", \"/v1/models/recommend\", {\n question,\n });\n }\n\n // ── Authenticated endpoints ───────────────────────────────────────────────\n\n async estimateCost(params: EstimateCostParams): Promise<CostEstimate> {\n this.requireAuth();\n return this.request<CostEstimate>(\"POST\", \"/v1/user/estimate-cost\", params);\n }\n\n async getHistory(limit = 20): Promise<HistoryResponse> {\n this.requireAuth();\n return this.request<HistoryResponse>(\n \"GET\",\n `/v1/user/history?limit=${limit}`\n );\n }\n\n async *streamDebate(params: DebateParams): AsyncGenerator<DebateEvent> {\n this.requireAuth();\n\n const res = await fetch(`${BASE_URL}/debate`, {\n method: \"POST\",\n headers: { ...this.baseHeaders, Accept: \"text/event-stream\" },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const payload = await res.json().catch(() => ({\n error: { code: \"unknown\", message: res.statusText },\n })) as ApiErrorBody;\n throw new DebateTalkError(\n res.status,\n payload.error?.message ?? res.statusText,\n payload.error?.code\n );\n }\n\n if (!res.body) throw new DebateTalkError(0, \"No response body\");\n\n const stream = res.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n for await (const event of stream) {\n if (!event.data || event.data === \"[DONE]\") continue;\n try {\n yield JSON.parse(event.data) as DebateEvent;\n } catch {\n // skip malformed events\n }\n }\n }\n\n async runDebate(params: DebateParams): Promise<DebateResult> {\n const events: DebateEvent[] = [];\n let debateId = \"\";\n let questionType = \"\";\n let models: string[] = [];\n let synthesis: SynthesisData | null = null;\n\n for await (const event of this.streamDebate(params)) {\n events.push(event);\n\n if (event.type === \"debate_start\") {\n debateId = typeof event.data[\"debate_id\"] === \"string\" ? event.data[\"debate_id\"] : \"\";\n models = Array.isArray(event.data[\"models\"]) ? (event.data[\"models\"] as string[]) : [];\n }\n if (event.type === \"classification\") {\n questionType = typeof event.data[\"question_type\"] === \"string\" ? event.data[\"question_type\"] : \"\";\n }\n if (event.type === \"synthesis\") {\n const d = event.data;\n if (\n typeof d[\"strong_ground\"] === \"string\" &&\n typeof d[\"fault_lines\"] === \"string\" &&\n typeof d[\"blind_spots\"] === \"string\" &&\n typeof d[\"your_call\"] === \"string\"\n ) {\n synthesis = d as unknown as SynthesisData;\n }\n }\n }\n\n return {\n debate_id: debateId,\n question: params.question,\n question_type: questionType,\n models,\n synthesis,\n events,\n };\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
DebateTalkClient,
|
|
4
4
|
DebateTalkError
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-XVI4IIO6.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/index.ts
|
|
8
8
|
import { Command as Command6 } from "commander";
|
|
@@ -156,12 +156,12 @@ function recommendCommand() {
|
|
|
156
156
|
import { Command as Command4 } from "commander";
|
|
157
157
|
import chalk5 from "chalk";
|
|
158
158
|
function costCommand() {
|
|
159
|
-
return new Command4("cost").description("Estimate the credit cost of a debate before running it").argument("<question>", "The question to estimate cost for").option("--rounds <n>", "Number of deliberation rounds"
|
|
159
|
+
return new Command4("cost").description("Estimate the credit cost of a debate before running it").argument("<question>", "The question to estimate cost for").option("--rounds <n>", "Number of deliberation rounds").action(async (question, opts) => {
|
|
160
160
|
const client = new DebateTalkClient();
|
|
161
161
|
try {
|
|
162
162
|
const est = await client.estimateCost({
|
|
163
163
|
question,
|
|
164
|
-
rounds: parseInt(opts.rounds, 10)
|
|
164
|
+
...opts.rounds && { rounds: parseInt(opts.rounds, 10) }
|
|
165
165
|
});
|
|
166
166
|
console.log(chalk5.bold(`Cost estimate`));
|
|
167
167
|
console.log();
|
|
@@ -190,8 +190,9 @@ function historyCommand() {
|
|
|
190
190
|
return new Command5("history").description("List your past debates").option("--limit <n>", "Number of debates to show", "20").action(async (opts) => {
|
|
191
191
|
const client = new DebateTalkClient();
|
|
192
192
|
try {
|
|
193
|
+
const rawLimit = parseInt(opts.limit, 10);
|
|
193
194
|
const { debates, total } = await client.getHistory(
|
|
194
|
-
|
|
195
|
+
Number.isNaN(rawLimit) ? 20 : Math.min(Math.max(1, rawLimit), 100)
|
|
195
196
|
);
|
|
196
197
|
if (debates.length === 0) {
|
|
197
198
|
console.log(chalk6.dim('No debates yet. Run: debatetalk debate "your question"'));
|
|
@@ -209,7 +210,7 @@ function historyCommand() {
|
|
|
209
210
|
});
|
|
210
211
|
const share = d.share_token ? chalk6.dim(` \u2192 https://console.debatetalk.ai/share/${d.share_token}`) : "";
|
|
211
212
|
console.log(
|
|
212
|
-
` ${chalk6.dim(date)} ${d.title}` + chalk6.dim(` (${d.model_count} models)`) + share
|
|
213
|
+
` ${chalk6.dim(date)} ${d.title}` + chalk6.dim(` (${d.model_count} models, ${d.status})`) + share
|
|
213
214
|
);
|
|
214
215
|
}
|
|
215
216
|
} catch (err) {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/debate.ts","../../src/cli/utils.ts","../../src/cli/commands/models.ts","../../src/cli/commands/recommend.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/history.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { debateCommand } from \"./commands/debate.js\";\nimport { modelsCommand } from \"./commands/models.js\";\nimport { recommendCommand } from \"./commands/recommend.js\";\nimport { costCommand } from \"./commands/cost.js\";\nimport { historyCommand } from \"./commands/history.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"debatetalk\")\n .description(\n \"DebateTalk CLI — run structured multi-model AI debates from your terminal.\\n\" +\n \"Docs: https://debatetalk.ai/resources/api-reference\"\n )\n .version(\"1.0.0\");\n\nprogram.addCommand(debateCommand());\nprogram.addCommand(modelsCommand());\nprogram.addCommand(recommendCommand());\nprogram.addCommand(costCommand());\nprogram.addCommand(historyCommand());\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\nimport type { DebateEvent } from \"../../types.js\";\n\nexport function debateCommand(): Command {\n return new Command(\"debate\")\n .description(\"Run a structured multi-model AI debate\")\n .argument(\"<question>\", \"The question or topic to debate\")\n .option(\n \"--models <ids>\",\n \"Comma-separated model IDs (omit for smart routing)\"\n )\n .option(\"--rounds <n>\", \"Number of deliberation rounds (default: 2)\")\n .action(\n async (\n question: string,\n opts: { models?: string; rounds?: string }\n ) => {\n const client = new DebateTalkClient();\n const params = {\n question,\n ...(opts.models && { models: opts.models.split(\",\").map((s) => s.trim()) }),\n ...(opts.rounds && { rounds: parseInt(opts.rounds, 10) }),\n };\n\n const spinner = ora(\"Starting debate…\").start();\n\n try {\n let currentPhase = \"\";\n\n for await (const event of client.streamDebate(params)) {\n const phase = getPhaseLabel(event);\n if (phase && phase !== currentPhase) {\n currentPhase = phase;\n spinner.text = phase;\n }\n\n if (event.type === \"synthesis\") {\n spinner.succeed(\"Debate complete\");\n printSynthesis(question, event);\n return;\n }\n }\n\n spinner.fail(\"Debate ended without synthesis\");\n } catch (err) {\n spinner.fail(\"Debate failed\");\n handleError(err);\n }\n }\n );\n}\n\nfunction getPhaseLabel(event: DebateEvent): string | null {\n switch (event.type) {\n case \"debate_start\":\n return \"Debate starting…\";\n case \"classification\":\n return `Classifying question (${(event.data[\"question_type\"] as string | undefined) ?? \"…\"})`;\n case \"round_start\":\n return `Round ${(event.data[\"round\"] as number | undefined) ?? \"?\"} — models deliberating…`;\n case \"consensus\":\n return \"Checking consensus…\";\n case \"synthesis\":\n return \"Generating synthesis…\";\n default:\n return null;\n }\n}\n\nfunction printSynthesis(question: string, event: DebateEvent): void {\n const d = event.data as Record<string, string>;\n console.log();\n console.log(chalk.bold(`\"${question}\"`));\n console.log();\n console.log(chalk.bold.green(\"━━━ STRONG GROUND ━━━\"));\n console.log(d[\"strong_ground\"] ?? \"\");\n console.log();\n console.log(chalk.bold.yellow(\"━━━ FAULT LINES ━━━\"));\n console.log(d[\"fault_lines\"] ?? \"\");\n console.log();\n console.log(chalk.bold.magenta(\"━━━ BLIND SPOTS ━━━\"));\n console.log(d[\"blind_spots\"] ?? \"\");\n console.log();\n console.log(chalk.bold.cyan(\"━━━ YOUR CALL ━━━\"));\n console.log(d[\"your_call\"] ?? \"\");\n console.log();\n}\n","import chalk from \"chalk\";\nimport { DebateTalkError } from \"../client.js\";\n\nexport function handleError(err: unknown): never {\n if (err instanceof DebateTalkError) {\n if (err.status === 401 || err.status === 403) {\n console.error(chalk.red(\"Authentication failed.\"));\n console.error(\n chalk.dim(\n \"Set DEBATETALK_API_KEY or create a key at https://console.debatetalk.ai/api-keys\"\n )\n );\n } else if (err.status === 429) {\n console.error(chalk.red(\"Rate limit reached.\"));\n console.error(chalk.dim(\"Free plan: 5 debates/day. Upgrade at https://debatetalk.ai\"));\n } else {\n console.error(chalk.red(`API error (${err.status}): ${err.message}`));\n }\n } else if (err instanceof Error) {\n console.error(chalk.red(err.message));\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\nexport function requireApiKey(): string {\n const key = process.env[\"DEBATETALK_API_KEY\"];\n if (!key) {\n console.error(chalk.red(\"DEBATETALK_API_KEY is not set.\"));\n console.error(\n chalk.dim(\"Create a key at https://console.debatetalk.ai/api-keys\")\n );\n process.exit(1);\n }\n return key;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function modelsCommand(): Command {\n return new Command(\"models\")\n .description(\"Show real-time health and latency for all DebateTalk models\")\n .action(async () => {\n const client = new DebateTalkClient();\n try {\n const { models, updated_at } = await client.getModelStatus();\n const online = models.filter((m) => m.status === \"online\").length;\n console.log(\n chalk.bold(`Model Status`) +\n chalk.dim(` — ${online}/${models.length} online (updated ${updated_at})`)\n );\n console.log();\n for (const m of models) {\n const icon =\n m.status === \"online\"\n ? chalk.green(\"✓\")\n : m.status === \"degraded\"\n ? chalk.yellow(\"⚠\")\n : chalk.red(\"✗\");\n const latency =\n m.latency_ms != null ? chalk.dim(` ${m.latency_ms}ms`) : \"\";\n console.log(` ${icon} ${m.display_name}${latency}`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function recommendCommand(): Command {\n return new Command(\"recommend\")\n .description(\"Get the best model panel for a question\")\n .argument(\"<question>\", \"The question to get recommendations for\")\n .action(async (question: string) => {\n const client = new DebateTalkClient();\n try {\n const rec = await client.recommendModels(question);\n console.log(chalk.bold(`Recommended panel`) + chalk.dim(` for \"${question}\"`));\n console.log(chalk.dim(`Question type: ${rec.question_type}`));\n console.log();\n console.log(` ${chalk.cyan(\"Debaters:\")} ${rec.debaters.join(\", \")}`);\n console.log(` ${chalk.cyan(\"Synthesizer:\")} ${rec.synthesizer}`);\n console.log(` ${chalk.cyan(\"Adjudicator:\")} ${rec.adjudicator}`);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function costCommand(): Command {\n return new Command(\"cost\")\n .description(\"Estimate the credit cost of a debate before running it\")\n .argument(\"<question>\", \"The question to estimate cost for\")\n .option(\"--rounds <n>\", \"Number of deliberation rounds\", \"2\")\n .action(async (question: string, opts: { rounds: string }) => {\n const client = new DebateTalkClient();\n try {\n const est = await client.estimateCost({\n question,\n rounds: parseInt(opts.rounds, 10),\n });\n console.log(chalk.bold(`Cost estimate`));\n console.log();\n console.log(\n ` ${chalk.cyan(\"Total:\")} ${est.estimated_credits} credits` +\n chalk.dim(` (~$${est.estimated_usd.toFixed(2)} USD)`)\n );\n console.log();\n console.log(chalk.dim(\" Breakdown:\"));\n for (const b of est.breakdown) {\n console.log(\n chalk.dim(\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function historyCommand(): Command {\n return new Command(\"history\")\n .description(\"List your past debates\")\n .option(\"--limit <n>\", \"Number of debates to show\", \"20\")\n .action(async (opts: { limit: string }) => {\n const client = new DebateTalkClient();\n try {\n const { debates, total } = await client.getHistory(\n parseInt(opts.limit, 10)\n );\n if (debates.length === 0) {\n console.log(chalk.dim('No debates yet. Run: debatetalk debate \"your question\"'));\n return;\n }\n console.log(\n chalk.bold(`Debate history`) +\n chalk.dim(` — showing ${debates.length} of ${total}`)\n );\n console.log();\n for (const d of debates) {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const share = d.share_token\n ? chalk.dim(` → https://console.debatetalk.ai/share/${d.share_token}`)\n : \"\";\n console.log(\n ` ${chalk.dim(date)} ${d.title}` +\n chalk.dim(` (${d.model_count} models)`) +\n share\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n"],"mappings":";;;;;;;AAAA,SAAS,WAAAA,gBAAe;;;ACAxB,SAAS,eAAe;AACxB,OAAOC,YAAW;AAClB,OAAO,SAAS;;;ACFhB,OAAO,WAAW;AAGX,SAAS,YAAY,KAAqB;AAC/C,MAAI,eAAe,iBAAiB;AAClC,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,cAAQ,MAAM,MAAM,IAAI,wBAAwB,CAAC;AACjD,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,IAAI,WAAW,KAAK;AAC7B,cAAQ,MAAM,MAAM,IAAI,qBAAqB,CAAC;AAC9C,cAAQ,MAAM,MAAM,IAAI,4DAA4D,CAAC;AAAA,IACvF,OAAO;AACL,cAAQ,MAAM,MAAM,IAAI,cAAc,IAAI,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;AAAA,IACtE;AAAA,EACF,WAAW,eAAe,OAAO;AAC/B,YAAQ,MAAM,MAAM,IAAI,IAAI,OAAO,CAAC;AAAA,EACtC,OAAO;AACL,YAAQ,MAAM,MAAM,IAAI,+BAA+B,CAAC;AAAA,EAC1D;AACA,UAAQ,KAAK,CAAC;AAChB;;;ADjBO,SAAS,gBAAyB;AACvC,SAAO,IAAI,QAAQ,QAAQ,EACxB,YAAY,wCAAwC,EACpD,SAAS,cAAc,iCAAiC,EACxD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,gBAAgB,4CAA4C,EACnE;AAAA,IACC,OACE,UACA,SACG;AACH,YAAM,SAAS,IAAI,iBAAiB;AACpC,YAAM,SAAS;AAAA,QACb;AAAA,QACA,GAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AAAA,QACzE,GAAI,KAAK,UAAU,EAAE,QAAQ,SAAS,KAAK,QAAQ,EAAE,EAAE;AAAA,MACzD;AAEA,YAAM,UAAU,IAAI,uBAAkB,EAAE,MAAM;AAE9C,UAAI;AACF,YAAI,eAAe;AAEnB,yBAAiB,SAAS,OAAO,aAAa,MAAM,GAAG;AACrD,gBAAM,QAAQ,cAAc,KAAK;AACjC,cAAI,SAAS,UAAU,cAAc;AACnC,2BAAe;AACf,oBAAQ,OAAO;AAAA,UACjB;AAEA,cAAI,MAAM,SAAS,aAAa;AAC9B,oBAAQ,QAAQ,iBAAiB;AACjC,2BAAe,UAAU,KAAK;AAC9B;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,KAAK,gCAAgC;AAAA,MAC/C,SAAS,KAAK;AACZ,gBAAQ,KAAK,eAAe;AAC5B,oBAAY,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACJ;AAEA,SAAS,cAAc,OAAmC;AACxD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,yBAA0B,MAAM,KAAK,eAAe,KAA4B,QAAG;AAAA,IAC5F,KAAK;AACH,aAAO,SAAU,MAAM,KAAK,OAAO,KAA4B,GAAG;AAAA,IACpE,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,UAAkB,OAA0B;AAClE,QAAM,IAAI,MAAM;AAChB,UAAQ,IAAI;AACZ,UAAQ,IAAIC,OAAM,KAAK,IAAI,QAAQ,GAAG,CAAC;AACvC,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,MAAM,qDAAuB,CAAC;AACrD,UAAQ,IAAI,EAAE,eAAe,KAAK,EAAE;AACpC,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,OAAO,mDAAqB,CAAC;AACpD,UAAQ,IAAI,EAAE,aAAa,KAAK,EAAE;AAClC,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,QAAQ,mDAAqB,CAAC;AACrD,UAAQ,IAAI,EAAE,aAAa,KAAK,EAAE;AAClC,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,KAAK,iDAAmB,CAAC;AAChD,UAAQ,IAAI,EAAE,WAAW,KAAK,EAAE;AAChC,UAAQ,IAAI;AACd;;;AE1FA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAIX,SAAS,gBAAyB;AACvC,SAAO,IAAIC,SAAQ,QAAQ,EACxB,YAAY,6DAA6D,EACzE,OAAO,YAAY;AAClB,UAAM,SAAS,IAAI,iBAAiB;AACpC,QAAI;AACF,YAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,OAAO,eAAe;AAC3D,YAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAC3D,cAAQ;AAAA,QACNC,OAAM,KAAK,cAAc,IACvBA,OAAM,IAAI,WAAM,MAAM,IAAI,OAAO,MAAM,oBAAoB,UAAU,GAAG;AAAA,MAC5E;AACA,cAAQ,IAAI;AACZ,iBAAW,KAAK,QAAQ;AACtB,cAAM,OACJ,EAAE,WAAW,WACTA,OAAM,MAAM,QAAG,IACf,EAAE,WAAW,aACXA,OAAM,OAAO,QAAG,IAChBA,OAAM,IAAI,QAAG;AACrB,cAAM,UACJ,EAAE,cAAc,OAAOA,OAAM,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI;AAC3D,gBAAQ,IAAI,KAAK,IAAI,IAAI,EAAE,YAAY,GAAG,OAAO,EAAE;AAAA,MACrD;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACjCA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAIX,SAAS,mBAA4B;AAC1C,SAAO,IAAIC,SAAQ,WAAW,EAC3B,YAAY,yCAAyC,EACrD,SAAS,cAAc,yCAAyC,EAChE,OAAO,OAAO,aAAqB;AAClC,UAAM,SAAS,IAAI,iBAAiB;AACpC,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,gBAAgB,QAAQ;AACjD,cAAQ,IAAIC,OAAM,KAAK,mBAAmB,IAAIA,OAAM,IAAI,SAAS,QAAQ,GAAG,CAAC;AAC7E,cAAQ,IAAIA,OAAM,IAAI,kBAAkB,IAAI,aAAa,EAAE,CAAC;AAC5D,cAAQ,IAAI;AACZ,cAAQ,IAAI,KAAKA,OAAM,KAAK,WAAW,CAAC,OAAO,IAAI,SAAS,KAAK,IAAI,CAAC,EAAE;AACxE,cAAQ,IAAI,KAAKA,OAAM,KAAK,cAAc,CAAC,IAAI,IAAI,WAAW,EAAE;AAChE,cAAQ,IAAI,KAAKA,OAAM,KAAK,cAAc,CAAC,IAAI,IAAI,WAAW,EAAE;AAAA,IAClE,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACvBA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAIX,SAAS,cAAuB;AACrC,SAAO,IAAIC,SAAQ,MAAM,EACtB,YAAY,wDAAwD,EACpE,SAAS,cAAc,mCAAmC,EAC1D,OAAO,gBAAgB,iCAAiC,GAAG,EAC3D,OAAO,OAAO,UAAkB,SAA6B;AAC5D,UAAM,SAAS,IAAI,iBAAiB;AACpC,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,aAAa;AAAA,QACpC;AAAA,QACA,QAAQ,SAAS,KAAK,QAAQ,EAAE;AAAA,MAClC,CAAC;AACD,cAAQ,IAAIC,OAAM,KAAK,eAAe,CAAC;AACvC,cAAQ,IAAI;AACZ,cAAQ;AAAA,QACN,KAAKA,OAAM,KAAK,QAAQ,CAAC,IAAI,IAAI,iBAAiB,aAChDA,OAAM,IAAI,OAAO,IAAI,cAAc,QAAQ,CAAC,CAAC,OAAO;AAAA,MACxD;AACA,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,IAAI,cAAc,CAAC;AACrC,iBAAW,KAAK,IAAI,WAAW;AAC7B,gBAAQ;AAAA,UACNA,OAAM;AAAA,YACJ,cAAS,EAAE,KAAK,KAAK,EAAE,IAAI,OAAO,EAAE,iBAAiB,eAAe,CAAC,aAAa,EAAE,iBAAiB;AAAA,UACvG;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ACpCA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAIX,SAAS,iBAA0B;AACxC,SAAO,IAAIC,SAAQ,SAAS,EACzB,YAAY,wBAAwB,EACpC,OAAO,eAAe,6BAA6B,IAAI,EACvD,OAAO,OAAO,SAA4B;AACzC,UAAM,SAAS,IAAI,iBAAiB;AACpC,QAAI;AACF,YAAM,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO;AAAA,QACtC,SAAS,KAAK,OAAO,EAAE;AAAA,MACzB;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,gBAAQ,IAAIC,OAAM,IAAI,wDAAwD,CAAC;AAC/E;AAAA,MACF;AACA,cAAQ;AAAA,QACNA,OAAM,KAAK,gBAAgB,IACzBA,OAAM,IAAI,mBAAc,QAAQ,MAAM,OAAO,KAAK,EAAE;AAAA,MACxD;AACA,cAAQ,IAAI;AACZ,iBAAW,KAAK,SAAS;AACvB,cAAM,OAAO,IAAI,KAAK,EAAE,UAAU,EAAE,mBAAmB,SAAS;AAAA,UAC9D,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK;AAAA,QACP,CAAC;AACD,cAAM,QAAQ,EAAE,cACZA,OAAM,IAAI,+CAA0C,EAAE,WAAW,EAAE,IACnE;AACJ,gBAAQ;AAAA,UACN,KAAKA,OAAM,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAC9BA,OAAM,IAAI,KAAK,EAAE,WAAW,UAAU,IACtC;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF,CAAC;AACL;;;ANpCA,IAAM,UAAU,IAAIC,SAAQ;AAE5B,QACG,KAAK,YAAY,EACjB;AAAA,EACC;AAEF,EACC,QAAQ,OAAO;AAElB,QAAQ,WAAW,cAAc,CAAC;AAClC,QAAQ,WAAW,cAAc,CAAC;AAClC,QAAQ,WAAW,iBAAiB,CAAC;AACrC,QAAQ,WAAW,YAAY,CAAC;AAChC,QAAQ,WAAW,eAAe,CAAC;AAEnC,QAAQ,MAAM;","names":["Command","chalk","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/debate.ts","../../src/cli/utils.ts","../../src/cli/commands/models.ts","../../src/cli/commands/recommend.ts","../../src/cli/commands/cost.ts","../../src/cli/commands/history.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { debateCommand } from \"./commands/debate.js\";\nimport { modelsCommand } from \"./commands/models.js\";\nimport { recommendCommand } from \"./commands/recommend.js\";\nimport { costCommand } from \"./commands/cost.js\";\nimport { historyCommand } from \"./commands/history.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"debatetalk\")\n .description(\n \"DebateTalk CLI — run structured multi-model AI debates from your terminal.\\n\" +\n \"Docs: https://debatetalk.ai/resources/api-reference\"\n )\n .version(\"1.0.0\");\n\nprogram.addCommand(debateCommand());\nprogram.addCommand(modelsCommand());\nprogram.addCommand(recommendCommand());\nprogram.addCommand(costCommand());\nprogram.addCommand(historyCommand());\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\nimport type { DebateEvent } from \"../../types.js\";\n\nexport function debateCommand(): Command {\n return new Command(\"debate\")\n .description(\"Run a structured multi-model AI debate\")\n .argument(\"<question>\", \"The question or topic to debate\")\n .option(\n \"--models <ids>\",\n \"Comma-separated model IDs (omit for smart routing)\"\n )\n .option(\"--rounds <n>\", \"Number of deliberation rounds (default: 2)\")\n .action(\n async (\n question: string,\n opts: { models?: string; rounds?: string }\n ) => {\n const client = new DebateTalkClient();\n const params = {\n question,\n ...(opts.models && { models: opts.models.split(\",\").map((s) => s.trim()) }),\n ...(opts.rounds && { rounds: parseInt(opts.rounds, 10) }),\n };\n\n const spinner = ora(\"Starting debate…\").start();\n\n try {\n let currentPhase = \"\";\n\n for await (const event of client.streamDebate(params)) {\n const phase = getPhaseLabel(event);\n if (phase && phase !== currentPhase) {\n currentPhase = phase;\n spinner.text = phase;\n }\n\n if (event.type === \"synthesis\") {\n spinner.succeed(\"Debate complete\");\n printSynthesis(question, event);\n return;\n }\n }\n\n spinner.fail(\"Debate ended without synthesis\");\n } catch (err) {\n spinner.fail(\"Debate failed\");\n handleError(err);\n }\n }\n );\n}\n\nfunction getPhaseLabel(event: DebateEvent): string | null {\n switch (event.type) {\n case \"debate_start\":\n return \"Debate starting…\";\n case \"classification\":\n return `Classifying question (${(event.data[\"question_type\"] as string | undefined) ?? \"…\"})`;\n case \"round_start\":\n return `Round ${(event.data[\"round\"] as number | undefined) ?? \"?\"} — models deliberating…`;\n case \"consensus\":\n return \"Checking consensus…\";\n case \"synthesis\":\n return \"Generating synthesis…\";\n default:\n return null;\n }\n}\n\nfunction printSynthesis(question: string, event: DebateEvent): void {\n const d = event.data as Record<string, string>;\n console.log();\n console.log(chalk.bold(`\"${question}\"`));\n console.log();\n console.log(chalk.bold.green(\"━━━ STRONG GROUND ━━━\"));\n console.log(d[\"strong_ground\"] ?? \"\");\n console.log();\n console.log(chalk.bold.yellow(\"━━━ FAULT LINES ━━━\"));\n console.log(d[\"fault_lines\"] ?? \"\");\n console.log();\n console.log(chalk.bold.magenta(\"━━━ BLIND SPOTS ━━━\"));\n console.log(d[\"blind_spots\"] ?? \"\");\n console.log();\n console.log(chalk.bold.cyan(\"━━━ YOUR CALL ━━━\"));\n console.log(d[\"your_call\"] ?? \"\");\n console.log();\n}\n","import chalk from \"chalk\";\nimport { DebateTalkError } from \"../client.js\";\n\nexport function handleError(err: unknown): never {\n if (err instanceof DebateTalkError) {\n if (err.status === 401 || err.status === 403) {\n console.error(chalk.red(\"Authentication failed.\"));\n console.error(\n chalk.dim(\n \"Set DEBATETALK_API_KEY or create a key at https://console.debatetalk.ai/api-keys\"\n )\n );\n } else if (err.status === 429) {\n console.error(chalk.red(\"Rate limit reached.\"));\n console.error(chalk.dim(\"Free plan: 5 debates/day. Upgrade at https://debatetalk.ai\"));\n } else {\n console.error(chalk.red(`API error (${err.status}): ${err.message}`));\n }\n } else if (err instanceof Error) {\n console.error(chalk.red(err.message));\n } else {\n console.error(chalk.red(\"An unexpected error occurred.\"));\n }\n process.exit(1);\n}\n\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function modelsCommand(): Command {\n return new Command(\"models\")\n .description(\"Show real-time health and latency for all DebateTalk models\")\n .action(async () => {\n const client = new DebateTalkClient();\n try {\n const { models, updated_at } = await client.getModelStatus();\n const online = models.filter((m) => m.status === \"online\").length;\n console.log(\n chalk.bold(`Model Status`) +\n chalk.dim(` — ${online}/${models.length} online (updated ${updated_at})`)\n );\n console.log();\n for (const m of models) {\n const icon =\n m.status === \"online\"\n ? chalk.green(\"✓\")\n : m.status === \"degraded\"\n ? chalk.yellow(\"⚠\")\n : chalk.red(\"✗\");\n const latency =\n m.latency_ms != null ? chalk.dim(` ${m.latency_ms}ms`) : \"\";\n console.log(` ${icon} ${m.display_name}${latency}`);\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function recommendCommand(): Command {\n return new Command(\"recommend\")\n .description(\"Get the best model panel for a question\")\n .argument(\"<question>\", \"The question to get recommendations for\")\n .action(async (question: string) => {\n const client = new DebateTalkClient();\n try {\n const rec = await client.recommendModels(question);\n console.log(chalk.bold(`Recommended panel`) + chalk.dim(` for \"${question}\"`));\n console.log(chalk.dim(`Question type: ${rec.question_type}`));\n console.log();\n console.log(` ${chalk.cyan(\"Debaters:\")} ${rec.debaters.join(\", \")}`);\n console.log(` ${chalk.cyan(\"Synthesizer:\")} ${rec.synthesizer}`);\n console.log(` ${chalk.cyan(\"Adjudicator:\")} ${rec.adjudicator}`);\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function costCommand(): Command {\n return new Command(\"cost\")\n .description(\"Estimate the credit cost of a debate before running it\")\n .argument(\"<question>\", \"The question to estimate cost for\")\n .option(\"--rounds <n>\", \"Number of deliberation rounds\")\n .action(async (question: string, opts: { rounds?: string }) => {\n const client = new DebateTalkClient();\n try {\n const est = await client.estimateCost({\n question,\n ...(opts.rounds && { rounds: parseInt(opts.rounds, 10) }),\n });\n console.log(chalk.bold(`Cost estimate`));\n console.log();\n console.log(\n ` ${chalk.cyan(\"Total:\")} ${est.estimated_credits} credits` +\n chalk.dim(` (~$${est.estimated_usd.toFixed(2)} USD)`)\n );\n console.log();\n console.log(chalk.dim(\" Breakdown:\"));\n for (const b of est.breakdown) {\n console.log(\n chalk.dim(\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { DebateTalkClient } from \"../../client.js\";\nimport { handleError } from \"../utils.js\";\n\nexport function historyCommand(): Command {\n return new Command(\"history\")\n .description(\"List your past debates\")\n .option(\"--limit <n>\", \"Number of debates to show\", \"20\")\n .action(async (opts: { limit: string }) => {\n const client = new DebateTalkClient();\n try {\n const rawLimit = parseInt(opts.limit, 10);\n const { debates, total } = await client.getHistory(\n Number.isNaN(rawLimit) ? 20 : Math.min(Math.max(1, rawLimit), 100)\n );\n if (debates.length === 0) {\n console.log(chalk.dim('No debates yet. Run: debatetalk debate \"your question\"'));\n return;\n }\n console.log(\n chalk.bold(`Debate history`) +\n chalk.dim(` — showing ${debates.length} of ${total}`)\n );\n console.log();\n for (const d of debates) {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const share = d.share_token\n ? chalk.dim(` → https://console.debatetalk.ai/share/${d.share_token}`)\n : \"\";\n console.log(\n ` ${chalk.dim(date)} ${d.title}` +\n chalk.dim(` (${d.model_count} models, ${d.status})`) +\n share\n );\n }\n } catch (err) {\n handleError(err);\n }\n });\n}\n"],"mappings":"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","names":["Command","chalk","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command"]}
|
package/dist/mcp/server.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
DebateTalkClient
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-XVI4IIO6.js";
|
|
5
5
|
|
|
6
6
|
// src/mcp/server.ts
|
|
7
7
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
// src/mcp/tools/run_debate.ts
|
|
15
15
|
var runDebateTool = {
|
|
16
16
|
name: "run_debate",
|
|
17
|
-
description: "Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. Also use it proactively for high-stakes decisions where a single AI answer is insufficient \u2014 architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: Strong Ground (what all models agree on), Fault Lines (genuine disagreements), Blind Spots (what all models missed), and Your Call (actionable recommendation). Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.",
|
|
17
|
+
description: "Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'multi model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. Also use it proactively for high-stakes decisions where a single AI answer is insufficient \u2014 architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: Strong Ground (what all models agree on), Fault Lines (genuine disagreements), Blind Spots (what all models missed), and Your Call (actionable recommendation). Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.",
|
|
18
18
|
inputSchema: {
|
|
19
19
|
type: "object",
|
|
20
20
|
properties: {
|
|
@@ -38,11 +38,12 @@ var runDebateTool = {
|
|
|
38
38
|
async function handleRunDebate(client, args) {
|
|
39
39
|
const result = await client.runDebate(args);
|
|
40
40
|
if (!result.synthesis) {
|
|
41
|
+
const id = result.debate_id ? `Debate ${result.debate_id}` : "Debate";
|
|
41
42
|
return {
|
|
42
43
|
content: [
|
|
43
44
|
{
|
|
44
45
|
type: "text",
|
|
45
|
-
text:
|
|
46
|
+
text: `${id} completed but synthesis was not produced. Check your plan limits at https://console.debatetalk.ai`
|
|
46
47
|
}
|
|
47
48
|
]
|
|
48
49
|
};
|
|
@@ -210,7 +211,8 @@ var getHistoryTool = {
|
|
|
210
211
|
}
|
|
211
212
|
};
|
|
212
213
|
async function handleGetHistory(client, args) {
|
|
213
|
-
const
|
|
214
|
+
const raw = args.limit ?? 20;
|
|
215
|
+
const limit = Number.isFinite(raw) ? Math.min(Math.max(1, raw), 100) : 20;
|
|
214
216
|
const { debates, total } = await client.getHistory(limit);
|
|
215
217
|
if (debates.length === 0) {
|
|
216
218
|
return {
|
|
@@ -246,6 +248,7 @@ async function handleGetHistory(client, args) {
|
|
|
246
248
|
}
|
|
247
249
|
|
|
248
250
|
// src/mcp/server.ts
|
|
251
|
+
import { fileURLToPath } from "url";
|
|
249
252
|
var ALL_TOOLS = [
|
|
250
253
|
runDebateTool,
|
|
251
254
|
getModelStatusTool,
|
|
@@ -286,7 +289,7 @@ async function main() {
|
|
|
286
289
|
const transport = new StdioServerTransport();
|
|
287
290
|
await server.connect(transport);
|
|
288
291
|
}
|
|
289
|
-
if (import.meta.url ===
|
|
292
|
+
if (fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
290
293
|
main().catch((err) => {
|
|
291
294
|
process.stderr.write(
|
|
292
295
|
`DebateTalk MCP server error: ${err instanceof Error ? err.message : String(err)}
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/server.ts","../../src/mcp/tools/run_debate.ts","../../src/mcp/tools/get_model_status.ts","../../src/mcp/tools/recommend_models.ts","../../src/mcp/tools/estimate_cost.ts","../../src/mcp/tools/get_history.ts"],"sourcesContent":["// Server is the low-level class needed for JSON Schema tool definitions.\n// McpServer (the replacement) requires Zod schemas — not compatible with our Tool[] approach.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { DebateTalkClient } from \"../client.js\";\nimport { runDebateTool, handleRunDebate } from \"./tools/run_debate.js\";\nimport { getModelStatusTool, handleGetModelStatus } from \"./tools/get_model_status.js\";\nimport { recommendModelsTool, handleRecommendModels } from \"./tools/recommend_models.js\";\nimport { estimateCostTool, handleEstimateCost } from \"./tools/estimate_cost.js\";\nimport { getHistoryTool, handleGetHistory } from \"./tools/get_history.js\";\n\nexport const ALL_TOOLS = [\n runDebateTool,\n getModelStatusTool,\n recommendModelsTool,\n estimateCostTool,\n getHistoryTool,\n];\n\nfunction createServer(client: DebateTalkClient): Server {\n const server = new Server(\n { name: \"debatetalk\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: ALL_TOOLS,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args = {} } = request.params;\n\n switch (name) {\n case \"run_debate\":\n return handleRunDebate(client, args as Parameters<typeof handleRunDebate>[1]);\n case \"get_model_status\":\n return handleGetModelStatus(client);\n case \"recommend_models\":\n return handleRecommendModels(client, args as Parameters<typeof handleRecommendModels>[1]);\n case \"estimate_cost\":\n return handleEstimateCost(client, args as Parameters<typeof handleEstimateCost>[1]);\n case \"get_history\":\n return handleGetHistory(client, args as Parameters<typeof handleGetHistory>[1]);\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n });\n\n return server;\n}\n\nasync function main() {\n const client = new DebateTalkClient();\n const server = createServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// Only start the server when run directly, not when imported in tests\nif (import.meta.url === `file://${process.argv[1]}`) {\n main().catch((err: unknown) => {\n process.stderr.write(\n `DebateTalk MCP server error: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n });\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const runDebateTool: Tool = {\n name: \"run_debate\",\n description:\n \"Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. \" +\n \"Also use it proactively for high-stakes decisions where a single AI answer is insufficient — architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. \" +\n \"Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: \" +\n \"Strong Ground (what all models agree on), Fault Lines (genuine disagreements), \" +\n \"Blind Spots (what all models missed), and Your Call (actionable recommendation). \" +\n \"Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description:\n \"The question or topic to debate. Can be a decision, prediction, factual question, or open-ended topic.\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Specific model IDs to use as debaters (e.g. [\\\"claude-opus-4-6\\\", \\\"gpt-5.4\\\"]). \" +\n \"Omit to let DebateTalk smart routing pick the best panel automatically.\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2, max depends on plan)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRunDebate(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const result = await client.runDebate(args);\n\n if (!result.synthesis) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `debate completed — ${result.debate_id} — but synthesis was not produced. Check your plan limits at https://console.debatetalk.ai`,\n },\n ],\n };\n }\n\n const { strong_ground, fault_lines, blind_spots, your_call } =\n result.synthesis;\n\n const modelList =\n result.models.length > 0 ? result.models.join(\", \") : \"smart routing\";\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `DebateTalk — ${result.question_type} question`,\n `Question: \"${result.question}\"`,\n `Models: ${modelList}`,\n `Debate ID: ${result.debate_id}`,\n ``,\n `━━━ Strong Ground ━━━`,\n `What all models agreed on:`,\n strong_ground,\n ``,\n `━━━ Fault Lines ━━━`,\n `Where models genuinely disagreed:`,\n fault_lines,\n ``,\n `━━━ Blind Spots ━━━`,\n `What all models missed:`,\n blind_spots,\n ``,\n `━━━ Your Call ━━━`,\n your_call,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getModelStatusTool: Tool = {\n name: \"get_model_status\",\n description:\n \"Get real-time health, latency, and uptime for all DebateTalk models. \" +\n \"Use this before running a debate to check which models are currently online. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport async function handleGetModelStatus(client: DebateTalkClient) {\n const { models, updated_at } = await client.getModelStatus();\n\n const rows = models\n .map((m) => {\n const latency = m.latency_ms != null ? `${m.latency_ms}ms` : \"—\";\n const uptime =\n m.uptime_pct != null ? `${m.uptime_pct.toFixed(1)}%` : \"—\";\n const statusIcon =\n m.status === \"online\" ? \"✓\" : m.status === \"degraded\" ? \"⚠\" : \"✗\";\n return `${statusIcon} ${m.display_name} (${m.provider}) — ${m.status}, latency: ${latency}, uptime: ${uptime}`;\n })\n .join(\"\\n\");\n\n const online = models.filter((m) => m.status === \"online\").length;\n const total = models.length;\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Model Status — ${online}/${total} online (updated ${updated_at})\\n\\n${rows}`,\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const recommendModelsTool: Tool = {\n name: \"recommend_models\",\n description:\n \"Get the best model panel recommended by DebateTalk smart routing for a specific question. \" +\n \"Returns the ideal debaters, synthesizer, and adjudicator based on the question type. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question or topic you want to debate\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRecommendModels(\n client: DebateTalkClient,\n args: { question: string }\n) {\n const rec = await client.recommendModels(args.question);\n\n const debaterList = rec.debaters.join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Recommended panel for \"${args.question}\"`,\n `Question type: ${rec.question_type}`,\n ``,\n `Debaters: ${debaterList}`,\n `Synthesizer: ${rec.synthesizer}`,\n `Adjudicator: ${rec.adjudicator}`,\n ``,\n `To use this panel, run a debate with models: ${rec.debaters.join(\", \")}`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const estimateCostTool: Tool = {\n name: \"estimate_cost\",\n description:\n \"Estimate the credit cost of a debate before running it. \" +\n \"Returns total credits, USD cost, and a per-model breakdown. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question to estimate cost for\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific model IDs to use (omit for smart routing)\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleEstimateCost(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const estimate = await client.estimateCost(args);\n\n const breakdownRows = estimate.breakdown\n .map(\n (b) =>\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Cost estimate for \"${args.question}\"`,\n ``,\n `Total: ${estimate.estimated_credits} credits (~$${estimate.estimated_usd.toFixed(2)} USD)`,\n ``,\n `Breakdown:`,\n breakdownRows,\n ``,\n `Credits refill automatically on Pro plans. View balance at https://console.debatetalk.ai`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getHistoryTool: Tool = {\n name: \"get_history\",\n description:\n \"Retrieve your past DebateTalk debates. \" +\n \"Returns debate titles, dates, model counts, and share links. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Number of debates to return (default: 20, max: 100)\",\n },\n },\n },\n};\n\nexport async function handleGetHistory(\n client: DebateTalkClient,\n args: { limit?: number }\n) {\n const limit = args.limit ?? 20;\n const { debates, total } = await client.getHistory(limit);\n\n if (debates.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No debates found. Run your first debate at https://console.debatetalk.ai\",\n },\n ],\n };\n }\n\n const rows = debates.map((d) => {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const shareLink = d.share_token\n ? ` — https://console.debatetalk.ai/share/${d.share_token}`\n : \"\";\n return `• [${date}] ${d.title} (${d.model_count} models, ${d.status})${shareLink}`;\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Debate history — showing ${debates.length} of ${total}`,\n ``,\n ...rows,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/server.ts","../../src/mcp/tools/run_debate.ts","../../src/mcp/tools/get_model_status.ts","../../src/mcp/tools/recommend_models.ts","../../src/mcp/tools/estimate_cost.ts","../../src/mcp/tools/get_history.ts"],"sourcesContent":["// Server is the low-level class needed for JSON Schema tool definitions.\n// McpServer (the replacement) requires Zod schemas — not compatible with our Tool[] approach.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { DebateTalkClient } from \"../client.js\";\nimport { runDebateTool, handleRunDebate } from \"./tools/run_debate.js\";\nimport { getModelStatusTool, handleGetModelStatus } from \"./tools/get_model_status.js\";\nimport { recommendModelsTool, handleRecommendModels } from \"./tools/recommend_models.js\";\nimport { estimateCostTool, handleEstimateCost } from \"./tools/estimate_cost.js\";\nimport { getHistoryTool, handleGetHistory } from \"./tools/get_history.js\";\n\nexport const ALL_TOOLS = [\n runDebateTool,\n getModelStatusTool,\n recommendModelsTool,\n estimateCostTool,\n getHistoryTool,\n];\n\nfunction createServer(client: DebateTalkClient): Server {\n const server = new Server(\n { name: \"debatetalk\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: ALL_TOOLS,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args = {} } = request.params;\n\n switch (name) {\n case \"run_debate\":\n return handleRunDebate(client, args as Parameters<typeof handleRunDebate>[1]);\n case \"get_model_status\":\n return handleGetModelStatus(client);\n case \"recommend_models\":\n return handleRecommendModels(client, args as Parameters<typeof handleRecommendModels>[1]);\n case \"estimate_cost\":\n return handleEstimateCost(client, args as Parameters<typeof handleEstimateCost>[1]);\n case \"get_history\":\n return handleGetHistory(client, args as Parameters<typeof handleGetHistory>[1]);\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n });\n\n return server;\n}\n\nasync function main() {\n const client = new DebateTalkClient();\n const server = createServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// Only start the server when run directly, not when imported in tests.\n// fileURLToPath handles Windows drive letter differences vs process.argv[1].\nimport { fileURLToPath } from \"url\";\nif (fileURLToPath(import.meta.url) === process.argv[1]) {\n main().catch((err: unknown) => {\n process.stderr.write(\n `DebateTalk MCP server error: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n });\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const runDebateTool: Tool = {\n name: \"run_debate\",\n description:\n \"Run a structured multi-model AI debate on any question. Use this tool when the user asks to 'debate', 'use DebateTalk', 'use DT', 'multi-model', 'multi model', 'get a second opinion', 'stress-test' an idea, or wants multiple AI perspectives on a decision. \" +\n \"Also use it proactively for high-stakes decisions where a single AI answer is insufficient — architecture choices, hiring decisions, strategic bets, predictions, or anything with genuine uncertainty. \" +\n \"Multiple AI models argue independently in a blind round, deliberate, and converge on a 4-part synthesis: \" +\n \"Strong Ground (what all models agree on), Fault Lines (genuine disagreements), \" +\n \"Blind Spots (what all models missed), and Your Call (actionable recommendation). \" +\n \"Requires an API key (Pro or Enterprise plan). Free tier: 5 debates/day.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description:\n \"The question or topic to debate. Can be a decision, prediction, factual question, or open-ended topic.\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Specific model IDs to use as debaters (e.g. [\\\"claude-opus-4-6\\\", \\\"gpt-5.4\\\"]). \" +\n \"Omit to let DebateTalk smart routing pick the best panel automatically.\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2, max depends on plan)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRunDebate(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const result = await client.runDebate(args);\n\n if (!result.synthesis) {\n const id = result.debate_id ? `Debate ${result.debate_id}` : \"Debate\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: `${id} completed but synthesis was not produced. Check your plan limits at https://console.debatetalk.ai`,\n },\n ],\n };\n }\n\n const { strong_ground, fault_lines, blind_spots, your_call } =\n result.synthesis;\n\n const modelList =\n result.models.length > 0 ? result.models.join(\", \") : \"smart routing\";\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `DebateTalk — ${result.question_type} question`,\n `Question: \"${result.question}\"`,\n `Models: ${modelList}`,\n `Debate ID: ${result.debate_id}`,\n ``,\n `━━━ Strong Ground ━━━`,\n `What all models agreed on:`,\n strong_ground,\n ``,\n `━━━ Fault Lines ━━━`,\n `Where models genuinely disagreed:`,\n fault_lines,\n ``,\n `━━━ Blind Spots ━━━`,\n `What all models missed:`,\n blind_spots,\n ``,\n `━━━ Your Call ━━━`,\n your_call,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getModelStatusTool: Tool = {\n name: \"get_model_status\",\n description:\n \"Get real-time health, latency, and uptime for all DebateTalk models. \" +\n \"Use this before running a debate to check which models are currently online. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport async function handleGetModelStatus(client: DebateTalkClient) {\n const { models, updated_at } = await client.getModelStatus();\n\n const rows = models\n .map((m) => {\n const latency = m.latency_ms != null ? `${m.latency_ms}ms` : \"—\";\n const uptime =\n m.uptime_pct != null ? `${m.uptime_pct.toFixed(1)}%` : \"—\";\n const statusIcon =\n m.status === \"online\" ? \"✓\" : m.status === \"degraded\" ? \"⚠\" : \"✗\";\n return `${statusIcon} ${m.display_name} (${m.provider}) — ${m.status}, latency: ${latency}, uptime: ${uptime}`;\n })\n .join(\"\\n\");\n\n const online = models.filter((m) => m.status === \"online\").length;\n const total = models.length;\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Model Status — ${online}/${total} online (updated ${updated_at})\\n\\n${rows}`,\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const recommendModelsTool: Tool = {\n name: \"recommend_models\",\n description:\n \"Get the best model panel recommended by DebateTalk smart routing for a specific question. \" +\n \"Returns the ideal debaters, synthesizer, and adjudicator based on the question type. \" +\n \"No API key required.\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question or topic you want to debate\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleRecommendModels(\n client: DebateTalkClient,\n args: { question: string }\n) {\n const rec = await client.recommendModels(args.question);\n\n const debaterList = rec.debaters.join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Recommended panel for \"${args.question}\"`,\n `Question type: ${rec.question_type}`,\n ``,\n `Debaters: ${debaterList}`,\n `Synthesizer: ${rec.synthesizer}`,\n `Adjudicator: ${rec.adjudicator}`,\n ``,\n `To use this panel, run a debate with models: ${rec.debaters.join(\", \")}`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const estimateCostTool: Tool = {\n name: \"estimate_cost\",\n description:\n \"Estimate the credit cost of a debate before running it. \" +\n \"Returns total credits, USD cost, and a per-model breakdown. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question to estimate cost for\",\n },\n models: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific model IDs to use (omit for smart routing)\",\n },\n rounds: {\n type: \"number\",\n description: \"Number of deliberation rounds (default: 2)\",\n },\n },\n required: [\"question\"],\n },\n};\n\nexport async function handleEstimateCost(\n client: DebateTalkClient,\n args: { question: string; models?: string[]; rounds?: number }\n) {\n const estimate = await client.estimateCost(args);\n\n const breakdownRows = estimate.breakdown\n .map(\n (b) =>\n ` • ${b.model} (${b.role}): ~${b.estimated_tokens.toLocaleString()} tokens = ${b.estimated_credits} credits`\n )\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Cost estimate for \"${args.question}\"`,\n ``,\n `Total: ${estimate.estimated_credits} credits (~$${estimate.estimated_usd.toFixed(2)} USD)`,\n ``,\n `Breakdown:`,\n breakdownRows,\n ``,\n `Credits refill automatically on Pro plans. View balance at https://console.debatetalk.ai`,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { DebateTalkClient } from \"../../client.js\";\n\nexport const getHistoryTool: Tool = {\n name: \"get_history\",\n description:\n \"Retrieve your past DebateTalk debates. \" +\n \"Returns debate titles, dates, model counts, and share links. \" +\n \"Requires an API key (Pro or Enterprise plan).\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Number of debates to return (default: 20, max: 100)\",\n },\n },\n },\n};\n\nexport async function handleGetHistory(\n client: DebateTalkClient,\n args: { limit?: number }\n) {\n const raw = args.limit ?? 20;\n const limit = Number.isFinite(raw) ? Math.min(Math.max(1, raw), 100) : 20;\n const { debates, total } = await client.getHistory(limit);\n\n if (debates.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No debates found. Run your first debate at https://console.debatetalk.ai\",\n },\n ],\n };\n }\n\n const rows = debates.map((d) => {\n const date = new Date(d.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n const shareLink = d.share_token\n ? ` — https://console.debatetalk.ai/share/${d.share_token}`\n : \"\";\n return `• [${date}] ${d.title} (${d.model_count} models, ${d.status})${shareLink}`;\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: [\n `Debate history — showing ${debates.length} of ${total}`,\n ``,\n ...rows,\n ].join(\"\\n\"),\n },\n ],\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@debatetalk/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Official MCP server and CLI for DebateTalk — run structured multi-model AI debates from your AI assistant or terminal.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
"files": [
|
|
28
28
|
"dist",
|
|
29
29
|
"README.md",
|
|
30
|
-
"LICENSE"
|
|
30
|
+
"LICENSE",
|
|
31
|
+
".mcp.json",
|
|
32
|
+
".claude-plugin"
|
|
31
33
|
],
|
|
32
34
|
"scripts": {
|
|
33
35
|
"build": "tsup",
|