@getanima/core 0.3.0 → 0.3.2

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.
@@ -8,6 +8,9 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.ReflectionEngine = void 0;
10
10
  const utils_1 = require("./utils");
11
+ const path_1 = require("path");
12
+ const crypto_1 = require("crypto");
13
+ const promises_1 = require("fs/promises");
11
14
  class ReflectionEngine {
12
15
  storagePath;
13
16
  memory;
@@ -66,25 +69,75 @@ class ReflectionEngine {
66
69
  return review;
67
70
  }
68
71
  /**
69
- * Check for memory conflicts — when different sessions have contradictory beliefs.
72
+ * Detect memory conflicts — when opinions have shifted, indicating contradictory beliefs
73
+ * across sessions. Returns structured MemoryConflict objects.
70
74
  */
71
75
  async detectConflicts() {
72
76
  const opinions = await this.memory.getOpinions();
77
+ const conflictsPath = (0, path_1.join)(this.storagePath, 'conflicts.json');
78
+ const raw = await (0, utils_1.readFileSafe)(conflictsPath);
79
+ const existing = JSON.parse(raw || '[]');
73
80
  const conflicts = [];
74
81
  for (const opinion of opinions) {
75
- if (opinion.previousOpinions.length > 0) {
76
- // This opinion has changed — potential conflict
77
- const relatedMemories = await this.memory.recall(opinion.topic, 5);
78
- if (relatedMemories.length > 1) {
79
- conflicts.push({
80
- topic: opinion.topic,
81
- memories: relatedMemories,
82
- });
83
- }
84
- }
82
+ if (opinion.previousOpinions.length === 0)
83
+ continue;
84
+ // Skip already resolved conflicts
85
+ const alreadyResolved = existing.find(c => c.topic === opinion.topic && c.resolved);
86
+ if (alreadyResolved)
87
+ continue;
88
+ const latest = opinion.previousOpinions[opinion.previousOpinions.length - 1];
89
+ conflicts.push({
90
+ id: existing.find(c => c.topic === opinion.topic)?.id || (0, crypto_1.randomUUID)(),
91
+ topic: opinion.topic,
92
+ positionA: {
93
+ content: latest.opinion,
94
+ session: latest.date || 'unknown',
95
+ date: latest.date || 'unknown',
96
+ },
97
+ positionB: {
98
+ content: opinion.current,
99
+ session: 'current',
100
+ date: opinion.updatedAt,
101
+ },
102
+ resolved: false,
103
+ });
104
+ }
105
+ // Persist conflicts (overwrite, not append)
106
+ if (conflicts.length > 0) {
107
+ const merged = [
108
+ ...existing.filter(c => c.resolved),
109
+ ...conflicts,
110
+ ];
111
+ await (0, utils_1.ensureDir)(this.storagePath);
112
+ await (0, promises_1.writeFile)(conflictsPath, JSON.stringify(merged, null, 2), 'utf-8');
85
113
  }
86
114
  return conflicts;
87
115
  }
116
+ /**
117
+ * Resolve a conflict by providing a resolution explanation.
118
+ */
119
+ async resolveConflict(conflictId, resolution) {
120
+ const conflictsPath = (0, path_1.join)(this.storagePath, 'conflicts.json');
121
+ const raw = await (0, utils_1.readFileSafe)(conflictsPath);
122
+ const conflicts = JSON.parse(raw || '[]');
123
+ const conflict = conflicts.find(c => c.id === conflictId);
124
+ if (!conflict)
125
+ return false;
126
+ conflict.resolved = true;
127
+ conflict.resolution = resolution;
128
+ conflict.resolvedAt = (0, utils_1.now)();
129
+ await (0, promises_1.writeFile)(conflictsPath, JSON.stringify(conflicts, null, 2), 'utf-8');
130
+ return true;
131
+ }
132
+ /**
133
+ * Get all conflicts (resolved and unresolved).
134
+ */
135
+ async getConflicts(includeResolved = false) {
136
+ const conflictsPath = (0, path_1.join)(this.storagePath, 'conflicts.json');
137
+ const raw = await (0, utils_1.readFileSafe)(conflictsPath);
138
+ const conflicts = JSON.parse(raw || '[]');
139
+ return includeResolved ? conflicts : conflicts.filter(c => !c.resolved);
140
+ }
88
141
  }
