@putervision/agent-reasoning-mcp 0.1.1

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.
@@ -0,0 +1,442 @@
1
+ import {
2
+ NotFoundError,
3
+ ValidationError
4
+ } from "./chunk-F4TEZ2TS.js";
5
+
6
+ // src/utils/id.ts
7
+ import * as crypto from "crypto";
8
+ var ENCODING = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
9
+ function generateId() {
10
+ let now = Date.now();
11
+ let timeStr = "";
12
+ for (let i = 0; i < 10; i++) {
13
+ const mod = now % 32;
14
+ timeStr = ENCODING.charAt(mod) + timeStr;
15
+ now = Math.floor(now / 32);
16
+ }
17
+ const randomBytes2 = crypto.randomBytes(16);
18
+ let randomStr = "";
19
+ for (let i = 0; i < 16; i++) {
20
+ randomStr += ENCODING.charAt(randomBytes2[i] % 32);
21
+ }
22
+ return timeStr + randomStr;
23
+ }
24
+
25
+ // src/utils/time.ts
26
+ function getCurrentIsoString() {
27
+ return (/* @__PURE__ */ new Date()).toISOString();
28
+ }
29
+ function parseIsoString(iso) {
30
+ return new Date(iso);
31
+ }
32
+ function getElapsedTimeMs(startTimeIso) {
33
+ return Date.now() - new Date(startTimeIso).getTime();
34
+ }
35
+
36
+ // src/engine/events.ts
37
+ import crypto2 from "crypto";
38
+
39
+ // src/utils/json-validator.ts
40
+ function safeJsonParse(str, fallback) {
41
+ if (!str || typeof str !== "string") return fallback;
42
+ try {
43
+ return JSON.parse(str);
44
+ } catch {
45
+ return fallback;
46
+ }
47
+ }
48
+ function safeJsonStringify(obj, fallback = "{}") {
49
+ try {
50
+ return JSON.stringify(obj);
51
+ } catch {
52
+ return fallback;
53
+ }
54
+ }
55
+
56
+ // src/engine/events.ts
57
+ function computeEventHash(params) {
58
+ const data = [
59
+ params.prev_hash,
60
+ params.id,
61
+ params.project,
62
+ params.entity_id,
63
+ params.entity_type,
64
+ params.action,
65
+ params.timestamp,
66
+ JSON.stringify(params.details || {})
67
+ ].join("|");
68
+ return crypto2.createHash("sha256").update(data).digest("hex");
69
+ }
70
+ function logReasoningEvent(db, params) {
71
+ const lastRow = db.prepare("SELECT hash FROM events WHERE project = ? ORDER BY rowid DESC LIMIT 1").get(params.project);
72
+ const prevHash = lastRow?.hash || "0".repeat(64);
73
+ const eventId = generateId();
74
+ const timestamp = getCurrentIsoString();
75
+ const hash = computeEventHash({
76
+ prev_hash: prevHash,
77
+ id: eventId,
78
+ project: params.project,
79
+ entity_id: params.entity_id,
80
+ entity_type: params.entity_type,
81
+ action: params.action,
82
+ timestamp,
83
+ details: params.details
84
+ });
85
+ db.prepare(
86
+ `
87
+ INSERT INTO events (id, project, entity_id, entity_type, action, prev_hash, hash, details_json, timestamp)
88
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
89
+ `
90
+ ).run(
91
+ eventId,
92
+ params.project,
93
+ params.entity_id,
94
+ params.entity_type,
95
+ params.action,
96
+ prevHash,
97
+ hash,
98
+ JSON.stringify(params.details || {}),
99
+ timestamp
100
+ );
101
+ return {
102
+ id: eventId,
103
+ project: params.project,
104
+ entity_id: params.entity_id,
105
+ entity_type: params.entity_type,
106
+ action: params.action,
107
+ prev_hash: prevHash,
108
+ hash,
109
+ details: params.details,
110
+ timestamp
111
+ };
112
+ }
113
+ function verifyEventChain(db, project) {
114
+ const rows = db.prepare("SELECT * FROM events WHERE project = ? ORDER BY rowid ASC").all(project);
115
+ if (rows.length === 0) {
116
+ return { valid: true, total_events: 0 };
117
+ }
118
+ let expectedPrevHash = "0".repeat(64);
119
+ for (const row of rows) {
120
+ if (row.prev_hash !== expectedPrevHash) {
121
+ return {
122
+ valid: false,
123
+ total_events: rows.length,
124
+ corrupted_event_id: row.id,
125
+ error: `Prev hash mismatch at event ${row.id}: expected ${expectedPrevHash}, found ${row.prev_hash}`
126
+ };
127
+ }
128
+ const calculatedHash = computeEventHash({
129
+ prev_hash: row.prev_hash,
130
+ id: row.id,
131
+ project: row.project,
132
+ entity_id: row.entity_id,
133
+ entity_type: row.entity_type,
134
+ action: row.action,
135
+ timestamp: row.timestamp,
136
+ details: safeJsonParse(row.details_json, {})
137
+ });
138
+ if (calculatedHash !== row.hash) {
139
+ return {
140
+ valid: false,
141
+ total_events: rows.length,
142
+ corrupted_event_id: row.id,
143
+ error: `Data tamper detected at event ${row.id}: hash mismatch`
144
+ };
145
+ }
146
+ expectedPrevHash = row.hash;
147
+ }
148
+ return { valid: true, total_events: rows.length };
149
+ }
150
+
151
+ // src/utils/sanitize.ts
152
+ var DANGEROUS_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
153
+ function sanitizeKeys(obj) {
154
+ if (obj === null || typeof obj !== "object") {
155
+ return obj;
156
+ }
157
+ if (Array.isArray(obj)) {
158
+ return obj.map((item) => sanitizeKeys(item));
159
+ }
160
+ const clean = /* @__PURE__ */ Object.create(null);
161
+ for (const key of Object.keys(obj)) {
162
+ if (DANGEROUS_KEYS.has(key)) {
163
+ continue;
164
+ }
165
+ const val = obj[key];
166
+ clean[key] = sanitizeKeys(val);
167
+ }
168
+ return { ...clean };
169
+ }
170
+
171
+ // src/engine/personality.ts
172
+ var UtilityProfileEngine = class {
173
+ static configureProfile(db, params) {
174
+ if (!params.name) throw new ValidationError("Profile name is required.");
175
+ if (!params.weights || Object.keys(params.weights).length === 0) {
176
+ throw new ValidationError("Utility weights are required.");
177
+ }
178
+ const defaultWeights = {
179
+ aggression: 0.5,
180
+ caution: 0.5,
181
+ greed: 0.5,
182
+ efficiency: 0.5,
183
+ exploration: 0.5,
184
+ cooperation: 0.5,
185
+ ...sanitizeKeys(params.weights)
186
+ };
187
+ const now = getCurrentIsoString();
188
+ const existing = db.prepare("SELECT * FROM utility_profiles WHERE project = ? AND name = ?").get(params.project, params.name);
189
+ if (params.is_active) {
190
+ db.prepare("UPDATE utility_profiles SET is_active = 0 WHERE project = ?").run(params.project);
191
+ }
192
+ if (existing) {
193
+ db.prepare(
194
+ `
195
+ UPDATE utility_profiles SET
196
+ description = ?, weights_json = ?, is_active = ?, updated_at = ?
197
+ WHERE id = ?
198
+ `
199
+ ).run(
200
+ params.description ?? existing.description,
201
+ safeJsonStringify(defaultWeights),
202
+ params.is_active ? 1 : existing.is_active,
203
+ now,
204
+ existing.id
205
+ );
206
+ return this.getProfile(db, { project: params.project, name: params.name });
207
+ }
208
+ const id = generateId();
209
+ const isActive = params.is_active ? 1 : 0;
210
+ db.prepare(
211
+ `
212
+ INSERT INTO utility_profiles (id, project, name, description, weights_json, is_active, created_at, updated_at)
213
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
214
+ `
215
+ ).run(
216
+ id,
217
+ params.project,
218
+ params.name,
219
+ params.description ?? null,
220
+ safeJsonStringify(defaultWeights),
221
+ isActive,
222
+ now,
223
+ now
224
+ );
225
+ logReasoningEvent(db, {
226
+ project: params.project,
227
+ entity_id: id,
228
+ entity_type: "profile",
229
+ action: "configure",
230
+ details: { name: params.name, weights: defaultWeights }
231
+ });
232
+ return {
233
+ id,
234
+ project: params.project,
235
+ name: params.name,
236
+ description: params.description,
237
+ weights: defaultWeights,
238
+ is_active: isActive === 1,
239
+ created_at: now,
240
+ updated_at: now
241
+ };
242
+ }
243
+ static getActiveProfile(db, project) {
244
+ const row = db.prepare("SELECT * FROM utility_profiles WHERE project = ? AND is_active = 1").get(project);
245
+ if (row) return this.mapRowToProfile(row);
246
+ return {
247
+ id: "default",
248
+ project,
249
+ name: "balanced",
250
+ description: "Default balanced autonomous profile",
251
+ weights: {
252
+ aggression: 0.5,
253
+ caution: 0.5,
254
+ greed: 0.5,
255
+ efficiency: 0.5,
256
+ exploration: 0.5,
257
+ cooperation: 0.5
258
+ },
259
+ is_active: true,
260
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
261
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
262
+ };
263
+ }
264
+ static getProfile(db, params) {
265
+ const row = db.prepare("SELECT * FROM utility_profiles WHERE project = ? AND name = ?").get(params.project, params.name);
266
+ if (!row) throw new NotFoundError(`Utility profile "${params.name}" not found.`);
267
+ return this.mapRowToProfile(row);
268
+ }
269
+ static listProfiles(db, project) {
270
+ const rows = db.prepare("SELECT * FROM utility_profiles WHERE project = ? ORDER BY is_active DESC, name ASC").all(project);
271
+ return rows.map((r) => this.mapRowToProfile(r));
272
+ }
273
+ static activateProfile(db, params) {
274
+ const profile = this.getProfile(db, params);
275
+ db.transaction(() => {
276
+ db.prepare("UPDATE utility_profiles SET is_active = 0 WHERE project = ?").run(params.project);
277
+ db.prepare("UPDATE utility_profiles SET is_active = 1 WHERE project = ? AND name = ?").run(
278
+ params.project,
279
+ params.name
280
+ );
281
+ })();
282
+ return { ...profile, is_active: true };
283
+ }
284
+ static mapRowToProfile(row) {
285
+ return {
286
+ id: row.id,
287
+ project: row.project,
288
+ name: row.name,
289
+ description: row.description,
290
+ weights: safeJsonParse(row.weights_json, {
291
+ aggression: 0.5,
292
+ caution: 0.5,
293
+ greed: 0.5,
294
+ efficiency: 0.5,
295
+ exploration: 0.5,
296
+ cooperation: 0.5
297
+ }),
298
+ is_active: row.is_active === 1,
299
+ metadata: safeJsonParse(row.metadata_json, void 0),
300
+ created_at: row.created_at,
301
+ updated_at: row.updated_at
302
+ };
303
+ }
304
+ };
305
+
306
+ // src/engine/knowledge.ts
307
+ var KnowledgeEngine = class {
308
+ static createPattern(db, params) {
309
+ if (!params.situation_pattern || !params.recommended_strategy) {
310
+ throw new ValidationError("situation_pattern and recommended_strategy are required.");
311
+ }
312
+ const id = generateId();
313
+ const now = getCurrentIsoString();
314
+ const confidence = params.confidence !== void 0 ? params.confidence : 0.7;
315
+ db.prepare(
316
+ `
317
+ INSERT INTO knowledge_patterns (
318
+ id, project, pattern_type, context_tags_json, situation_pattern,
319
+ recommended_strategy, confidence, sample_count, success_rate,
320
+ metadata_json, created_at, updated_at
321
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 1, 1.0, ?, ?, ?)
322
+ `
323
+ ).run(
324
+ id,
325
+ params.project,
326
+ params.pattern_type,
327
+ safeJsonStringify(params.context_tags || []),
328
+ params.situation_pattern,
329
+ params.recommended_strategy,
330
+ confidence,
331
+ params.metadata ? safeJsonStringify(params.metadata) : null,
332
+ now,
333
+ now
334
+ );
335
+ logReasoningEvent(db, {
336
+ project: params.project,
337
+ entity_id: id,
338
+ entity_type: "knowledge",
339
+ action: "create_pattern",
340
+ details: { pattern_type: params.pattern_type, situation: params.situation_pattern }
341
+ });
342
+ return {
343
+ id,
344
+ project: params.project,
345
+ pattern_type: params.pattern_type,
346
+ context_tags: params.context_tags || [],
347
+ situation_pattern: params.situation_pattern,
348
+ recommended_strategy: params.recommended_strategy,
349
+ confidence,
350
+ sample_count: 1,
351
+ success_rate: 1,
352
+ metadata: params.metadata,
353
+ created_at: now,
354
+ updated_at: now
355
+ };
356
+ }
357
+ static queryKnowledge(db, params) {
358
+ let sql = "SELECT * FROM knowledge_patterns WHERE project = ?";
359
+ const sqlParams = [params.project];
360
+ if (params.pattern_type) {
361
+ sql += " AND pattern_type = ?";
362
+ sqlParams.push(params.pattern_type);
363
+ }
364
+ if (params.query) {
365
+ sql += " AND (situation_pattern LIKE ? OR recommended_strategy LIKE ?)";
366
+ sqlParams.push(`%${params.query}%`, `%${params.query}%`);
367
+ }
368
+ sql += " ORDER BY confidence DESC, success_rate DESC LIMIT ?";
369
+ sqlParams.push(params.limit || 50);
370
+ const rows = db.prepare(sql).all(...sqlParams);
371
+ return rows.map((r) => this.mapRowToPattern(r));
372
+ }
373
+ static mapRowToPattern(row) {
374
+ return {
375
+ id: row.id,
376
+ project: row.project,
377
+ pattern_type: row.pattern_type,
378
+ context_tags: safeJsonParse(row.context_tags_json, []),
379
+ situation_pattern: row.situation_pattern,
380
+ recommended_strategy: row.recommended_strategy,
381
+ confidence: row.confidence,
382
+ sample_count: row.sample_count,
383
+ success_rate: row.success_rate,
384
+ metadata: safeJsonParse(row.metadata_json, void 0),
385
+ created_at: row.created_at,
386
+ updated_at: row.updated_at
387
+ };
388
+ }
389
+ /**
390
+ * Seeds tactical domain heuristics for gaming and autonomous agent navigation.
391
+ */
392
+ static seedDefaultPatterns(db, project) {
393
+ const defaults = [
394
+ {
395
+ pattern_type: "heuristic",
396
+ context_tags: ["combat", "kiting", "tactics"],
397
+ situation_pattern: "Melee enemy approaching within aggro range",
398
+ recommended_strategy: "Maintain distance, cast snare/slow ability, and backpedal along clear AABB path",
399
+ confidence: 0.9
400
+ },
401
+ {
402
+ pattern_type: "optimization",
403
+ context_tags: ["gathering", "economy", "inventory"],
404
+ situation_pattern: "Inventory weight exceeds capacity threshold (>85%)",
405
+ recommended_strategy: "Pause harvesting loop, plot waypoint route to bank/vendor, deposit heavy resources before resuming",
406
+ confidence: 0.95
407
+ },
408
+ {
409
+ pattern_type: "contingency",
410
+ context_tags: ["dungeon", "survival", "emergency"],
411
+ situation_pattern: "Player health falls below 30% during combat",
412
+ recommended_strategy: "Trigger high-priority preemption interrupt, consume health potion, and reposition behind obstacle cover",
413
+ confidence: 0.98
414
+ }
415
+ ];
416
+ let count = 0;
417
+ for (const p of defaults) {
418
+ const existing = db.prepare("SELECT id FROM knowledge_patterns WHERE project = ? AND situation_pattern = ?").get(project, p.situation_pattern);
419
+ if (!existing) {
420
+ this.createPattern(db, { project, ...p });
421
+ count++;
422
+ }
423
+ }
424
+ return count;
425
+ }
426
+ };
427
+
428
+ export {
429
+ generateId,
430
+ getCurrentIsoString,
431
+ parseIsoString,
432
+ getElapsedTimeMs,
433
+ safeJsonParse,
434
+ safeJsonStringify,
435
+ computeEventHash,
436
+ logReasoningEvent,
437
+ verifyEventChain,
438
+ sanitizeKeys,
439
+ UtilityProfileEngine,
440
+ KnowledgeEngine
441
+ };
442
+ //# sourceMappingURL=chunk-6CYLIFQX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/id.ts","../src/utils/time.ts","../src/engine/events.ts","../src/utils/json-validator.ts","../src/utils/sanitize.ts","../src/engine/personality.ts","../src/engine/knowledge.ts"],"sourcesContent":["import * as crypto from 'crypto';\n\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\nexport function generateId(): string {\n let now = Date.now();\n let timeStr = '';\n for (let i = 0; i < 10; i++) {\n const mod = now % 32;\n timeStr = ENCODING.charAt(mod) + timeStr;\n now = Math.floor(now / 32);\n }\n\n const randomBytes = crypto.randomBytes(16);\n let randomStr = '';\n for (let i = 0; i < 16; i++) {\n randomStr += ENCODING.charAt(randomBytes[i] % 32);\n }\n\n return timeStr + randomStr;\n}\n","export function getCurrentIsoString(): string {\n return new Date().toISOString();\n}\n\nexport function parseIsoString(iso: string): Date {\n return new Date(iso);\n}\n\nexport function getElapsedTimeMs(startTimeIso: string): number {\n return Date.now() - new Date(startTimeIso).getTime();\n}\n","import crypto from 'crypto';\nimport Database from 'better-sqlite3';\nimport { ReasoningEvent, EventId } from '../schema/types.js';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonParse } from '../utils/json-validator.js';\n\nexport function computeEventHash(params: {\n prev_hash: string;\n id: string;\n project: string;\n entity_id: string;\n entity_type: string;\n action: string;\n timestamp: string;\n details?: Record<string, unknown>;\n}): string {\n const data = [\n params.prev_hash,\n params.id,\n params.project,\n params.entity_id,\n params.entity_type,\n params.action,\n params.timestamp,\n JSON.stringify(params.details || {}),\n ].join('|');\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nexport function logReasoningEvent(\n db: Database.Database,\n params: {\n project: string;\n entity_id: string;\n entity_type: 'goal' | 'belief' | 'trace' | 'profile' | 'intention' | 'knowledge';\n action: string;\n details?: Record<string, unknown>;\n }\n): ReasoningEvent {\n const lastRow = db\n .prepare('SELECT hash FROM events WHERE project = ? ORDER BY rowid DESC LIMIT 1')\n .get(params.project) as { hash?: string } | undefined;\n const prevHash = lastRow?.hash || '0'.repeat(64);\n\n const eventId = generateId() as EventId;\n const timestamp = getCurrentIsoString();\n const hash = computeEventHash({\n prev_hash: prevHash,\n id: eventId,\n project: params.project,\n entity_id: params.entity_id,\n entity_type: params.entity_type,\n action: params.action,\n timestamp,\n details: params.details,\n });\n\n db.prepare(\n `\n INSERT INTO events (id, project, entity_id, entity_type, action, prev_hash, hash, details_json, timestamp)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `\n ).run(\n eventId,\n params.project,\n params.entity_id,\n params.entity_type,\n params.action,\n prevHash,\n hash,\n JSON.stringify(params.details || {}),\n timestamp\n );\n\n return {\n id: eventId,\n project: params.project,\n entity_id: params.entity_id,\n entity_type: params.entity_type,\n action: params.action,\n prev_hash: prevHash,\n hash,\n details: params.details,\n timestamp,\n };\n}\n\nexport function verifyEventChain(\n db: Database.Database,\n project: string\n): { valid: boolean; total_events: number; corrupted_event_id?: string; error?: string } {\n const rows = db\n .prepare('SELECT * FROM events WHERE project = ? ORDER BY rowid ASC')\n .all(project) as any[];\n\n if (rows.length === 0) {\n return { valid: true, total_events: 0 };\n }\n\n let expectedPrevHash = '0'.repeat(64);\n for (const row of rows) {\n if (row.prev_hash !== expectedPrevHash) {\n return {\n valid: false,\n total_events: rows.length,\n corrupted_event_id: row.id,\n error: `Prev hash mismatch at event ${row.id}: expected ${expectedPrevHash}, found ${row.prev_hash}`,\n };\n }\n\n const calculatedHash = computeEventHash({\n prev_hash: row.prev_hash,\n id: row.id,\n project: row.project,\n entity_id: row.entity_id,\n entity_type: row.entity_type,\n action: row.action,\n timestamp: row.timestamp,\n details: safeJsonParse(row.details_json, {}),\n });\n\n if (calculatedHash !== row.hash) {\n return {\n valid: false,\n total_events: rows.length,\n corrupted_event_id: row.id,\n error: `Data tamper detected at event ${row.id}: hash mismatch`,\n };\n }\n\n expectedPrevHash = row.hash;\n }\n\n return { valid: true, total_events: rows.length };\n}\n","export function safeJsonParse<T = any>(str: string | null | undefined, fallback: T): T {\n if (!str || typeof str !== 'string') return fallback;\n try {\n return JSON.parse(str) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function safeJsonStringify(obj: unknown, fallback = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch {\n return fallback;\n }\n}\n","const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Recursively sanitizes an object or array to prevent prototype pollution.\n * Strips dangerous property keys (__proto__, constructor, prototype).\n */\nexport function sanitizeKeys<T = any>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => sanitizeKeys(item)) as unknown as T;\n }\n\n const clean: Record<string, any> = Object.create(null);\n for (const key of Object.keys(obj as Record<string, any>)) {\n if (DANGEROUS_KEYS.has(key)) {\n continue;\n }\n const val = (obj as Record<string, any>)[key];\n clean[key] = sanitizeKeys(val);\n }\n\n return { ...clean } as T;\n}\n","import Database from 'better-sqlite3';\nimport { UtilityProfile, ProfileId } from '../schema/types.js';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonParse, safeJsonStringify } from '../utils/json-validator.js';\nimport { ValidationError, NotFoundError } from '../utils/errors.js';\nimport { logReasoningEvent } from './events.js';\nimport { sanitizeKeys } from '../utils/sanitize.js';\n\nexport class UtilityProfileEngine {\n static configureProfile(\n db: Database.Database,\n params: {\n project: string;\n name: string;\n description?: string;\n weights: Record<string, number>;\n is_active?: boolean;\n }\n ): UtilityProfile {\n if (!params.name) throw new ValidationError('Profile name is required.');\n if (!params.weights || Object.keys(params.weights).length === 0) {\n throw new ValidationError('Utility weights are required.');\n }\n\n const defaultWeights = {\n aggression: 0.5,\n caution: 0.5,\n greed: 0.5,\n efficiency: 0.5,\n exploration: 0.5,\n cooperation: 0.5,\n ...sanitizeKeys(params.weights),\n };\n\n const now = getCurrentIsoString();\n const existing = db\n .prepare('SELECT * FROM utility_profiles WHERE project = ? AND name = ?')\n .get(params.project, params.name) as any;\n\n if (params.is_active) {\n db.prepare('UPDATE utility_profiles SET is_active = 0 WHERE project = ?').run(params.project);\n }\n\n if (existing) {\n db.prepare(\n `\n UPDATE utility_profiles SET\n description = ?, weights_json = ?, is_active = ?, updated_at = ?\n WHERE id = ?\n `\n ).run(\n params.description ?? existing.description,\n safeJsonStringify(defaultWeights),\n params.is_active ? 1 : existing.is_active,\n now,\n existing.id\n );\n\n return this.getProfile(db, { project: params.project, name: params.name });\n }\n\n const id = generateId() as ProfileId;\n const isActive = params.is_active ? 1 : 0;\n\n db.prepare(\n `\n INSERT INTO utility_profiles (id, project, name, description, weights_json, is_active, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `\n ).run(\n id,\n params.project,\n params.name,\n params.description ?? null,\n safeJsonStringify(defaultWeights),\n isActive,\n now,\n now\n );\n\n logReasoningEvent(db, {\n project: params.project,\n entity_id: id,\n entity_type: 'profile',\n action: 'configure',\n details: { name: params.name, weights: defaultWeights },\n });\n\n return {\n id,\n project: params.project,\n name: params.name,\n description: params.description,\n weights: defaultWeights,\n is_active: isActive === 1,\n created_at: now,\n updated_at: now,\n };\n }\n\n static getActiveProfile(db: Database.Database, project: string): UtilityProfile {\n const row = db\n .prepare('SELECT * FROM utility_profiles WHERE project = ? AND is_active = 1')\n .get(project) as any;\n if (row) return this.mapRowToProfile(row);\n\n // Default fallback profile\n return {\n id: 'default' as ProfileId,\n project,\n name: 'balanced',\n description: 'Default balanced autonomous profile',\n weights: {\n aggression: 0.5,\n caution: 0.5,\n greed: 0.5,\n efficiency: 0.5,\n exploration: 0.5,\n cooperation: 0.5,\n },\n is_active: true,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n };\n }\n\n static getProfile(\n db: Database.Database,\n params: { project: string; name: string }\n ): UtilityProfile {\n const row = db\n .prepare('SELECT * FROM utility_profiles WHERE project = ? AND name = ?')\n .get(params.project, params.name) as any;\n if (!row) throw new NotFoundError(`Utility profile \"${params.name}\" not found.`);\n return this.mapRowToProfile(row);\n }\n\n static listProfiles(db: Database.Database, project: string): UtilityProfile[] {\n const rows = db\n .prepare('SELECT * FROM utility_profiles WHERE project = ? ORDER BY is_active DESC, name ASC')\n .all(project) as any[];\n return rows.map((r) => this.mapRowToProfile(r));\n }\n\n static activateProfile(\n db: Database.Database,\n params: { project: string; name: string }\n ): UtilityProfile {\n const profile = this.getProfile(db, params);\n db.transaction(() => {\n db.prepare('UPDATE utility_profiles SET is_active = 0 WHERE project = ?').run(params.project);\n db.prepare('UPDATE utility_profiles SET is_active = 1 WHERE project = ? AND name = ?').run(\n params.project,\n params.name\n );\n })();\n return { ...profile, is_active: true };\n }\n\n private static mapRowToProfile(row: any): UtilityProfile {\n return {\n id: row.id as ProfileId,\n project: row.project,\n name: row.name,\n description: row.description,\n weights: safeJsonParse(row.weights_json, {\n aggression: 0.5,\n caution: 0.5,\n greed: 0.5,\n efficiency: 0.5,\n exploration: 0.5,\n cooperation: 0.5,\n }),\n is_active: row.is_active === 1,\n metadata: safeJsonParse(row.metadata_json, undefined),\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n}\n","import Database from 'better-sqlite3';\nimport { KnowledgePattern, PatternId } from '../schema/types.js';\nimport { generateId } from '../utils/id.js';\nimport { getCurrentIsoString } from '../utils/time.js';\nimport { safeJsonParse, safeJsonStringify } from '../utils/json-validator.js';\nimport { ValidationError, NotFoundError } from '../utils/errors.js';\nimport { logReasoningEvent } from './events.js';\n\nexport class KnowledgeEngine {\n static createPattern(\n db: Database.Database,\n params: {\n project: string;\n pattern_type: 'heuristic' | 'anti_pattern' | 'optimization' | 'contingency';\n context_tags: string[];\n situation_pattern: string;\n recommended_strategy: string;\n confidence?: number;\n metadata?: Record<string, unknown>;\n }\n ): KnowledgePattern {\n if (!params.situation_pattern || !params.recommended_strategy) {\n throw new ValidationError('situation_pattern and recommended_strategy are required.');\n }\n\n const id = generateId() as PatternId;\n const now = getCurrentIsoString();\n const confidence = params.confidence !== undefined ? params.confidence : 0.7;\n\n db.prepare(\n `\n INSERT INTO knowledge_patterns (\n id, project, pattern_type, context_tags_json, situation_pattern,\n recommended_strategy, confidence, sample_count, success_rate,\n metadata_json, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 1, 1.0, ?, ?, ?)\n `\n ).run(\n id,\n params.project,\n params.pattern_type,\n safeJsonStringify(params.context_tags || []),\n params.situation_pattern,\n params.recommended_strategy,\n confidence,\n params.metadata ? safeJsonStringify(params.metadata) : null,\n now,\n now\n );\n\n logReasoningEvent(db, {\n project: params.project,\n entity_id: id,\n entity_type: 'knowledge',\n action: 'create_pattern',\n details: { pattern_type: params.pattern_type, situation: params.situation_pattern },\n });\n\n return {\n id,\n project: params.project,\n pattern_type: params.pattern_type,\n context_tags: params.context_tags || [],\n situation_pattern: params.situation_pattern,\n recommended_strategy: params.recommended_strategy,\n confidence,\n sample_count: 1,\n success_rate: 1.0,\n metadata: params.metadata,\n created_at: now,\n updated_at: now,\n };\n }\n\n static queryKnowledge(\n db: Database.Database,\n params: {\n project: string;\n query?: string;\n pattern_type?: string;\n context_tags?: string[];\n limit?: number;\n }\n ): KnowledgePattern[] {\n let sql = 'SELECT * FROM knowledge_patterns WHERE project = ?';\n const sqlParams: any[] = [params.project];\n\n if (params.pattern_type) {\n sql += ' AND pattern_type = ?';\n sqlParams.push(params.pattern_type);\n }\n if (params.query) {\n sql += ' AND (situation_pattern LIKE ? OR recommended_strategy LIKE ?)';\n sqlParams.push(`%${params.query}%`, `%${params.query}%`);\n }\n\n sql += ' ORDER BY confidence DESC, success_rate DESC LIMIT ?';\n sqlParams.push(params.limit || 50);\n\n const rows = db.prepare(sql).all(...sqlParams) as any[];\n return rows.map((r) => this.mapRowToPattern(r));\n }\n\n private static mapRowToPattern(row: any): KnowledgePattern {\n return {\n id: row.id as PatternId,\n project: row.project,\n pattern_type: row.pattern_type,\n context_tags: safeJsonParse(row.context_tags_json, []),\n situation_pattern: row.situation_pattern,\n recommended_strategy: row.recommended_strategy,\n confidence: row.confidence,\n sample_count: row.sample_count,\n success_rate: row.success_rate,\n metadata: safeJsonParse(row.metadata_json, undefined),\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n /**\n * Seeds tactical domain heuristics for gaming and autonomous agent navigation.\n */\n static seedDefaultPatterns(db: Database.Database, project: string): number {\n const defaults = [\n {\n pattern_type: 'heuristic' as const,\n context_tags: ['combat', 'kiting', 'tactics'],\n situation_pattern: 'Melee enemy approaching within aggro range',\n recommended_strategy:\n 'Maintain distance, cast snare/slow ability, and backpedal along clear AABB path',\n confidence: 0.9,\n },\n {\n pattern_type: 'optimization' as const,\n context_tags: ['gathering', 'economy', 'inventory'],\n situation_pattern: 'Inventory weight exceeds capacity threshold (>85%)',\n recommended_strategy:\n 'Pause harvesting loop, plot waypoint route to bank/vendor, deposit heavy resources before resuming',\n confidence: 0.95,\n },\n {\n pattern_type: 'contingency' as const,\n context_tags: ['dungeon', 'survival', 'emergency'],\n situation_pattern: 'Player health falls below 30% during combat',\n recommended_strategy:\n 'Trigger high-priority preemption interrupt, consume health potion, and reposition behind obstacle cover',\n confidence: 0.98,\n },\n ];\n\n let count = 0;\n for (const p of defaults) {\n const existing = db\n .prepare('SELECT id FROM knowledge_patterns WHERE project = ? AND situation_pattern = ?')\n .get(project, p.situation_pattern);\n if (!existing) {\n this.createPattern(db, { project, ...p });\n count++;\n }\n }\n return count;\n }\n}\n"],"mappings":";;;;;;AAAA,YAAY,YAAY;AAExB,IAAM,WAAW;AAEV,SAAS,aAAqB;AACnC,MAAI,MAAM,KAAK,IAAI;AACnB,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,MAAM,MAAM;AAClB,cAAU,SAAS,OAAO,GAAG,IAAI;AACjC,UAAM,KAAK,MAAM,MAAM,EAAE;AAAA,EAC3B;AAEA,QAAMA,eAAqB,mBAAY,EAAE;AACzC,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,iBAAa,SAAS,OAAOA,aAAY,CAAC,IAAI,EAAE;AAAA,EAClD;AAEA,SAAO,UAAU;AACnB;;;ACpBO,SAAS,sBAA8B;AAC5C,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEO,SAAS,eAAe,KAAmB;AAChD,SAAO,IAAI,KAAK,GAAG;AACrB;AAEO,SAAS,iBAAiB,cAA8B;AAC7D,SAAO,KAAK,IAAI,IAAI,IAAI,KAAK,YAAY,EAAE,QAAQ;AACrD;;;ACVA,OAAOC,aAAY;;;ACAZ,SAAS,cAAuB,KAAgC,UAAgB;AACrF,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,KAAc,WAAW,MAAc;AACvE,MAAI;AACF,WAAO,KAAK,UAAU,GAAG;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADRO,SAAS,iBAAiB,QAStB;AACT,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK,UAAU,OAAO,WAAW,CAAC,CAAC;AAAA,EACrC,EAAE,KAAK,GAAG;AACV,SAAOC,QAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC9D;AAEO,SAAS,kBACd,IACA,QAOgB;AAChB,QAAM,UAAU,GACb,QAAQ,uEAAuE,EAC/E,IAAI,OAAO,OAAO;AACrB,QAAM,WAAW,SAAS,QAAQ,IAAI,OAAO,EAAE;AAE/C,QAAM,UAAU,WAAW;AAC3B,QAAM,YAAY,oBAAoB;AACtC,QAAM,OAAO,iBAAiB;AAAA,IAC5B,WAAW;AAAA,IACX,IAAI;AAAA,IACJ,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,QAAQ,OAAO;AAAA,IACf;AAAA,IACA,SAAS,OAAO;AAAA,EAClB,CAAC;AAED,KAAG;AAAA,IACD;AAAA;AAAA;AAAA;AAAA,EAIF,EAAE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,KAAK,UAAU,OAAO,WAAW,CAAC,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,QAAQ,OAAO;AAAA,IACf,WAAW;AAAA,IACX;AAAA,IACA,SAAS,OAAO;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,iBACd,IACA,SACuF;AACvF,QAAM,OAAO,GACV,QAAQ,2DAA2D,EACnE,IAAI,OAAO;AAEd,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,EAAE,OAAO,MAAM,cAAc,EAAE;AAAA,EACxC;AAEA,MAAI,mBAAmB,IAAI,OAAO,EAAE;AACpC,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,cAAc,kBAAkB;AACtC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,cAAc,KAAK;AAAA,QACnB,oBAAoB,IAAI;AAAA,QACxB,OAAO,+BAA+B,IAAI,EAAE,cAAc,gBAAgB,WAAW,IAAI,SAAS;AAAA,MACpG;AAAA,IACF;AAEA,UAAM,iBAAiB,iBAAiB;AAAA,MACtC,WAAW,IAAI;AAAA,MACf,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,WAAW,IAAI;AAAA,MACf,aAAa,IAAI;AAAA,MACjB,QAAQ,IAAI;AAAA,MACZ,WAAW,IAAI;AAAA,MACf,SAAS,cAAc,IAAI,cAAc,CAAC,CAAC;AAAA,IAC7C,CAAC;AAED,QAAI,mBAAmB,IAAI,MAAM;AAC/B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,cAAc,KAAK;AAAA,QACnB,oBAAoB,IAAI;AAAA,QACxB,OAAO,iCAAiC,IAAI,EAAE;AAAA,MAChD;AAAA,IACF;AAEA,uBAAmB,IAAI;AAAA,EACzB;AAEA,SAAO,EAAE,OAAO,MAAM,cAAc,KAAK,OAAO;AAClD;;;AEvIA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAMjE,SAAS,aAAsB,KAAW;AAC/C,MAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,CAAC,SAAS,aAAa,IAAI,CAAC;AAAA,EAC7C;AAEA,QAAM,QAA6B,uBAAO,OAAO,IAAI;AACrD,aAAW,OAAO,OAAO,KAAK,GAA0B,GAAG;AACzD,QAAI,eAAe,IAAI,GAAG,GAAG;AAC3B;AAAA,IACF;AACA,UAAM,MAAO,IAA4B,GAAG;AAC5C,UAAM,GAAG,IAAI,aAAa,GAAG;AAAA,EAC/B;AAEA,SAAO,EAAE,GAAG,MAAM;AACpB;;;AChBO,IAAM,uBAAN,MAA2B;AAAA,EAChC,OAAO,iBACL,IACA,QAOgB;AAChB,QAAI,CAAC,OAAO,KAAM,OAAM,IAAI,gBAAgB,2BAA2B;AACvE,QAAI,CAAC,OAAO,WAAW,OAAO,KAAK,OAAO,OAAO,EAAE,WAAW,GAAG;AAC/D,YAAM,IAAI,gBAAgB,+BAA+B;AAAA,IAC3D;AAEA,UAAM,iBAAiB;AAAA,MACrB,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,GAAG,aAAa,OAAO,OAAO;AAAA,IAChC;AAEA,UAAM,MAAM,oBAAoB;AAChC,UAAM,WAAW,GACd,QAAQ,+DAA+D,EACvE,IAAI,OAAO,SAAS,OAAO,IAAI;AAElC,QAAI,OAAO,WAAW;AACpB,SAAG,QAAQ,6DAA6D,EAAE,IAAI,OAAO,OAAO;AAAA,IAC9F;AAEA,QAAI,UAAU;AACZ,SAAG;AAAA,QACD;AAAA;AAAA;AAAA;AAAA;AAAA,MAKF,EAAE;AAAA,QACA,OAAO,eAAe,SAAS;AAAA,QAC/B,kBAAkB,cAAc;AAAA,QAChC,OAAO,YAAY,IAAI,SAAS;AAAA,QAChC;AAAA,QACA,SAAS;AAAA,MACX;AAEA,aAAO,KAAK,WAAW,IAAI,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,KAAK,CAAC;AAAA,IAC3E;AAEA,UAAM,KAAK,WAAW;AACtB,UAAM,WAAW,OAAO,YAAY,IAAI;AAExC,OAAG;AAAA,MACD;AAAA;AAAA;AAAA;AAAA,IAIF,EAAE;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO,eAAe;AAAA,MACtB,kBAAkB,cAAc;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,sBAAkB,IAAI;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,SAAS,EAAE,MAAM,OAAO,MAAM,SAAS,eAAe;AAAA,IACxD,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,SAAS;AAAA,MACT,WAAW,aAAa;AAAA,MACxB,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA,OAAO,iBAAiB,IAAuB,SAAiC;AAC9E,UAAM,MAAM,GACT,QAAQ,oEAAoE,EAC5E,IAAI,OAAO;AACd,QAAI,IAAK,QAAO,KAAK,gBAAgB,GAAG;AAGxC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,MACX,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,OAAO,WACL,IACA,QACgB;AAChB,UAAM,MAAM,GACT,QAAQ,+DAA+D,EACvE,IAAI,OAAO,SAAS,OAAO,IAAI;AAClC,QAAI,CAAC,IAAK,OAAM,IAAI,cAAc,oBAAoB,OAAO,IAAI,cAAc;AAC/E,WAAO,KAAK,gBAAgB,GAAG;AAAA,EACjC;AAAA,EAEA,OAAO,aAAa,IAAuB,SAAmC;AAC5E,UAAM,OAAO,GACV,QAAQ,oFAAoF,EAC5F,IAAI,OAAO;AACd,WAAO,KAAK,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC;AAAA,EAChD;AAAA,EAEA,OAAO,gBACL,IACA,QACgB;AAChB,UAAM,UAAU,KAAK,WAAW,IAAI,MAAM;AAC1C,OAAG,YAAY,MAAM;AACnB,SAAG,QAAQ,6DAA6D,EAAE,IAAI,OAAO,OAAO;AAC5F,SAAG,QAAQ,0EAA0E,EAAE;AAAA,QACrF,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,IACF,CAAC,EAAE;AACH,WAAO,EAAE,GAAG,SAAS,WAAW,KAAK;AAAA,EACvC;AAAA,EAEA,OAAe,gBAAgB,KAA0B;AACvD,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,MACV,aAAa,IAAI;AAAA,MACjB,SAAS,cAAc,IAAI,cAAc;AAAA,QACvC,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,aAAa;AAAA,MACf,CAAC;AAAA,MACD,WAAW,IAAI,cAAc;AAAA,MAC7B,UAAU,cAAc,IAAI,eAAe,MAAS;AAAA,MACpD,YAAY,IAAI;AAAA,MAChB,YAAY,IAAI;AAAA,IAClB;AAAA,EACF;AACF;;;AC5KO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,cACL,IACA,QASkB;AAClB,QAAI,CAAC,OAAO,qBAAqB,CAAC,OAAO,sBAAsB;AAC7D,YAAM,IAAI,gBAAgB,0DAA0D;AAAA,IACtF;AAEA,UAAM,KAAK,WAAW;AACtB,UAAM,MAAM,oBAAoB;AAChC,UAAM,aAAa,OAAO,eAAe,SAAY,OAAO,aAAa;AAEzE,OAAG;AAAA,MACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOF,EAAE;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,kBAAkB,OAAO,gBAAgB,CAAC,CAAC;AAAA,MAC3C,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA,OAAO,WAAW,kBAAkB,OAAO,QAAQ,IAAI;AAAA,MACvD;AAAA,MACA;AAAA,IACF;AAEA,sBAAkB,IAAI;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,SAAS,EAAE,cAAc,OAAO,cAAc,WAAW,OAAO,kBAAkB;AAAA,IACpF,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO,gBAAgB,CAAC;AAAA,MACtC,mBAAmB,OAAO;AAAA,MAC1B,sBAAsB,OAAO;AAAA,MAC7B;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA,OAAO,eACL,IACA,QAOoB;AACpB,QAAI,MAAM;AACV,UAAM,YAAmB,CAAC,OAAO,OAAO;AAExC,QAAI,OAAO,cAAc;AACvB,aAAO;AACP,gBAAU,KAAK,OAAO,YAAY;AAAA,IACpC;AACA,QAAI,OAAO,OAAO;AAChB,aAAO;AACP,gBAAU,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,GAAG;AAAA,IACzD;AAEA,WAAO;AACP,cAAU,KAAK,OAAO,SAAS,EAAE;AAEjC,UAAM,OAAO,GAAG,QAAQ,GAAG,EAAE,IAAI,GAAG,SAAS;AAC7C,WAAO,KAAK,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC;AAAA,EAChD;AAAA,EAEA,OAAe,gBAAgB,KAA4B;AACzD,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,cAAc,IAAI;AAAA,MAClB,cAAc,cAAc,IAAI,mBAAmB,CAAC,CAAC;AAAA,MACrD,mBAAmB,IAAI;AAAA,MACvB,sBAAsB,IAAI;AAAA,MAC1B,YAAY,IAAI;AAAA,MAChB,cAAc,IAAI;AAAA,MAClB,cAAc,IAAI;AAAA,MAClB,UAAU,cAAc,IAAI,eAAe,MAAS;AAAA,MACpD,YAAY,IAAI;AAAA,MAChB,YAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,oBAAoB,IAAuB,SAAyB;AACzE,UAAM,WAAW;AAAA,MACf;AAAA,QACE,cAAc;AAAA,QACd,cAAc,CAAC,UAAU,UAAU,SAAS;AAAA,QAC5C,mBAAmB;AAAA,QACnB,sBACE;AAAA,QACF,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,cAAc,CAAC,aAAa,WAAW,WAAW;AAAA,QAClD,mBAAmB;AAAA,QACnB,sBACE;AAAA,QACF,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,cAAc,CAAC,WAAW,YAAY,WAAW;AAAA,QACjD,mBAAmB;AAAA,QACnB,sBACE;AAAA,QACF,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI,QAAQ;AACZ,eAAW,KAAK,UAAU;AACxB,YAAM,WAAW,GACd,QAAQ,+EAA+E,EACvF,IAAI,SAAS,EAAE,iBAAiB;AACnC,UAAI,CAAC,UAAU;AACb,aAAK,cAAc,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;AACxC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;","names":["randomBytes","crypto","crypto"]}