@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,150 @@
1
+ import { z } from 'zod';
2
+ export declare const PersonalityConfigSchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ version: z.ZodString;
5
+ author: z.ZodString;
6
+ description: z.ZodOptional<z.ZodString>;
7
+ license: z.ZodOptional<z.ZodEnum<["MIT", "CC-BY-4.0", "CC-BY-SA-4.0", "CC0", "proprietary"]>>;
8
+ tone: z.ZodOptional<z.ZodObject<{
9
+ warmth: z.ZodOptional<z.ZodNumber>;
10
+ directness: z.ZodOptional<z.ZodNumber>;
11
+ humor: z.ZodOptional<z.ZodNumber>;
12
+ formality: z.ZodOptional<z.ZodNumber>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ humor?: number | undefined;
15
+ warmth?: number | undefined;
16
+ directness?: number | undefined;
17
+ formality?: number | undefined;
18
+ }, {
19
+ humor?: number | undefined;
20
+ warmth?: number | undefined;
21
+ directness?: number | undefined;
22
+ formality?: number | undefined;
23
+ }>>;
24
+ errorStyle: z.ZodOptional<z.ZodEnum<["professional", "apologetic", "matter_of_fact", "self_deprecating", "gentle", "detailed", "encouraging", "terse", "educational"]>>;
25
+ catchphrases: z.ZodOptional<z.ZodObject<{
26
+ greeting: z.ZodOptional<z.ZodString>;
27
+ farewell: z.ZodOptional<z.ZodString>;
28
+ thinking: z.ZodOptional<z.ZodString>;
29
+ success: z.ZodOptional<z.ZodString>;
30
+ error: z.ZodOptional<z.ZodString>;
31
+ }, "strip", z.ZodTypeAny, {
32
+ error?: string | undefined;
33
+ greeting?: string | undefined;
34
+ farewell?: string | undefined;
35
+ thinking?: string | undefined;
36
+ success?: string | undefined;
37
+ }, {
38
+ error?: string | undefined;
39
+ greeting?: string | undefined;
40
+ farewell?: string | undefined;
41
+ thinking?: string | undefined;
42
+ success?: string | undefined;
43
+ }>>;
44
+ expertise: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
45
+ boundaries: z.ZodOptional<z.ZodObject<{
46
+ neverJokeAbout: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
47
+ neverAdviseOn: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ neverJokeAbout?: string[] | undefined;
50
+ neverAdviseOn?: string[] | undefined;
51
+ }, {
52
+ neverJokeAbout?: string[] | undefined;
53
+ neverAdviseOn?: string[] | undefined;
54
+ }>>;
55
+ bodyMarkdown: z.ZodOptional<z.ZodString>;
56
+ voiceProfile: z.ZodOptional<z.ZodObject<{
57
+ voice: z.ZodOptional<z.ZodEnum<["alloy", "echo", "fable", "nova", "onyx", "shimmer"]>>;
58
+ speed: z.ZodOptional<z.ZodNumber>;
59
+ pauseDuration: z.ZodOptional<z.ZodNumber>;
60
+ useFillers: z.ZodOptional<z.ZodBoolean>;
61
+ fillerFrequency: z.ZodOptional<z.ZodNumber>;
62
+ }, "strip", z.ZodTypeAny, {
63
+ voice?: "onyx" | "nova" | "fable" | "echo" | "shimmer" | "alloy" | undefined;
64
+ speed?: number | undefined;
65
+ pauseDuration?: number | undefined;
66
+ useFillers?: boolean | undefined;
67
+ fillerFrequency?: number | undefined;
68
+ }, {
69
+ voice?: "onyx" | "nova" | "fable" | "echo" | "shimmer" | "alloy" | undefined;
70
+ speed?: number | undefined;
71
+ pauseDuration?: number | undefined;
72
+ useFillers?: boolean | undefined;
73
+ fillerFrequency?: number | undefined;
74
+ }>>;
75
+ }, "strict", z.ZodTypeAny, {
76
+ name: string;
77
+ version: string;
78
+ author: string;
79
+ expertise?: string[] | undefined;
80
+ catchphrases?: {
81
+ error?: string | undefined;
82
+ greeting?: string | undefined;
83
+ farewell?: string | undefined;
84
+ thinking?: string | undefined;
85
+ success?: string | undefined;
86
+ } | undefined;
87
+ tone?: {
88
+ humor?: number | undefined;
89
+ warmth?: number | undefined;
90
+ directness?: number | undefined;
91
+ formality?: number | undefined;
92
+ } | undefined;
93
+ description?: string | undefined;
94
+ license?: "MIT" | "CC-BY-4.0" | "CC-BY-SA-4.0" | "CC0" | "proprietary" | undefined;
95
+ errorStyle?: "professional" | "apologetic" | "matter_of_fact" | "self_deprecating" | "gentle" | "detailed" | "encouraging" | "terse" | "educational" | undefined;
96
+ boundaries?: {
97
+ neverJokeAbout?: string[] | undefined;
98
+ neverAdviseOn?: string[] | undefined;
99
+ } | undefined;
100
+ bodyMarkdown?: string | undefined;
101
+ voiceProfile?: {
102
+ voice?: "onyx" | "nova" | "fable" | "echo" | "shimmer" | "alloy" | undefined;
103
+ speed?: number | undefined;
104
+ pauseDuration?: number | undefined;
105
+ useFillers?: boolean | undefined;
106
+ fillerFrequency?: number | undefined;
107
+ } | undefined;
108
+ }, {
109
+ name: string;
110
+ version: string;
111
+ author: string;
112
+ expertise?: string[] | undefined;
113
+ catchphrases?: {
114
+ error?: string | undefined;
115
+ greeting?: string | undefined;
116
+ farewell?: string | undefined;
117
+ thinking?: string | undefined;
118
+ success?: string | undefined;
119
+ } | undefined;
120
+ tone?: {
121
+ humor?: number | undefined;
122
+ warmth?: number | undefined;
123
+ directness?: number | undefined;
124
+ formality?: number | undefined;
125
+ } | undefined;
126
+ description?: string | undefined;
127
+ license?: "MIT" | "CC-BY-4.0" | "CC-BY-SA-4.0" | "CC0" | "proprietary" | undefined;
128
+ errorStyle?: "professional" | "apologetic" | "matter_of_fact" | "self_deprecating" | "gentle" | "detailed" | "encouraging" | "terse" | "educational" | undefined;
129
+ boundaries?: {
130
+ neverJokeAbout?: string[] | undefined;
131
+ neverAdviseOn?: string[] | undefined;
132
+ } | undefined;
133
+ bodyMarkdown?: string | undefined;
134
+ voiceProfile?: {
135
+ voice?: "onyx" | "nova" | "fable" | "echo" | "shimmer" | "alloy" | undefined;
136
+ speed?: number | undefined;
137
+ pauseDuration?: number | undefined;
138
+ useFillers?: boolean | undefined;
139
+ fillerFrequency?: number | undefined;
140
+ } | undefined;
141
+ }>;
142
+ export declare const FORBIDDEN_FIELD_NAMES: readonly string[];
143
+ export declare const FORBIDDEN_FIELD_PATTERNS: readonly RegExp[];
144
+ export interface ValidationResult {
145
+ valid: boolean;
146
+ errors: string[];
147
+ warnings: string[];
148
+ }
149
+ export declare function validatePersonalityConfig(raw: unknown): ValidationResult;
150
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/marketplace/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8DzB,CAAC;AAEZ,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAQlD,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAMrD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAgDxE"}
@@ -0,0 +1,122 @@
1
+ import { z } from 'zod';
2
+ import { scanAllStringFields } from './scanner.js';
3
+ export const PersonalityConfigSchema = z
4
+ .object({
5
+ name: z
6
+ .string()
7
+ .max(64)
8
+ .regex(/^[a-zA-Z0-9][a-zA-Z0-9 _-]*$/),
9
+ version: z.string().regex(/^\d+\.\d+\.\d+$/),
10
+ author: z.string().max(128),
11
+ description: z.string().max(512).optional(),
12
+ license: z
13
+ .enum(['MIT', 'CC-BY-4.0', 'CC-BY-SA-4.0', 'CC0', 'proprietary'])
14
+ .optional(),
15
+ tone: z
16
+ .object({
17
+ warmth: z.number().min(0).max(1).optional(),
18
+ directness: z.number().min(0).max(1).optional(),
19
+ humor: z.number().min(0).max(1).optional(),
20
+ formality: z.number().min(0).max(1).optional(),
21
+ })
22
+ .optional(),
23
+ errorStyle: z
24
+ .enum([
25
+ 'professional',
26
+ 'apologetic',
27
+ 'matter_of_fact',
28
+ 'self_deprecating',
29
+ 'gentle',
30
+ 'detailed',
31
+ 'encouraging',
32
+ 'terse',
33
+ 'educational',
34
+ ])
35
+ .optional(),
36
+ catchphrases: z
37
+ .object({
38
+ greeting: z.string().max(256).optional(),
39
+ farewell: z.string().max(256).optional(),
40
+ thinking: z.string().max(256).optional(),
41
+ success: z.string().max(256).optional(),
42
+ error: z.string().max(256).optional(),
43
+ })
44
+ .optional(),
45
+ expertise: z.array(z.string().max(64)).max(20).optional(),
46
+ boundaries: z
47
+ .object({
48
+ neverJokeAbout: z.array(z.string().max(64)).max(20).optional(),
49
+ neverAdviseOn: z.array(z.string().max(64)).max(20).optional(),
50
+ })
51
+ .optional(),
52
+ bodyMarkdown: z.string().max(4096).optional(),
53
+ voiceProfile: z
54
+ .object({
55
+ voice: z
56
+ .enum(['alloy', 'echo', 'fable', 'nova', 'onyx', 'shimmer'])
57
+ .optional(),
58
+ speed: z.number().min(0.5).max(2.0).optional(),
59
+ pauseDuration: z.number().int().min(100).max(1000).optional(),
60
+ useFillers: z.boolean().optional(),
61
+ fillerFrequency: z.number().min(0).max(0.5).optional(),
62
+ })
63
+ .optional(),
64
+ })
65
+ .strict();
66
+ export const FORBIDDEN_FIELD_NAMES = [
67
+ 'corePrinciples',
68
+ 'securityFloor',
69
+ 'confirmationPatterns',
70
+ 'auditBehavior',
71
+ 'systemPrompt',
72
+ 'modes',
73
+ 'preferences',
74
+ ];
75
+ export const FORBIDDEN_FIELD_PATTERNS = [
76
+ /prompt/i,
77
+ /system/i,
78
+ /instruction/i,
79
+ /override/i,
80
+ /ignore/i,
81
+ ];
82
+ export function validatePersonalityConfig(raw) {
83
+ const errors = [];
84
+ const warnings = [];
85
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
86
+ return { valid: false, errors: ['Input must be a non-null object'], warnings };
87
+ }
88
+ const obj = raw;
89
+ // Check forbidden field names
90
+ for (const key of Object.keys(obj)) {
91
+ if (FORBIDDEN_FIELD_NAMES.includes(key)) {
92
+ errors.push(`Forbidden field name: "${key}"`);
93
+ }
94
+ }
95
+ // Check forbidden field name patterns
96
+ for (const key of Object.keys(obj)) {
97
+ for (const pattern of FORBIDDEN_FIELD_PATTERNS) {
98
+ if (pattern.test(key)) {
99
+ errors.push(`Field name "${key}" matches forbidden pattern: ${pattern}`);
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ // Parse with Zod schema
105
+ const result = PersonalityConfigSchema.safeParse(raw);
106
+ if (!result.success) {
107
+ for (const issue of result.error.issues) {
108
+ errors.push(`${issue.path.join('.')}: ${issue.message}`);
109
+ }
110
+ }
111
+ // Content scan (only if schema passed)
112
+ if (result.success) {
113
+ const scanResult = scanAllStringFields(obj);
114
+ if (!scanResult.clean) {
115
+ for (const violation of scanResult.violations) {
116
+ errors.push(`Content violation in "${violation.field}": matched pattern "${violation.pattern}"`);
117
+ }
118
+ }
119
+ }
120
+ return { valid: errors.length === 0, errors, warnings };
121
+ }
122
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/marketplace/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,EAAE,CAAC;SACP,KAAK,CAAC,8BAA8B,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC3C,OAAO,EAAE,CAAC;SACP,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;SAChE,QAAQ,EAAE;IACb,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KAC/C,CAAC;SACD,QAAQ,EAAE;IACb,UAAU,EAAE,CAAC;SACV,IAAI,CAAC;QACJ,cAAc;QACd,YAAY;QACZ,gBAAgB;QAChB,kBAAkB;QAClB,QAAQ;QACR,UAAU;QACV,aAAa;QACb,OAAO;QACP,aAAa;KACd,CAAC;SACD,QAAQ,EAAE;IACb,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACtC,CAAC;SACD,QAAQ,EAAE;IACb,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzD,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC9D,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC9D,CAAC;SACD,QAAQ,EAAE;IACb,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAC7C,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,KAAK,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;aAC3D,QAAQ,EAAE;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QAC9C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAC7D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACvD,CAAC;SACD,QAAQ,EAAE;CACd,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,eAAe;IACf,cAAc;IACd,OAAO;IACP,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,SAAS;IACT,SAAS;IACT,cAAc;IACd,WAAW;IACX,SAAS;CACV,CAAC;AAQF,MAAM,UAAU,yBAAyB,CAAC,GAAY;IACpD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,iCAAiC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,8BAA8B;IAC9B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,OAAO,IAAI,wBAAwB,EAAE,CAAC;YAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,eAAe,GAAG,gCAAgC,OAAO,EAAE,CAAC,CAAC;gBACzE,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,UAAU,GAAe,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CACT,yBAAyB,SAAS,CAAC,KAAK,uBAAuB,SAAS,CAAC,OAAO,GAAG,CACpF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mode-detector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-detector.test.d.ts","sourceRoot":"","sources":["../../../src/modes/__tests__/mode-detector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ModeDetector } from '../mode-detector.js';
3
+ function makeMode(id, signals) {
4
+ return { id, name: id, description: `${id} mode`, promptContent: `# ${id}`, signals };
5
+ }
6
+ function buildModes() {
7
+ const modes = new Map();
8
+ modes.set('operator', makeMode('operator', [
9
+ { phrase: 'run', weight: 0.8 }, { phrase: 'execute', weight: 0.8 },
10
+ { phrase: 'deploy', weight: 0.8 }, { phrase: 'status', weight: 0.6 },
11
+ ]));
12
+ modes.set('analyst', makeMode('analyst', [
13
+ { phrase: 'analyze', weight: 0.8 }, { phrase: 'investigate', weight: 0.8 },
14
+ { phrase: "what's the risk", weight: 0.9 }, { phrase: 'compare', weight: 0.7 },
15
+ ]));
16
+ modes.set('advisor', makeMode('advisor', [
17
+ { phrase: 'should i', weight: 0.8 }, { phrase: 'help me decide', weight: 0.9 },
18
+ { phrase: 'trade-offs', weight: 0.8 }, { phrase: 'options', weight: 0.6 },
19
+ ]));
20
+ modes.set('writer', makeMode('writer', [
21
+ { phrase: 'write', weight: 0.7 }, { phrase: 'draft', weight: 0.8 },
22
+ { phrase: 'blog post', weight: 0.9 }, { phrase: 'email', weight: 0.7 },
23
+ ]));
24
+ modes.set('socratic', makeMode('socratic', [
25
+ { phrase: 'challenge me', weight: 0.9 }, { phrase: 'red team', weight: 0.9 },
26
+ { phrase: 'what am i missing', weight: 0.8 }, { phrase: 'poke holes', weight: 0.8 },
27
+ ]));
28
+ modes.set('legal', makeMode('legal', [
29
+ { phrase: 'compliance', weight: 0.9 }, { phrase: 'regulation', weight: 0.8 },
30
+ { phrase: 'contract', weight: 0.8 }, { phrase: 'legal', weight: 0.8 },
31
+ ]));
32
+ modes.set('roast', makeMode('roast', [
33
+ { phrase: 'roast', weight: 0.9 }, { phrase: "don't sugarcoat", weight: 0.8 },
34
+ { phrase: 'give it to me straight', weight: 0.8 },
35
+ ]));
36
+ modes.set('companion', makeMode('companion', [
37
+ { phrase: 'how are you', weight: 0.4 }, { phrase: 'just chatting', weight: 0.6 },
38
+ { phrase: 'feeling', weight: 0.5 },
39
+ ]));
40
+ return modes;
41
+ }
42
+ describe('ModeDetector', () => {
43
+ const modes = buildModes();
44
+ const detector = new ModeDetector(modes);
45
+ it('should detect operator mode from "run" signals', () => {
46
+ const result = detector.detect('run the test suite and deploy');
47
+ expect(result).not.toBeNull();
48
+ expect(result.mode).toBe('operator');
49
+ });
50
+ it('should detect analyst mode from analysis signals', () => {
51
+ const result = detector.detect("analyze this data and what's the risk here");
52
+ expect(result).not.toBeNull();
53
+ expect(result.mode).toBe('analyst');
54
+ });
55
+ it('should detect advisor mode from decision signals', () => {
56
+ const result = detector.detect('should i go with option A? help me decide');
57
+ expect(result).not.toBeNull();
58
+ expect(result.mode).toBe('advisor');
59
+ });
60
+ it('should detect writer mode from writing signals', () => {
61
+ const result = detector.detect('draft a blog post about TypeScript');
62
+ expect(result).not.toBeNull();
63
+ expect(result.mode).toBe('writer');
64
+ });
65
+ it('should detect socratic mode from challenge signals', () => {
66
+ const result = detector.detect('challenge me on this. red team my plan');
67
+ expect(result).not.toBeNull();
68
+ expect(result.mode).toBe('socratic');
69
+ });
70
+ it('should detect legal mode from compliance signals', () => {
71
+ const result = detector.detect('check this contract for compliance issues');
72
+ expect(result).not.toBeNull();
73
+ expect(result.mode).toBe('legal');
74
+ });
75
+ it('should detect roast mode from roast signals', () => {
76
+ const result = detector.detect("roast my code, don't sugarcoat it");
77
+ expect(result).not.toBeNull();
78
+ expect(result.mode).toBe('roast');
79
+ });
80
+ it('should detect companion mode from casual signals', () => {
81
+ const result = detector.detect("how are you feeling today? just chatting");
82
+ expect(result).not.toBeNull();
83
+ expect(result.mode).toBe('companion');
84
+ });
85
+ it('should return null for empty messages', () => {
86
+ expect(detector.detect('')).toBeNull();
87
+ });
88
+ it('should return null for very short messages', () => {
89
+ expect(detector.detect('hi')).toBeNull();
90
+ });
91
+ it('should return null when no signals match', () => {
92
+ expect(detector.detect('tell me a random fact about penguins')).toBeNull();
93
+ });
94
+ it('should score higher with multiple matching keywords', () => {
95
+ const single = detector.detect('run this');
96
+ const multiple = detector.detect('run and execute, then deploy');
97
+ expect(single).not.toBeNull();
98
+ expect(multiple).not.toBeNull();
99
+ // Multiple matches should still resolve to operator
100
+ expect(multiple.mode).toBe('operator');
101
+ });
102
+ it('should apply hysteresis bias to current mode', () => {
103
+ // When current mode is "operator" and message has weak operator signal
104
+ const state = { activeMode: 'operator', autoDetected: true };
105
+ const result = detector.detect('check the status', { currentState: state });
106
+ expect(result).not.toBeNull();
107
+ expect(result.mode).toBe('operator');
108
+ });
109
+ it('should apply task type boosting for code messages', () => {
110
+ // "execute" is a weak operator signal; "code" task type should boost it
111
+ const withBoost = detector.detect('run and execute this', { taskType: 'code' });
112
+ expect(withBoost).not.toBeNull();
113
+ expect(withBoost.mode).toBe('operator');
114
+ });
115
+ it('should return candidates sorted by score', () => {
116
+ const result = detector.detect('analyze the status and run diagnostics');
117
+ expect(result).not.toBeNull();
118
+ expect(result.candidates.length).toBeGreaterThan(0);
119
+ // Candidates should be sorted descending by score
120
+ for (let i = 1; i < result.candidates.length; i++) {
121
+ expect(result.candidates[i - 1].score).toBeGreaterThanOrEqual(result.candidates[i].score);
122
+ }
123
+ });
124
+ it('should handle case-insensitive matching', () => {
125
+ const result = detector.detect('ANALYZE this data');
126
+ expect(result).not.toBeNull();
127
+ expect(result.mode).toBe('analyst');
128
+ });
129
+ });
130
+ //# sourceMappingURL=mode-detector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-detector.test.js","sourceRoot":"","sources":["../../../src/modes/__tests__/mode-detector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mode-loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-loader.test.d.ts","sourceRoot":"","sources":["../../../src/modes/__tests__/mode-loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ import { ModeLoader } from '../mode-loader.js';
6
+ describe('ModeLoader', () => {
7
+ let tmpDir;
8
+ let builtInDir;
9
+ let userDir;
10
+ beforeEach(async () => {
11
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'mode-loader-test-'));
12
+ builtInDir = path.join(tmpDir, 'built-in');
13
+ userDir = path.join(tmpDir, 'user');
14
+ await fs.mkdir(builtInDir, { recursive: true });
15
+ await fs.mkdir(userDir, { recursive: true });
16
+ });
17
+ afterEach(async () => {
18
+ await fs.rm(tmpDir, { recursive: true, force: true });
19
+ });
20
+ it('should load built-in mode files', async () => {
21
+ await fs.writeFile(path.join(builtInDir, 'operator.md'), `<!-- mode: operator\n name: Operator\n description: Fast execution\n signals: run:0.8, execute:0.7 -->\n# Operator mode content`);
22
+ await fs.writeFile(path.join(builtInDir, 'analyst.md'), `<!-- mode: analyst\n name: Analyst\n description: Deep analysis\n signals: analyze:0.8 -->\n# Analyst mode content`);
23
+ const loader = new ModeLoader(builtInDir, userDir);
24
+ const modes = await loader.loadAll();
25
+ expect(modes.size).toBe(2);
26
+ expect(modes.get('operator')).toBeDefined();
27
+ expect(modes.get('analyst')).toBeDefined();
28
+ });
29
+ it('should parse metadata correctly', async () => {
30
+ await fs.writeFile(path.join(builtInDir, 'writer.md'), `<!-- mode: writer\n name: Writer\n description: Creative writing\n signals: write:0.7, draft:0.8, blog post:0.9 -->\n# Writer mode\nBe creative.`);
31
+ const loader = new ModeLoader(builtInDir, userDir);
32
+ await loader.loadAll();
33
+ const mode = loader.get('writer');
34
+ expect(mode).toBeDefined();
35
+ expect(mode.name).toBe('Writer');
36
+ expect(mode.description).toBe('Creative writing');
37
+ expect(mode.signals).toHaveLength(3);
38
+ expect(mode.signals[0]).toEqual({ phrase: 'write', weight: 0.7 });
39
+ expect(mode.signals[1]).toEqual({ phrase: 'draft', weight: 0.8 });
40
+ expect(mode.signals[2]).toEqual({ phrase: 'blog post', weight: 0.9 });
41
+ expect(mode.promptContent).toContain('# Writer mode');
42
+ expect(mode.promptContent).toContain('Be creative.');
43
+ });
44
+ it('should return empty map when directory does not exist', async () => {
45
+ const loader = new ModeLoader('/nonexistent/path', '/also/nonexistent');
46
+ const modes = await loader.loadAll();
47
+ expect(modes.size).toBe(0);
48
+ });
49
+ it('should skip files without valid metadata', async () => {
50
+ // File with no HTML comment header
51
+ await fs.writeFile(path.join(builtInDir, 'operator.md'), `# Just some markdown\nNo metadata here.`);
52
+ const loader = new ModeLoader(builtInDir, userDir);
53
+ const modes = await loader.loadAll();
54
+ expect(modes.size).toBe(0);
55
+ });
56
+ it('should skip non-.md files', async () => {
57
+ await fs.writeFile(path.join(builtInDir, 'readme.txt'), 'not a mode');
58
+ await fs.writeFile(path.join(builtInDir, 'operator.md'), `<!-- mode: operator\n name: Operator\n description: test\n signals: run:0.8 -->\ncontent`);
59
+ const loader = new ModeLoader(builtInDir, userDir);
60
+ const modes = await loader.loadAll();
61
+ expect(modes.size).toBe(1);
62
+ });
63
+ it('should skip files with unknown mode IDs', async () => {
64
+ await fs.writeFile(path.join(builtInDir, 'custom-mode.md'), `<!-- mode: custom-mode\n name: Custom\n description: test\n signals: foo:0.8 -->\ncontent`);
65
+ const loader = new ModeLoader(builtInDir, userDir);
66
+ const modes = await loader.loadAll();
67
+ expect(modes.size).toBe(0);
68
+ });
69
+ it('should allow user modes to override built-in modes', async () => {
70
+ await fs.writeFile(path.join(builtInDir, 'operator.md'), `<!-- mode: operator\n name: Operator\n description: Built-in operator\n signals: run:0.8 -->\nBuilt-in content`);
71
+ await fs.writeFile(path.join(userDir, 'operator.md'), `<!-- mode: operator\n name: My Operator\n description: Custom operator\n signals: run:0.9, go:0.7 -->\nCustom content`);
72
+ const loader = new ModeLoader(builtInDir, userDir);
73
+ await loader.loadAll();
74
+ const mode = loader.get('operator');
75
+ expect(mode).toBeDefined();
76
+ expect(mode.name).toBe('My Operator');
77
+ expect(mode.description).toBe('Custom operator');
78
+ expect(mode.promptContent).toBe('Custom content');
79
+ });
80
+ it('should reload modes', async () => {
81
+ await fs.writeFile(path.join(builtInDir, 'operator.md'), `<!-- mode: operator\n name: Operator\n description: v1\n signals: run:0.8 -->\nv1`);
82
+ const loader = new ModeLoader(builtInDir, userDir);
83
+ await loader.loadAll();
84
+ expect(loader.get('operator').description).toBe('v1');
85
+ // Modify file
86
+ await fs.writeFile(path.join(builtInDir, 'operator.md'), `<!-- mode: operator\n name: Operator\n description: v2\n signals: run:0.8 -->\nv2`);
87
+ await loader.reload();
88
+ expect(loader.get('operator').description).toBe('v2');
89
+ });
90
+ });
91
+ //# sourceMappingURL=mode-loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-loader.test.js","sourceRoot":"","sources":["../../../src/modes/__tests__/mode-loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prompt-assembler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-assembler.test.d.ts","sourceRoot":"","sources":["../../../src/modes/__tests__/prompt-assembler.test.ts"],"names":[],"mappings":""}