claude-soul-server 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/dist/engine/context-assembler.d.ts +3 -0
- package/dist/engine/context-assembler.js +161 -0
- package/dist/engine/context-assembler.js.map +1 -0
- package/dist/engine/exemplar-selector.d.ts +6 -0
- package/dist/engine/exemplar-selector.js +21 -0
- package/dist/engine/exemplar-selector.js.map +1 -0
- package/dist/engine/framework-engine.d.ts +61 -0
- package/dist/engine/framework-engine.js +351 -0
- package/dist/engine/framework-engine.js.map +1 -0
- package/dist/engine/framework-renderer.d.ts +17 -0
- package/dist/engine/framework-renderer.js +161 -0
- package/dist/engine/framework-renderer.js.map +1 -0
- package/dist/engine/framework-seeds.d.ts +2 -0
- package/dist/engine/framework-seeds.js +265 -0
- package/dist/engine/framework-seeds.js.map +1 -0
- package/dist/engine/lesson-store.d.ts +8 -0
- package/dist/engine/lesson-store.js +40 -0
- package/dist/engine/lesson-store.js.map +1 -0
- package/dist/engine/meta-optimizer.d.ts +37 -0
- package/dist/engine/meta-optimizer.js +140 -0
- package/dist/engine/meta-optimizer.js.map +1 -0
- package/dist/engine/prompt-builder.d.ts +31 -0
- package/dist/engine/prompt-builder.js +385 -0
- package/dist/engine/prompt-builder.js.map +1 -0
- package/dist/engine/reflection-runner.d.ts +18 -0
- package/dist/engine/reflection-runner.js +313 -0
- package/dist/engine/reflection-runner.js.map +1 -0
- package/dist/engine/shadow-transform.d.ts +1 -0
- package/dist/engine/shadow-transform.js +41 -0
- package/dist/engine/shadow-transform.js.map +1 -0
- package/dist/engine/signal-extractor.d.ts +14 -0
- package/dist/engine/signal-extractor.js +204 -0
- package/dist/engine/signal-extractor.js.map +1 -0
- package/dist/engine/signal-store.d.ts +5 -0
- package/dist/engine/signal-store.js +56 -0
- package/dist/engine/signal-store.js.map +1 -0
- package/dist/engine/snapshot-manager.d.ts +3 -0
- package/dist/engine/snapshot-manager.js +52 -0
- package/dist/engine/snapshot-manager.js.map +1 -0
- package/dist/engine/state-engine.d.ts +34 -0
- package/dist/engine/state-engine.js +127 -0
- package/dist/engine/state-engine.js.map +1 -0
- package/dist/engine/tension-detector.d.ts +10 -0
- package/dist/engine/tension-detector.js +77 -0
- package/dist/engine/tension-detector.js.map +1 -0
- package/dist/engine/token-budget.d.ts +12 -0
- package/dist/engine/token-budget.js +44 -0
- package/dist/engine/token-budget.js.map +1 -0
- package/dist/hooks/on-stop.d.ts +11 -0
- package/dist/hooks/on-stop.js +153 -0
- package/dist/hooks/on-stop.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/soul-activate.d.ts +1 -0
- package/dist/tools/soul-activate.js +149 -0
- package/dist/tools/soul-activate.js.map +1 -0
- package/dist/tools/soul-context.d.ts +1 -0
- package/dist/tools/soul-context.js +31 -0
- package/dist/tools/soul-context.js.map +1 -0
- package/dist/tools/soul-evaluate.d.ts +8 -0
- package/dist/tools/soul-evaluate.js +97 -0
- package/dist/tools/soul-evaluate.js.map +1 -0
- package/dist/tools/soul-framework.d.ts +1 -0
- package/dist/tools/soul-framework.js +66 -0
- package/dist/tools/soul-framework.js.map +1 -0
- package/dist/tools/soul-read.d.ts +1 -0
- package/dist/tools/soul-read.js +24 -0
- package/dist/tools/soul-read.js.map +1 -0
- package/dist/tools/soul-reflect.d.ts +1 -0
- package/dist/tools/soul-reflect.js +82 -0
- package/dist/tools/soul-reflect.js.map +1 -0
- package/dist/tools/soul-signal.d.ts +8 -0
- package/dist/tools/soul-signal.js +119 -0
- package/dist/tools/soul-signal.js.map +1 -0
- package/dist/tools/soul-status.d.ts +1 -0
- package/dist/tools/soul-status.js +130 -0
- package/dist/tools/soul-status.js.map +1 -0
- package/dist/tools/soul-write.d.ts +1 -0
- package/dist/tools/soul-write.js +26 -0
- package/dist/tools/soul-write.js.map +1 -0
- package/dist/types/config-types.d.ts +45 -0
- package/dist/types/config-types.js +21 -0
- package/dist/types/config-types.js.map +1 -0
- package/dist/types/learning-types.d.ts +166 -0
- package/dist/types/learning-types.js +2 -0
- package/dist/types/learning-types.js.map +1 -0
- package/dist/util/files.d.ts +20 -0
- package/dist/util/files.js +54 -0
- package/dist/util/files.js.map +1 -0
- package/dist/util/llm.d.ts +6 -0
- package/dist/util/llm.js +76 -0
- package/dist/util/llm.js.map +1 -0
- package/dist/util/tokens.d.ts +1 -0
- package/dist/util/tokens.js +4 -0
- package/dist/util/tokens.js.map +1 -0
- package/package.json +44 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { handleSoulContext } from "./tools/soul-context.js";
|
|
6
|
+
import { handleSoulSignal } from "./tools/soul-signal.js";
|
|
7
|
+
import { handleSoulRead } from "./tools/soul-read.js";
|
|
8
|
+
import { handleSoulWrite } from "./tools/soul-write.js";
|
|
9
|
+
import { handleSoulStatus } from "./tools/soul-status.js";
|
|
10
|
+
import { handleSoulReflect } from "./tools/soul-reflect.js";
|
|
11
|
+
import { handleSoulEvaluate } from "./tools/soul-evaluate.js";
|
|
12
|
+
import { handleSoulActivate } from "./tools/soul-activate.js";
|
|
13
|
+
import { handleSoulFramework } from "./tools/soul-framework.js";
|
|
14
|
+
const server = new McpServer({
|
|
15
|
+
name: "claude-soul",
|
|
16
|
+
version: "0.1.0",
|
|
17
|
+
});
|
|
18
|
+
server.tool("soul_context", "Load your soul context — identity, frameworks, signals, lessons, and state. Call this at the start of every conversation. Default is 'full' (~4500 tokens). Use 'slim' for identity only.", {
|
|
19
|
+
mode: z.enum(["slim", "full"]).optional()
|
|
20
|
+
.describe("Context mode: 'full' (default) = identity + frameworks + signals + lessons + state. 'slim' = identity only."),
|
|
21
|
+
}, async ({ mode }) => {
|
|
22
|
+
try {
|
|
23
|
+
const context = await handleSoulContext(mode ?? "full");
|
|
24
|
+
return { content: [{ type: "text", text: context }] };
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: "text", text: `Error loading soul context: ${err}` }],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
server.tool("soul_activate", "Select and load relevant frameworks for this conversation. Call after reading the user's first message to pick the most applicable frameworks.", {
|
|
34
|
+
message: z.string().describe("The user's first message or a summary of the conversation topic"),
|
|
35
|
+
}, async ({ message }) => {
|
|
36
|
+
try {
|
|
37
|
+
const result = await handleSoulActivate(message);
|
|
38
|
+
return { content: [{ type: "text", text: result }] };
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: "text", text: `Error activating frameworks: ${err}` }],
|
|
43
|
+
isError: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
server.tool("soul_framework", "Load a single framework with full details: description, evidence history, tier, and relationships.", {
|
|
48
|
+
name: z.string().describe("Framework name (case-insensitive, partial match) or ID"),
|
|
49
|
+
}, async ({ name }) => {
|
|
50
|
+
try {
|
|
51
|
+
const result = await handleSoulFramework(name);
|
|
52
|
+
return { content: [{ type: "text", text: result }] };
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return {
|
|
56
|
+
content: [{ type: "text", text: `Error loading framework: ${err}` }],
|
|
57
|
+
isError: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
server.tool("soul_signal", "Record observed signals from this interaction. Use when you notice patterns the automatic extractor might miss.", {
|
|
62
|
+
signals: z
|
|
63
|
+
.array(z.object({
|
|
64
|
+
type: z.enum([
|
|
65
|
+
"correction",
|
|
66
|
+
"rephrasing",
|
|
67
|
+
"gratitude",
|
|
68
|
+
"disengagement",
|
|
69
|
+
"topic_shift",
|
|
70
|
+
"depth_change",
|
|
71
|
+
"success",
|
|
72
|
+
"confusion",
|
|
73
|
+
]),
|
|
74
|
+
evidence: z.string().describe("What you observed"),
|
|
75
|
+
confidence: z.number().min(0).max(1).optional(),
|
|
76
|
+
}))
|
|
77
|
+
.describe("Array of observed signals"),
|
|
78
|
+
}, async ({ signals }) => {
|
|
79
|
+
try {
|
|
80
|
+
const result = await handleSoulSignal(signals);
|
|
81
|
+
return { content: [{ type: "text", text: result }] };
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: "text", text: `Error recording signals: ${err}` }],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
server.tool("soul_read", "Read a soul file. Available: SOUL.md, SHADOW.md, STATE.md, STORY.md, CORRECTIONS.md, FRAMEWORKS.md, BONDS.md, MORTAL.md, GROWTH.md, PRINCIPLES.md, EDGES.md", {
|
|
91
|
+
file: z.string().describe("Soul file name (e.g., SOUL.md)"),
|
|
92
|
+
}, async ({ file }) => {
|
|
93
|
+
try {
|
|
94
|
+
const content = await handleSoulRead(file);
|
|
95
|
+
return { content: [{ type: "text", text: content }] };
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: "text", text: `Error reading soul file: ${err}` }],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
server.tool("soul_write", "Write to a soul file. SOUL.md, SHADOW.md, STORY.md, CORRECTIONS.md, BONDS.md, MORTAL.md, GROWTH.md, PRINCIPLES.md, EDGES.md are writable. STATE.md and FRAMEWORKS.md are auto-managed.", {
|
|
105
|
+
file: z.string().describe("Soul file name (e.g., SOUL.md)"),
|
|
106
|
+
content: z.string().describe("New content for the file"),
|
|
107
|
+
}, async ({ file, content }) => {
|
|
108
|
+
try {
|
|
109
|
+
const result = await handleSoulWrite(file, content);
|
|
110
|
+
return { content: [{ type: "text", text: result }] };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{ type: "text", text: `Error writing soul file: ${err}` }],
|
|
115
|
+
isError: true,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
server.tool("soul_status", "Get current system status — framework count, learning phase, signal count, last reflection time.", {}, async () => {
|
|
120
|
+
try {
|
|
121
|
+
const status = await handleSoulStatus();
|
|
122
|
+
return { content: [{ type: "text", text: status }] };
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
return {
|
|
126
|
+
content: [{ type: "text", text: `Error getting status: ${err}` }],
|
|
127
|
+
isError: true,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
server.tool("soul_reflect", "Trigger a reflection cycle. Quick: tests frameworks against recent signals. Deep: full analysis with framework discovery. Meta: audits framework coherence and redundancy.", {
|
|
132
|
+
tier: z
|
|
133
|
+
.enum(["quick", "deep", "meta"])
|
|
134
|
+
.describe("Reflection tier: quick (fast, signal testing), deep (thorough, discovers new frameworks), meta (audits the system itself)"),
|
|
135
|
+
}, async ({ tier }) => {
|
|
136
|
+
try {
|
|
137
|
+
const result = await handleSoulReflect(tier);
|
|
138
|
+
return { content: [{ type: "text", text: result }] };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return {
|
|
142
|
+
content: [{ type: "text", text: `Error during reflection: ${err}` }],
|
|
143
|
+
isError: true,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
server.tool("soul_self_evaluate", "Record a self-evaluation of a complex response. Be descriptive: 'Response used 450 words for a simple question' not 'bad response'.", {
|
|
148
|
+
summary: z
|
|
149
|
+
.string()
|
|
150
|
+
.describe("Brief descriptive summary of the response and its dynamics"),
|
|
151
|
+
}, async ({ summary }) => {
|
|
152
|
+
try {
|
|
153
|
+
const result = await handleSoulEvaluate(summary);
|
|
154
|
+
return { content: [{ type: "text", text: result }] };
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
return {
|
|
158
|
+
content: [{ type: "text", text: `Error during self-evaluation: ${err}` }],
|
|
159
|
+
isError: true,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
async function main() {
|
|
164
|
+
const transport = new StdioServerTransport();
|
|
165
|
+
await server.connect(transport);
|
|
166
|
+
}
|
|
167
|
+
main().catch((err) => {
|
|
168
|
+
console.error("Claude Soul MCP server failed to start:", err);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleSoulActivate(firstMessage: string): Promise<string>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { FrameworkEngine } from "../engine/framework-engine.js";
|
|
2
|
+
import { callClaude, parseLlmJson } from "../util/llm.js";
|
|
3
|
+
import { loadConfig } from "../util/files.js";
|
|
4
|
+
/**
|
|
5
|
+
* Build the activation prompt — asks an LLM to select relevant frameworks for this conversation.
|
|
6
|
+
*/
|
|
7
|
+
function buildActivationPrompt(frameworks, userMessage) {
|
|
8
|
+
const eligible = frameworks
|
|
9
|
+
.filter((f) => f.status === "active" || f.status === "questioning")
|
|
10
|
+
.sort((a, b) => b.confidence - a.confidence);
|
|
11
|
+
const models = eligible.filter((f) => f.kind !== "process");
|
|
12
|
+
const processes = eligible.filter((f) => f.kind === "process");
|
|
13
|
+
const modelIndex = models
|
|
14
|
+
.map((f) => {
|
|
15
|
+
const tier = f.evidenceTier ?? "hypothesis";
|
|
16
|
+
return `- ${f.id}: ${f.name} [${tier}] (${f.status}) — ${f.description.slice(0, 150)}`;
|
|
17
|
+
})
|
|
18
|
+
.join("\n");
|
|
19
|
+
const processIndex = processes
|
|
20
|
+
.map((f) => {
|
|
21
|
+
const tier = f.evidenceTier ?? "hypothesis";
|
|
22
|
+
const triggers = (f.triggers ?? []).slice(0, 3).join("; ");
|
|
23
|
+
return `- ${f.id}: ${f.name} [${tier}] (${f.status}) — Triggers: ${triggers}`;
|
|
24
|
+
})
|
|
25
|
+
.join("\n");
|
|
26
|
+
return [
|
|
27
|
+
"You are selecting thinking frameworks for an upcoming conversation.",
|
|
28
|
+
"",
|
|
29
|
+
"## Available Mental Models (thinking vocabulary)",
|
|
30
|
+
"",
|
|
31
|
+
modelIndex || " (none)",
|
|
32
|
+
"",
|
|
33
|
+
"## Available Cognitive Processes (actionable checklists)",
|
|
34
|
+
"",
|
|
35
|
+
processIndex || " (none)",
|
|
36
|
+
"",
|
|
37
|
+
"## User's First Message",
|
|
38
|
+
"",
|
|
39
|
+
userMessage,
|
|
40
|
+
"",
|
|
41
|
+
"## Task",
|
|
42
|
+
"",
|
|
43
|
+
"Select 5-8 mental models most relevant as thinking vocabulary for this conversation.",
|
|
44
|
+
"Also select 0-2 cognitive processes whose triggers match the conversation type.",
|
|
45
|
+
"Only select processes when their triggers clearly apply — do not over-activate.",
|
|
46
|
+
"",
|
|
47
|
+
"Consider: the topic, type of task (building, debugging, explaining, reviewing, discussing),",
|
|
48
|
+
"and which named concepts are most likely to be useful.",
|
|
49
|
+
"",
|
|
50
|
+
"Also classify the conversation type for future context-tagging.",
|
|
51
|
+
"",
|
|
52
|
+
"## JSON Output",
|
|
53
|
+
"",
|
|
54
|
+
"Respond with ONLY a valid JSON object:",
|
|
55
|
+
"",
|
|
56
|
+
"```json",
|
|
57
|
+
JSON.stringify({
|
|
58
|
+
conversationType: "building|debugging|explaining|reviewing|meta|general",
|
|
59
|
+
selectedIds: ["framework-id-1", "framework-id-2"],
|
|
60
|
+
selectedProcessIds: ["process-id-1"],
|
|
61
|
+
reasoning: "brief explanation",
|
|
62
|
+
}, null, 2),
|
|
63
|
+
"```",
|
|
64
|
+
].join("\n");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Render selected frameworks as a concept vocabulary for this conversation.
|
|
68
|
+
*/
|
|
69
|
+
function renderSelectedFrameworks(frameworks, conversationType) {
|
|
70
|
+
const models = frameworks.filter((f) => f.kind !== "process");
|
|
71
|
+
const processes = frameworks.filter((f) => f.kind === "process");
|
|
72
|
+
const lines = [];
|
|
73
|
+
lines.push(`## Activated Frameworks (${conversationType})`);
|
|
74
|
+
lines.push("");
|
|
75
|
+
lines.push("Named concepts selected for this conversation. Apply as thinking vocabulary when relevant:");
|
|
76
|
+
lines.push("");
|
|
77
|
+
for (const fw of models) {
|
|
78
|
+
const tier = fw.evidenceTier ?? "hypothesis";
|
|
79
|
+
lines.push(`### ${fw.name} [${tier}]`);
|
|
80
|
+
lines.push(fw.description);
|
|
81
|
+
lines.push("");
|
|
82
|
+
}
|
|
83
|
+
if (processes.length > 0) {
|
|
84
|
+
lines.push("## Active Cognitive Processes");
|
|
85
|
+
lines.push("");
|
|
86
|
+
lines.push("Procedures to follow when triggered. These are active checklists, not optional vocabulary.");
|
|
87
|
+
lines.push("");
|
|
88
|
+
for (const p of processes) {
|
|
89
|
+
const tier = p.evidenceTier ?? "hypothesis";
|
|
90
|
+
lines.push(`### ${p.name} [${tier}]`);
|
|
91
|
+
lines.push(p.description);
|
|
92
|
+
if (p.triggers && p.triggers.length > 0) {
|
|
93
|
+
lines.push(`**Triggers**: ${p.triggers.join(" | ")}`);
|
|
94
|
+
}
|
|
95
|
+
if (p.steps && p.steps.length > 0) {
|
|
96
|
+
for (const [i, step] of p.steps.entries()) {
|
|
97
|
+
lines.push(`${i + 1}. ${step}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
lines.push("");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return lines.join("\n");
|
|
104
|
+
}
|
|
105
|
+
export async function handleSoulActivate(firstMessage) {
|
|
106
|
+
const config = await loadConfig();
|
|
107
|
+
const engine = new FrameworkEngine();
|
|
108
|
+
const store = await engine.initialize();
|
|
109
|
+
const eligible = store.frameworks.filter((f) => f.status === "active" || f.status === "questioning");
|
|
110
|
+
// If few enough frameworks, skip the LLM call and return all
|
|
111
|
+
if (eligible.length <= 8) {
|
|
112
|
+
return renderSelectedFrameworks(eligible, "general");
|
|
113
|
+
}
|
|
114
|
+
const prompt = buildActivationPrompt(store.frameworks, firstMessage);
|
|
115
|
+
let responseText;
|
|
116
|
+
try {
|
|
117
|
+
responseText = await callClaude(prompt, config.reflection.quickModel);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
// Fallback: return top 8 by confidence if LLM call fails
|
|
121
|
+
const fallback = eligible
|
|
122
|
+
.sort((a, b) => b.confidence - a.confidence)
|
|
123
|
+
.slice(0, 8);
|
|
124
|
+
return renderSelectedFrameworks(fallback, "general") +
|
|
125
|
+
"\n\n*(Activation used confidence-based fallback — LLM selection unavailable)*";
|
|
126
|
+
}
|
|
127
|
+
const parsed = parseLlmJson(responseText);
|
|
128
|
+
if (!parsed) {
|
|
129
|
+
const fallback = eligible
|
|
130
|
+
.sort((a, b) => b.confidence - a.confidence)
|
|
131
|
+
.slice(0, 8);
|
|
132
|
+
return renderSelectedFrameworks(fallback, "general") +
|
|
133
|
+
"\n\n*(Activation used confidence-based fallback — could not parse LLM response)*";
|
|
134
|
+
}
|
|
135
|
+
const selectedIds = parsed.selectedIds ?? [];
|
|
136
|
+
const selectedProcessIds = parsed.selectedProcessIds ?? [];
|
|
137
|
+
const allSelectedIds = [...new Set([...selectedIds, ...selectedProcessIds])];
|
|
138
|
+
const conversationType = parsed.conversationType ?? "general";
|
|
139
|
+
const selected = store.frameworks.filter((f) => allSelectedIds.includes(f.id));
|
|
140
|
+
// If LLM selected nothing useful, fall back to top by confidence
|
|
141
|
+
if (selected.length === 0) {
|
|
142
|
+
const fallback = eligible
|
|
143
|
+
.sort((a, b) => b.confidence - a.confidence)
|
|
144
|
+
.slice(0, 8);
|
|
145
|
+
return renderSelectedFrameworks(fallback, conversationType);
|
|
146
|
+
}
|
|
147
|
+
return renderSelectedFrameworks(selected, conversationType);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=soul-activate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soul-activate.js","sourceRoot":"","sources":["../../src/tools/soul-activate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleSoulContext(mode?: "slim" | "full"): Promise<string>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { assembleSoulContext, assembleSlimContext } from "../engine/context-assembler.js";
|
|
3
|
+
import { loadConfig, ensureDirs, soulFilePath } from "../util/files.js";
|
|
4
|
+
import { FrameworkEngine } from "../engine/framework-engine.js";
|
|
5
|
+
import { renderFrameworksToMarkdown } from "../engine/framework-renderer.js";
|
|
6
|
+
import { StateEngine } from "../engine/state-engine.js";
|
|
7
|
+
export async function handleSoulContext(mode = "full") {
|
|
8
|
+
await ensureDirs();
|
|
9
|
+
if (mode === "slim") {
|
|
10
|
+
const context = await assembleSlimContext();
|
|
11
|
+
if (!context.trim()) {
|
|
12
|
+
return "Soul system initialized but no context files found yet. Soul files are at ~/.soul/files/";
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
}
|
|
16
|
+
const frameworkEngine = new FrameworkEngine();
|
|
17
|
+
const store = await frameworkEngine.initialize();
|
|
18
|
+
const frameworksMd = renderFrameworksToMarkdown(store);
|
|
19
|
+
await fs.writeFile(soulFilePath("FRAMEWORKS.md"), frameworksMd, "utf-8");
|
|
20
|
+
const stateEngine = new StateEngine();
|
|
21
|
+
await stateEngine.load();
|
|
22
|
+
stateEngine.recordEvent({ type: "session_start" });
|
|
23
|
+
await stateEngine.tick();
|
|
24
|
+
const config = await loadConfig();
|
|
25
|
+
const context = await assembleSoulContext(config);
|
|
26
|
+
if (!context.trim()) {
|
|
27
|
+
return "Soul system initialized but no context files found yet. Soul files are at ~/.soul/files/";
|
|
28
|
+
}
|
|
29
|
+
return context;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=soul-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soul-context.js","sourceRoot":"","sources":["../../src/tools/soul-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwB,MAAM;IAE9B,MAAM,UAAU,EAAE,CAAC;IAEnB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO,0FAA0F,CAAC;QACpG,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzE,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IACzB,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACnD,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAEzB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAElD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO,0FAA0F,CAAC;IACpG,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-evaluation: Claude describes its response dynamics,
|
|
3
|
+
* and we generate self-signals weighted at 0.5x user signals.
|
|
4
|
+
*
|
|
5
|
+
* Gallwey-style: descriptive, not evaluative.
|
|
6
|
+
* "Response used 450 words for a simple question" not "bad response"
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleSoulEvaluate(summary: string): Promise<string>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { appendSignals } from "../engine/signal-store.js";
|
|
3
|
+
import { FrameworkEngine } from "../engine/framework-engine.js";
|
|
4
|
+
import { loadConfig } from "../util/files.js";
|
|
5
|
+
/**
|
|
6
|
+
* Self-evaluation: Claude describes its response dynamics,
|
|
7
|
+
* and we generate self-signals weighted at 0.5x user signals.
|
|
8
|
+
*
|
|
9
|
+
* Gallwey-style: descriptive, not evaluative.
|
|
10
|
+
* "Response used 450 words for a simple question" not "bad response"
|
|
11
|
+
*/
|
|
12
|
+
export async function handleSoulEvaluate(summary) {
|
|
13
|
+
const config = await loadConfig();
|
|
14
|
+
if (!config.selfEvaluation.enabled) {
|
|
15
|
+
return "Self-evaluation is disabled in config.";
|
|
16
|
+
}
|
|
17
|
+
const frameworkEngine = new FrameworkEngine();
|
|
18
|
+
const store = await frameworkEngine.initialize();
|
|
19
|
+
const activeFrameworks = store.frameworks.filter((f) => f.status === "active" || f.status === "questioning");
|
|
20
|
+
// Generate self-signals from the summary
|
|
21
|
+
const selfSignals = [];
|
|
22
|
+
const sessionKey = crypto.randomUUID().slice(0, 8);
|
|
23
|
+
const selfWeight = config.selfEvaluation.weight; // 0.5x
|
|
24
|
+
// Check for length/depth mismatch indicators
|
|
25
|
+
if (/too (long|verbose|detailed|much)/i.test(summary)) {
|
|
26
|
+
selfSignals.push({
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
sessionKey,
|
|
29
|
+
type: "disengagement",
|
|
30
|
+
evidence: `Self-eval: ${summary.slice(0, 150)}`,
|
|
31
|
+
source: "self",
|
|
32
|
+
confidence: 0.6 * selfWeight,
|
|
33
|
+
userSnippets: [],
|
|
34
|
+
assistantSnippets: [],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (/too (short|brief|terse)/i.test(summary)) {
|
|
38
|
+
selfSignals.push({
|
|
39
|
+
timestamp: Date.now(),
|
|
40
|
+
sessionKey,
|
|
41
|
+
type: "depth_change",
|
|
42
|
+
evidence: `Self-eval: ${summary.slice(0, 150)}`,
|
|
43
|
+
source: "self",
|
|
44
|
+
confidence: 0.6 * selfWeight,
|
|
45
|
+
userSnippets: [],
|
|
46
|
+
assistantSnippets: [],
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (/pattern.?match|generic|surface/i.test(summary)) {
|
|
50
|
+
selfSignals.push({
|
|
51
|
+
timestamp: Date.now(),
|
|
52
|
+
sessionKey,
|
|
53
|
+
type: "correction",
|
|
54
|
+
evidence: `Self-eval: detected pattern-matching instead of first-principles. ${summary.slice(0, 100)}`,
|
|
55
|
+
source: "self",
|
|
56
|
+
confidence: 0.5 * selfWeight,
|
|
57
|
+
userSnippets: [],
|
|
58
|
+
assistantSnippets: [],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (/successful|well.?received|good fit|aligned/i.test(summary)) {
|
|
62
|
+
selfSignals.push({
|
|
63
|
+
timestamp: Date.now(),
|
|
64
|
+
sessionKey,
|
|
65
|
+
type: "success",
|
|
66
|
+
evidence: `Self-eval: ${summary.slice(0, 150)}`,
|
|
67
|
+
source: "self",
|
|
68
|
+
confidence: 0.5 * selfWeight,
|
|
69
|
+
userSnippets: [],
|
|
70
|
+
assistantSnippets: [],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Always generate a general self-observation signal
|
|
74
|
+
if (selfSignals.length === 0) {
|
|
75
|
+
selfSignals.push({
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
sessionKey,
|
|
78
|
+
type: "depth_change",
|
|
79
|
+
evidence: `Self-eval observation: ${summary.slice(0, 150)}`,
|
|
80
|
+
source: "self",
|
|
81
|
+
confidence: 0.4 * selfWeight,
|
|
82
|
+
userSnippets: [],
|
|
83
|
+
assistantSnippets: [],
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
await appendSignals(selfSignals);
|
|
87
|
+
const frameworkNames = activeFrameworks.slice(0, 5).map((f) => f.name);
|
|
88
|
+
return [
|
|
89
|
+
`Self-evaluation recorded: ${selfSignals.length} self-signal(s) (weighted at ${selfWeight}x).`,
|
|
90
|
+
`Types: ${selfSignals.map((s) => s.type).join(", ")}`,
|
|
91
|
+
"",
|
|
92
|
+
`Active frameworks checked against: ${frameworkNames.join(", ")}`,
|
|
93
|
+
"",
|
|
94
|
+
"Self-signals will be factored into the next reflection cycle.",
|
|
95
|
+
].join("\n");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=soul-evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soul-evaluate.js","sourceRoot":"","sources":["../../src/tools/soul-evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleSoulFramework(name: string): Promise<string>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { FrameworkEngine } from "../engine/framework-engine.js";
|
|
2
|
+
function formatDate(timestamp) {
|
|
3
|
+
return new Date(timestamp).toISOString().slice(0, 10);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Render a single framework with full detail: description, evidence history,
|
|
7
|
+
* workflows, related frameworks, and tensions.
|
|
8
|
+
*/
|
|
9
|
+
function renderFullFramework(fw) {
|
|
10
|
+
const confirmed = fw.evidence.filter((e) => e.type === "confirmed");
|
|
11
|
+
const contradicted = fw.evidence.filter((e) => e.type === "contradicted");
|
|
12
|
+
const lines = [];
|
|
13
|
+
lines.push(`# ${fw.name}`);
|
|
14
|
+
lines.push("");
|
|
15
|
+
const tier = fw.evidenceTier ?? "hypothesis";
|
|
16
|
+
lines.push(`**Status**: ${fw.status} | **Tier**: ${tier} | **Source**: ${fw.source}`);
|
|
17
|
+
lines.push(`**Domain**: ${fw.domain} | **Applied**: ${fw.applicationCount} times | **Last tested**: ${formatDate(fw.lastTestedAt)}`);
|
|
18
|
+
lines.push("");
|
|
19
|
+
lines.push("## Description");
|
|
20
|
+
lines.push("");
|
|
21
|
+
lines.push(fw.description);
|
|
22
|
+
// Evidence history
|
|
23
|
+
lines.push("");
|
|
24
|
+
lines.push(`## Evidence (${confirmed.length} confirmed, ${contradicted.length} contradicted)`);
|
|
25
|
+
if (fw.evidence.length === 0) {
|
|
26
|
+
lines.push("*(no evidence yet)*");
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
for (const e of fw.evidence) {
|
|
30
|
+
lines.push(`- [${formatDate(e.timestamp)}] **${e.type}**: ${e.context}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Related frameworks
|
|
34
|
+
if (fw.relatedFrameworks.length > 0) {
|
|
35
|
+
lines.push("");
|
|
36
|
+
lines.push(`## Related: ${fw.relatedFrameworks.join(", ")}`);
|
|
37
|
+
}
|
|
38
|
+
if (fw.contradicts.length > 0) {
|
|
39
|
+
lines.push(`## Contradicts: ${fw.contradicts.join(", ")}`);
|
|
40
|
+
}
|
|
41
|
+
if (fw.supersedes.length > 0) {
|
|
42
|
+
lines.push(`## Supersedes: ${fw.supersedes.join(", ")}`);
|
|
43
|
+
}
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
}
|
|
46
|
+
export async function handleSoulFramework(name) {
|
|
47
|
+
const engine = new FrameworkEngine();
|
|
48
|
+
const store = await engine.initialize();
|
|
49
|
+
// Search by name (case-insensitive) or by ID
|
|
50
|
+
const fw = store.frameworks.find((f) => f.name.toLowerCase() === name.toLowerCase() ||
|
|
51
|
+
f.id === name);
|
|
52
|
+
if (!fw) {
|
|
53
|
+
// Try partial match
|
|
54
|
+
const partial = store.frameworks.find((f) => f.name.toLowerCase().includes(name.toLowerCase()));
|
|
55
|
+
if (partial) {
|
|
56
|
+
return renderFullFramework(partial);
|
|
57
|
+
}
|
|
58
|
+
const available = store.frameworks
|
|
59
|
+
.filter((f) => f.status !== "retired")
|
|
60
|
+
.map((f) => `- ${f.name} (${f.id})`)
|
|
61
|
+
.join("\n");
|
|
62
|
+
return `Framework "${name}" not found. Available:\n${available}`;
|
|
63
|
+
}
|
|
64
|
+
return renderFullFramework(fw);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=soul-framework.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soul-framework.js","sourceRoot":"","sources":["../../src/tools/soul-framework.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleSoulRead(fileName: string): Promise<string>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { soulFilePath, readFileSafe } from "../util/files.js";
|
|
2
|
+
const ALLOWED_FILES = [
|
|
3
|
+
"SOUL.md",
|
|
4
|
+
"SHADOW.md",
|
|
5
|
+
"STATE.md",
|
|
6
|
+
"STORY.md",
|
|
7
|
+
"BONDS.md",
|
|
8
|
+
"MORTAL.md",
|
|
9
|
+
"GROWTH.md",
|
|
10
|
+
"PRINCIPLES.md",
|
|
11
|
+
"FRAMEWORKS.md",
|
|
12
|
+
"EDGES.md",
|
|
13
|
+
];
|
|
14
|
+
export async function handleSoulRead(fileName) {
|
|
15
|
+
if (!ALLOWED_FILES.includes(fileName)) {
|
|
16
|
+
return `Error: Unknown soul file "${fileName}". Available files: ${ALLOWED_FILES.join(", ")}`;
|
|
17
|
+
}
|
|
18
|
+
const content = await readFileSafe(soulFilePath(fileName));
|
|
19
|
+
if (!content.trim()) {
|
|
20
|
+
return `${fileName} is empty or does not exist yet.`;
|
|
21
|
+
}
|
|
22
|
+
return content;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=soul-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soul-read.js","sourceRoot":"","sources":["../../src/tools/soul-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,aAAa,GAAG;IACpB,SAAS;IACT,WAAW;IACX,UAAU;IACV,UAAU;IACV,UAAU;IACV,WAAW;IACX,WAAW;IACX,eAAe;IACf,eAAe;IACf,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO,6BAA6B,QAAQ,uBAAuB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAChG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO,GAAG,QAAQ,kCAAkC,CAAC;IACvD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleSoulReflect(tier: "quick" | "deep" | "meta"): Promise<string>;
|