89
142
  exports.ReflectionEngine = ReflectionEngine;
90
143
  //# sourceMappingURL=reflection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reflection.js","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reflection.js","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK5C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAAS;gBAEX,WAAW,EAAE,MAAM;IAK/B,oCAAoC;IAC9B,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAerC,kCAAkC;YACpB,IAAI;IAIlB,OAAO,CAAC,YAAY;IAIpB,6BAA6B;IAC7B,MAAM,IAAI,YAAY,EAAE;IAKxB,sDAAsD;IACtD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAM5C,iCAAiC;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAK9C,0FAA0F;IACpF,IAAI,CAAC,KAAK,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,GAAG,OAAO,CAAC,YAAY,CAAC;IAkCzB,uDAAuD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAWzE,oCAAoC;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS3D,qCAAqC;IAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C,2DAA2D;IAC3D,MAAM,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAOlC,qDAAqD;IACrD,OAAO,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;CAMpC"}
1
+ {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM5C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAAS;gBAEX,WAAW,EAAE,MAAM;IAK/B,oCAAoC;IAC9B,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAerC,kCAAkC;YACpB,IAAI;IAIlB,OAAO,CAAC,YAAY;IAIpB,6BAA6B;IAC7B,MAAM,IAAI,YAAY,EAAE;IAKxB,sDAAsD;IACtD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAM5C,iCAAiC;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAK9C,0FAA0F;IACpF,IAAI,CAAC,KAAK,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,GAAG,OAAO,CAAC,YAAY,CAAC;IAqDzB,uDAAuD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAkBzE,oCAAoC;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc3D,qCAAqC;IAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C,2DAA2D;IAC3D,MAAM,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAOlC,qDAAqD;IACrD,OAAO,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;CAMpC"}
@@ -9,6 +9,7 @@
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.RelationshipEngine = void 0;
11
11
  const utils_1 = require("./utils");
12
+ const validation_1 = require("./validation");
12
13
  const path_1 = require("path");
13
14
  const promises_1 = require("fs/promises");
14
15
  class RelationshipEngine {
@@ -17,8 +18,8 @@ class RelationshipEngine {
17
18
  relationships = [];
18
19
  loaded = false;
19
20
  constructor(storagePath) {
20
- this.storagePath = storagePath;
21
- this.filePath = (0, path_1.join)(storagePath, 'relationships', 'relationships.json');
21
+ this.storagePath = (0, validation_1.validateStoragePath)(storagePath);
22
+ this.filePath = (0, path_1.join)(this.storagePath, 'relationships', 'relationships.json');
22
23
  }
23
24
  /** Load relationships from disk. */
24
25
  async load() {
@@ -63,32 +64,47 @@ class RelationshipEngine {
63
64
  /** Add or update a relationship. If name exists, updates it. Returns the relationship. */
64
65
  async meet(input) {
65
66
  this.ensureLoaded();
66
- const existing = this.find(input.name);
67
+ // Validate inputs
68
+ const name = (0, validation_1.validateString)(input.name, 'name', { maxLength: validation_1.LIMITS.MAX_NAME_LENGTH });
69
+ const type = input.type ? (0, validation_1.validateEnum)(input.type, 'type', ['human', 'agent', 'entity']) : 'human';
70
+ const context = (0, validation_1.validateOptionalString)(input.context, 'context', validation_1.LIMITS.MAX_NOTE_LENGTH);
71
+ const notes = input.notes ? (0, validation_1.validateStringArray)(input.notes, 'notes', { maxItems: validation_1.LIMITS.MAX_NOTES_PER_RELATIONSHIP, maxItemLength: validation_1.LIMITS.MAX_NOTE_LENGTH }) : [];
72
+ const preferences = input.preferences ? (0, validation_1.validateStringArray)(input.preferences, 'preferences', { maxItems: validation_1.LIMITS.MAX_PREFERENCES, maxItemLength: validation_1.LIMITS.MAX_TAG_LENGTH }) : [];
73
+ const existing = this.find(name);
67
74
  if (existing) {
68
75
  // Update existing
69
76
  existing.lastInteraction = (0, utils_1.now)();
70
77
  existing.interactionCount++;
71
- if (input.context)
72
- existing.context = input.context;
73
- if (input.notes)
74
- existing.notes.push(...input.notes);
75
- if (input.preferences) {
76
- existing.preferences = [...new Set([...(existing.preferences || []), ...input.preferences])];
78
+ if (context)
79
+ existing.context = context;
80
+ if (notes.length) {
81
+ existing.notes.push(...notes);
82
+ // Enforce max notes
83
+ if (existing.notes.length > validation_1.LIMITS.MAX_NOTES_PER_RELATIONSHIP) {
84
+ existing.notes = existing.notes.slice(-validation_1.LIMITS.MAX_NOTES_PER_RELATIONSHIP);
85
+ }
86
+ }
87
+ if (preferences.length) {
88
+ existing.preferences = [...new Set([...(existing.preferences || []), ...preferences])].slice(0, validation_1.LIMITS.MAX_PREFERENCES);
77
89
  }
78
90
  await this.save();
79
91
  return existing;
80
92
  }
93
+ // Enforce max relationships
94
+ if (this.relationships.length >= validation_1.LIMITS.MAX_RELATIONSHIPS) {
95
+ throw new validation_1.AnimaValidationError('relationships', `maximum of ${validation_1.LIMITS.MAX_RELATIONSHIPS} relationships reached`);
96
+ }
81
97
  // Create new
82
98
  const rel = {
83
99
  id: (0, utils_1.uid)(),
84
- name: input.name,
85
- type: input.type || 'human',
86
- context: input.context || '',
100
+ name,
101
+ type,
102
+ context: context || '',
87
103
  interactionCount: 1,
88
104
  firstMet: (0, utils_1.now)(),
89
105
  lastInteraction: (0, utils_1.now)(),
90
- preferences: input.preferences || [],
91
- notes: input.notes || [],
106
+ preferences,
107
+ notes,
92
108
  };
93
109
  this.relationships.push(rel);
94
110
  await this.save();
@@ -97,23 +113,35 @@ class RelationshipEngine {
97
113
  /** Record an interaction (bumps count + timestamp). */
98
114
  async interact(name, note) {
99
115
  this.ensureLoaded();
100
- const rel = this.find(name);
116
+ const validName = (0, validation_1.validateString)(name, 'name', { maxLength: validation_1.LIMITS.MAX_NAME_LENGTH });
117
+ if (note !== undefined)
118
+ (0, validation_1.validateString)(note, 'note', { maxLength: validation_1.LIMITS.MAX_NOTE_LENGTH, required: false });
119
+ const rel = this.find(validName);
101
120
  if (!rel)
102
121
  return null;
103
122
  rel.interactionCount++;
104
123
  rel.lastInteraction = (0, utils_1.now)();
105
- if (note)
124
+ if (note) {
106
125
  rel.notes.push(note);
126
+ if (rel.notes.length > validation_1.LIMITS.MAX_NOTES_PER_RELATIONSHIP) {
127
+ rel.notes = rel.notes.slice(-validation_1.LIMITS.MAX_NOTES_PER_RELATIONSHIP);
128
+ }
129
+ }
107
130
  await this.save();
108
131
  return rel;
109
132
  }
110
133
  /** Add a note to a relationship. */
111
134
  async addNote(name, note) {
112
135
  this.ensureLoaded();
113
- const rel = this.find(name);
136
+ const validName = (0, validation_1.validateString)(name, 'name', { maxLength: validation_1.LIMITS.MAX_NAME_LENGTH });
137
+ const validNote = (0, validation_1.validateString)(note, 'note', { maxLength: validation_1.LIMITS.MAX_NOTE_LENGTH });
138
+ const rel = this.find(validName);
114
139
  if (!rel)
115
140
  return false;
116
- rel.notes.push(note);
141
+ rel.notes.push(validNote);
142
+ if (rel.notes.length > validation_1.LIMITS.MAX_NOTES_PER_RELATIONSHIP) {
143
+ rel.notes = rel.notes.slice(-validation_1.LIMITS.MAX_NOTES_PER_RELATIONSHIP);
144
+ }
117
145
  await this.save();
118
146
  return true;
119
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Input validation & sanitization for Anima SDK.
3
+ *
4
+ * Every public method should validate inputs before processing.
5
+ * Fail fast, fail loud — don't silently accept garbage data.
6
+ */
7
+ export declare const LIMITS: {
8
+ /** Max length for a single memory content field */
9
+ readonly MAX_MEMORY_CONTENT: 50000;
10
+ /** Max length for a single note */
11
+ readonly MAX_NOTE_LENGTH: 10000;
12
+ /** Max length for a name field */
13
+ readonly MAX_NAME_LENGTH: 200;
14
+ /** Max length for a topic field */
15
+ readonly MAX_TOPIC_LENGTH: 500;
16
+ /** Max length for an opinion */
17
+ readonly MAX_OPINION_LENGTH: 10000;
18
+ /** Max number of tags per memory */
19
+ readonly MAX_TAGS: 50;
20
+ /** Max length of a single tag */
21
+ readonly MAX_TAG_LENGTH: 100;
22
+ /** Max number of notes per relationship */
23
+ readonly MAX_NOTES_PER_RELATIONSHIP: 1000;
24
+ /** Max number of preferences per relationship */
25
+ readonly MAX_PREFERENCES: 100;
26
+ /** Max number of relationships */
27
+ readonly MAX_RELATIONSHIPS: 10000;
28
+ /** Max number of memories in index */
29
+ readonly MAX_MEMORIES: 100000;
30
+ /** Max number of opinions */
31
+ readonly MAX_OPINIONS: 5000;
32
+ };
33
+ export declare class AnimaValidationError extends Error {
34
+ readonly field: string;
35
+ readonly constraint: string;
36
+ constructor(field: string, constraint: string);
37
+ }
38
+ /** Validate a required string field is non-empty and within length */
39
+ export declare function validateString(value: unknown, field: string, opts?: {
40
+ maxLength?: number;
41
+ minLength?: number;
42
+ required?: boolean;
43
+ }): string;
44
+ /** Validate an optional string — returns undefined if not provided */
45
+ export declare function validateOptionalString(value: unknown, field: string, maxLength: number): string | undefined;
46
+ /** Validate a number is within range */
47
+ export declare function validateNumber(value: unknown, field: string, opts?: {
48
+ min?: number;
49
+ max?: number;
50
+ required?: boolean;
51
+ }): number;
52
+ /** Validate a string array with per-item and total limits */
53
+ export declare function validateStringArray(value: unknown, field: string, opts?: {
54
+ maxItems?: number;
55
+ maxItemLength?: number;
56
+ required?: boolean;
57
+ }): string[];
58
+ /**
59
+ * Validate and sanitize a storage path.
60
+ *
61
+ * Prevents:
62
+ * - Path traversal (../../etc/passwd)
63
+ * - Null bytes
64
+ * - Paths outside the resolved directory
65
+ */
66
+ export declare function validateStoragePath(storagePath: string): string;
67
+ /**
68
+ * Ensure a sub-path stays within the base directory.
69
+ * Use this when constructing paths from user-provided segments.
70
+ */
71
+ export declare function validateSubPath(basePath: string, subPath: string): string;
72
+ /** Validate a value is one of the allowed options */
73
+ export declare function validateEnum<T extends string>(value: unknown, field: string, allowed: readonly T[], defaultValue?: T): T;
74
+ /** Validate confidence score: must be 0-1 */
75
+ export declare function validateConfidence(value: unknown, field?: string): number;
76
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,MAAM;IACjB,mDAAmD;;IAEnD,mCAAmC;;IAEnC,kCAAkC;;IAElC,mCAAmC;;IAEnC,gCAAgC;;IAEhC,oCAAoC;;IAEpC,iCAAiC;;IAEjC,2CAA2C;;IAE3C,iDAAiD;;IAEjD,kCAAkC;;IAElC,sCAAsC;;IAEtC,6BAA6B;;CAErB,CAAC;AAIX,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAM9C;AAID,sEAAsE;AACtE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACxE,MAAM,CAuBR;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAGpB;AAID,wCAAwC;AACxC,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5D,MAAM,CAiBR;AAID,6DAA6D;AAC7D,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3E,MAAM,EAAE,CAyBV;AAID;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmB/D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMzE;AAID,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,CAWH;AAID,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAe,GAAG,MAAM,CAE/E"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /**
3
+ * Input validation & sanitization for Anima SDK.
4
+ *
5
+ * Every public method should validate inputs before processing.
6
+ * Fail fast, fail loud — don't silently accept garbage data.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AnimaValidationError = exports.LIMITS = void 0;
10
+ exports.validateString = validateString;
11
+ exports.validateOptionalString = validateOptionalString;
12
+ exports.validateNumber = validateNumber;
13
+ exports.validateStringArray = validateStringArray;
14
+ exports.validateStoragePath = validateStoragePath;
15
+ exports.validateSubPath = validateSubPath;
16
+ exports.validateEnum = validateEnum;
17
+ exports.validateConfidence = validateConfidence;
18
+ const path_1 = require("path");
19
+ // ============ LIMITS ============
20
+ exports.LIMITS = {
21
+ /** Max length for a single memory content field */
22
+ MAX_MEMORY_CONTENT: 50_000, // 50KB — generous but not absurd
23
+ /** Max length for a single note */
24
+ MAX_NOTE_LENGTH: 10_000, // 10KB
25
+ /** Max length for a name field */
26
+ MAX_NAME_LENGTH: 200,
27
+ /** Max length for a topic field */
28
+ MAX_TOPIC_LENGTH: 500,
29
+ /** Max length for an opinion */
30
+ MAX_OPINION_LENGTH: 10_000,
31
+ /** Max number of tags per memory */
32
+ MAX_TAGS: 50,
33
+ /** Max length of a single tag */
34
+ MAX_TAG_LENGTH: 100,
35
+ /** Max number of notes per relationship */
36
+ MAX_NOTES_PER_RELATIONSHIP: 1000,
37
+ /** Max number of preferences per relationship */
38
+ MAX_PREFERENCES: 100,
39
+ /** Max number of relationships */
40
+ MAX_RELATIONSHIPS: 10_000,
41
+ /** Max number of memories in index */
42
+ MAX_MEMORIES: 100_000,
43
+ /** Max number of opinions */
44
+ MAX_OPINIONS: 5_000,
45
+ };
46
+ // ============ ERRORS ============
47
+ class AnimaValidationError extends Error {
48
+ field;
49
+ constraint;
50
+ constructor(field, constraint) {
51
+ super(`Validation failed: ${field} — ${constraint}`);
52
+ this.name = 'AnimaValidationError';
53
+ this.field = field;
54
+ this.constraint = constraint;
55
+ }
56
+ }
57
+ exports.AnimaValidationError = AnimaValidationError;
58
+ // ============ STRING VALIDATORS ============
59
+ /** Validate a required string field is non-empty and within length */
60
+ function validateString(value, field, opts = {}) {
61
+ const { maxLength, minLength = 1, required = true } = opts;
62
+ if (value === undefined || value === null) {
63
+ if (required)
64
+ throw new AnimaValidationError(field, 'is required');
65
+ return '';
66
+ }
67
+ if (typeof value !== 'string') {
68
+ throw new AnimaValidationError(field, 'must be a string');
69
+ }
70
+ const trimmed = value.trim();
71
+ if (required && trimmed.length < minLength) {
72
+ throw new AnimaValidationError(field, `must be at least ${minLength} character(s), got ${trimmed.length}`);
73
+ }
74
+ if (maxLength && trimmed.length > maxLength) {
75
+ throw new AnimaValidationError(field, `must be at most ${maxLength} characters, got ${trimmed.length}`);
76
+ }
77
+ return trimmed;
78
+ }
79
+ /** Validate an optional string — returns undefined if not provided */
80
+ function validateOptionalString(value, field, maxLength) {
81
+ if (value === undefined || value === null)
82
+ return undefined;
83
+ return validateString(value, field, { maxLength, required: false });
84
+ }
85
+ // ============ NUMBER VALIDATORS ============
86
+ /** Validate a number is within range */
87
+ function validateNumber(value, field, opts = {}) {
88
+ const { min = -Infinity, max = Infinity, required = true } = opts;
89
+ if (value === undefined || value === null) {
90
+ if (required)
91
+ throw new AnimaValidationError(field, 'is required');
92
+ return 0;
93
+ }
94
+ if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {
95
+ throw new AnimaValidationError(field, 'must be a finite number');
96
+ }
97
+ if (value < min || value > max) {
98
+ throw new AnimaValidationError(field, `must be between ${min} and ${max}, got ${value}`);
99
+ }
100
+ return value;
101
+ }
102
+ // ============ ARRAY VALIDATORS ============
103
+ /** Validate a string array with per-item and total limits */
104
+ function validateStringArray(value, field, opts = {}) {
105
+ const { maxItems = 100, maxItemLength = 500, required = false } = opts;
106
+ if (value === undefined || value === null) {
107
+ if (required)
108
+ throw new AnimaValidationError(field, 'is required');
109
+ return [];
110
+ }
111
+ if (!Array.isArray(value)) {
112
+ throw new AnimaValidationError(field, 'must be an array');
113
+ }
114
+ if (value.length > maxItems) {
115
+ throw new AnimaValidationError(field, `must have at most ${maxItems} items, got ${value.length}`);
116
+ }
117
+ return value.map((item, i) => {
118
+ if (typeof item !== 'string') {
119
+ throw new AnimaValidationError(`${field}[${i}]`, 'must be a string');
120
+ }
121
+ if (item.length > maxItemLength) {
122
+ throw new AnimaValidationError(`${field}[${i}]`, `must be at most ${maxItemLength} characters`);
123
+ }
124
+ return item;
125
+ });
126
+ }
127
+ // ============ PATH VALIDATION ============
128
+ /**
129
+ * Validate and sanitize a storage path.
130
+ *
131
+ * Prevents:
132
+ * - Path traversal (../../etc/passwd)
133
+ * - Null bytes
134
+ * - Paths outside the resolved directory
135
+ */
136
+ function validateStoragePath(storagePath) {
137
+ if (!storagePath || typeof storagePath !== 'string') {
138
+ throw new AnimaValidationError('storagePath', 'is required and must be a non-empty string');
139
+ }
140
+ // Reject null bytes (used in path traversal attacks)
141
+ if (storagePath.includes('\0')) {
142
+ throw new AnimaValidationError('storagePath', 'must not contain null bytes');
143
+ }
144
+ // Resolve to absolute path and normalize
145
+ const resolved = (0, path_1.resolve)((0, path_1.normalize)(storagePath));
146
+ // On Windows, reject UNC paths unless explicitly a local drive
147
+ if (process.platform === 'win32' && resolved.startsWith('\\\\')) {
148
+ throw new AnimaValidationError('storagePath', 'UNC paths are not supported');
149
+ }
150
+ return resolved;
151
+ }
152
+ /**
153
+ * Ensure a sub-path stays within the base directory.
154
+ * Use this when constructing paths from user-provided segments.
155
+ */
156
+ function validateSubPath(basePath, subPath) {
157
+ const resolved = (0, path_1.resolve)(basePath, (0, path_1.normalize)(subPath));
158
+ if (!resolved.startsWith((0, path_1.resolve)(basePath))) {
159
+ throw new AnimaValidationError('path', `traversal detected: ${subPath} escapes ${basePath}`);
160
+ }
161
+ return resolved;
162
+ }
163
+ // ============ ENUM VALIDATORS ============
164
+ /** Validate a value is one of the allowed options */
165
+ function validateEnum(value, field, allowed, defaultValue) {
166
+ if (value === undefined || value === null) {
167
+ if (defaultValue !== undefined)
168
+ return defaultValue;
169
+ throw new AnimaValidationError(field, `is required, must be one of: ${allowed.join(', ')}`);
170
+ }
171
+ if (!allowed.includes(value)) {
172
+ throw new AnimaValidationError(field, `must be one of: ${allowed.join(', ')}, got "${value}"`);
173
+ }
174
+ return value;
175
+ }
176
+ // ============ CONFIDENCE VALIDATOR ============
177
+ /** Validate confidence score: must be 0-1 */
178
+ function validateConfidence(value, field = 'confidence') {
179
+ return validateNumber(value, field, { min: 0, max: 1, required: true });
180
+ }
181
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getanima/core",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Identity and memory infrastructure for AI agents",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",