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.
Files changed (132) hide show
  1. package/.env.example +49 -0
  2. package/README.md +161 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +336 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/config/index.d.ts +37 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +68 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/models.d.ts +17 -0
  12. package/dist/config/models.d.ts.map +1 -0
  13. package/dist/config/models.js +128 -0
  14. package/dist/config/models.js.map +1 -0
  15. package/dist/core/agents/agent-factory.d.ts +31 -0
  16. package/dist/core/agents/agent-factory.d.ts.map +1 -0
  17. package/dist/core/agents/agent-factory.js +151 -0
  18. package/dist/core/agents/agent-factory.js.map +1 -0
  19. package/dist/core/agents/base-agent.d.ts +51 -0
  20. package/dist/core/agents/base-agent.d.ts.map +1 -0
  21. package/dist/core/agents/base-agent.js +245 -0
  22. package/dist/core/agents/base-agent.js.map +1 -0
  23. package/dist/core/agents/index.d.ts +8 -0
  24. package/dist/core/agents/index.d.ts.map +1 -0
  25. package/dist/core/agents/index.js +9 -0
  26. package/dist/core/agents/index.js.map +1 -0
  27. package/dist/core/agents/personalities/automation.d.ts +14 -0
  28. package/dist/core/agents/personalities/automation.d.ts.map +1 -0
  29. package/dist/core/agents/personalities/automation.js +146 -0
  30. package/dist/core/agents/personalities/automation.js.map +1 -0
  31. package/dist/core/agents/personalities/chat.d.ts +10 -0
  32. package/dist/core/agents/personalities/chat.d.ts.map +1 -0
  33. package/dist/core/agents/personalities/chat.js +132 -0
  34. package/dist/core/agents/personalities/chat.js.map +1 -0
  35. package/dist/core/agents/personalities/coding.d.ts +16 -0
  36. package/dist/core/agents/personalities/coding.d.ts.map +1 -0
  37. package/dist/core/agents/personalities/coding.js +166 -0
  38. package/dist/core/agents/personalities/coding.js.map +1 -0
  39. package/dist/core/agents/personalities/research.d.ts +13 -0
  40. package/dist/core/agents/personalities/research.d.ts.map +1 -0
  41. package/dist/core/agents/personalities/research.js +133 -0
  42. package/dist/core/agents/personalities/research.js.map +1 -0
  43. package/dist/core/agents/types.d.ts +102 -0
  44. package/dist/core/agents/types.d.ts.map +1 -0
  45. package/dist/core/agents/types.js +2 -0
  46. package/dist/core/agents/types.js.map +1 -0
  47. package/dist/core/orchestrator/graph.d.ts +118 -0
  48. package/dist/core/orchestrator/graph.d.ts.map +1 -0
  49. package/dist/core/orchestrator/graph.js +233 -0
  50. package/dist/core/orchestrator/graph.js.map +1 -0
  51. package/dist/database/client.d.ts +19 -0
  52. package/dist/database/client.d.ts.map +1 -0
  53. package/dist/database/client.js +95 -0
  54. package/dist/database/client.js.map +1 -0
  55. package/dist/index.d.ts +41 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +67 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/llm/openrouter-client.d.ts +45 -0
  60. package/dist/llm/openrouter-client.d.ts.map +1 -0
  61. package/dist/llm/openrouter-client.js +155 -0
  62. package/dist/llm/openrouter-client.js.map +1 -0
  63. package/dist/memory/conversation/index.d.ts +37 -0
  64. package/dist/memory/conversation/index.d.ts.map +1 -0
  65. package/dist/memory/conversation/index.js +196 -0
  66. package/dist/memory/conversation/index.js.map +1 -0
  67. package/dist/memory/index.d.ts +4 -0
  68. package/dist/memory/index.d.ts.map +1 -0
  69. package/dist/memory/index.js +5 -0
  70. package/dist/memory/index.js.map +1 -0
  71. package/dist/memory/knowledge-base/index.d.ts +51 -0
  72. package/dist/memory/knowledge-base/index.d.ts.map +1 -0
  73. package/dist/memory/knowledge-base/index.js +222 -0
  74. package/dist/memory/knowledge-base/index.js.map +1 -0
  75. package/dist/memory/longterm/vector-store.d.ts +44 -0
  76. package/dist/memory/longterm/vector-store.d.ts.map +1 -0
  77. package/dist/memory/longterm/vector-store.js +229 -0
  78. package/dist/memory/longterm/vector-store.js.map +1 -0
  79. package/dist/safety/audit-logger.d.ts +68 -0
  80. package/dist/safety/audit-logger.d.ts.map +1 -0
  81. package/dist/safety/audit-logger.js +215 -0
  82. package/dist/safety/audit-logger.js.map +1 -0
  83. package/dist/safety/guardrails/input-guardrail.d.ts +21 -0
  84. package/dist/safety/guardrails/input-guardrail.d.ts.map +1 -0
  85. package/dist/safety/guardrails/input-guardrail.js +145 -0
  86. package/dist/safety/guardrails/input-guardrail.js.map +1 -0
  87. package/dist/safety/guardrails/output-guardrail.d.ts +18 -0
  88. package/dist/safety/guardrails/output-guardrail.d.ts.map +1 -0
  89. package/dist/safety/guardrails/output-guardrail.js +125 -0
  90. package/dist/safety/guardrails/output-guardrail.js.map +1 -0
  91. package/dist/safety/index.d.ts +4 -0
  92. package/dist/safety/index.d.ts.map +1 -0
  93. package/dist/safety/index.js +5 -0
  94. package/dist/safety/index.js.map +1 -0
  95. package/dist/utils/errors.d.ts +36 -0
  96. package/dist/utils/errors.d.ts.map +1 -0
  97. package/dist/utils/errors.js +94 -0
  98. package/dist/utils/errors.js.map +1 -0
  99. package/dist/utils/logger.d.ts +8 -0
  100. package/dist/utils/logger.d.ts.map +1 -0
  101. package/dist/utils/logger.js +47 -0
  102. package/dist/utils/logger.js.map +1 -0
  103. package/docker/init-db.sql +149 -0
  104. package/docker/sandbox/Dockerfile.sandbox +29 -0
  105. package/docker-compose.yml +61 -0
  106. package/package.json +80 -0
  107. package/src/cli/index.ts +392 -0
  108. package/src/config/index.ts +85 -0
  109. package/src/config/models.ts +156 -0
  110. package/src/core/agents/agent-factory.ts +192 -0
  111. package/src/core/agents/base-agent.ts +333 -0
  112. package/src/core/agents/index.ts +27 -0
  113. package/src/core/agents/personalities/automation.ts +202 -0
  114. package/src/core/agents/personalities/chat.ts +159 -0
  115. package/src/core/agents/personalities/coding.ts +227 -0
  116. package/src/core/agents/personalities/research.ts +177 -0
  117. package/src/core/agents/types.ts +124 -0
  118. package/src/core/orchestrator/graph.ts +305 -0
  119. package/src/database/client.ts +109 -0
  120. package/src/index.ts +104 -0
  121. package/src/llm/openrouter-client.ts +218 -0
  122. package/src/memory/conversation/index.ts +313 -0
  123. package/src/memory/index.ts +23 -0
  124. package/src/memory/knowledge-base/index.ts +357 -0
  125. package/src/memory/longterm/vector-store.ts +364 -0
  126. package/src/safety/audit-logger.ts +357 -0
  127. package/src/safety/guardrails/input-guardrail.ts +191 -0
  128. package/src/safety/guardrails/output-guardrail.ts +160 -0
  129. package/src/safety/index.ts +21 -0
  130. package/src/utils/errors.ts +120 -0
  131. package/src/utils/logger.ts +74 -0
  132. 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"}