@auxiora/personality 1.0.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/LICENSE +191 -0
- package/dist/__tests__/builder.test.d.ts +2 -0
- package/dist/__tests__/builder.test.d.ts.map +1 -0
- package/dist/__tests__/builder.test.js +67 -0
- package/dist/__tests__/builder.test.js.map +1 -0
- package/dist/__tests__/conversation-builder.test.d.ts +2 -0
- package/dist/__tests__/conversation-builder.test.d.ts.map +1 -0
- package/dist/__tests__/conversation-builder.test.js +324 -0
- package/dist/__tests__/conversation-builder.test.js.map +1 -0
- package/dist/__tests__/escalation.test.d.ts +2 -0
- package/dist/__tests__/escalation.test.d.ts.map +1 -0
- package/dist/__tests__/escalation.test.js +143 -0
- package/dist/__tests__/escalation.test.js.map +1 -0
- package/dist/__tests__/manager.test.d.ts +2 -0
- package/dist/__tests__/manager.test.d.ts.map +1 -0
- package/dist/__tests__/manager.test.js +96 -0
- package/dist/__tests__/manager.test.js.map +1 -0
- package/dist/__tests__/parser.test.d.ts +2 -0
- package/dist/__tests__/parser.test.d.ts.map +1 -0
- package/dist/__tests__/parser.test.js +89 -0
- package/dist/__tests__/parser.test.js.map +1 -0
- package/dist/__tests__/security-floor.test.d.ts +2 -0
- package/dist/__tests__/security-floor.test.d.ts.map +1 -0
- package/dist/__tests__/security-floor.test.js +183 -0
- package/dist/__tests__/security-floor.test.js.map +1 -0
- package/dist/builder.d.ts +6 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +65 -0
- package/dist/builder.js.map +1 -0
- package/dist/conversation-builder.d.ts +30 -0
- package/dist/conversation-builder.d.ts.map +1 -0
- package/dist/conversation-builder.js +232 -0
- package/dist/conversation-builder.js.map +1 -0
- package/dist/escalation.d.ts +35 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +134 -0
- package/dist/escalation.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +28 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +114 -0
- package/dist/manager.js.map +1 -0
- package/dist/marketplace/__tests__/scanner.test.d.ts +2 -0
- package/dist/marketplace/__tests__/scanner.test.d.ts.map +1 -0
- package/dist/marketplace/__tests__/scanner.test.js +134 -0
- package/dist/marketplace/__tests__/scanner.test.js.map +1 -0
- package/dist/marketplace/__tests__/schema.test.d.ts +2 -0
- package/dist/marketplace/__tests__/schema.test.d.ts.map +1 -0
- package/dist/marketplace/__tests__/schema.test.js +243 -0
- package/dist/marketplace/__tests__/schema.test.js.map +1 -0
- package/dist/marketplace/scanner.d.ts +19 -0
- package/dist/marketplace/scanner.d.ts.map +1 -0
- package/dist/marketplace/scanner.js +62 -0
- package/dist/marketplace/scanner.js.map +1 -0
- package/dist/marketplace/schema.d.ts +150 -0
- package/dist/marketplace/schema.d.ts.map +1 -0
- package/dist/marketplace/schema.js +122 -0
- package/dist/marketplace/schema.js.map +1 -0
- package/dist/modes/__tests__/mode-detector.test.d.ts +2 -0
- package/dist/modes/__tests__/mode-detector.test.d.ts.map +1 -0
- package/dist/modes/__tests__/mode-detector.test.js +130 -0
- package/dist/modes/__tests__/mode-detector.test.js.map +1 -0
- package/dist/modes/__tests__/mode-loader.test.d.ts +2 -0
- package/dist/modes/__tests__/mode-loader.test.d.ts.map +1 -0
- package/dist/modes/__tests__/mode-loader.test.js +91 -0
- package/dist/modes/__tests__/mode-loader.test.js.map +1 -0
- package/dist/modes/__tests__/prompt-assembler.test.d.ts +2 -0
- package/dist/modes/__tests__/prompt-assembler.test.d.ts.map +1 -0
- package/dist/modes/__tests__/prompt-assembler.test.js +241 -0
- package/dist/modes/__tests__/prompt-assembler.test.js.map +1 -0
- package/dist/modes/mode-detector.d.ts +10 -0
- package/dist/modes/mode-detector.d.ts.map +1 -0
- package/dist/modes/mode-detector.js +70 -0
- package/dist/modes/mode-detector.js.map +1 -0
- package/dist/modes/mode-loader.d.ts +14 -0
- package/dist/modes/mode-loader.d.ts.map +1 -0
- package/dist/modes/mode-loader.js +94 -0
- package/dist/modes/mode-loader.js.map +1 -0
- package/dist/modes/prompt-assembler.d.ts +27 -0
- package/dist/modes/prompt-assembler.d.ts.map +1 -0
- package/dist/modes/prompt-assembler.js +224 -0
- package/dist/modes/prompt-assembler.js.map +1 -0
- package/dist/modes/types.d.ts +42 -0
- package/dist/modes/types.d.ts.map +1 -0
- package/dist/modes/types.js +24 -0
- package/dist/modes/types.js.map +1 -0
- package/dist/parser.d.ts +6 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +122 -0
- package/dist/parser.js.map +1 -0
- package/dist/security-floor.d.ts +31 -0
- package/dist/security-floor.d.ts.map +1 -0
- package/dist/security-floor.js +113 -0
- package/dist/security-floor.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/voice-profiles.d.ts +23 -0
- package/dist/voice-profiles.d.ts.map +1 -0
- package/dist/voice-profiles.js +72 -0
- package/dist/voice-profiles.js.map +1 -0
- package/modes/advisor.md +24 -0
- package/modes/analyst.md +25 -0
- package/modes/companion.md +24 -0
- package/modes/legal.md +1188 -0
- package/modes/operator.md +24 -0
- package/modes/roast.md +24 -0
- package/modes/socratic.md +24 -0
- package/modes/writer.md +23 -0
- package/package.json +27 -0
- package/src/__tests__/builder.test.ts +78 -0
- package/src/__tests__/conversation-builder.test.ts +386 -0
- package/src/__tests__/escalation.test.ts +172 -0
- package/src/__tests__/manager.test.ts +141 -0
- package/src/__tests__/parser.test.ts +101 -0
- package/src/__tests__/security-floor.test.ts +212 -0
- package/src/builder.ts +75 -0
- package/src/conversation-builder.ts +279 -0
- package/src/escalation.ts +162 -0
- package/src/index.ts +55 -0
- package/src/manager.ts +119 -0
- package/src/marketplace/__tests__/scanner.test.ts +159 -0
- package/src/marketplace/__tests__/schema.test.ts +269 -0
- package/src/marketplace/scanner.ts +85 -0
- package/src/marketplace/schema.ts +141 -0
- package/src/modes/__tests__/mode-detector.test.ts +149 -0
- package/src/modes/__tests__/mode-loader.test.ts +143 -0
- package/src/modes/__tests__/prompt-assembler.test.ts +291 -0
- package/src/modes/mode-detector.ts +84 -0
- package/src/modes/mode-loader.ts +105 -0
- package/src/modes/prompt-assembler.ts +278 -0
- package/src/modes/types.ts +67 -0
- package/src/parser.ts +132 -0
- package/src/security-floor.ts +147 -0
- package/src/types.ts +27 -0
- package/src/voice-profiles.ts +88 -0
- package/templates/chill.md +30 -0
- package/templates/creative.md +29 -0
- package/templates/friendly.md +28 -0
- package/templates/mentor.md +31 -0
- package/templates/minimal.md +24 -0
- package/templates/professional.md +28 -0
- package/templates/technical.md +30 -0
- package/tsconfig.json +12 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import { getSoulPath, getAgentsPath, getIdentityPath, getUserPath, } from '@auxiora/core';
|
|
3
|
+
export class PromptAssembler {
|
|
4
|
+
agent;
|
|
5
|
+
modeLoader;
|
|
6
|
+
personalityAdapter;
|
|
7
|
+
basePrompt = '';
|
|
8
|
+
constructor(agent, modeLoader, personalityAdapter) {
|
|
9
|
+
this.agent = agent;
|
|
10
|
+
this.modeLoader = modeLoader;
|
|
11
|
+
this.personalityAdapter = personalityAdapter;
|
|
12
|
+
}
|
|
13
|
+
async buildBase() {
|
|
14
|
+
const parts = [];
|
|
15
|
+
// 1. Identity preamble
|
|
16
|
+
parts.push(this.buildIdentityPreamble(this.agent));
|
|
17
|
+
// 2. Personality adaptations from living memory
|
|
18
|
+
if (this.personalityAdapter) {
|
|
19
|
+
const modifier = await this.personalityAdapter.getPromptModifier();
|
|
20
|
+
if (modifier) {
|
|
21
|
+
parts.push(modifier);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// 3. SOUL.md
|
|
25
|
+
try {
|
|
26
|
+
const soul = await fs.readFile(getSoulPath(), 'utf-8');
|
|
27
|
+
parts.push(soul);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// No SOUL.md
|
|
31
|
+
}
|
|
32
|
+
// Custom instructions from config
|
|
33
|
+
if (this.agent.customInstructions) {
|
|
34
|
+
parts.push(`## Custom Instructions\n${this.agent.customInstructions}`);
|
|
35
|
+
}
|
|
36
|
+
// 4. AGENTS.md
|
|
37
|
+
try {
|
|
38
|
+
const agents = await fs.readFile(getAgentsPath(), 'utf-8');
|
|
39
|
+
parts.push(agents);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// No AGENTS.md
|
|
43
|
+
}
|
|
44
|
+
// 5. IDENTITY.md
|
|
45
|
+
try {
|
|
46
|
+
const identity = await fs.readFile(getIdentityPath(), 'utf-8');
|
|
47
|
+
parts.push(identity);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// No IDENTITY.md
|
|
51
|
+
}
|
|
52
|
+
// 6. USER.md
|
|
53
|
+
try {
|
|
54
|
+
const user = await fs.readFile(getUserPath(), 'utf-8');
|
|
55
|
+
parts.push(`\n## About the User\n${user}`);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// No USER.md
|
|
59
|
+
}
|
|
60
|
+
if (parts.length > 1) {
|
|
61
|
+
this.basePrompt = parts.join('\n\n---\n\n');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.basePrompt = `You are ${this.agent.name}, a helpful AI assistant. Be concise, accurate, and friendly.`;
|
|
65
|
+
}
|
|
66
|
+
return this.basePrompt;
|
|
67
|
+
}
|
|
68
|
+
getBasePrompt() {
|
|
69
|
+
return this.basePrompt;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build a prompt for a security context: base prompt + security floor section + memories.
|
|
73
|
+
* No mode instructions or user preferences are included.
|
|
74
|
+
*/
|
|
75
|
+
enrichForSecurityContext(securityContext, securityFloor, memorySection) {
|
|
76
|
+
const parts = [this.basePrompt];
|
|
77
|
+
// Inject security floor section
|
|
78
|
+
const sfSection = securityFloor.getSecurityPromptSection(securityContext);
|
|
79
|
+
if (sfSection) {
|
|
80
|
+
parts.push(`\n\n${sfSection}`);
|
|
81
|
+
}
|
|
82
|
+
// Inject memories (security context still benefits from memory)
|
|
83
|
+
if (memorySection) {
|
|
84
|
+
parts.push(memorySection);
|
|
85
|
+
}
|
|
86
|
+
return parts.join('');
|
|
87
|
+
}
|
|
88
|
+
enrichForMessage(modeState, memorySection, preferences, escalationState, _channelType) {
|
|
89
|
+
// If escalation is active, dampen tone in the identity preamble
|
|
90
|
+
let prompt;
|
|
91
|
+
if (escalationState && escalationState.level !== 'normal') {
|
|
92
|
+
const dampened = this.dampenToneForEscalation(escalationState);
|
|
93
|
+
const modifiedAgent = { ...this.agent, tone: dampened };
|
|
94
|
+
prompt = this.buildIdentityPreamble(modifiedAgent);
|
|
95
|
+
// Re-add the rest of the base prompt after identity (if base has more than just identity)
|
|
96
|
+
const identityEnd = this.basePrompt.indexOf('\n\n---\n\n');
|
|
97
|
+
if (identityEnd !== -1) {
|
|
98
|
+
prompt += this.basePrompt.slice(identityEnd);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
prompt = this.basePrompt;
|
|
103
|
+
}
|
|
104
|
+
const parts = [prompt];
|
|
105
|
+
// Inject active mode instructions
|
|
106
|
+
if (modeState && modeState.activeMode !== 'auto' && modeState.activeMode !== 'off') {
|
|
107
|
+
const mode = this.modeLoader.get(modeState.activeMode);
|
|
108
|
+
if (mode) {
|
|
109
|
+
parts.push(`\n\n## Active Mode: ${mode.name}\n${mode.promptContent}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Inject preference overrides
|
|
113
|
+
if (preferences) {
|
|
114
|
+
const rendered = this.renderPreferences(preferences);
|
|
115
|
+
if (rendered) {
|
|
116
|
+
parts.push(`\n\n## User Preferences\n${rendered}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Inject memories
|
|
120
|
+
if (memorySection) {
|
|
121
|
+
parts.push(memorySection);
|
|
122
|
+
}
|
|
123
|
+
return parts.join('');
|
|
124
|
+
}
|
|
125
|
+
renderPreferences(prefs) {
|
|
126
|
+
const lines = [];
|
|
127
|
+
if (prefs.verbosity <= 0.2) {
|
|
128
|
+
lines.push('- Be extremely concise. Use bullet points and short sentences.');
|
|
129
|
+
}
|
|
130
|
+
else if (prefs.verbosity >= 0.8) {
|
|
131
|
+
lines.push('- Be thorough and detailed. Explain reasoning and provide examples.');
|
|
132
|
+
}
|
|
133
|
+
if (prefs.formality <= 0.2) {
|
|
134
|
+
lines.push('- Use casual, conversational language.');
|
|
135
|
+
}
|
|
136
|
+
else if (prefs.formality >= 0.8) {
|
|
137
|
+
lines.push('- Use formal, professional language.');
|
|
138
|
+
}
|
|
139
|
+
if (prefs.proactiveness >= 0.8) {
|
|
140
|
+
lines.push('- Proactively suggest next steps, improvements, and related topics.');
|
|
141
|
+
}
|
|
142
|
+
else if (prefs.proactiveness <= 0.2) {
|
|
143
|
+
lines.push('- Only answer what is directly asked. Do not volunteer extra information.');
|
|
144
|
+
}
|
|
145
|
+
if (prefs.riskTolerance >= 0.8) {
|
|
146
|
+
lines.push('- Be bold in recommendations. Favor decisive action over excessive caution.');
|
|
147
|
+
}
|
|
148
|
+
else if (prefs.riskTolerance <= 0.2) {
|
|
149
|
+
lines.push('- Be cautious. Highlight risks and caveats prominently.');
|
|
150
|
+
}
|
|
151
|
+
if (prefs.humor >= 0.8) {
|
|
152
|
+
lines.push('- Feel free to be witty and playful in responses.');
|
|
153
|
+
}
|
|
154
|
+
else if (prefs.humor <= 0.2) {
|
|
155
|
+
lines.push('- Keep responses serious and professional. Avoid humor.');
|
|
156
|
+
}
|
|
157
|
+
if (prefs.feedbackStyle === 'sandwich') {
|
|
158
|
+
lines.push('- When giving feedback, use the sandwich method: positive → constructive → positive.');
|
|
159
|
+
}
|
|
160
|
+
else if (prefs.feedbackStyle === 'gentle') {
|
|
161
|
+
lines.push('- Give feedback gently with empathy. Lead with understanding.');
|
|
162
|
+
}
|
|
163
|
+
if (prefs.expertiseAssumption === 'beginner') {
|
|
164
|
+
lines.push('- Explain concepts from first principles. Define technical terms.');
|
|
165
|
+
}
|
|
166
|
+
else if (prefs.expertiseAssumption === 'expert') {
|
|
167
|
+
lines.push('- Assume deep technical knowledge. Skip basic explanations.');
|
|
168
|
+
}
|
|
169
|
+
return lines.join('\n');
|
|
170
|
+
}
|
|
171
|
+
dampenToneForEscalation(state) {
|
|
172
|
+
const tone = { ...this.agent.tone };
|
|
173
|
+
switch (state.level) {
|
|
174
|
+
case 'caution':
|
|
175
|
+
return { ...tone, humor: tone.humor * 0.5 };
|
|
176
|
+
case 'serious':
|
|
177
|
+
return { ...tone, humor: 0, directness: Math.max(tone.directness, 0.6) };
|
|
178
|
+
case 'lockdown':
|
|
179
|
+
return { warmth: tone.warmth, humor: 0, directness: Math.max(tone.directness, 0.7), formality: Math.max(tone.formality, 0.5) };
|
|
180
|
+
default:
|
|
181
|
+
return tone;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
buildIdentityPreamble(agent) {
|
|
185
|
+
const lines = ['# Agent Identity'];
|
|
186
|
+
lines.push(`You are ${agent.name} (${agent.pronouns}).`);
|
|
187
|
+
if (agent.vibe) {
|
|
188
|
+
lines.push(`Vibe: ${agent.vibe}`);
|
|
189
|
+
}
|
|
190
|
+
lines.push('');
|
|
191
|
+
lines.push('## Personality');
|
|
192
|
+
lines.push(`Warmth: ${agent.tone.warmth}/1.0 | Directness: ${agent.tone.directness}/1.0 | Humor: ${agent.tone.humor}/1.0 | Formality: ${agent.tone.formality}/1.0`);
|
|
193
|
+
lines.push(`Error handling style: ${agent.errorStyle}`);
|
|
194
|
+
if (agent.expertise.length > 0) {
|
|
195
|
+
lines.push('');
|
|
196
|
+
lines.push('## Expertise');
|
|
197
|
+
for (const area of agent.expertise) {
|
|
198
|
+
lines.push(`- ${area}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const phrases = Object.entries(agent.catchphrases).filter(([, v]) => v);
|
|
202
|
+
if (phrases.length > 0) {
|
|
203
|
+
lines.push('');
|
|
204
|
+
lines.push('## Catchphrases');
|
|
205
|
+
for (const [key, value] of phrases) {
|
|
206
|
+
lines.push(`- ${key.charAt(0).toUpperCase() + key.slice(1)}: ${value}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const hasJokeBoundaries = agent.boundaries.neverJokeAbout.length > 0;
|
|
210
|
+
const hasAdviseBoundaries = agent.boundaries.neverAdviseOn.length > 0;
|
|
211
|
+
if (hasJokeBoundaries || hasAdviseBoundaries) {
|
|
212
|
+
lines.push('');
|
|
213
|
+
lines.push('## Boundaries');
|
|
214
|
+
if (hasJokeBoundaries) {
|
|
215
|
+
lines.push(`Never joke about: ${agent.boundaries.neverJokeAbout.join(', ')}`);
|
|
216
|
+
}
|
|
217
|
+
if (hasAdviseBoundaries) {
|
|
218
|
+
lines.push(`Never advise on: ${agent.boundaries.neverAdviseOn.join(', ')}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return lines.join('\n');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=prompt-assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-assembler.js","sourceRoot":"","sources":["../../src/modes/prompt-assembler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EACL,WAAW,EACX,aAAa,EACb,eAAe,EACf,WAAW,GACZ,MAAM,eAAe,CAAC;AAQvB,MAAM,OAAO,eAAe;IAClB,KAAK,CAAgB;IACrB,UAAU,CAAa;IACvB,kBAAkB,CAAmD;IACrE,UAAU,GAAW,EAAE,CAAC;IAEhC,YACE,KAAoB,EACpB,UAAsB,EACtB,kBAAoE;QAEpE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,uBAAuB;QACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAEnD,gDAAgD;QAChD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;YACnE,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,aAAa;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,eAAe;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QAED,aAAa;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,WAAW,IAAI,CAAC,KAAK,CAAC,IAAI,+DAA+D,CAAC;QAC9G,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,wBAAwB,CACtB,eAAgC,EAChC,aAA4B,EAC5B,aAA4B;QAE5B,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE1C,gCAAgC;QAChC,MAAM,SAAS,GAAG,aAAa,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAC1E,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,gEAAgE;QAChE,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,gBAAgB,CACd,SAAuC,EACvC,aAA4B,EAC5B,WAA6B,EAC7B,eAAiC,EACjC,YAAqB;QAErB,gEAAgE;QAChE,IAAI,MAAc,CAAC;QACnB,IAAI,eAAe,IAAI,eAAe,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;YAC/D,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACxD,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAEnD,0FAA0F;YAC1F,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;QAED,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;QAEjC,kCAAkC;QAClC,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACnF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,UAAoB,CAAC,CAAC;YACjE,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,iBAAiB,CAAC,KAAsB;QACtC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC5F,CAAC;aAAM,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;QACrG,CAAC;aAAM,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,KAAK,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAClF,CAAC;aAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,uBAAuB,CAAC,KAAsB;QACpD,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpC,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,KAAK,SAAS;gBACZ,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;YAC9C,KAAK,SAAS;gBACZ,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3E,KAAK,UAAU;gBACb,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;YACjI;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,KAAoB;QAChD,MAAM,KAAK,GAAa,CAAC,kBAAkB,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CACR,WAAW,KAAK,CAAC,IAAI,CAAC,MAAM,sBAAsB,KAAK,CAAC,IAAI,CAAC,UAAU,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,qBAAqB,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CACxJ,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAExD,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QACrE,MAAM,mBAAmB,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QACtE,IAAI,iBAAiB,IAAI,mBAAmB,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5B,IAAI,iBAAiB,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,oBAAoB,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { EscalationLevel } from '../escalation.js';
|
|
2
|
+
export declare const MODE_IDS: readonly ["operator", "analyst", "advisor", "writer", "socratic", "legal", "roast", "companion"];
|
|
3
|
+
export type ModeId = (typeof MODE_IDS)[number];
|
|
4
|
+
export interface ModeSignal {
|
|
5
|
+
phrase: string;
|
|
6
|
+
weight: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ModeTemplate {
|
|
9
|
+
id: ModeId;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
promptContent: string;
|
|
13
|
+
signals: ModeSignal[];
|
|
14
|
+
}
|
|
15
|
+
export interface ModeDetectionResult {
|
|
16
|
+
mode: ModeId;
|
|
17
|
+
confidence: number;
|
|
18
|
+
candidates: Array<{
|
|
19
|
+
mode: ModeId;
|
|
20
|
+
score: number;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export interface UserPreferences {
|
|
24
|
+
verbosity: number;
|
|
25
|
+
formality: number;
|
|
26
|
+
proactiveness: number;
|
|
27
|
+
riskTolerance: number;
|
|
28
|
+
humor: number;
|
|
29
|
+
feedbackStyle: 'direct' | 'sandwich' | 'gentle';
|
|
30
|
+
expertiseAssumption: 'beginner' | 'intermediate' | 'expert';
|
|
31
|
+
}
|
|
32
|
+
export declare const DEFAULT_PREFERENCES: UserPreferences;
|
|
33
|
+
export interface SessionModeState {
|
|
34
|
+
activeMode: ModeId | 'auto' | 'off';
|
|
35
|
+
autoDetected: boolean;
|
|
36
|
+
lastAutoMode?: ModeId;
|
|
37
|
+
lastSwitchAt?: number;
|
|
38
|
+
escalationLevel?: EscalationLevel;
|
|
39
|
+
suspendedMode?: ModeId | 'auto' | 'off';
|
|
40
|
+
}
|
|
41
|
+
export declare const DEFAULT_SESSION_MODE_STATE: SessionModeState;
|
|
42
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/modes/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,QAAQ,kGASX,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChD,mBAAmB,EAAE,UAAU,GAAG,cAAc,GAAG,QAAQ,CAAC;CAC7D;AAED,eAAO,MAAM,mBAAmB,EAAE,eAQjC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;CACzC;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAGxC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const MODE_IDS = [
|
|
2
|
+
'operator',
|
|
3
|
+
'analyst',
|
|
4
|
+
'advisor',
|
|
5
|
+
'writer',
|
|
6
|
+
'socratic',
|
|
7
|
+
'legal',
|
|
8
|
+
'roast',
|
|
9
|
+
'companion',
|
|
10
|
+
];
|
|
11
|
+
export const DEFAULT_PREFERENCES = {
|
|
12
|
+
verbosity: 0.5,
|
|
13
|
+
formality: 0.5,
|
|
14
|
+
proactiveness: 0.5,
|
|
15
|
+
riskTolerance: 0.5,
|
|
16
|
+
humor: 0.3,
|
|
17
|
+
feedbackStyle: 'direct',
|
|
18
|
+
expertiseAssumption: 'intermediate',
|
|
19
|
+
};
|
|
20
|
+
export const DEFAULT_SESSION_MODE_STATE = {
|
|
21
|
+
activeMode: 'auto',
|
|
22
|
+
autoDetected: false,
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/modes/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,UAAU;IACV,OAAO;IACP,OAAO;IACP,WAAW;CACH,CAAC;AAiCX,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IAClD,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;IACd,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,GAAG;IAClB,KAAK,EAAE,GAAG;IACV,aAAa,EAAE,QAAQ;IACvB,mBAAmB,EAAE,cAAc;CACpC,CAAC;AAWF,MAAM,CAAC,MAAM,0BAA0B,GAAqB;IAC1D,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,KAAK;CACpB,CAAC"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA4F7C;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAoCvD"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
|
|
2
|
+
/**
|
|
3
|
+
* Parse a simple YAML subset into a nested record.
|
|
4
|
+
* Supports: top-level keys, nested object keys (2-space indent),
|
|
5
|
+
* arrays at 2-space indent, sub-keys under nested objects (4-space indent),
|
|
6
|
+
* and arrays at 4-space indent.
|
|
7
|
+
*/
|
|
8
|
+
function parseYaml(yaml) {
|
|
9
|
+
const result = {};
|
|
10
|
+
const lines = yaml.split('\n');
|
|
11
|
+
// Track current hierarchy: topKey, nestedKey
|
|
12
|
+
let topKey = '';
|
|
13
|
+
let topObj = null;
|
|
14
|
+
let nestedKey = '';
|
|
15
|
+
for (const line of lines) {
|
|
16
|
+
if (line.trim() === '' || line.trim().startsWith('#'))
|
|
17
|
+
continue;
|
|
18
|
+
// 4-space array item (under a nested object's sub-key)
|
|
19
|
+
const deep4ArrayMatch = line.match(/^ - (.+)$/);
|
|
20
|
+
if (deep4ArrayMatch && topObj && nestedKey) {
|
|
21
|
+
if (!Array.isArray(topObj[nestedKey])) {
|
|
22
|
+
topObj[nestedKey] = [];
|
|
23
|
+
}
|
|
24
|
+
topObj[nestedKey].push(parseYamlValue(deep4ArrayMatch[1]));
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// 2-space key or array item
|
|
28
|
+
const indent2Match = line.match(/^ (\w+):\s*(.*)$/);
|
|
29
|
+
if (indent2Match && topKey) {
|
|
30
|
+
// This is a sub-key under the current top-level key
|
|
31
|
+
if (topObj === null) {
|
|
32
|
+
topObj = {};
|
|
33
|
+
result[topKey] = topObj;
|
|
34
|
+
}
|
|
35
|
+
const [, key, value] = indent2Match;
|
|
36
|
+
nestedKey = key;
|
|
37
|
+
if (value === '') {
|
|
38
|
+
// Sub-key with children (array or deeper object) — set undefined for now
|
|
39
|
+
topObj[key] = undefined;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
topObj[key] = parseYamlValue(value);
|
|
43
|
+
}
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const indent2ArrayMatch = line.match(/^ - (.+)$/);
|
|
47
|
+
if (indent2ArrayMatch && topKey) {
|
|
48
|
+
nestedKey = '';
|
|
49
|
+
if (!Array.isArray(result[topKey])) {
|
|
50
|
+
result[topKey] = [];
|
|
51
|
+
}
|
|
52
|
+
result[topKey].push(parseYamlValue(indent2ArrayMatch[1]));
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Top-level key
|
|
56
|
+
const topMatch = line.match(/^(\w+):\s*(.*)$/);
|
|
57
|
+
if (topMatch) {
|
|
58
|
+
const [, key, value] = topMatch;
|
|
59
|
+
topKey = key;
|
|
60
|
+
topObj = null;
|
|
61
|
+
nestedKey = '';
|
|
62
|
+
if (value === '') {
|
|
63
|
+
result[topKey] = undefined;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
result[topKey] = parseYamlValue(value);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
function parseYamlValue(value) {
|
|
73
|
+
const trimmed = value.trim();
|
|
74
|
+
if (trimmed === 'true')
|
|
75
|
+
return true;
|
|
76
|
+
if (trimmed === 'false')
|
|
77
|
+
return false;
|
|
78
|
+
if (/^-?\d+(\.\d+)?$/.test(trimmed))
|
|
79
|
+
return Number(trimmed);
|
|
80
|
+
// Strip surrounding quotes
|
|
81
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
82
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
83
|
+
return trimmed.slice(1, -1);
|
|
84
|
+
}
|
|
85
|
+
return trimmed;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse a SOUL.md file content into a SoulConfig.
|
|
89
|
+
*/
|
|
90
|
+
export function parseSoulMd(content) {
|
|
91
|
+
const match = content.match(FRONTMATTER_RE);
|
|
92
|
+
if (!match) {
|
|
93
|
+
throw new Error('Invalid SOUL.md: missing YAML frontmatter (expected --- delimiters)');
|
|
94
|
+
}
|
|
95
|
+
const [, yamlPart] = match;
|
|
96
|
+
const data = parseYaml(yamlPart);
|
|
97
|
+
const tone = (data.tone ?? {});
|
|
98
|
+
const boundaries = (data.boundaries ?? {});
|
|
99
|
+
const catchphrases = (data.catchphrases ?? {});
|
|
100
|
+
return {
|
|
101
|
+
name: String(data.name ?? 'Auxiora'),
|
|
102
|
+
pronouns: String(data.pronouns ?? 'they/them'),
|
|
103
|
+
tone: {
|
|
104
|
+
warmth: Number(tone.warmth ?? 0.6),
|
|
105
|
+
directness: Number(tone.directness ?? 0.5),
|
|
106
|
+
humor: Number(tone.humor ?? 0.3),
|
|
107
|
+
formality: Number(tone.formality ?? 0.5),
|
|
108
|
+
},
|
|
109
|
+
expertise: Array.isArray(data.expertise) ? data.expertise.map(String) : [],
|
|
110
|
+
errorStyle: String(data.errorStyle ?? 'professional'),
|
|
111
|
+
catchphrases: Object.fromEntries(Object.entries(catchphrases).map(([k, v]) => [k, String(v)])),
|
|
112
|
+
boundaries: {
|
|
113
|
+
neverJokeAbout: Array.isArray(boundaries.neverJokeAbout)
|
|
114
|
+
? boundaries.neverJokeAbout.map(String)
|
|
115
|
+
: [],
|
|
116
|
+
neverAdviseOn: Array.isArray(boundaries.neverAdviseOn)
|
|
117
|
+
? boundaries.neverAdviseOn.map(String)
|
|
118
|
+
: [],
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Floor — mandatory behavioral baseline that cannot be overridden
|
|
3
|
+
* by any personality template, mode, user preference, or marketplace config.
|
|
4
|
+
*/
|
|
5
|
+
import type { ToneSettings } from './types.js';
|
|
6
|
+
import type { ModeId } from './modes/types.js';
|
|
7
|
+
export declare const SECURITY_TOOL_PATTERNS: readonly string[];
|
|
8
|
+
export declare const SECURITY_MESSAGE_PATTERNS: readonly RegExp[];
|
|
9
|
+
export type SecurityFloorRule = 'SF-1' | 'SF-2' | 'SF-3' | 'SF-4' | 'SF-5';
|
|
10
|
+
export interface SecurityContext {
|
|
11
|
+
active: boolean;
|
|
12
|
+
triggeredBy: 'tool' | 'message_pattern' | 'workflow' | 'trust_flag' | 'incident';
|
|
13
|
+
activeRules: SecurityFloorRule[];
|
|
14
|
+
previousMode?: ModeId | 'auto' | 'off';
|
|
15
|
+
}
|
|
16
|
+
export interface SecurityDetectionInput {
|
|
17
|
+
toolCalls?: string[];
|
|
18
|
+
userMessage: string;
|
|
19
|
+
activeWorkflow?: string;
|
|
20
|
+
trustFlagged?: boolean;
|
|
21
|
+
activeIncident?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare class SecurityFloor {
|
|
24
|
+
/** Detect whether the current interaction requires security floor activation. */
|
|
25
|
+
detectSecurityContext(input: SecurityDetectionInput): SecurityContext;
|
|
26
|
+
/** Clamp tone values to security floor requirements. */
|
|
27
|
+
applyFloor(tone: ToneSettings): ToneSettings;
|
|
28
|
+
/** Generate a markdown prompt section describing active security floor rules. */
|
|
29
|
+
getSecurityPromptSection(context: SecurityContext): string;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=security-floor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-floor.d.ts","sourceRoot":"","sources":["../src/security-floor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAQnD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAMtD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;IACjF,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;CACxC;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAgBD,qBAAa,aAAa;IACxB,iFAAiF;IACjF,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,eAAe;IAuDrE,wDAAwD;IACxD,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY;IAS5C,iFAAiF;IACjF,wBAAwB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;CAqB3D"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Floor — mandatory behavioral baseline that cannot be overridden
|
|
3
|
+
* by any personality template, mode, user preference, or marketplace config.
|
|
4
|
+
*/
|
|
5
|
+
export const SECURITY_TOOL_PATTERNS = [
|
|
6
|
+
'vault_read',
|
|
7
|
+
'vault_write',
|
|
8
|
+
'vault_delete',
|
|
9
|
+
'secret_rotate',
|
|
10
|
+
'credential_',
|
|
11
|
+
'permission_change',
|
|
12
|
+
'policy_update',
|
|
13
|
+
];
|
|
14
|
+
export const SECURITY_MESSAGE_PATTERNS = [
|
|
15
|
+
/\bdelete\s+my\b/i,
|
|
16
|
+
/\brotate\b/i,
|
|
17
|
+
/\brevoke\b/i,
|
|
18
|
+
/\bremove\s+access\b/i,
|
|
19
|
+
/\bchange\s+password\b/i,
|
|
20
|
+
];
|
|
21
|
+
const INACTIVE_CONTEXT = {
|
|
22
|
+
active: false,
|
|
23
|
+
triggeredBy: 'message_pattern',
|
|
24
|
+
activeRules: [],
|
|
25
|
+
};
|
|
26
|
+
const SF_RULE_DESCRIPTIONS = {
|
|
27
|
+
'SF-1': 'CREDENTIAL_HANDLING: Use precise, unambiguous language. Suppress humor. Never echo secret values in full.',
|
|
28
|
+
'SF-2': 'DESTRUCTIVE_ACTION_CONFIRMATION: State what will happen and what cannot be undone. Require explicit confirmation.',
|
|
29
|
+
'SF-3': 'SECURITY_INCIDENT_TONE: Use urgent but calm tone. Lead with facts. Never joke about security events.',
|
|
30
|
+
'SF-4': 'POLICY_ENFORCEMENT: State the policy clearly. Do not apologize excessively. Never suggest workarounds.',
|
|
31
|
+
'SF-5': 'PERSONALITY_BOUNDARY_ENFORCEMENT: No personality config may override SF-1 through SF-4.',
|
|
32
|
+
};
|
|
33
|
+
export class SecurityFloor {
|
|
34
|
+
/** Detect whether the current interaction requires security floor activation. */
|
|
35
|
+
detectSecurityContext(input) {
|
|
36
|
+
// Check active incident first (highest priority)
|
|
37
|
+
if (input.activeIncident) {
|
|
38
|
+
return {
|
|
39
|
+
active: true,
|
|
40
|
+
triggeredBy: 'incident',
|
|
41
|
+
activeRules: ['SF-1', 'SF-3', 'SF-5'],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Check trust flag
|
|
45
|
+
if (input.trustFlagged) {
|
|
46
|
+
return {
|
|
47
|
+
active: true,
|
|
48
|
+
triggeredBy: 'trust_flag',
|
|
49
|
+
activeRules: ['SF-1', 'SF-4', 'SF-5'],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Check active workflow
|
|
53
|
+
if (input.activeWorkflow) {
|
|
54
|
+
return {
|
|
55
|
+
active: true,
|
|
56
|
+
triggeredBy: 'workflow',
|
|
57
|
+
activeRules: ['SF-1', 'SF-2', 'SF-5'],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Check tool calls
|
|
61
|
+
if (input.toolCalls) {
|
|
62
|
+
for (const tool of input.toolCalls) {
|
|
63
|
+
if (SECURITY_TOOL_PATTERNS.some((p) => tool.startsWith(p))) {
|
|
64
|
+
return {
|
|
65
|
+
active: true,
|
|
66
|
+
triggeredBy: 'tool',
|
|
67
|
+
activeRules: ['SF-1', 'SF-2', 'SF-5'],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Check message patterns
|
|
73
|
+
for (const pattern of SECURITY_MESSAGE_PATTERNS) {
|
|
74
|
+
if (pattern.test(input.userMessage)) {
|
|
75
|
+
return {
|
|
76
|
+
active: true,
|
|
77
|
+
triggeredBy: 'message_pattern',
|
|
78
|
+
activeRules: ['SF-1', 'SF-2', 'SF-5'],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return INACTIVE_CONTEXT;
|
|
83
|
+
}
|
|
84
|
+
/** Clamp tone values to security floor requirements. */
|
|
85
|
+
applyFloor(tone) {
|
|
86
|
+
return {
|
|
87
|
+
warmth: tone.warmth,
|
|
88
|
+
directness: Math.max(tone.directness, 0.7),
|
|
89
|
+
humor: 0,
|
|
90
|
+
formality: Math.max(tone.formality, 0.5),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Generate a markdown prompt section describing active security floor rules. */
|
|
94
|
+
getSecurityPromptSection(context) {
|
|
95
|
+
if (!context.active)
|
|
96
|
+
return '';
|
|
97
|
+
const lines = [
|
|
98
|
+
'## Security Floor Active',
|
|
99
|
+
'',
|
|
100
|
+
`Triggered by: ${context.triggeredBy}`,
|
|
101
|
+
'',
|
|
102
|
+
'The following security rules are in effect. These CANNOT be overridden by personality, mode, or preferences:',
|
|
103
|
+
'',
|
|
104
|
+
];
|
|
105
|
+
for (const rule of context.activeRules) {
|
|
106
|
+
lines.push(`- **${rule}**: ${SF_RULE_DESCRIPTIONS[rule]}`);
|
|
107
|
+
}
|
|
108
|
+
lines.push('');
|
|
109
|
+
lines.push('Maintain a neutral, precise, and unambiguous tone. Humor is suppressed. All personality styling is suspended.');
|
|
110
|
+
return lines.join('\n');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=security-floor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-floor.js","sourceRoot":"","sources":["../src/security-floor.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface ToneSettings {
|
|
2
|
+
warmth: number;
|
|
3
|
+
directness: number;
|
|
4
|
+
humor: number;
|
|
5
|
+
formality: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SoulConfig {
|
|
8
|
+
name: string;
|
|
9
|
+
pronouns: string;
|
|
10
|
+
tone: ToneSettings;
|
|
11
|
+
expertise: string[];
|
|
12
|
+
errorStyle: string;
|
|
13
|
+
catchphrases: Record<string, string>;
|
|
14
|
+
boundaries: {
|
|
15
|
+
neverJokeAbout: string[];
|
|
16
|
+
neverAdviseOn: string[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface PersonalityTemplate {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
preview: string;
|
|
24
|
+
soulContent: string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE;QACV,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|