@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.
- package/dist/anima.d.ts +14 -0
- package/dist/anima.d.ts.map +1 -1
- package/dist/anima.js +26 -0
- package/dist/anima.js.map +1 -1
- package/dist/esm/anima.js +26 -0
- package/dist/esm/anima.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/memory.js +37 -13
- package/dist/esm/memory.js.map +1 -1
- package/dist/esm/reflection.js +65 -12
- package/dist/esm/reflection.js.map +1 -1
- package/dist/esm/relationships.js +46 -18
- package/dist/esm/relationships.js.map +1 -1
- package/dist/esm/validation.js +169 -0
- package/dist/esm/validation.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +37 -13
- package/dist/memory.js.map +1 -1
- package/dist/reflection.d.ts +12 -6
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +64 -11
- package/dist/reflection.js.map +1 -1
- package/dist/relationships.d.ts.map +1 -1
- package/dist/relationships.js +46 -18
- package/dist/relationships.js.map +1 -1
- package/dist/validation.d.ts +76 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +181 -0
- package/dist/validation.js.map +1 -0
- package/package.json +1 -1
package/dist/reflection.js
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
package/dist/reflection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAKH,
|
|
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;
|
|
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"}
|
package/dist/relationships.js
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
72
|
-
existing.context =
|
|
73
|
-
if (
|
|
74
|
-
existing.notes.push(...
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
85
|
-
type
|
|
86
|
-
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
|
|
91
|
-
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
|
|
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
|
|
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(
|
|
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":";AAAA;;;;;;GAMG;;;AAGH,mCAAgE;AAChE,+BAA4B;AAC5B,0CAAoC;AAEpC,MAAa,kBAAkB;IACrB,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,aAAa,GAAmB,EAAE,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;
|
|
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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"}
|