@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.
Files changed (149) hide show
  1. package/LICENSE +191 -0
  2. package/dist/__tests__/builder.test.d.ts +2 -0
  3. package/dist/__tests__/builder.test.d.ts.map +1 -0
  4. package/dist/__tests__/builder.test.js +67 -0
  5. package/dist/__tests__/builder.test.js.map +1 -0
  6. package/dist/__tests__/conversation-builder.test.d.ts +2 -0
  7. package/dist/__tests__/conversation-builder.test.d.ts.map +1 -0
  8. package/dist/__tests__/conversation-builder.test.js +324 -0
  9. package/dist/__tests__/conversation-builder.test.js.map +1 -0
  10. package/dist/__tests__/escalation.test.d.ts +2 -0
  11. package/dist/__tests__/escalation.test.d.ts.map +1 -0
  12. package/dist/__tests__/escalation.test.js +143 -0
  13. package/dist/__tests__/escalation.test.js.map +1 -0
  14. package/dist/__tests__/manager.test.d.ts +2 -0
  15. package/dist/__tests__/manager.test.d.ts.map +1 -0
  16. package/dist/__tests__/manager.test.js +96 -0
  17. package/dist/__tests__/manager.test.js.map +1 -0
  18. package/dist/__tests__/parser.test.d.ts +2 -0
  19. package/dist/__tests__/parser.test.d.ts.map +1 -0
  20. package/dist/__tests__/parser.test.js +89 -0
  21. package/dist/__tests__/parser.test.js.map +1 -0
  22. package/dist/__tests__/security-floor.test.d.ts +2 -0
  23. package/dist/__tests__/security-floor.test.d.ts.map +1 -0
  24. package/dist/__tests__/security-floor.test.js +183 -0
  25. package/dist/__tests__/security-floor.test.js.map +1 -0
  26. package/dist/builder.d.ts +6 -0
  27. package/dist/builder.d.ts.map +1 -0
  28. package/dist/builder.js +65 -0
  29. package/dist/builder.js.map +1 -0
  30. package/dist/conversation-builder.d.ts +30 -0
  31. package/dist/conversation-builder.d.ts.map +1 -0
  32. package/dist/conversation-builder.js +232 -0
  33. package/dist/conversation-builder.js.map +1 -0
  34. package/dist/escalation.d.ts +35 -0
  35. package/dist/escalation.d.ts.map +1 -0
  36. package/dist/escalation.js +134 -0
  37. package/dist/escalation.js.map +1 -0
  38. package/dist/index.d.ts +21 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +20 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/manager.d.ts +28 -0
  43. package/dist/manager.d.ts.map +1 -0
  44. package/dist/manager.js +114 -0
  45. package/dist/manager.js.map +1 -0
  46. package/dist/marketplace/__tests__/scanner.test.d.ts +2 -0
  47. package/dist/marketplace/__tests__/scanner.test.d.ts.map +1 -0
  48. package/dist/marketplace/__tests__/scanner.test.js +134 -0
  49. package/dist/marketplace/__tests__/scanner.test.js.map +1 -0
  50. package/dist/marketplace/__tests__/schema.test.d.ts +2 -0
  51. package/dist/marketplace/__tests__/schema.test.d.ts.map +1 -0
  52. package/dist/marketplace/__tests__/schema.test.js +243 -0
  53. package/dist/marketplace/__tests__/schema.test.js.map +1 -0
  54. package/dist/marketplace/scanner.d.ts +19 -0
  55. package/dist/marketplace/scanner.d.ts.map +1 -0
  56. package/dist/marketplace/scanner.js +62 -0
  57. package/dist/marketplace/scanner.js.map +1 -0
  58. package/dist/marketplace/schema.d.ts +150 -0
  59. package/dist/marketplace/schema.d.ts.map +1 -0
  60. package/dist/marketplace/schema.js +122 -0
  61. package/dist/marketplace/schema.js.map +1 -0
  62. package/dist/modes/__tests__/mode-detector.test.d.ts +2 -0
  63. package/dist/modes/__tests__/mode-detector.test.d.ts.map +1 -0
  64. package/dist/modes/__tests__/mode-detector.test.js +130 -0
  65. package/dist/modes/__tests__/mode-detector.test.js.map +1 -0
  66. package/dist/modes/__tests__/mode-loader.test.d.ts +2 -0
  67. package/dist/modes/__tests__/mode-loader.test.d.ts.map +1 -0
  68. package/dist/modes/__tests__/mode-loader.test.js +91 -0
  69. package/dist/modes/__tests__/mode-loader.test.js.map +1 -0
  70. package/dist/modes/__tests__/prompt-assembler.test.d.ts +2 -0
  71. package/dist/modes/__tests__/prompt-assembler.test.d.ts.map +1 -0
  72. package/dist/modes/__tests__/prompt-assembler.test.js +241 -0
  73. package/dist/modes/__tests__/prompt-assembler.test.js.map +1 -0
  74. package/dist/modes/mode-detector.d.ts +10 -0
  75. package/dist/modes/mode-detector.d.ts.map +1 -0
  76. package/dist/modes/mode-detector.js +70 -0
  77. package/dist/modes/mode-detector.js.map +1 -0
  78. package/dist/modes/mode-loader.d.ts +14 -0
  79. package/dist/modes/mode-loader.d.ts.map +1 -0
  80. package/dist/modes/mode-loader.js +94 -0
  81. package/dist/modes/mode-loader.js.map +1 -0
  82. package/dist/modes/prompt-assembler.d.ts +27 -0
  83. package/dist/modes/prompt-assembler.d.ts.map +1 -0
  84. package/dist/modes/prompt-assembler.js +224 -0
  85. package/dist/modes/prompt-assembler.js.map +1 -0
  86. package/dist/modes/types.d.ts +42 -0
  87. package/dist/modes/types.d.ts.map +1 -0
  88. package/dist/modes/types.js +24 -0
  89. package/dist/modes/types.js.map +1 -0
  90. package/dist/parser.d.ts +6 -0
  91. package/dist/parser.d.ts.map +1 -0
  92. package/dist/parser.js +122 -0
  93. package/dist/parser.js.map +1 -0
  94. package/dist/security-floor.d.ts +31 -0
  95. package/dist/security-floor.d.ts.map +1 -0
  96. package/dist/security-floor.js +113 -0
  97. package/dist/security-floor.js.map +1 -0
  98. package/dist/types.d.ts +26 -0
  99. package/dist/types.d.ts.map +1 -0
  100. package/dist/types.js +2 -0
  101. package/dist/types.js.map +1 -0
  102. package/dist/voice-profiles.d.ts +23 -0
  103. package/dist/voice-profiles.d.ts.map +1 -0
  104. package/dist/voice-profiles.js +72 -0
  105. package/dist/voice-profiles.js.map +1 -0
  106. package/modes/advisor.md +24 -0
  107. package/modes/analyst.md +25 -0
  108. package/modes/companion.md +24 -0
  109. package/modes/legal.md +1188 -0
  110. package/modes/operator.md +24 -0
  111. package/modes/roast.md +24 -0
  112. package/modes/socratic.md +24 -0
  113. package/modes/writer.md +23 -0
  114. package/package.json +27 -0
  115. package/src/__tests__/builder.test.ts +78 -0
  116. package/src/__tests__/conversation-builder.test.ts +386 -0
  117. package/src/__tests__/escalation.test.ts +172 -0
  118. package/src/__tests__/manager.test.ts +141 -0
  119. package/src/__tests__/parser.test.ts +101 -0
  120. package/src/__tests__/security-floor.test.ts +212 -0
  121. package/src/builder.ts +75 -0
  122. package/src/conversation-builder.ts +279 -0
  123. package/src/escalation.ts +162 -0
  124. package/src/index.ts +55 -0
  125. package/src/manager.ts +119 -0
  126. package/src/marketplace/__tests__/scanner.test.ts +159 -0
  127. package/src/marketplace/__tests__/schema.test.ts +269 -0
  128. package/src/marketplace/scanner.ts +85 -0
  129. package/src/marketplace/schema.ts +141 -0
  130. package/src/modes/__tests__/mode-detector.test.ts +149 -0
  131. package/src/modes/__tests__/mode-loader.test.ts +143 -0
  132. package/src/modes/__tests__/prompt-assembler.test.ts +291 -0
  133. package/src/modes/mode-detector.ts +84 -0
  134. package/src/modes/mode-loader.ts +105 -0
  135. package/src/modes/prompt-assembler.ts +278 -0
  136. package/src/modes/types.ts +67 -0
  137. package/src/parser.ts +132 -0
  138. package/src/security-floor.ts +147 -0
  139. package/src/types.ts +27 -0
  140. package/src/voice-profiles.ts +88 -0
  141. package/templates/chill.md +30 -0
  142. package/templates/creative.md +29 -0
  143. package/templates/friendly.md +28 -0
  144. package/templates/mentor.md +31 -0
  145. package/templates/minimal.md +24 -0
  146. package/templates/professional.md +28 -0
  147. package/templates/technical.md +30 -0
  148. package/tsconfig.json +12 -0
  149. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,65 @@
