family-ai-agent 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +49 -0
- package/README.md +161 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +336 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +37 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +68 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/models.d.ts +17 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +128 -0
- package/dist/config/models.js.map +1 -0
- package/dist/core/agents/agent-factory.d.ts +31 -0
- package/dist/core/agents/agent-factory.d.ts.map +1 -0
- package/dist/core/agents/agent-factory.js +151 -0
- package/dist/core/agents/agent-factory.js.map +1 -0
- package/dist/core/agents/base-agent.d.ts +51 -0
- package/dist/core/agents/base-agent.d.ts.map +1 -0
- package/dist/core/agents/base-agent.js +245 -0
- package/dist/core/agents/base-agent.js.map +1 -0
- package/dist/core/agents/index.d.ts +8 -0
- package/dist/core/agents/index.d.ts.map +1 -0
- package/dist/core/agents/index.js +9 -0
- package/dist/core/agents/index.js.map +1 -0
- package/dist/core/agents/personalities/automation.d.ts +14 -0
- package/dist/core/agents/personalities/automation.d.ts.map +1 -0
- package/dist/core/agents/personalities/automation.js +146 -0
- package/dist/core/agents/personalities/automation.js.map +1 -0
- package/dist/core/agents/personalities/chat.d.ts +10 -0
- package/dist/core/agents/personalities/chat.d.ts.map +1 -0
- package/dist/core/agents/personalities/chat.js +132 -0
- package/dist/core/agents/personalities/chat.js.map +1 -0
- package/dist/core/agents/personalities/coding.d.ts +16 -0
- package/dist/core/agents/personalities/coding.d.ts.map +1 -0
- package/dist/core/agents/personalities/coding.js +166 -0
- package/dist/core/agents/personalities/coding.js.map +1 -0
- package/dist/core/agents/personalities/research.d.ts +13 -0
- package/dist/core/agents/personalities/research.d.ts.map +1 -0
- package/dist/core/agents/personalities/research.js +133 -0
- package/dist/core/agents/personalities/research.js.map +1 -0
- package/dist/core/agents/types.d.ts +102 -0
- package/dist/core/agents/types.d.ts.map +1 -0
- package/dist/core/agents/types.js +2 -0
- package/dist/core/agents/types.js.map +1 -0
- package/dist/core/orchestrator/graph.d.ts +118 -0
- package/dist/core/orchestrator/graph.d.ts.map +1 -0
- package/dist/core/orchestrator/graph.js +233 -0
- package/dist/core/orchestrator/graph.js.map +1 -0
- package/dist/database/client.d.ts +19 -0
- package/dist/database/client.d.ts.map +1 -0
- package/dist/database/client.js +95 -0
- package/dist/database/client.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/openrouter-client.d.ts +45 -0
- package/dist/llm/openrouter-client.d.ts.map +1 -0
- package/dist/llm/openrouter-client.js +155 -0
- package/dist/llm/openrouter-client.js.map +1 -0
- package/dist/memory/conversation/index.d.ts +37 -0
- package/dist/memory/conversation/index.d.ts.map +1 -0
- package/dist/memory/conversation/index.js +196 -0
- package/dist/memory/conversation/index.js.map +1 -0
- package/dist/memory/index.d.ts +4 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/knowledge-base/index.d.ts +51 -0
- package/dist/memory/knowledge-base/index.d.ts.map +1 -0
- package/dist/memory/knowledge-base/index.js +222 -0
- package/dist/memory/knowledge-base/index.js.map +1 -0
- package/dist/memory/longterm/vector-store.d.ts +44 -0
- package/dist/memory/longterm/vector-store.d.ts.map +1 -0
- package/dist/memory/longterm/vector-store.js +229 -0
- package/dist/memory/longterm/vector-store.js.map +1 -0
- package/dist/safety/audit-logger.d.ts +68 -0
- package/dist/safety/audit-logger.d.ts.map +1 -0
- package/dist/safety/audit-logger.js +215 -0
- package/dist/safety/audit-logger.js.map +1 -0
- package/dist/safety/guardrails/input-guardrail.d.ts +21 -0
- package/dist/safety/guardrails/input-guardrail.d.ts.map +1 -0
- package/dist/safety/guardrails/input-guardrail.js +145 -0
- package/dist/safety/guardrails/input-guardrail.js.map +1 -0
- package/dist/safety/guardrails/output-guardrail.d.ts +18 -0
- package/dist/safety/guardrails/output-guardrail.d.ts.map +1 -0
- package/dist/safety/guardrails/output-guardrail.js +125 -0
- package/dist/safety/guardrails/output-guardrail.js.map +1 -0
- package/dist/safety/index.d.ts +4 -0
- package/dist/safety/index.d.ts.map +1 -0
- package/dist/safety/index.js +5 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +94 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/docker/init-db.sql +149 -0
- package/docker/sandbox/Dockerfile.sandbox +29 -0
- package/docker-compose.yml +61 -0
- package/package.json +80 -0
- package/src/cli/index.ts +392 -0
- package/src/config/index.ts +85 -0
- package/src/config/models.ts +156 -0
- package/src/core/agents/agent-factory.ts +192 -0
- package/src/core/agents/base-agent.ts +333 -0
- package/src/core/agents/index.ts +27 -0
- package/src/core/agents/personalities/automation.ts +202 -0
- package/src/core/agents/personalities/chat.ts +159 -0
- package/src/core/agents/personalities/coding.ts +227 -0
- package/src/core/agents/personalities/research.ts +177 -0
- package/src/core/agents/types.ts +124 -0
- package/src/core/orchestrator/graph.ts +305 -0
- package/src/database/client.ts +109 -0
- package/src/index.ts +104 -0
- package/src/llm/openrouter-client.ts +218 -0
- package/src/memory/conversation/index.ts +313 -0
- package/src/memory/index.ts +23 -0
- package/src/memory/knowledge-base/index.ts +357 -0
- package/src/memory/longterm/vector-store.ts +364 -0
- package/src/safety/audit-logger.ts +357 -0
- package/src/safety/guardrails/input-guardrail.ts +191 -0
- package/src/safety/guardrails/output-guardrail.ts +160 -0
- package/src/safety/index.ts +21 -0
- package/src/utils/errors.ts +120 -0
- package/src/utils/logger.ts +74 -0
- package/tsconfig.json +37 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { query } from '../database/client.js';
|
|
3
|
+
import { config } from '../config/index.js';
|
|
4
|
+
import { createLogger } from '../utils/logger.js';
|
|
5
|
+
const logger = createLogger('AuditLogger');
|
|
6
|
+
export class AuditLogger {
|
|
7
|
+
enabled;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.enabled = config.ENABLE_AUDIT_LOGGING;
|
|
10
|
+
}
|
|
11
|
+
// Hash sensitive content for logging
|
|
12
|
+
hashContent(content) {
|
|
13
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
14
|
+
}
|
|
15
|
+
// Log an action
|
|
16
|
+
async log(actionType, details, options = {}) {
|
|
17
|
+
if (!this.enabled) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const result = await query(`INSERT INTO audit_logs
|
|
22
|
+
(user_id, agent_id, action_type, action_details, input_hash, output_hash, status, error_message, execution_time_ms)
|
|
23
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
|
24
|
+
RETURNING id`, [
|
|
25
|
+
options.userId ?? null,
|
|
26
|
+
options.agentId ?? null,
|
|
27
|
+
actionType,
|
|
28
|
+
JSON.stringify(details),
|
|
29
|
+
options.input ? this.hashContent(options.input) : null,
|
|
30
|
+
options.output ? this.hashContent(options.output) : null,
|
|
31
|
+
options.status ?? 'success',
|
|
32
|
+
options.error ?? null,
|
|
33
|
+
options.executionTimeMs ?? null,
|
|
34
|
+
]);
|
|
35
|
+
const logId = result.rows[0]?.id;
|
|
36
|
+
logger.debug('Audit log created', { logId, actionType });
|
|
37
|
+
return logId ?? null;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
logger.error('Failed to create audit log', { error, actionType });
|
|
41
|
+
// Don't throw - audit logging should not break the main flow
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Log user input
|
|
46
|
+
async logUserInput(input, options = {}) {
|
|
47
|
+
return this.log('user_input', {
|
|
48
|
+
inputLength: input.length,
|
|
49
|
+
...options.metadata,
|
|
50
|
+
}, {
|
|
51
|
+
userId: options.userId,
|
|
52
|
+
input,
|
|
53
|
+
status: 'success',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// Log agent execution
|
|
57
|
+
async logAgentExecution(agentId, input, output, executionTimeMs, options = {}) {
|
|
58
|
+
return this.log('agent_execution', {
|
|
59
|
+
inputLength: input.length,
|
|
60
|
+
outputLength: output.length,
|
|
61
|
+
executionTimeMs,
|
|
62
|
+
}, {
|
|
63
|
+
userId: options.userId,
|
|
64
|
+
agentId,
|
|
65
|
+
input,
|
|
66
|
+
output,
|
|
67
|
+
status: options.success !== false ? 'success' : 'failure',
|
|
68
|
+
error: options.error,
|
|
69
|
+
executionTimeMs,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Log tool call
|
|
73
|
+
async logToolCall(toolName, input, output, options = {}) {
|
|
74
|
+
return this.log('tool_call', {
|
|
75
|
+
toolName,
|
|
76
|
+
inputType: typeof input,
|
|
77
|
+
outputType: typeof output,
|
|
78
|
+
}, {
|
|
79
|
+
agentId: options.agentId,
|
|
80
|
+
userId: options.userId,
|
|
81
|
+
input: JSON.stringify(input),
|
|
82
|
+
output: JSON.stringify(output),
|
|
83
|
+
status: options.success !== false ? 'success' : 'failure',
|
|
84
|
+
error: options.error,
|
|
85
|
+
executionTimeMs: options.executionTimeMs,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// Log safety block
|
|
89
|
+
async logSafetyBlock(reason, details, options = {}) {
|
|
90
|
+
return this.log('safety_block', {
|
|
91
|
+
reason,
|
|
92
|
+
...details,
|
|
93
|
+
}, {
|
|
94
|
+
userId: options.userId,
|
|
95
|
+
input: options.input,
|
|
96
|
+
status: 'blocked',
|
|
97
|
+
error: reason,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// Query audit logs
|
|
101
|
+
async query(filters = {}, options = {}) {
|
|
102
|
+
const { limit = 50, offset = 0 } = options;
|
|
103
|
+
let sql = `
|
|
104
|
+
SELECT id, user_id, agent_id, action_type, action_details,
|
|
105
|
+
input_hash, output_hash, status, error_message,
|
|
106
|
+
execution_time_ms, created_at
|
|
107
|
+
FROM audit_logs
|
|
108
|
+
WHERE 1=1
|
|
109
|
+
`;
|
|
110
|
+
const params = [];
|
|
111
|
+
let paramIndex = 1;
|
|
112
|
+
if (filters.userId) {
|
|
113
|
+
sql += ` AND user_id = $${paramIndex}`;
|
|
114
|
+
params.push(filters.userId);
|
|
115
|
+
paramIndex++;
|
|
116
|
+
}
|
|
117
|
+
if (filters.agentId) {
|
|
118
|
+
sql += ` AND agent_id = $${paramIndex}`;
|
|
119
|
+
params.push(filters.agentId);
|
|
120
|
+
paramIndex++;
|
|
121
|
+
}
|
|
122
|
+
if (filters.actionType) {
|
|
123
|
+
sql += ` AND action_type = $${paramIndex}`;
|
|
124
|
+
params.push(filters.actionType);
|
|
125
|
+
paramIndex++;
|
|
126
|
+
}
|
|
127
|
+
if (filters.status) {
|
|
128
|
+
sql += ` AND status = $${paramIndex}`;
|
|
129
|
+
params.push(filters.status);
|
|
130
|
+
paramIndex++;
|
|
131
|
+
}
|
|
132
|
+
if (filters.startDate) {
|
|
133
|
+
sql += ` AND created_at >= $${paramIndex}`;
|
|
134
|
+
params.push(filters.startDate);
|
|
135
|
+
paramIndex++;
|
|
136
|
+
}
|
|
137
|
+
if (filters.endDate) {
|
|
138
|
+
sql += ` AND created_at <= $${paramIndex}`;
|
|
139
|
+
params.push(filters.endDate);
|
|
140
|
+
paramIndex++;
|
|
141
|
+
}
|
|
142
|
+
sql += ` ORDER BY created_at DESC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`;
|
|
143
|
+
params.push(limit, offset);
|
|
144
|
+
try {
|
|
145
|
+
const result = await query(sql, params);
|
|
146
|
+
return result.rows.map((row) => ({
|
|
147
|
+
id: row.id,
|
|
148
|
+
userId: row.user_id ?? undefined,
|
|
149
|
+
agentId: row.agent_id ?? undefined,
|
|
150
|
+
actionType: row.action_type,
|
|
151
|
+
actionDetails: row.action_details,
|
|
152
|
+
inputHash: row.input_hash ?? undefined,
|
|
153
|
+
outputHash: row.output_hash ?? undefined,
|
|
154
|
+
status: row.status,
|
|
155
|
+
errorMessage: row.error_message ?? undefined,
|
|
156
|
+
executionTimeMs: row.execution_time_ms ?? undefined,
|
|
157
|
+
createdAt: row.created_at,
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
logger.error('Failed to query audit logs', { error });
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Get statistics
|
|
166
|
+
async getStats(userId, days = 7) {
|
|
167
|
+
const startDate = new Date();
|
|
168
|
+
startDate.setDate(startDate.getDate() - days);
|
|
169
|
+
let sql = `
|
|
170
|
+
SELECT
|
|
171
|
+
COUNT(*) as total,
|
|
172
|
+
COUNT(*) FILTER (WHERE status = 'success') as success_count,
|
|
173
|
+
COUNT(*) FILTER (WHERE status = 'blocked') as blocked_count,
|
|
174
|
+
AVG(execution_time_ms) FILTER (WHERE execution_time_ms IS NOT NULL) as avg_time
|
|
175
|
+
FROM audit_logs
|
|
176
|
+
WHERE created_at >= $1
|
|
177
|
+
`;
|
|
178
|
+
const params = [startDate];
|
|
179
|
+
if (userId) {
|
|
180
|
+
sql += ' AND user_id = $2';
|
|
181
|
+
params.push(userId);
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const result = await query(sql, params);
|
|
185
|
+
const row = result.rows[0];
|
|
186
|
+
const total = parseInt(row?.total ?? '0', 10);
|
|
187
|
+
const successCount = parseInt(row?.success_count ?? '0', 10);
|
|
188
|
+
return {
|
|
189
|
+
totalRequests: total,
|
|
190
|
+
successRate: total > 0 ? (successCount / total) * 100 : 100,
|
|
191
|
+
avgExecutionTime: parseFloat(row?.avg_time ?? '0'),
|
|
192
|
+
blockedCount: parseInt(row?.blocked_count ?? '0', 10),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
logger.error('Failed to get audit stats', { error });
|
|
197
|
+
return {
|
|
198
|
+
totalRequests: 0,
|
|
199
|
+
successRate: 100,
|
|
200
|
+
avgExecutionTime: 0,
|
|
201
|
+
blockedCount: 0,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Singleton instance
|
|
207
|
+
let auditInstance = null;
|
|
208
|
+
export function getAuditLogger() {
|
|
209
|
+
if (!auditInstance) {
|
|
210
|
+
auditInstance = new AuditLogger();
|
|
211
|
+
}
|
|
212
|
+
return auditInstance;
|
|
213
|
+
}
|
|
214
|
+
export default AuditLogger;
|
|
215
|
+
//# sourceMappingURL=audit-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../src/safety/audit-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface InputValidationResult {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
sanitizedInput: string;
|
|
4
|
+
warnings: string[];
|
|
5
|
+
blockedReason?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class InputGuardrail {
|
|
8
|
+
private enabled;
|
|
9
|
+
private enablePiiDetection;
|
|
10
|
+
constructor();
|
|
11
|
+
validate(input: string): Promise<InputValidationResult>;
|
|
12
|
+
private detectPii;
|
|
13
|
+
private sanitize;
|
|
14
|
+
isObviouslyHarmful(input: string): boolean;
|
|
15
|
+
estimateTokens(input: string): number;
|
|
16
|
+
isWithinTokenLimit(input: string, maxTokens?: number): boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function getInputGuardrail(): InputGuardrail;
|
|
19
|
+
export declare function validateInput(input: string): Promise<InputValidationResult>;
|
|
20
|
+
export default InputGuardrail;
|
|
21
|
+
//# sourceMappingURL=input-guardrail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-guardrail.d.ts","sourceRoot":"","sources":["../../../src/safety/guardrails/input-guardrail.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkCD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,kBAAkB,CAAU;;IAQ9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwD7D,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;IAmBhB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAgB1C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAMrC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;CAI/D;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAGD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAGjF;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { config } from '../../config/index.js';
|
|
2
|
+
import { createLogger, logSafetyEvent } from '../../utils/logger.js';
|
|
3
|
+
import { SafetyError, ValidationError } from '../../utils/errors.js';
|
|
4
|
+
const logger = createLogger('InputGuardrail');
|
|
5
|
+
// Patterns that indicate potentially harmful content
|
|
6
|
+
const HARMFUL_PATTERNS = [
|
|
7
|
+
// Injection attempts
|
|
8
|
+
/ignore\s+(previous|all)\s+instructions/i,
|
|
9
|
+
/disregard\s+(your|the)\s+(rules|guidelines)/i,
|
|
10
|
+
/you\s+are\s+now\s+(a|an)\s+different/i,
|
|
11
|
+
/pretend\s+you\s+(are|have)\s+no\s+restrictions/i,
|
|
12
|
+
/jailbreak/i,
|
|
13
|
+
/bypass\s+(safety|security|filters)/i,
|
|
14
|
+
// Dangerous requests
|
|
15
|
+
/how\s+to\s+(make|build|create)\s+(a\s+)?(bomb|weapon|explosive)/i,
|
|
16
|
+
/how\s+to\s+(hack|break\s+into)/i,
|
|
17
|
+
/how\s+to\s+harm\s+(myself|others|someone)/i,
|
|
18
|
+
// Personal information extraction
|
|
19
|
+
/give\s+me\s+(your|the)\s+(api|secret)\s+key/i,
|
|
20
|
+
/what\s+is\s+(your|the)\s+password/i,
|
|
21
|
+
];
|
|
22
|
+
// Patterns for PII detection
|
|
23
|
+
const PII_PATTERNS = [
|
|
24
|
+
{ name: 'SSN', pattern: /\b\d{3}-\d{2}-\d{4}\b/ },
|
|
25
|
+
{ name: 'Credit Card', pattern: /\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b/ },
|
|
26
|
+
{ name: 'Email', pattern: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/ },
|
|
27
|
+
{ name: 'Phone', pattern: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/ },
|
|
28
|
+
];
|
|
29
|
+
// Maximum input lengths
|
|
30
|
+
const MAX_INPUT_LENGTH = 50000; // 50k characters
|
|
31
|
+
const MAX_TOKENS_ESTIMATE = 12500; // Roughly 50k chars / 4
|
|
32
|
+
export class InputGuardrail {
|
|
33
|
+
enabled;
|
|
34
|
+
enablePiiDetection;
|
|
35
|
+
constructor() {
|
|
36
|
+
this.enabled = config.ENABLE_CONTENT_FILTER;
|
|
37
|
+
this.enablePiiDetection = config.ENABLE_PII_DETECTION;
|
|
38
|
+
}
|
|
39
|
+
// Main validation method
|
|
40
|
+
async validate(input) {
|
|
41
|
+
const warnings = [];
|
|
42
|
+
let sanitizedInput = input;
|
|
43
|
+
// Check if guardrails are enabled
|
|
44
|
+
if (!this.enabled) {
|
|
45
|
+
return { valid: true, sanitizedInput, warnings };
|
|
46
|
+
}
|
|
47
|
+
// Length validation
|
|
48
|
+
if (input.length > MAX_INPUT_LENGTH) {
|
|
49
|
+
throw new ValidationError(`Input exceeds maximum length of ${MAX_INPUT_LENGTH} characters`);
|
|
50
|
+
}
|
|
51
|
+
// Empty input check
|
|
52
|
+
if (!input.trim()) {
|
|
53
|
+
throw new ValidationError('Input cannot be empty');
|
|
54
|
+
}
|
|
55
|
+
// Check for harmful patterns
|
|
56
|
+
for (const pattern of HARMFUL_PATTERNS) {
|
|
57
|
+
if (pattern.test(input)) {
|
|
58
|
+
logSafetyEvent('harmful_content_detected', true, 'Input matches harmful pattern');
|
|
59
|
+
throw new SafetyError('Your request contains content that violates safety guidelines');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// PII detection
|
|
63
|
+
if (this.enablePiiDetection) {
|
|
64
|
+
const piiResult = this.detectPii(input);
|
|
65
|
+
if (piiResult.detected) {
|
|
66
|
+
warnings.push(`Potential PII detected: ${piiResult.types.join(', ')}. ` +
|
|
67
|
+
'Please be careful with personal information.');
|
|
68
|
+
logSafetyEvent('pii_detected', false, 'PII detected in input', {
|
|
69
|
+
types: piiResult.types,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Sanitize input
|
|
74
|
+
sanitizedInput = this.sanitize(input);
|
|
75
|
+
return {
|
|
76
|
+
valid: true,
|
|
77
|
+
sanitizedInput,
|
|
78
|
+
warnings,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Detect PII in input
|
|
82
|
+
detectPii(input) {
|
|
83
|
+
const detectedTypes = [];
|
|
84
|
+
for (const { name, pattern } of PII_PATTERNS) {
|
|
85
|
+
if (pattern.test(input)) {
|
|
86
|
+
detectedTypes.push(name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
detected: detectedTypes.length > 0,
|
|
91
|
+
types: detectedTypes,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Sanitize input
|
|
95
|
+
sanitize(input) {
|
|
96
|
+
let sanitized = input;
|
|
97
|
+
// Remove null bytes
|
|
98
|
+
sanitized = sanitized.replace(/\0/g, '');
|
|
99
|
+
// Normalize unicode
|
|
100
|
+
sanitized = sanitized.normalize('NFC');
|
|
101
|
+
// Remove control characters (except newlines and tabs)
|
|
102
|
+
sanitized = sanitized.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
|
|
103
|
+
// Trim excessive whitespace
|
|
104
|
+
sanitized = sanitized.replace(/\s{10,}/g, ' ');
|
|
105
|
+
return sanitized.trim();
|
|
106
|
+
}
|
|
107
|
+
// Quick check for obviously harmful content
|
|
108
|
+
isObviouslyHarmful(input) {
|
|
109
|
+
const lowerInput = input.toLowerCase();
|
|
110
|
+
const obviousPatterns = [
|
|
111
|
+
'ignore previous instructions',
|
|
112
|
+
'ignore all instructions',
|
|
113
|
+
'you are now',
|
|
114
|
+
'pretend you have no',
|
|
115
|
+
'jailbreak',
|
|
116
|
+
'bypass safety',
|
|
117
|
+
];
|
|
118
|
+
return obviousPatterns.some((pattern) => lowerInput.includes(pattern));
|
|
119
|
+
}
|
|
120
|
+
// Estimate token count
|
|
121
|
+
estimateTokens(input) {
|
|
122
|
+
// Rough estimate: 1 token ≈ 4 characters
|
|
123
|
+
return Math.ceil(input.length / 4);
|
|
124
|
+
}
|
|
125
|
+
// Check if input is within token limits
|
|
126
|
+
isWithinTokenLimit(input, maxTokens) {
|
|
127
|
+
const limit = maxTokens ?? config.MAX_TOKENS_PER_REQUEST;
|
|
128
|
+
return this.estimateTokens(input) <= limit;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Singleton instance
|
|
132
|
+
let guardrailInstance = null;
|
|
133
|
+
export function getInputGuardrail() {
|
|
134
|
+
if (!guardrailInstance) {
|
|
135
|
+
guardrailInstance = new InputGuardrail();
|
|
136
|
+
}
|
|
137
|
+
return guardrailInstance;
|
|
138
|
+
}
|
|
139
|
+
// Convenience function
|
|
140
|
+
export async function validateInput(input) {
|
|
141
|
+
const guardrail = getInputGuardrail();
|
|
142
|
+
return guardrail.validate(input);
|
|
143
|
+
}
|
|
144
|
+
export default InputGuardrail;
|
|
145
|
+
//# sourceMappingURL=input-guardrail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-guardrail.js","sourceRoot":"","sources":["../../../src/safety/guardrails/input-guardrail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface OutputValidationResult {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
sanitizedOutput: string;
|
|
4
|
+
warnings: string[];
|
|
5
|
+
redactions: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare class OutputGuardrail {
|
|
8
|
+
private enabled;
|
|
9
|
+
constructor();
|
|
10
|
+
validate(output: string): OutputValidationResult;
|
|
11
|
+
containsDangerousCode(output: string): boolean;
|
|
12
|
+
truncate(output: string, maxLength?: number): string;
|
|
13
|
+
formatCodeSafely(code: string, language?: string): string;
|
|
14
|
+
}
|
|
15
|
+
export declare function getOutputGuardrail(): OutputGuardrail;
|
|
16
|
+
export declare function validateOutput(output: string): OutputValidationResult;
|
|
17
|
+
export default OutputGuardrail;
|
|
18
|
+
//# sourceMappingURL=output-guardrail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-guardrail.d.ts","sourceRoot":"","sources":["../../../src/safety/guardrails/output-guardrail.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AA4BD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAU;;IAOzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB;IAmDhD,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAsB9C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,MAAM;IAiB3D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM;CAK9D;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAGrE;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { config } from '../../config/index.js';
|
|
2
|
+
import { createLogger, logSafetyEvent } from '../../utils/logger.js';
|
|
3
|
+
const logger = createLogger('OutputGuardrail');
|
|
4
|
+
// Patterns for sensitive information in outputs
|
|
5
|
+
const SENSITIVE_PATTERNS = [
|
|
6
|
+
// API keys and tokens
|
|
7
|
+
{ name: 'API Key', pattern: /\b(sk|pk|api[_-]?key)[_-]?[a-zA-Z0-9]{20,}\b/gi },
|
|
8
|
+
{ name: 'Bearer Token', pattern: /bearer\s+[a-zA-Z0-9_-]{20,}/gi },
|
|
9
|
+
{ name: 'JWT', pattern: /eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*/g },
|
|
10
|
+
// Credentials
|
|
11
|
+
{ name: 'Password Field', pattern: /password['":\s]*['"]?[^'"\s,]{8,}['"]?/gi },
|
|
12
|
+
{ name: 'Secret', pattern: /secret['":\s]*['"]?[a-zA-Z0-9_-]{16,}['"]?/gi },
|
|
13
|
+
// Personal Information
|
|
14
|
+
{ name: 'SSN', pattern: /\b\d{3}-\d{2}-\d{4}\b/g },
|
|
15
|
+
{ name: 'Credit Card', pattern: /\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b/g },
|
|
16
|
+
// Private keys
|
|
17
|
+
{ name: 'Private Key', pattern: /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----[\s\S]*?-----END\s+(?:RSA\s+)?PRIVATE\s+KEY-----/g },
|
|
18
|
+
];
|
|
19
|
+
// Harmful content patterns in output
|
|
20
|
+
const HARMFUL_OUTPUT_PATTERNS = [
|
|
21
|
+
/how\s+to\s+(make|build|create)\s+(a\s+)?(bomb|weapon|explosive)/i,
|
|
22
|
+
/instructions\s+for\s+(making|building)\s+(a\s+)?weapon/i,
|
|
23
|
+
/step[\s-]by[\s-]step\s+guide\s+to\s+harm/i,
|
|
24
|
+
];
|
|
25
|
+
export class OutputGuardrail {
|
|
26
|
+
enabled;
|
|
27
|
+
constructor() {
|
|
28
|
+
this.enabled = config.ENABLE_CONTENT_FILTER;
|
|
29
|
+
}
|
|
30
|
+
// Main validation method
|
|
31
|
+
validate(output) {
|
|
32
|
+
const warnings = [];
|
|
33
|
+
const redactions = [];
|
|
34
|
+
let sanitizedOutput = output;
|
|
35
|
+
if (!this.enabled) {
|
|
36
|
+
return { valid: true, sanitizedOutput, warnings, redactions };
|
|
37
|
+
}
|
|
38
|
+
// Check for harmful content
|
|
39
|
+
for (const pattern of HARMFUL_OUTPUT_PATTERNS) {
|
|
40
|
+
if (pattern.test(output)) {
|
|
41
|
+
logSafetyEvent('harmful_output_blocked', true, 'Output contains harmful content');
|
|
42
|
+
return {
|
|
43
|
+
valid: false,
|
|
44
|
+
sanitizedOutput: '[Content blocked due to safety guidelines]',
|
|
45
|
+
warnings: ['Output contained potentially harmful content'],
|
|
46
|
+
redactions: [],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Redact sensitive information
|
|
51
|
+
for (const { name, pattern } of SENSITIVE_PATTERNS) {
|
|
52
|
+
const matches = output.match(pattern);
|
|
53
|
+
if (matches) {
|
|
54
|
+
for (const match of matches) {
|
|
55
|
+
sanitizedOutput = sanitizedOutput.replace(match, `[REDACTED: ${name}]`);
|
|
56
|
+
redactions.push(name);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (redactions.length > 0) {
|
|
61
|
+
logSafetyEvent('sensitive_data_redacted', false, 'Sensitive data redacted from output', {
|
|
62
|
+
redactionTypes: [...new Set(redactions)],
|
|
63
|
+
});
|
|
64
|
+
warnings.push(`Sensitive information was redacted from the output: ${[...new Set(redactions)].join(', ')}`);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
valid: true,
|
|
68
|
+
sanitizedOutput,
|
|
69
|
+
warnings,
|
|
70
|
+
redactions: [...new Set(redactions)],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Check if output contains code that might be dangerous
|
|
74
|
+
containsDangerousCode(output) {
|
|
75
|
+
const dangerousPatterns = [
|
|
76
|
+
// Shell commands that could be harmful
|
|
77
|
+
/rm\s+-rf\s+\//,
|
|
78
|
+
/mkfs\./,
|
|
79
|
+
/dd\s+if=.*of=\/dev/,
|
|
80
|
+
/:(){ :|:& };:/, // Fork bomb
|
|
81
|
+
// Dangerous SQL
|
|
82
|
+
/drop\s+table/i,
|
|
83
|
+
/delete\s+from\s+.*where\s+1\s*=\s*1/i,
|
|
84
|
+
/truncate\s+table/i,
|
|
85
|
+
// Dangerous code patterns
|
|
86
|
+
/eval\s*\(\s*['"`].*['"`]\s*\)/,
|
|
87
|
+
/exec\s*\(\s*['"`].*['"`]\s*\)/,
|
|
88
|
+
];
|
|
89
|
+
return dangerousPatterns.some((pattern) => pattern.test(output));
|
|
90
|
+
}
|
|
91
|
+
// Truncate output if too long
|
|
92
|
+
truncate(output, maxLength = 10000) {
|
|
93
|
+
if (output.length <= maxLength) {
|
|
94
|
+
return output;
|
|
95
|
+
}
|
|
96
|
+
const truncated = output.slice(0, maxLength);
|
|
97
|
+
const lastNewline = truncated.lastIndexOf('\n');
|
|
98
|
+
// Try to truncate at a natural break point
|
|
99
|
+
if (lastNewline > maxLength * 0.8) {
|
|
100
|
+
return truncated.slice(0, lastNewline) + '\n\n[Output truncated...]';
|
|
101
|
+
}
|
|
102
|
+
return truncated + '\n\n[Output truncated...]';
|
|
103
|
+
}
|
|
104
|
+
// Format code blocks safely
|
|
105
|
+
formatCodeSafely(code, language = '') {
|
|
106
|
+
// Escape any existing code fence markers
|
|
107
|
+
const escapedCode = code.replace(/```/g, '\\`\\`\\`');
|
|
108
|
+
return `\`\`\`${language}\n${escapedCode}\n\`\`\``;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Singleton instance
|
|
112
|
+
let guardrailInstance = null;
|
|
113
|
+
export function getOutputGuardrail() {
|
|
114
|
+
if (!guardrailInstance) {
|
|
115
|
+
guardrailInstance = new OutputGuardrail();
|
|
116
|
+
}
|
|
117
|
+
return guardrailInstance;
|
|
118
|
+
}
|
|
119
|
+
// Convenience function
|
|
120
|
+
export function validateOutput(output) {
|
|
121
|
+
const guardrail = getOutputGuardrail();
|
|
122
|
+
return guardrail.validate(output);
|
|
123
|
+
}
|
|
124
|
+
export default OutputGuardrail;
|
|
125
|
+
//# sourceMappingURL=output-guardrail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-guardrail.js","sourceRoot":"","sources":["../../../src/safety/guardrails/output-guardrail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { InputGuardrail, getInputGuardrail, validateInput, type InputValidationResult, } from './guardrails/input-guardrail.js';
|
|
2
|
+
export { OutputGuardrail, getOutputGuardrail, validateOutput, type OutputValidationResult, } from './guardrails/output-guardrail.js';
|
|
3
|
+
export { AuditLogger, getAuditLogger, type AuditLogEntry, type AuditActionType, } from './audit-logger.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/safety/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,KAAK,qBAAqB,GAC3B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,KAAK,sBAAsB,GAC5B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,WAAW,EACX,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Safety module exports
|
|
2
|
+
export { InputGuardrail, getInputGuardrail, validateInput, } from './guardrails/input-guardrail.js';
|
|
3
|
+
export { OutputGuardrail, getOutputGuardrail, validateOutput, } from './guardrails/output-guardrail.js';
|
|
4
|
+
export { AuditLogger, getAuditLogger, } from './audit-logger.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/safety/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,GAEd,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,GAEf,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,WAAW,EACX,cAAc,GAGf,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare class FamilyAIError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly statusCode: number;
|
|
4
|
+
readonly details?: Record<string, unknown>;
|
|
5
|
+
constructor(message: string, code: string, statusCode?: number, details?: Record<string, unknown>);
|
|
6
|
+
}
|
|
7
|
+
export declare class ConfigurationError extends FamilyAIError {
|
|
8
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
9
|
+
}
|
|
10
|
+
export declare class LLMError extends FamilyAIError {
|
|
11
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
12
|
+
}
|
|
13
|
+
export declare class MemoryError extends FamilyAIError {
|
|
14
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
15
|
+
}
|
|
16
|
+
export declare class ToolExecutionError extends FamilyAIError {
|
|
17
|
+
constructor(message: string, toolName: string, details?: Record<string, unknown>);
|
|
18
|
+
}
|
|
19
|
+
export declare class SafetyError extends FamilyAIError {
|
|
20
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
21
|
+
}
|
|
22
|
+
export declare class ValidationError extends FamilyAIError {
|
|
23
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
24
|
+
}
|
|
25
|
+
export declare class AgentError extends FamilyAIError {
|
|
26
|
+
constructor(message: string, agentId: string, details?: Record<string, unknown>);
|
|
27
|
+
}
|
|
28
|
+
export declare class RateLimitError extends FamilyAIError {
|
|
29
|
+
constructor(retryAfter?: number);
|
|
30
|
+
}
|
|
31
|
+
export declare class SandboxError extends FamilyAIError {
|
|
32
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
33
|
+
}
|
|
34
|
+
export declare function isRetryableError(error: unknown): boolean;
|
|
35
|
+
export declare function formatErrorForUser(error: unknown): string;
|
|
36
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGhD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAY,EACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASpC;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,QAAS,SAAQ,aAAa;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,WAAY,SAAQ,aAAa;gBAChC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBAEjD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAKpC;AAED,qBAAa,WAAY,SAAQ,aAAa;gBAChC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,UAAW,SAAQ,aAAa;gBAEzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAKpC;AAED,qBAAa,cAAe,SAAQ,aAAa;gBACnC,UAAU,CAAC,EAAE,MAAM;CAIhC;AAED,qBAAa,YAAa,SAAQ,aAAa;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiBzD"}
|