@statechange/council 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +207 -0
- package/council/creative/ABOUT.md +23 -0
- package/council/critic/ABOUT.md +23 -0
- package/council/strategist/ABOUT.md +21 -0
- package/dist/backends/anthropic.d.ts +2 -0
- package/dist/backends/anthropic.js +57 -0
- package/dist/backends/anthropic.js.map +1 -0
- package/dist/backends/google.d.ts +2 -0
- package/dist/backends/google.js +68 -0
- package/dist/backends/google.js.map +1 -0
- package/dist/backends/index.d.ts +3 -0
- package/dist/backends/index.js +47 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/ollama.d.ts +2 -0
- package/dist/backends/ollama.js +68 -0
- package/dist/backends/ollama.js.map +1 -0
- package/dist/backends/openai.d.ts +2 -0
- package/dist/backends/openai.js +62 -0
- package/dist/backends/openai.js.map +1 -0
- package/dist/backends/types.d.ts +1 -0
- package/dist/backends/types.js +2 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +152 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.js +118 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/counsellor.d.ts +7 -0
- package/dist/commands/counsellor.js +98 -0
- package/dist/commands/counsellor.js.map +1 -0
- package/dist/commands/discuss.d.ts +12 -0
- package/dist/commands/discuss.js +154 -0
- package/dist/commands/discuss.js.map +1 -0
- package/dist/commands/history.d.ts +5 -0
- package/dist/commands/history.js +46 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.js +40 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/core/conversation-engine.d.ts +13 -0
- package/dist/core/conversation-engine.js +226 -0
- package/dist/core/conversation-engine.js.map +1 -0
- package/dist/core/counsellor-loader.d.ts +4 -0
- package/dist/core/counsellor-loader.js +97 -0
- package/dist/core/counsellor-loader.js.map +1 -0
- package/dist/core/counsellor-registry.d.ts +12 -0
- package/dist/core/counsellor-registry.js +131 -0
- package/dist/core/counsellor-registry.js.map +1 -0
- package/dist/core/excalidraw-cheatsheet.d.ts +5 -0
- package/dist/core/excalidraw-cheatsheet.js +65 -0
- package/dist/core/excalidraw-cheatsheet.js.map +1 -0
- package/dist/core/history.d.ts +16 -0
- package/dist/core/history.js +74 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/infographic.d.ts +4 -0
- package/dist/core/infographic.js +81 -0
- package/dist/core/infographic.js.map +1 -0
- package/dist/core/key-scanner.d.ts +8 -0
- package/dist/core/key-scanner.js +79 -0
- package/dist/core/key-scanner.js.map +1 -0
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +38 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/output-formatter.d.ts +2 -0
- package/dist/core/output-formatter.js +47 -0
- package/dist/core/output-formatter.js.map +1 -0
- package/dist/core/secretary.d.ts +23 -0
- package/dist/core/secretary.js +171 -0
- package/dist/core/secretary.js.map +1 -0
- package/dist/core/skill-loader.d.ts +2 -0
- package/dist/core/skill-loader.js +32 -0
- package/dist/core/skill-loader.js.map +1 -0
- package/dist/electron/ipc-handlers.d.ts +3 -0
- package/dist/electron/ipc-handlers.js +477 -0
- package/dist/electron/ipc-handlers.js.map +1 -0
- package/dist/electron/main.d.ts +1 -0
- package/dist/electron/main.js +85 -0
- package/dist/electron/main.js.map +1 -0
- package/dist/electron/preload.d.ts +1 -0
- package/dist/electron/preload.js +38 -0
- package/dist/electron/preload.js.map +1 -0
- package/dist/types.d.ts +184 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist-electron/main.js +1635 -0
- package/package.json +87 -0
- package/skills/council-manage/SKILL.md +214 -0
- package/skills/council-setup-keys/SKILL.md +127 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { getBackend } from "../backends/index.js";
|
|
2
|
+
import { getExcalidrawCheatsheet } from "./excalidraw-cheatsheet.js";
|
|
3
|
+
const EXCALIDRAW_DELIMITER = "---EXCALIDRAW---";
|
|
4
|
+
const DEFAULT_SYSTEM_PROMPT = `You are the Secretary of a council discussion. Your job is to synthesize a clear, structured summary of the conversation that just took place.
|
|
5
|
+
|
|
6
|
+
Structure your summary with these sections:
|
|
7
|
+
|
|
8
|
+
## Individual Positions
|
|
9
|
+
Briefly summarize each counsellor's key arguments and stance.
|
|
10
|
+
|
|
11
|
+
## Points of Convergence
|
|
12
|
+
Where did the counsellors agree? What common ground emerged?
|
|
13
|
+
|
|
14
|
+
## Points of Divergence
|
|
15
|
+
Where did they disagree? What are the key tensions?
|
|
16
|
+
|
|
17
|
+
## Synthesis
|
|
18
|
+
What are the most important takeaways? What would you recommend based on the full discussion?
|
|
19
|
+
|
|
20
|
+
Be concise but thorough. Use markdown formatting.`;
|
|
21
|
+
function buildTranscript(result) {
|
|
22
|
+
const lines = [];
|
|
23
|
+
lines.push(`Topic: ${result.topic}`);
|
|
24
|
+
lines.push(`Counsellors: ${result.counsellors.map(c => c.name).join(", ")}`);
|
|
25
|
+
lines.push(`Rounds: ${result.rounds}`);
|
|
26
|
+
lines.push("");
|
|
27
|
+
let currentRound = 0;
|
|
28
|
+
for (const turn of result.turns) {
|
|
29
|
+
if (turn.round !== currentRound) {
|
|
30
|
+
currentRound = turn.round;
|
|
31
|
+
lines.push(`--- Round ${currentRound} ---`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
}
|
|
34
|
+
lines.push(`[${turn.counsellorName}]:`);
|
|
35
|
+
lines.push(turn.content);
|
|
36
|
+
lines.push("");
|
|
37
|
+
}
|
|
38
|
+
return lines.join("\n");
|
|
39
|
+
}
|
|
40
|
+
export async function runSecretary({ result, config, onChunk, signal, }) {
|
|
41
|
+
const secretaryConfig = config.secretary;
|
|
42
|
+
if (!secretaryConfig?.backend) {
|
|
43
|
+
throw new Error("No secretary backend configured");
|
|
44
|
+
}
|
|
45
|
+
const backend = await getBackend(secretaryConfig.backend);
|
|
46
|
+
const model = secretaryConfig.model ?? backend.defaultModel;
|
|
47
|
+
const basePrompt = secretaryConfig.systemPrompt || DEFAULT_SYSTEM_PROMPT;
|
|
48
|
+
const cheatsheet = getExcalidrawCheatsheet();
|
|
49
|
+
const systemPrompt = `${basePrompt}
|
|
50
|
+
|
|
51
|
+
${cheatsheet}
|
|
52
|
+
|
|
53
|
+
After your text summary, output \`${EXCALIDRAW_DELIMITER}\` on its own line, then a JSON array of Excalidraw elements showing a visual map of where each counsellor stands on the topic. Use shapes for each counsellor with their name, arrows to show relationships (agreement/disagreement), and position them to visually represent the discussion dynamics.`;
|
|
54
|
+
const transcript = buildTranscript(result);
|
|
55
|
+
const chatRequest = {
|
|
56
|
+
model,
|
|
57
|
+
systemPrompt,
|
|
58
|
+
messages: [{ role: "user", content: `Please summarize this council discussion and create a position diagram:\n\n${transcript}` }],
|
|
59
|
+
temperature: 0.5,
|
|
60
|
+
};
|
|
61
|
+
let fullResponse = "";
|
|
62
|
+
if (backend.chatStream) {
|
|
63
|
+
for await (const chunk of backend.chatStream(chatRequest)) {
|
|
64
|
+
if (signal?.aborted)
|
|
65
|
+
break;
|
|
66
|
+
fullResponse += chunk.delta;
|
|
67
|
+
if (chunk.delta && onChunk) {
|
|
68
|
+
onChunk(chunk.delta);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const response = await backend.chat(chatRequest);
|
|
74
|
+
fullResponse = response.content;
|
|
75
|
+
if (onChunk)
|
|
76
|
+
onChunk(fullResponse);
|
|
77
|
+
}
|
|
78
|
+
// Parse response: split on delimiter
|
|
79
|
+
const delimiterIndex = fullResponse.indexOf(EXCALIDRAW_DELIMITER);
|
|
80
|
+
if (delimiterIndex === -1) {
|
|
81
|
+
return { text: fullResponse.trim() };
|
|
82
|
+
}
|
|
83
|
+
const text = fullResponse.slice(0, delimiterIndex).trim();
|
|
84
|
+
const diagramRaw = fullResponse.slice(delimiterIndex + EXCALIDRAW_DELIMITER.length).trim();
|
|
85
|
+
// Try to extract JSON array from the diagram portion
|
|
86
|
+
let diagram;
|
|
87
|
+
try {
|
|
88
|
+
// Find the JSON array in the response (it might be wrapped in markdown code blocks)
|
|
89
|
+
const jsonMatch = diagramRaw.match(/\[[\s\S]*\]/);
|
|
90
|
+
if (jsonMatch) {
|
|
91
|
+
diagram = JSON.parse(jsonMatch[0]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Non-fatal: diagram parsing failed, just return the text
|
|
96
|
+
}
|
|
97
|
+
return { text, diagram };
|
|
98
|
+
}
|
|
99
|
+
const INTERIM_SYSTEM_PROMPT = `You are the Secretary of a council debate. Briefly summarize this round of discussion. Note emerging agreements, disagreements, and shifts in position. 2-3 paragraphs max. Use markdown formatting.`;
|
|
100
|
+
export async function runInterimSummary({ result, roundNumber, config, onChunk, signal, }) {
|
|
101
|
+
const secretaryConfig = config.secretary;
|
|
102
|
+
if (!secretaryConfig?.backend) {
|
|
103
|
+
throw new Error("No secretary backend configured");
|
|
104
|
+
}
|
|
105
|
+
const backend = await getBackend(secretaryConfig.backend);
|
|
106
|
+
const model = secretaryConfig.model ?? backend.defaultModel;
|
|
107
|
+
// Build transcript of only this round's turns
|
|
108
|
+
const roundTurns = result.turns.filter((t) => t.round === roundNumber);
|
|
109
|
+
const lines = [];
|
|
110
|
+
lines.push(`Topic: ${result.topic}`);
|
|
111
|
+
lines.push(`Round ${roundNumber}${roundNumber === 1 ? " (Constructive)" : " (Rebuttal)"}`);
|
|
112
|
+
lines.push("");
|
|
113
|
+
for (const turn of roundTurns) {
|
|
114
|
+
lines.push(`[${turn.counsellorName}]:`);
|
|
115
|
+
lines.push(turn.content);
|
|
116
|
+
lines.push("");
|
|
117
|
+
}
|
|
118
|
+
const chatRequest = {
|
|
119
|
+
model,
|
|
120
|
+
systemPrompt: INTERIM_SYSTEM_PROMPT,
|
|
121
|
+
messages: [{ role: "user", content: `Please summarize this round:\n\n${lines.join("\n")}` }],
|
|
122
|
+
temperature: 0.5,
|
|
123
|
+
};
|
|
124
|
+
let fullResponse = "";
|
|
125
|
+
if (backend.chatStream) {
|
|
126
|
+
for await (const chunk of backend.chatStream(chatRequest)) {
|
|
127
|
+
if (signal?.aborted)
|
|
128
|
+
break;
|
|
129
|
+
fullResponse += chunk.delta;
|
|
130
|
+
if (chunk.delta && onChunk) {
|
|
131
|
+
onChunk(chunk.delta);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const response = await backend.chat(chatRequest);
|
|
137
|
+
fullResponse = response.content;
|
|
138
|
+
if (onChunk)
|
|
139
|
+
onChunk(fullResponse);
|
|
140
|
+
}
|
|
141
|
+
return fullResponse.trim();
|
|
142
|
+
}
|
|
143
|
+
export async function generateTitle({ topic, firstRoundTurns, config, }) {
|
|
144
|
+
const secretaryConfig = config.secretary;
|
|
145
|
+
if (!secretaryConfig?.backend) {
|
|
146
|
+
throw new Error("No secretary backend configured");
|
|
147
|
+
}
|
|
148
|
+
const backend = await getBackend(secretaryConfig.backend);
|
|
149
|
+
const model = secretaryConfig.model ?? backend.defaultModel;
|
|
150
|
+
const turnsSummary = firstRoundTurns
|
|
151
|
+
.map((t) => `[${t.counsellorName}]: ${t.content.slice(0, 300)}`)
|
|
152
|
+
.join("\n\n");
|
|
153
|
+
const response = await backend.chat({
|
|
154
|
+
model,
|
|
155
|
+
systemPrompt: "Generate a concise title (max 8 words) for this council discussion. Return only the title, no quotes or punctuation at the end.",
|
|
156
|
+
messages: [
|
|
157
|
+
{
|
|
158
|
+
role: "user",
|
|
159
|
+
content: `Topic: ${topic}\n\nFirst round:\n${turnsSummary}`,
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
temperature: 0.3,
|
|
163
|
+
});
|
|
164
|
+
// Strip quotes and trailing punctuation
|
|
165
|
+
return response.content
|
|
166
|
+
.trim()
|
|
167
|
+
.replace(/^["']+|["']+$/g, "")
|
|
168
|
+
.replace(/[.!?]+$/, "")
|
|
169
|
+
.trim();
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=secretary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretary.js","sourceRoot":"","sources":["../../src/core/secretary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import matter from "gray-matter";
|
|
6
|
+
const searchPaths = (counsellorDir, skillName) => [
|
|
7
|
+
join(counsellorDir, "skills", skillName, "SKILL.md"),
|
|
8
|
+
join(process.cwd(), ".claude", "skills", skillName, "SKILL.md"),
|
|
9
|
+
join(homedir(), ".agents", "skills", skillName, "SKILL.md"),
|
|
10
|
+
join(homedir(), ".claude", "skills", skillName, "SKILL.md"),
|
|
11
|
+
];
|
|
12
|
+
export async function resolveSkill(skillName, counsellorDir) {
|
|
13
|
+
for (const candidate of searchPaths(counsellorDir, skillName)) {
|
|
14
|
+
if (existsSync(candidate)) {
|
|
15
|
+
const raw = await readFile(candidate, "utf-8");
|
|
16
|
+
const { content } = matter(raw);
|
|
17
|
+
return content.trim();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
export async function resolveSkills(skillNames, counsellorDir) {
|
|
23
|
+
const sections = [];
|
|
24
|
+
for (const name of skillNames) {
|
|
25
|
+
const content = await resolveSkill(name, counsellorDir);
|
|
26
|
+
if (content) {
|
|
27
|
+
sections.push(`## Skill: ${name}\n\n${content}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return sections.join("\n\n");
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=skill-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/core/skill-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,WAAW,GAAG,CAAC,aAAqB,EAAE,SAAiB,EAAY,EAAE,CAAC;IAC1E,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;IACpD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;IAC3D,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;CAC5D,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,aAAqB;IAErB,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;QAC9D,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAoB,EACpB,aAAqB;IAErB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|