@soleri/core 2.1.0 → 2.4.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 (207) hide show
  1. package/dist/brain/brain.d.ts +3 -1
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +60 -4
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/brain/intelligence.d.ts +36 -1
  6. package/dist/brain/intelligence.d.ts.map +1 -1
  7. package/dist/brain/intelligence.js +119 -14
  8. package/dist/brain/intelligence.js.map +1 -1
  9. package/dist/brain/types.d.ts +32 -0
  10. package/dist/brain/types.d.ts.map +1 -1
  11. package/dist/control/identity-manager.d.ts +22 -0
  12. package/dist/control/identity-manager.d.ts.map +1 -0
  13. package/dist/control/identity-manager.js +233 -0
  14. package/dist/control/identity-manager.js.map +1 -0
  15. package/dist/control/intent-router.d.ts +32 -0
  16. package/dist/control/intent-router.d.ts.map +1 -0
  17. package/dist/control/intent-router.js +242 -0
  18. package/dist/control/intent-router.js.map +1 -0
  19. package/dist/control/types.d.ts +68 -0
  20. package/dist/control/types.d.ts.map +1 -0
  21. package/dist/control/types.js +9 -0
  22. package/dist/control/types.js.map +1 -0
  23. package/dist/curator/curator.d.ts +29 -0
  24. package/dist/curator/curator.d.ts.map +1 -1
  25. package/dist/curator/curator.js +135 -0
  26. package/dist/curator/curator.js.map +1 -1
  27. package/dist/facades/types.d.ts +1 -1
  28. package/dist/governance/governance.d.ts +42 -0
  29. package/dist/governance/governance.d.ts.map +1 -0
  30. package/dist/governance/governance.js +488 -0
  31. package/dist/governance/governance.js.map +1 -0
  32. package/dist/governance/index.d.ts +3 -0
  33. package/dist/governance/index.d.ts.map +1 -0
  34. package/dist/governance/index.js +2 -0
  35. package/dist/governance/index.js.map +1 -0
  36. package/dist/governance/types.d.ts +102 -0
  37. package/dist/governance/types.d.ts.map +1 -0
  38. package/dist/governance/types.js +3 -0
  39. package/dist/governance/types.js.map +1 -0
  40. package/dist/index.d.ts +32 -3
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +29 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/logging/logger.d.ts +37 -0
  45. package/dist/logging/logger.d.ts.map +1 -0
  46. package/dist/logging/logger.js +145 -0
  47. package/dist/logging/logger.js.map +1 -0
  48. package/dist/logging/types.d.ts +19 -0
  49. package/dist/logging/types.d.ts.map +1 -0
  50. package/dist/logging/types.js +2 -0
  51. package/dist/logging/types.js.map +1 -0
  52. package/dist/loop/loop-manager.d.ts +49 -0
  53. package/dist/loop/loop-manager.d.ts.map +1 -0
  54. package/dist/loop/loop-manager.js +105 -0
  55. package/dist/loop/loop-manager.js.map +1 -0
  56. package/dist/loop/types.d.ts +35 -0
  57. package/dist/loop/types.d.ts.map +1 -0
  58. package/dist/loop/types.js +8 -0
  59. package/dist/loop/types.js.map +1 -0
  60. package/dist/planning/gap-analysis.d.ts +29 -0
  61. package/dist/planning/gap-analysis.d.ts.map +1 -0
  62. package/dist/planning/gap-analysis.js +265 -0
  63. package/dist/planning/gap-analysis.js.map +1 -0
  64. package/dist/planning/gap-types.d.ts +29 -0
  65. package/dist/planning/gap-types.d.ts.map +1 -0
  66. package/dist/planning/gap-types.js +28 -0
  67. package/dist/planning/gap-types.js.map +1 -0
  68. package/dist/planning/planner.d.ts +150 -1
  69. package/dist/planning/planner.d.ts.map +1 -1
  70. package/dist/planning/planner.js +365 -2
  71. package/dist/planning/planner.js.map +1 -1
  72. package/dist/project/project-registry.d.ts +79 -0
  73. package/dist/project/project-registry.d.ts.map +1 -0
  74. package/dist/project/project-registry.js +276 -0
  75. package/dist/project/project-registry.js.map +1 -0
  76. package/dist/project/types.d.ts +28 -0
  77. package/dist/project/types.d.ts.map +1 -0
  78. package/dist/project/types.js +5 -0
  79. package/dist/project/types.js.map +1 -0
  80. package/dist/runtime/admin-extra-ops.d.ts +13 -0
  81. package/dist/runtime/admin-extra-ops.d.ts.map +1 -0
  82. package/dist/runtime/admin-extra-ops.js +284 -0
  83. package/dist/runtime/admin-extra-ops.js.map +1 -0
  84. package/dist/runtime/admin-ops.d.ts +15 -0
  85. package/dist/runtime/admin-ops.d.ts.map +1 -0
  86. package/dist/runtime/admin-ops.js +322 -0
  87. package/dist/runtime/admin-ops.js.map +1 -0
  88. package/dist/runtime/capture-ops.d.ts +15 -0
  89. package/dist/runtime/capture-ops.d.ts.map +1 -0
  90. package/dist/runtime/capture-ops.js +345 -0
  91. package/dist/runtime/capture-ops.js.map +1 -0
  92. package/dist/runtime/core-ops.d.ts +7 -3
  93. package/dist/runtime/core-ops.d.ts.map +1 -1
  94. package/dist/runtime/core-ops.js +474 -8
  95. package/dist/runtime/core-ops.js.map +1 -1
  96. package/dist/runtime/curator-extra-ops.d.ts +9 -0
  97. package/dist/runtime/curator-extra-ops.d.ts.map +1 -0
  98. package/dist/runtime/curator-extra-ops.js +59 -0
  99. package/dist/runtime/curator-extra-ops.js.map +1 -0
  100. package/dist/runtime/domain-ops.d.ts.map +1 -1
  101. package/dist/runtime/domain-ops.js +59 -13
  102. package/dist/runtime/domain-ops.js.map +1 -1
  103. package/dist/runtime/grading-ops.d.ts +14 -0
  104. package/dist/runtime/grading-ops.d.ts.map +1 -0
  105. package/dist/runtime/grading-ops.js +105 -0
  106. package/dist/runtime/grading-ops.js.map +1 -0
  107. package/dist/runtime/loop-ops.d.ts +13 -0
  108. package/dist/runtime/loop-ops.d.ts.map +1 -0
  109. package/dist/runtime/loop-ops.js +179 -0
  110. package/dist/runtime/loop-ops.js.map +1 -0
  111. package/dist/runtime/memory-cross-project-ops.d.ts +12 -0
  112. package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -0
  113. package/dist/runtime/memory-cross-project-ops.js +165 -0
  114. package/dist/runtime/memory-cross-project-ops.js.map +1 -0
  115. package/dist/runtime/memory-extra-ops.d.ts +13 -0
  116. package/dist/runtime/memory-extra-ops.d.ts.map +1 -0
  117. package/dist/runtime/memory-extra-ops.js +173 -0
  118. package/dist/runtime/memory-extra-ops.js.map +1 -0
  119. package/dist/runtime/orchestrate-ops.d.ts +17 -0
  120. package/dist/runtime/orchestrate-ops.d.ts.map +1 -0
  121. package/dist/runtime/orchestrate-ops.js +240 -0
  122. package/dist/runtime/orchestrate-ops.js.map +1 -0
  123. package/dist/runtime/planning-extra-ops.d.ts +17 -0
  124. package/dist/runtime/planning-extra-ops.d.ts.map +1 -0
  125. package/dist/runtime/planning-extra-ops.js +300 -0
  126. package/dist/runtime/planning-extra-ops.js.map +1 -0
  127. package/dist/runtime/project-ops.d.ts +15 -0
  128. package/dist/runtime/project-ops.d.ts.map +1 -0
  129. package/dist/runtime/project-ops.js +181 -0
  130. package/dist/runtime/project-ops.js.map +1 -0
  131. package/dist/runtime/runtime.d.ts.map +1 -1
  132. package/dist/runtime/runtime.js +44 -1
  133. package/dist/runtime/runtime.js.map +1 -1
  134. package/dist/runtime/types.d.ts +21 -0
  135. package/dist/runtime/types.d.ts.map +1 -1
  136. package/dist/runtime/vault-extra-ops.d.ts +9 -0
  137. package/dist/runtime/vault-extra-ops.d.ts.map +1 -0
  138. package/dist/runtime/vault-extra-ops.js +195 -0
  139. package/dist/runtime/vault-extra-ops.js.map +1 -0
  140. package/dist/telemetry/telemetry.d.ts +48 -0
  141. package/dist/telemetry/telemetry.d.ts.map +1 -0
  142. package/dist/telemetry/telemetry.js +87 -0
  143. package/dist/telemetry/telemetry.js.map +1 -0
  144. package/dist/vault/vault.d.ts +94 -0
  145. package/dist/vault/vault.d.ts.map +1 -1
  146. package/dist/vault/vault.js +340 -1
  147. package/dist/vault/vault.js.map +1 -1
  148. package/package.json +1 -1
  149. package/src/__tests__/admin-extra-ops.test.ts +420 -0
  150. package/src/__tests__/admin-ops.test.ts +271 -0
  151. package/src/__tests__/brain-intelligence.test.ts +205 -0
  152. package/src/__tests__/brain.test.ts +131 -0
  153. package/src/__tests__/capture-ops.test.ts +509 -0
  154. package/src/__tests__/core-ops.test.ts +266 -2
  155. package/src/__tests__/curator-extra-ops.test.ts +359 -0
  156. package/src/__tests__/domain-ops.test.ts +66 -0
  157. package/src/__tests__/governance.test.ts +522 -0
  158. package/src/__tests__/grading-ops.test.ts +340 -0
  159. package/src/__tests__/identity-manager.test.ts +243 -0
  160. package/src/__tests__/intent-router.test.ts +222 -0
  161. package/src/__tests__/logger.test.ts +200 -0
  162. package/src/__tests__/loop-ops.test.ts +398 -0
  163. package/src/__tests__/memory-cross-project-ops.test.ts +246 -0
  164. package/src/__tests__/memory-extra-ops.test.ts +352 -0
  165. package/src/__tests__/orchestrate-ops.test.ts +284 -0
  166. package/src/__tests__/planner.test.ts +331 -0
  167. package/src/__tests__/planning-extra-ops.test.ts +548 -0
  168. package/src/__tests__/project-ops.test.ts +367 -0
  169. package/src/__tests__/vault-extra-ops.test.ts +407 -0
  170. package/src/brain/brain.ts +114 -7
  171. package/src/brain/intelligence.ts +179 -10
  172. package/src/brain/types.ts +38 -0
  173. package/src/control/identity-manager.ts +354 -0
  174. package/src/control/intent-router.ts +326 -0
  175. package/src/control/types.ts +102 -0
  176. package/src/curator/curator.ts +213 -0
  177. package/src/governance/governance.ts +698 -0
  178. package/src/governance/index.ts +18 -0
  179. package/src/governance/types.ts +111 -0
  180. package/src/index.ts +102 -2
  181. package/src/logging/logger.ts +154 -0
  182. package/src/logging/types.ts +21 -0
  183. package/src/loop/loop-manager.ts +130 -0
  184. package/src/loop/types.ts +44 -0
  185. package/src/planning/gap-analysis.ts +506 -0
  186. package/src/planning/gap-types.ts +58 -0
  187. package/src/planning/planner.ts +478 -2
  188. package/src/project/project-registry.ts +358 -0
  189. package/src/project/types.ts +31 -0
  190. package/src/runtime/admin-extra-ops.ts +307 -0
  191. package/src/runtime/admin-ops.ts +329 -0
  192. package/src/runtime/capture-ops.ts +385 -0
  193. package/src/runtime/core-ops.ts +535 -7
  194. package/src/runtime/curator-extra-ops.ts +71 -0
  195. package/src/runtime/domain-ops.ts +65 -13
  196. package/src/runtime/grading-ops.ts +121 -0
  197. package/src/runtime/loop-ops.ts +194 -0
  198. package/src/runtime/memory-cross-project-ops.ts +192 -0
  199. package/src/runtime/memory-extra-ops.ts +186 -0
  200. package/src/runtime/orchestrate-ops.ts +272 -0
  201. package/src/runtime/planning-extra-ops.ts +327 -0
  202. package/src/runtime/project-ops.ts +196 -0
  203. package/src/runtime/runtime.ts +49 -1
  204. package/src/runtime/types.ts +21 -0
  205. package/src/runtime/vault-extra-ops.ts +225 -0
  206. package/src/telemetry/telemetry.ts +118 -0
  207. package/src/vault/vault.ts +412 -1
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Intelligent capture operations — 4 ops for governance-gated knowledge capture
3
+ * and project-scoped intelligent search.
4
+ *
5
+ * Ops: capture_knowledge, capture_quick, search_intelligent, search_feedback.
6
+ */
7
+
8
+ import { z } from 'zod';
9
+ import type { OpDefinition } from '../facades/types.js';
10
+ import type { AgentRuntime } from './types.js';
11
+
12
+ /**
13
+ * Create the 4 intelligent capture operations for an agent runtime.
14
+ *
15
+ * Groups: capture (2), search (2).
16
+ */
17
+ export function createCaptureOps(runtime: AgentRuntime): OpDefinition[] {
18
+ const { vault, brain, governance } = runtime;
19
+
20
+ return [
21
+ // ─── Capture ──────────────────────────────────────────────────
22
+ {
23
+ name: 'capture_knowledge',
24
+ description:
25
+ 'Batch-capture knowledge entries with governance gating and auto-enrichment via TF-IDF tagging.',
26
+ auth: 'write',
27
+ schema: z.object({
28
+ projectPath: z.string().optional().default('.'),
29
+ entries: z.array(
30
+ z.object({
31
+ id: z.string().optional(),
32
+ type: z
33
+ .enum(['pattern', 'anti-pattern', 'rule', 'workflow', 'principle', 'reference'])
34
+ .describe('Entry type'),
35
+ domain: z.string(),
36
+ title: z.string(),
37
+ severity: z.enum(['critical', 'warning', 'info']).optional().default('info'),
38
+ description: z.string(),
39
+ tags: z.array(z.string()).optional().default([]),
40
+ context: z.string().optional(),
41
+ example: z.string().optional(),
42
+ counterExample: z.string().optional(),
43
+ why: z.string().optional(),
44
+ }),
45
+ ),
46
+ }),
47
+ handler: async (params) => {
48
+ const projectPath = (params.projectPath as string | undefined) ?? '.';
49
+ const entries = params.entries as Array<{
50
+ id?: string;
51
+ type: string;
52
+ domain: string;
53
+ title: string;
54
+ severity?: string;
55
+ description: string;
56
+ tags?: string[];
57
+ context?: string;
58
+ example?: string;
59
+ counterExample?: string;
60
+ why?: string;
61
+ }>;
62
+
63
+ let captured = 0;
64
+ let proposed = 0;
65
+ let rejected = 0;
66
+ const results: Array<{ id: string; action: string; reason?: string }> = [];
67
+
68
+ for (const entry of entries) {
69
+ const entryId = entry.id ?? `${entry.domain}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
70
+ const mappedSeverity = mapSeverity(entry.severity);
71
+ const mappedType = mapType(entry.type);
72
+
73
+ try {
74
+ const decision = governance.evaluateCapture(projectPath, {
75
+ type: mappedType,
76
+ category: entry.domain,
77
+ title: entry.title,
78
+ });
79
+
80
+ switch (decision.action) {
81
+ case 'capture': {
82
+ try {
83
+ brain.enrichAndCapture({
84
+ id: entryId,
85
+ type: mappedType as 'pattern' | 'anti-pattern' | 'rule',
86
+ domain: entry.domain,
87
+ title: entry.title,
88
+ severity: mappedSeverity,
89
+ description: entry.description,
90
+ tags: entry.tags ?? [],
91
+ context: entry.context,
92
+ example: entry.example,
93
+ counterExample: entry.counterExample,
94
+ why: entry.why,
95
+ });
96
+ captured++;
97
+ results.push({ id: entryId, action: 'capture' });
98
+ } catch (err) {
99
+ rejected++;
100
+ results.push({
101
+ id: entryId,
102
+ action: 'error',
103
+ reason: err instanceof Error ? err.message : String(err),
104
+ });
105
+ }
106
+ break;
107
+ }
108
+ case 'propose': {
109
+ try {
110
+ governance.propose(
111
+ projectPath,
112
+ {
113
+ entryId,
114
+ title: entry.title,
115
+ type: mappedType,
116
+ category: entry.domain,
117
+ data: {
118
+ severity: mappedSeverity,
119
+ description: entry.description,
120
+ context: entry.context,
121
+ example: entry.example,
122
+ counterExample: entry.counterExample,
123
+ why: entry.why,
124
+ tags: entry.tags,
125
+ },
126
+ },
127
+ 'capture-ops',
128
+ );
129
+ proposed++;
130
+ results.push({ id: entryId, action: 'propose', reason: decision.reason });
131
+ } catch (err) {
132
+ rejected++;
133
+ results.push({
134
+ id: entryId,
135
+ action: 'error',
136
+ reason: err instanceof Error ? err.message : String(err),
137
+ });
138
+ }
139
+ break;
140
+ }
141
+ default: {
142
+ // reject or quarantine
143
+ rejected++;
144
+ results.push({ id: entryId, action: decision.action, reason: decision.reason });
145
+ }
146
+ }
147
+ } catch (err) {
148
+ rejected++;
149
+ results.push({
150
+ id: entryId,
151
+ action: 'error',
152
+ reason: err instanceof Error ? err.message : String(err),
153
+ });
154
+ }
155
+ }
156
+
157
+ return { captured, proposed, rejected, results };
158
+ },
159
+ },
160
+
161
+ {
162
+ name: 'capture_quick',
163
+ description:
164
+ 'Quick single-entry capture with minimal required fields. Auto-generates ID and infers severity.',
165
+ auth: 'write',
166
+ schema: z.object({
167
+ projectPath: z.string().optional().default('.'),
168
+ type: z
169
+ .enum(['pattern', 'anti-pattern', 'rule', 'workflow', 'principle', 'reference'])
170
+ .describe('Entry type'),
171
+ domain: z.string(),
172
+ title: z.string(),
173
+ description: z.string(),
174
+ tags: z.array(z.string()).optional().default([]),
175
+ }),
176
+ handler: async (params) => {
177
+ const projectPath = (params.projectPath as string | undefined) ?? '.';
178
+ const entryType = params.type as string;
179
+ const domain = params.domain as string;
180
+ const title = params.title as string;
181
+ const description = params.description as string;
182
+ const tags = (params.tags as string[] | undefined) ?? [];
183
+
184
+ const id = `${domain}-${Date.now()}`;
185
+ const mappedSeverity = 'info' as const;
186
+ const mappedType = mapType(entryType);
187
+
188
+ try {
189
+ const decision = governance.evaluateCapture(projectPath, {
190
+ type: mappedType,
191
+ category: domain,
192
+ title,
193
+ });
194
+
195
+ switch (decision.action) {
196
+ case 'capture': {
197
+ try {
198
+ brain.enrichAndCapture({
199
+ id,
200
+ type: mappedType as 'pattern' | 'anti-pattern' | 'rule',
201
+ domain,
202
+ title,
203
+ severity: mapSeverity(mappedSeverity),
204
+ description,
205
+ tags,
206
+ });
207
+ return { captured: true, id, governance: { action: 'capture' as const } };
208
+ } catch (err) {
209
+ return {
210
+ captured: false,
211
+ id,
212
+ governance: {
213
+ action: 'error' as const,
214
+ reason: err instanceof Error ? err.message : String(err),
215
+ },
216
+ };
217
+ }
218
+ }
219
+ case 'propose': {
220
+ try {
221
+ governance.propose(
222
+ projectPath,
223
+ {
224
+ entryId: id,
225
+ title,
226
+ type: mappedType,
227
+ category: domain,
228
+ data: { severity: mapSeverity(mappedSeverity), description, tags },
229
+ },
230
+ 'capture-ops-quick',
231
+ );
232
+ return {
233
+ captured: false,
234
+ id,
235
+ governance: { action: 'propose' as const, reason: decision.reason },
236
+ };
237
+ } catch (err) {
238
+ return {
239
+ captured: false,
240
+ id,
241
+ governance: {
242
+ action: 'error' as const,
243
+ reason: err instanceof Error ? err.message : String(err),
244
+ },
245
+ };
246
+ }
247
+ }
248
+ default: {
249
+ return {
250
+ captured: false,
251
+ id,
252
+ governance: { action: decision.action, reason: decision.reason },
253
+ };
254
+ }
255
+ }
256
+ } catch (err) {
257
+ return {
258
+ captured: false,
259
+ id,
260
+ governance: {
261
+ action: 'error' as const,
262
+ reason: err instanceof Error ? err.message : String(err),
263
+ },
264
+ };
265
+ }
266
+ },
267
+ },
268
+
269
+ // ─── Search ────────────────────────────────────────────────────
270
+ {
271
+ name: 'search_intelligent',
272
+ description:
273
+ 'Project-scoped intelligent search combining vault FTS, brain TF-IDF ranking, and optional memory search.',
274
+ auth: 'read',
275
+ schema: z.object({
276
+ query: z.string(),
277
+ projectPath: z.string().optional(),
278
+ domain: z.string().optional(),
279
+ type: z.string().optional(),
280
+ limit: z.number().optional().default(20),
281
+ includeMemories: z.boolean().optional().default(false),
282
+ }),
283
+ handler: async (params) => {
284
+ const query = params.query as string;
285
+ const domain = params.domain as string | undefined;
286
+ const type = params.type as string | undefined;
287
+ const limit = (params.limit as number | undefined) ?? 20;
288
+ const includeMemories = (params.includeMemories as boolean | undefined) ?? false;
289
+
290
+ // Search vault via brain's intelligent search (TF-IDF ranked)
291
+ let vaultResults: Array<{ source: string; [key: string]: unknown }> = [];
292
+ try {
293
+ const ranked = await brain.intelligentSearch(query, { domain, type, limit });
294
+ vaultResults = ranked.map((r) => ({ ...r, source: 'vault' }));
295
+ } catch {
296
+ // Graceful degradation — return empty vault results
297
+ }
298
+
299
+ // Optionally include memories
300
+ let memoryResults: Array<{ source: string; [key: string]: unknown }> = [];
301
+ if (includeMemories) {
302
+ try {
303
+ const memories = vault.searchMemories(query, { limit });
304
+ memoryResults = memories.map((m) => ({ ...m, source: 'memory', score: 0.5 }));
305
+ } catch {
306
+ // Graceful degradation — return empty memory results
307
+ }
308
+ }
309
+
310
+ // Merge and sort by score descending
311
+ const combined = [...vaultResults, ...memoryResults];
312
+ combined.sort((a, b) => ((b.score as number) ?? 0) - ((a.score as number) ?? 0));
313
+
314
+ return combined.slice(0, limit);
315
+ },
316
+ },
317
+
318
+ {
319
+ name: 'search_feedback',
320
+ description:
321
+ 'Record feedback on search results to improve future ranking via brain learning.',
322
+ auth: 'write',
323
+ schema: z.object({
324
+ query: z.string(),
325
+ entryId: z.string(),
326
+ helpful: z.boolean(),
327
+ context: z.string().optional(),
328
+ }),
329
+ handler: async (params) => {
330
+ const query = params.query as string;
331
+ const entryId = params.entryId as string;
332
+ const helpful = params.helpful as boolean;
333
+ const context = params.context as string | undefined;
334
+
335
+ try {
336
+ const action = helpful ? 'accepted' : 'dismissed';
337
+ brain.recordFeedback(query, entryId, action);
338
+ return { recorded: true, query, entryId, action, context: context ?? null };
339
+ } catch (err) {
340
+ return {
341
+ recorded: false,
342
+ error: err instanceof Error ? err.message : String(err),
343
+ };
344
+ }
345
+ },
346
+ },
347
+ ];
348
+ }
349
+
350
+ // ─── Helpers ────────────────────────────────────────────────────────
351
+
352
+ /**
353
+ * Map extended severity values to IntelligenceEntry-compatible severity.
354
+ * 'info' maps to 'suggestion' (the closest existing severity level).
355
+ */
356
+ function mapSeverity(severity: string | undefined): 'critical' | 'warning' | 'suggestion' {
357
+ switch (severity) {
358
+ case 'critical':
359
+ return 'critical';
360
+ case 'warning':
361
+ return 'warning';
362
+ case 'info':
363
+ default:
364
+ return 'suggestion';
365
+ }
366
+ }
367
+
368
+ /**
369
+ * Map extended type values to IntelligenceEntry-compatible types.
370
+ * 'workflow', 'principle', 'reference' map to 'rule' (the closest existing type).
371
+ */
372
+ function mapType(type: string): 'pattern' | 'anti-pattern' | 'rule' {
373
+ switch (type) {
374
+ case 'pattern':
375
+ return 'pattern';
376
+ case 'anti-pattern':
377
+ return 'anti-pattern';
378
+ case 'rule':
379
+ case 'workflow':
380
+ case 'principle':
381
+ case 'reference':
382
+ default:
383
+ return 'rule';
384
+ }
385
+ }