1
+ function formatYamlValue(value) {
2
+ if (typeof value === 'string') {
3
+ // Quote strings that contain characters problematic in YAML value position
4
+ if (/[:#{}[\],&*?|>%@`]/.test(value) || value.includes('\n')) {
5
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
6
+ }
7
+ return value;
8
+ }
9
+ return String(value);
10
+ }
11
+ /**
12
+ * Build a SOUL.md file content string from a SoulConfig.
13
+ */
14
+ export function buildSoulMd(config, bodyMarkdown) {
15
+ const lines = ['---'];
16
+ lines.push(`name: ${formatYamlValue(config.name)}`);
17
+ lines.push(`pronouns: ${formatYamlValue(config.pronouns)}`);
18
+ lines.push(`errorStyle: ${formatYamlValue(config.errorStyle)}`);
19
+ // Tone
20
+ lines.push('tone:');
21
+ lines.push(` warmth: ${config.tone.warmth}`);
22
+ lines.push(` directness: ${config.tone.directness}`);
23
+ lines.push(` humor: ${config.tone.humor}`);
24
+ lines.push(` formality: ${config.tone.formality}`);
25
+ // Expertise
26
+ if (config.expertise.length > 0) {
27
+ lines.push('expertise:');
28
+ for (const item of config.expertise) {
29
+ lines.push(` - ${formatYamlValue(item)}`);
30
+ }
31
+ }
32
+ // Catchphrases
33
+ const catchphraseEntries = Object.entries(config.catchphrases);
34
+ if (catchphraseEntries.length > 0) {
35
+ lines.push('catchphrases:');
36
+ for (const [key, value] of catchphraseEntries) {
37
+ lines.push(` ${key}: ${formatYamlValue(value)}`);
38
+ }
39
+ }
40
+ // Boundaries
41
+ const hasJokeBoundaries = config.boundaries.neverJokeAbout.length > 0;
42
+ const hasAdviseBoundaries = config.boundaries.neverAdviseOn.length > 0;
43
+ if (hasJokeBoundaries || hasAdviseBoundaries) {
44
+ lines.push('boundaries:');
45
+ if (hasJokeBoundaries) {
46
+ lines.push(' neverJokeAbout:');
47
+ for (const item of config.boundaries.neverJokeAbout) {
48
+ lines.push(` - ${formatYamlValue(item)}`);
49
+ }
50
+ }
51
+ if (hasAdviseBoundaries) {
52
+ lines.push(' neverAdviseOn:');
53
+ for (const item of config.boundaries.neverAdviseOn) {
54
+ lines.push(` - ${formatYamlValue(item)}`);
55
+ }
56
+ }
57
+ }
58
+ lines.push('---');
59
+ if (bodyMarkdown) {
60
+ lines.push('');
61
+ lines.push(bodyMarkdown);
62
+ }
63
+ return lines.join('\n') + '\n';
64
+ }
65
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { SoulConfig } from './types.js';
2
+ export interface ConversationQuestion {
3
+ id: string;
4
+ text: string;
5
+ hint?: string;
6
+ }
7
+ export interface ConversationStep {
8
+ question: ConversationQuestion;
9
+ warning?: string;
10
+ done: false;
11
+ }
12
+ export interface ConversationComplete {
13
+ config: SoulConfig;
14
+ soulMd: string;
15
+ warnings?: string[];
16
+ done: true;
17
+ }
18
+ export type ConversationResult = ConversationStep | ConversationComplete;
19
+ export declare class SoulConversationBuilder {
20
+ private currentStep;
21
+ private partial;
22
+ private lastWarning?;
23
+ startConversation(): ConversationResult;
24
+ processAnswer(answer: string): ConversationResult;
25
+ getProgress(): number;
26
+ private applyAnswer;
27
+ private buildConfig;
28
+ private inferTone;
29
+ }
30
+ //# sourceMappingURL=conversation-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-builder.d.ts","sourceRoot":"","sources":["../src/conversation-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AAI3D,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAqFzE,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAS;IAE7B,iBAAiB,IAAI,kBAAkB;IAUvC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IA2BjD,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,WAAW;IAyFnB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,SAAS;CAelB"}
@@ -0,0 +1,232 @@
1
+ import { buildSoulMd } from './builder.js';
2
+ import { scanAllStringFields } from './marketplace/scanner.js';
3
+ const NAME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9 _-]{0,63}$/;
4
+ const VALID_ERROR_STYLES = [
5
+ 'professional',
6
+ 'apologetic',
7
+ 'matter_of_fact',
8
+ 'self_deprecating',
9
+ 'gentle',
10
+ 'detailed',
11
+ 'encouraging',
12
+ 'terse',
13
+ 'educational',
14
+ ];
15
+ const QUESTIONS = [
16
+ {
17
+ id: 'name',
18
+ text: 'What should I call myself? Pick a name for your AI assistant.',
19
+ hint: 'e.g. Nova, Atlas, Jasper, or any name you like',
20
+ },
21
+ {
22
+ id: 'error_style',
23
+ text: 'When I make a mistake or hit an error, how should I communicate it?',
24
+ hint: 'Options: professional, apologetic, matter_of_fact, self_deprecating, gentle, detailed, encouraging, terse, educational',
25
+ },
26
+ {
27
+ id: 'humor',
28
+ text: 'How much humor should I use? (0 = serious, 10 = maximum fun)',
29
+ hint: 'Enter a number from 0 to 10',
30
+ },
31
+ {
32
+ id: 'advice_boundaries',
33
+ text: 'Are there topics I should never give advice on? (comma-separated, or "none")',
34
+ hint: 'e.g. legal, medical, financial',
35
+ },
36
+ {
37
+ id: 'joke_boundaries',
38
+ text: 'Are there topics I should never joke about? (comma-separated, or "none")',
39
+ hint: 'e.g. health, politics, religion',
40
+ },
41
+ {
42
+ id: 'expertise',
43
+ text: 'What are my areas of expertise? (comma-separated, or "general")',
44
+ hint: 'e.g. TypeScript, DevOps, Python, Data Science',
45
+ },
46
+ {
47
+ id: 'catchphrases',
48
+ text: 'Any catchphrases you want me to use? Format: greeting=Hello there!, farewell=See ya! (or "none")',
49
+ hint: 'key=value pairs separated by commas',
50
+ },
51
+ {
52
+ id: 'communication_style',
53
+ text: 'Describe your preferred communication style in a few words.',
54
+ hint: 'e.g. warm and casual, formal and precise, brief and direct',
55
+ },
56
+ ];
57
+ /** Check tone values for unusual combinations. */
58
+ function checkToneCoherence(tone) {
59
+ const warnings = [];
60
+ if (tone.humor > 0.8 && tone.formality > 0.8) {
61
+ warnings.push('High humor + high formality is unusual. The result may feel inconsistent.');
62
+ }
63
+ if (tone.warmth < 0.2 && tone.humor > 0.6) {
64
+ warnings.push('Low warmth + high humor can come across as mean-spirited.');
65
+ }
66
+ if (tone.directness > 0.9 && tone.warmth > 0.9) {
67
+ warnings.push('Very direct + very warm can feel contradictory.');
68
+ }
69
+ return warnings;
70
+ }
71
+ export class SoulConversationBuilder {
72
+ currentStep = 0;
73
+ partial = {};
74
+ lastWarning;
75
+ startConversation() {
76
+ this.currentStep = 0;
77
+ this.partial = {};
78
+ this.lastWarning = undefined;
79
+ return {
80
+ question: QUESTIONS[0],
81
+ done: false,
82
+ };
83
+ }
84
+ processAnswer(answer) {
85
+ const questionId = QUESTIONS[this.currentStep].id;
86
+ this.lastWarning = undefined;
87
+ this.applyAnswer(questionId, answer.trim());
88
+ this.currentStep++;
89
+ if (this.currentStep >= QUESTIONS.length) {
90
+ const config = this.buildConfig();
91
+ const warnings = checkToneCoherence(config.tone);
92
+ return {
93
+ config,
94
+ soulMd: buildSoulMd(config),
95
+ warnings: warnings.length > 0 ? warnings : undefined,
96
+ done: true,
97
+ };
98
+ }
99
+ const step = {
100
+ question: QUESTIONS[this.currentStep],
101
+ done: false,
102
+ };
103
+ if (this.lastWarning) {
104
+ step.warning = this.lastWarning;
105
+ }
106
+ return step;
107
+ }
108
+ getProgress() {
109
+ return Math.round((this.currentStep / QUESTIONS.length) * 100);
110
+ }
111
+ applyAnswer(questionId, answer) {
112
+ switch (questionId) {
113
+ case 'name':
114
+ if (answer && NAME_REGEX.test(answer)) {
115
+ this.partial.name = answer;
116
+ }
117
+ else if (answer) {
118
+ this.partial.name = 'Auxiora';
119
+ this.lastWarning = `Name "${answer}" contains invalid characters. Using default "Auxiora".`;
120
+ }
121
+ else {
122
+ this.partial.name = 'Auxiora';
123
+ }
124
+ break;
125
+ case 'error_style': {
126
+ const normalized = answer.toLowerCase().replace(/[\s-]/g, '_');
127
+ this.partial.errorStyle = VALID_ERROR_STYLES.includes(normalized) ? normalized : 'professional';
128
+ break;
129
+ }
130
+ case 'humor': {
131
+ const parsed = parseInt(answer, 10);
132
+ this.partial.humor = Number.isNaN(parsed) ? 0.3 : Math.max(0, Math.min(10, parsed)) / 10;
133
+ break;
134
+ }
135
+ case 'advice_boundaries': {
136
+ if (answer.toLowerCase() === 'none' || !answer) {
137
+ this.partial.boundaries = { ...this.partial.boundaries ?? { neverJokeAbout: [], neverAdviseOn: [] }, neverAdviseOn: [] };
138
+ }
139
+ else {
140
+ const items = answer.split(',').map(s => s.trim()).filter(Boolean);
141
+ this.partial.boundaries = { ...this.partial.boundaries ?? { neverJokeAbout: [], neverAdviseOn: [] }, neverAdviseOn: items };
142
+ }
143
+ break;
144
+ }
145
+ case 'joke_boundaries': {
146
+ if (answer.toLowerCase() === 'none' || !answer) {
147
+ this.partial.boundaries = { ...this.partial.boundaries ?? { neverJokeAbout: [], neverAdviseOn: [] }, neverJokeAbout: [] };
148
+ }
149
+ else {
150
+ const items = answer.split(',').map(s => s.trim()).filter(Boolean);
151
+ this.partial.boundaries = { ...this.partial.boundaries ?? { neverJokeAbout: [], neverAdviseOn: [] }, neverJokeAbout: items };
152
+ }
153
+ break;
154
+ }
155
+ case 'expertise': {
156
+ if (answer.toLowerCase() === 'general' || !answer) {
157
+ this.partial.expertise = [];
158
+ }
159
+ else {
160
+ this.partial.expertise = answer.split(',').map(s => s.trim()).filter(Boolean);
161
+ }
162
+ break;
163
+ }
164
+ case 'catchphrases': {
165
+ if (answer.toLowerCase() === 'none' || !answer) {
166
+ this.partial.catchphrases = {};
167
+ }
168
+ else {
169
+ const phrases = {};
170
+ const pairs = answer.split(',');
171
+ for (const pair of pairs) {
172
+ const eqIndex = pair.indexOf('=');
173
+ if (eqIndex > 0) {
174
+ const key = pair.slice(0, eqIndex).trim();
175
+ const value = pair.slice(eqIndex + 1).trim();
176
+ if (key && value) {
177
+ phrases[key] = value;
178
+ }
179
+ }
180
+ }
181
+ // Scan catchphrases for injection patterns
182
+ const scanResult = scanAllStringFields(phrases);
183
+ if (!scanResult.clean) {
184
+ this.partial.catchphrases = {};
185
+ this.lastWarning = 'Catchphrases contain disallowed patterns and were rejected.';
186
+ }
187
+ else {
188
+ this.partial.catchphrases = phrases;
189
+ }
190
+ }
191
+ break;
192
+ }
193
+ case 'communication_style':
194
+ this.partial.communicationStyle = answer || 'balanced';
195
+ break;
196
+ }
197
+ }
198
+ buildConfig() {
199
+ const style = this.partial.communicationStyle?.toLowerCase() ?? 'balanced';
200
+ const tone = this.inferTone(style);
201
+ return {
202
+ name: this.partial.name ?? 'Auxiora',
203
+ pronouns: this.partial.pronouns ?? 'they/them',
204
+ tone: {
205
+ warmth: tone.warmth,
206
+ directness: tone.directness,
207
+ humor: this.partial.humor ?? 0.3,
208
+ formality: tone.formality,
209
+ },
210
+ expertise: this.partial.expertise ?? [],
211
+ errorStyle: this.partial.errorStyle ?? 'professional',
212
+ catchphrases: this.partial.catchphrases ?? {},
213
+ boundaries: this.partial.boundaries ?? { neverJokeAbout: [], neverAdviseOn: [] },
214
+ };
215
+ }
216
+ inferTone(style) {
217
+ if (/warm|friendly|casual/.test(style)) {
218
+ return { warmth: 0.8, directness: 0.5, formality: 0.2 };
219
+ }
220
+ if (/formal|precise|professional/.test(style)) {
221
+ return { warmth: 0.4, directness: 0.7, formality: 0.8 };
222
+ }
223
+ if (/brief|direct|concise/.test(style)) {
224
+ return { warmth: 0.4, directness: 0.9, formality: 0.5 };
225
+ }
226
+ if (/playful|fun/.test(style)) {
227
+ return { warmth: 0.9, directness: 0.4, formality: 0.1 };
228
+ }
229
+ return { warmth: 0.6, directness: 0.6, formality: 0.5 };
230
+ }
231
+ }
232
+ //# sourceMappingURL=conversation-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-builder.js","sourceRoot":"","sources":["../src/conversation-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Escalation state machine for response severity management.
3
+ * Tracks escalation level across a session and dampens personality tone accordingly.
4
+ */
5
+ import type { ToneSettings } from './types.js';
6
+ export declare const ESCALATION_LEVELS: readonly ["normal", "caution", "serious", "lockdown"];
7
+ export type EscalationLevel = (typeof ESCALATION_LEVELS)[number];
8
+ export declare const SEVERITY_LEVELS: readonly ["low", "medium", "high", "critical"];
9
+ export type SeverityLevel = (typeof SEVERITY_LEVELS)[number];
10
+ export declare const RESPONSE_CATEGORIES: readonly ["uncertainty", "access_failure", "policy_block", "destructive_confirmation", "security_incident", "rate_limit", "provider_unavailable", "partial_success"];
11
+ export type ResponseCategory = (typeof RESPONSE_CATEGORIES)[number];
12
+ export interface EscalationTableEntry {
13
+ severity: SeverityLevel;
14
+ securityFloorRequired: boolean;
15
+ canonicalPhrase: string;
16
+ }
17
+ export declare const ESCALATION_TABLE: Record<ResponseCategory, EscalationTableEntry>;
18
+ export interface EscalationState {
19
+ level: EscalationLevel;
20
+ lastEvent?: ResponseCategory;
21
+ enteredAt?: number;
22
+ }
23
+ export declare class EscalationStateMachine {
24
+ private state;
25
+ private securityFloor;
26
+ /** Process a response category event and transition escalation state. */
27
+ processEvent(event: ResponseCategory): EscalationState;
28
+ /** Resolve toward normal. Transitions one step down. */
29
+ resolve(): EscalationState;
30
+ /** Get current escalation state. */
31
+ getState(): EscalationState;
32
+ /** Dampen tone values based on current escalation level. */
33
+ dampenTone(tone: ToneSettings): ToneSettings;
34
+ }
35
+ //# sourceMappingURL=escalation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../src/escalation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,eAAO,MAAM,iBAAiB,uDAAwD,CAAC;AACvF,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe,gDAAiD,CAAC;AAC9E,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAO,MAAM,mBAAmB,sKAStB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,aAAa,CAAC;IACxB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,CAyC3E,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,aAAa,CAAuB;IAE5C,yEAAyE;IACzE,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe;IAkBtD,wDAAwD;IACxD,OAAO,IAAI,eAAe;IAiB1B,oCAAoC;IACpC,QAAQ,IAAI,eAAe;IAI3B,4DAA4D;IAC5D,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY;CAmB7C"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Escalation state machine for response severity management.
3
+ * Tracks escalation level across a session and dampens personality tone accordingly.
4
+ */
5
+ import { SecurityFloor } from './security-floor.js';
6
+ export const ESCALATION_LEVELS = ['normal', 'caution', 'serious', 'lockdown'];
7
+ export const SEVERITY_LEVELS = ['low', 'medium', 'high', 'critical'];
8
+ export const RESPONSE_CATEGORIES = [
9
+ 'uncertainty',
10
+ 'access_failure',
11
+ 'policy_block',
12
+ 'destructive_confirmation',
13
+ 'security_incident',
14
+ 'rate_limit',
15
+ 'provider_unavailable',
16
+ 'partial_success',
17
+ ];
18
+ export const ESCALATION_TABLE = {
19
+ uncertainty: {
20
+ severity: 'low',
21
+ securityFloorRequired: false,
22
+ canonicalPhrase: "I don't have enough information to answer that confidently.",
23
+ },
24
+ access_failure: {
25
+ severity: 'medium',
26
+ securityFloorRequired: false,
27
+ canonicalPhrase: "I can't reach that resource right now.",
28
+ },
29
+ policy_block: {
30
+ severity: 'medium',
31
+ securityFloorRequired: true,
32
+ canonicalPhrase: 'That action is restricted by your configured policies.',
33
+ },
34
+ destructive_confirmation: {
35
+ severity: 'high',
36
+ securityFloorRequired: true,
37
+ canonicalPhrase: "This will [impact]. This cannot be undone. Type '[verb]' to confirm.",
38
+ },
39
+ security_incident: {
40
+ severity: 'critical',
41
+ securityFloorRequired: true,
42
+ canonicalPhrase: "I've detected something unusual. Here's what I see.",
43
+ },
44
+ rate_limit: {
45
+ severity: 'low',
46
+ securityFloorRequired: false,
47
+ canonicalPhrase: "I've hit a rate limit. I'll retry in [N] seconds.",
48
+ },
49
+ provider_unavailable: {
50
+ severity: 'medium',
51
+ securityFloorRequired: false,
52
+ canonicalPhrase: "My AI provider isn't responding. Trying fallback.",
53
+ },
54
+ partial_success: {
55
+ severity: 'low',
56
+ securityFloorRequired: false,
57
+ canonicalPhrase: "I completed part of that. Here's what worked and what didn't.",
58
+ },
59
+ };
60
+ const SEVERITY_TO_LEVEL = {
61
+ low: 'caution',
62
+ medium: 'serious',
63
+ high: 'lockdown',
64
+ critical: 'lockdown',
65
+ };
66
+ const LEVEL_ORDER = {
67
+ normal: 0,
68
+ caution: 1,
69
+ serious: 2,
70
+ lockdown: 3,
71
+ };
72
+ export class EscalationStateMachine {
73
+ state = { level: 'normal' };
74
+ securityFloor = new SecurityFloor();
75
+ /** Process a response category event and transition escalation state. */
76
+ processEvent(event) {
77
+ const entry = ESCALATION_TABLE[event];
78
+ const targetLevel = SEVERITY_TO_LEVEL[entry.severity];
79
+ // Only escalate upward, never downward from an event
80
+ if (LEVEL_ORDER[targetLevel] > LEVEL_ORDER[this.state.level]) {
81
+ this.state = {
82
+ level: targetLevel,
83
+ lastEvent: event,
84
+ enteredAt: Date.now(),
85
+ };
86
+ }
87
+ else {
88
+ this.state = { ...this.state, lastEvent: event };
89
+ }
90
+ return { ...this.state };
91
+ }
92
+ /** Resolve toward normal. Transitions one step down. */
93
+ resolve() {
94
+ switch (this.state.level) {
95
+ case 'lockdown':
96
+ this.state = { level: 'normal', enteredAt: Date.now() };
97
+ break;
98
+ case 'serious':
99
+ this.state = { level: 'normal', enteredAt: Date.now() };
100
+ break;
101
+ case 'caution':
102
+ this.state = { level: 'normal', enteredAt: Date.now() };
103
+ break;
104
+ case 'normal':
105
+ break;
106
+ }
107
+ return { ...this.state };
108
+ }
109
+ /** Get current escalation state. */
110
+ getState() {
111
+ return { ...this.state };
112
+ }
113
+ /** Dampen tone values based on current escalation level. */
114
+ dampenTone(tone) {
115
+ switch (this.state.level) {
116
+ case 'normal':
117
+ return { ...tone };
118
+ case 'caution':
119
+ return {
120
+ ...tone,
121
+ humor: tone.humor * 0.5,
122
+ };
123
+ case 'serious':
124
+ return {
125
+ ...tone,
126
+ humor: 0,
127
+ directness: Math.max(tone.directness, 0.6),
128
+ };
129
+ case 'lockdown':
130
+ return this.securityFloor.applyFloor(tone);
131
+ }
132
+ }
133
+ }
134
+ //# sourceMappingURL=escalation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation.js","sourceRoot":"","sources":["../src/escalation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type { PersonalityTemplate, SoulConfig, ToneSettings } from './types.js';
2
+ export { parseSoulMd } from './parser.js';
3
+ export { buildSoulMd } from './builder.js';
4
+ export { PersonalityManager } from './manager.js';
5
+ export { SoulConversationBuilder } from './conversation-builder.js';
6
+ export type { ConversationQuestion, ConversationStep, ConversationComplete, ConversationResult } from './conversation-builder.js';
7
+ export { ModeLoader } from './modes/mode-loader.js';
8
+ export { ModeDetector } from './modes/mode-detector.js';
9
+ export { PromptAssembler } from './modes/prompt-assembler.js';
10
+ export type { ModeId, ModeTemplate, ModeSignal, ModeDetectionResult, UserPreferences, SessionModeState, } from './modes/types.js';
11
+ export { MODE_IDS, DEFAULT_PREFERENCES, DEFAULT_SESSION_MODE_STATE } from './modes/types.js';
12
+ export { getVoiceProfile, listVoiceProfiles, DEFAULT_VOICE_PROFILE, type VoiceProfile, } from './voice-profiles.js';
13
+ export { SecurityFloor, SECURITY_TOOL_PATTERNS, SECURITY_MESSAGE_PATTERNS } from './security-floor.js';
14
+ export type { SecurityContext, SecurityFloorRule, SecurityDetectionInput } from './security-floor.js';
15
+ export { EscalationStateMachine, ESCALATION_LEVELS, SEVERITY_LEVELS, RESPONSE_CATEGORIES, ESCALATION_TABLE, } from './escalation.js';
16
+ export type { EscalationLevel, SeverityLevel, ResponseCategory, EscalationState, EscalationTableEntry, } from './escalation.js';
17
+ export { scanString, scanAllStringFields, BLOCKED_PATTERNS } from './marketplace/scanner.js';
18
+ export type { ScanViolation, ScanResult } from './marketplace/scanner.js';
19
+ export { validatePersonalityConfig, PersonalityConfigSchema, FORBIDDEN_FIELD_NAMES, FORBIDDEN_FIELD_PATTERNS, } from './marketplace/schema.js';
20
+ export type { ValidationResult } from './marketplace/schema.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAElI,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EACV,MAAM,EACN,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE7F,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACvG,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEtG,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC7F,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ export { parseSoulMd } from './parser.js';
2
+ export { buildSoulMd } from './builder.js';
3
+ export { PersonalityManager } from './manager.js';
4
+ export { SoulConversationBuilder } from './conversation-builder.js';
5
+ // Modes system
6
+ export { ModeLoader } from './modes/mode-loader.js';
7
+ export { ModeDetector } from './modes/mode-detector.js';
8
+ export { PromptAssembler } from './modes/prompt-assembler.js';
9
+ export { MODE_IDS, DEFAULT_PREFERENCES, DEFAULT_SESSION_MODE_STATE } from './modes/types.js';
10
+ // [P15] Voice profiles
11
+ export { getVoiceProfile, listVoiceProfiles, DEFAULT_VOICE_PROFILE, } from './voice-profiles.js';
12
+ // Security floor
13
+ export { SecurityFloor, SECURITY_TOOL_PATTERNS, SECURITY_MESSAGE_PATTERNS } from './security-floor.js';
14
+ // Escalation
15
+ export { EscalationStateMachine, ESCALATION_LEVELS, SEVERITY_LEVELS, RESPONSE_CATEGORIES, ESCALATION_TABLE, } from './escalation.js';
16
+ // Marketplace scanner
17
+ export { scanString, scanAllStringFields, BLOCKED_PATTERNS } from './marketplace/scanner.js';
18
+ // Marketplace schema
19
+ export { validatePersonalityConfig, PersonalityConfigSchema, FORBIDDEN_FIELD_NAMES, FORBIDDEN_FIELD_PATTERNS, } from './marketplace/schema.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAS9D,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC7F,uBAAuB;AACvB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAC7B,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEvG,aAAa;AACb,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAQzB,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE7F,qBAAqB;AACrB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { PersonalityTemplate, SoulConfig } from './types.js';
2
+ export declare class PersonalityManager {
3
+ private templatesDir;
4
+ private workspaceDir;
5
+ constructor(templatesDir: string, workspaceDir: string);
6
+ /**
7
+ * List all available personality templates from the templates directory.
8
+ */
9
+ listTemplates(): Promise<PersonalityTemplate[]>;
10
+ /**
11
+ * Get a specific personality template by ID.
12
+ */
13
+ getTemplate(id: string): Promise<PersonalityTemplate | undefined>;
14
+ /**
15
+ * Apply a template by copying its content to the workspace SOUL.md.
16
+ */
17
+ applyTemplate(id: string): Promise<void>;
18
+ /**
19
+ * Read and parse the current SOUL.md from the workspace.
20
+ */
21
+ getCurrentPersonality(): Promise<SoulConfig | undefined>;
22
+ /**
23
+ * Build a custom SOUL.md from a SoulConfig and write it to the workspace.
24
+ */
25
+ buildCustom(config: SoulConfig, bodyMarkdown?: string): Promise<string>;
26
+ private loadTemplateFile;
27
+ }
28
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIlE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAKtD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAiBrD;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAKvE;;OAEG;IACG,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9C;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAU9D;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAQ/D,gBAAgB;CAmC/B"}