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,21 @@
|
|
|
1
|
+
// Safety module exports
|
|
2
|
+
export {
|
|
3
|
+
InputGuardrail,
|
|
4
|
+
getInputGuardrail,
|
|
5
|
+
validateInput,
|
|
6
|
+
type InputValidationResult,
|
|
7
|
+
} from './guardrails/input-guardrail.js';
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
OutputGuardrail,
|
|
11
|
+
getOutputGuardrail,
|
|
12
|
+
validateOutput,
|
|
13
|
+
type OutputValidationResult,
|
|
14
|
+
} from './guardrails/output-guardrail.js';
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
AuditLogger,
|
|
18
|
+
getAuditLogger,
|
|
19
|
+
type AuditLogEntry,
|
|
20
|
+
type AuditActionType,
|
|
21
|
+
} from './audit-logger.js';
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export class FamilyAIError extends Error {
|
|
2
|
+
public readonly code: string;
|
|
3
|
+
public readonly statusCode: number;
|
|
4
|
+
public readonly details?: Record<string, unknown>;
|
|
5
|
+
|
|
6
|
+
constructor(
|
|
7
|
+
message: string,
|
|
8
|
+
code: string,
|
|
9
|
+
statusCode: number = 500,
|
|
10
|
+
details?: Record<string, unknown>
|
|
11
|
+
) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'FamilyAIError';
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.statusCode = statusCode;
|
|
16
|
+
this.details = details;
|
|
17
|
+
Error.captureStackTrace(this, this.constructor);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class ConfigurationError extends FamilyAIError {
|
|
22
|
+
constructor(message: string, details?: Record<string, unknown>) {
|
|
23
|
+
super(message, 'CONFIGURATION_ERROR', 500, details);
|
|
24
|
+
this.name = 'ConfigurationError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class LLMError extends FamilyAIError {
|
|
29
|
+
constructor(message: string, details?: Record<string, unknown>) {
|
|
30
|
+
super(message, 'LLM_ERROR', 502, details);
|
|
31
|
+
this.name = 'LLMError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class MemoryError extends FamilyAIError {
|
|
36
|
+
constructor(message: string, details?: Record<string, unknown>) {
|
|
37
|
+
super(message, 'MEMORY_ERROR', 500, details);
|
|
38
|
+
this.name = 'MemoryError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class ToolExecutionError extends FamilyAIError {
|
|
43
|
+
constructor(
|
|
44
|
+
message: string,
|
|
45
|
+
toolName: string,
|
|
46
|
+
details?: Record<string, unknown>
|
|
47
|
+
) {
|
|
48
|
+
super(message, 'TOOL_EXECUTION_ERROR', 500, { toolName, ...details });
|
|
49
|
+
this.name = 'ToolExecutionError';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export class SafetyError extends FamilyAIError {
|
|
54
|
+
constructor(message: string, details?: Record<string, unknown>) {
|
|
55
|
+
super(message, 'SAFETY_ERROR', 403, details);
|
|
56
|
+
this.name = 'SafetyError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class ValidationError extends FamilyAIError {
|
|
61
|
+
constructor(message: string, details?: Record<string, unknown>) {
|
|
62
|
+
super(message, 'VALIDATION_ERROR', 400, details);
|
|
63
|
+
this.name = 'ValidationError';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export class AgentError extends FamilyAIError {
|
|
68
|
+
constructor(
|
|
69
|
+
message: string,
|
|
70
|
+
agentId: string,
|
|
71
|
+
details?: Record<string, unknown>
|
|
72
|
+
) {
|
|
73
|
+
super(message, 'AGENT_ERROR', 500, { agentId, ...details });
|
|
74
|
+
this.name = 'AgentError';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export class RateLimitError extends FamilyAIError {
|
|
79
|
+
constructor(retryAfter?: number) {
|
|
80
|
+
super('Rate limit exceeded', 'RATE_LIMIT_ERROR', 429, { retryAfter });
|
|
81
|
+
this.name = 'RateLimitError';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export class SandboxError extends FamilyAIError {
|
|
86
|
+
constructor(message: string, details?: Record<string, unknown>) {
|
|
87
|
+
super(message, 'SANDBOX_ERROR', 500, details);
|
|
88
|
+
this.name = 'SandboxError';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function isRetryableError(error: unknown): boolean {
|
|
93
|
+
if (error instanceof FamilyAIError) {
|
|
94
|
+
return (
|
|
95
|
+
error.code === 'LLM_ERROR' ||
|
|
96
|
+
error.code === 'RATE_LIMIT_ERROR' ||
|
|
97
|
+
error.statusCode >= 500
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function formatErrorForUser(error: unknown): string {
|
|
104
|
+
if (error instanceof SafetyError) {
|
|
105
|
+
return `Request blocked: ${error.message}`;
|
|
106
|
+
}
|
|
107
|
+
if (error instanceof ValidationError) {
|
|
108
|
+
return `Invalid input: ${error.message}`;
|
|
109
|
+
}
|
|
110
|
+
if (error instanceof RateLimitError) {
|
|
111
|
+
return 'Too many requests. Please wait a moment and try again.';
|
|
112
|
+
}
|
|
113
|
+
if (error instanceof FamilyAIError) {
|
|
114
|
+
return `An error occurred: ${error.message}`;
|
|
115
|
+
}
|
|
116
|
+
if (error instanceof Error) {
|
|
117
|
+
return `Unexpected error: ${error.message}`;
|
|
118
|
+
}
|
|
119
|
+
return 'An unexpected error occurred';
|
|
120
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import { config } from '../config/index.js';
|
|
3
|
+
|
|
4
|
+
const { combine, timestamp, printf, colorize, json } = winston.format;
|
|
5
|
+
|
|
6
|
+
const prettyFormat = printf(({ level, message, timestamp, ...metadata }) => {
|
|
7
|
+
let msg = `${timestamp} [${level}]: ${message}`;
|
|
8
|
+
if (Object.keys(metadata).length > 0) {
|
|
9
|
+
msg += ` ${JSON.stringify(metadata)}`;
|
|
10
|
+
}
|
|
11
|
+
return msg;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const logFormat =
|
|
15
|
+
config.LOG_FORMAT === 'pretty'
|
|
16
|
+
? combine(colorize(), timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), prettyFormat)
|
|
17
|
+
: combine(timestamp(), json());
|
|
18
|
+
|
|
19
|
+
export const logger = winston.createLogger({
|
|
20
|
+
level: config.LOG_LEVEL,
|
|
21
|
+
format: logFormat,
|
|
22
|
+
defaultMeta: { service: 'family-ai-agent' },
|
|
23
|
+
transports: [
|
|
24
|
+
new winston.transports.Console(),
|
|
25
|
+
new winston.transports.File({
|
|
26
|
+
filename: 'logs/error.log',
|
|
27
|
+
level: 'error',
|
|
28
|
+
}),
|
|
29
|
+
new winston.transports.File({
|
|
30
|
+
filename: 'logs/combined.log',
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Create a child logger for specific components
|
|
36
|
+
export function createLogger(component: string) {
|
|
37
|
+
return logger.child({ component });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Structured logging helpers
|
|
41
|
+
export function logAgentAction(
|
|
42
|
+
agentId: string,
|
|
43
|
+
action: string,
|
|
44
|
+
details: Record<string, unknown>
|
|
45
|
+
) {
|
|
46
|
+
logger.info('Agent action', { agentId, action, ...details });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function logToolExecution(
|
|
50
|
+
toolName: string,
|
|
51
|
+
input: unknown,
|
|
52
|
+
output: unknown,
|
|
53
|
+
durationMs: number
|
|
54
|
+
) {
|
|
55
|
+
logger.debug('Tool execution', { toolName, input, output, durationMs });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function logMemoryOperation(
|
|
59
|
+
operation: 'read' | 'write' | 'search',
|
|
60
|
+
memoryType: string,
|
|
61
|
+
details: Record<string, unknown>
|
|
62
|
+
) {
|
|
63
|
+
logger.debug('Memory operation', { operation, memoryType, ...details });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function logSafetyEvent(
|
|
67
|
+
eventType: string,
|
|
68
|
+
blocked: boolean,
|
|
69
|
+
reason?: string,
|
|
70
|
+
details?: Record<string, unknown>
|
|
71
|
+
) {
|
|
72
|
+
const level = blocked ? 'warn' : 'info';
|
|
73
|
+
logger.log(level, 'Safety event', { eventType, blocked, reason, ...details });
|
|
74
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"lib": ["ES2022"],
|
|
7
|
+
"outDir": "./dist",
|
|
8
|
+
"rootDir": "./src",
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"resolveJsonModule": true,
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"declarationMap": true,
|
|
16
|
+
"sourceMap": true,
|
|
17
|
+
"noImplicitReturns": true,
|
|
18
|
+
"noFallthroughCasesInSwitch": true,
|
|
19
|
+
"noUncheckedIndexedAccess": true,
|
|
20
|
+
"exactOptionalPropertyTypes": false,
|
|
21
|
+
"baseUrl": ".",
|
|
22
|
+
"paths": {
|
|
23
|
+
"@/*": ["./src/*"],
|
|
24
|
+
"@core/*": ["./src/core/*"],
|
|
25
|
+
"@memory/*": ["./src/memory/*"],
|
|
26
|
+
"@tools/*": ["./src/tools/*"],
|
|
27
|
+
"@safety/*": ["./src/safety/*"],
|
|
28
|
+
"@llm/*": ["./src/llm/*"],
|
|
29
|
+
"@api/*": ["./src/api/*"],
|
|
30
|
+
"@cli/*": ["./src/cli/*"],
|
|
31
|
+
"@config/*": ["./src/config/*"],
|
|
32
|
+
"@utils/*": ["./src/utils/*"]
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"include": ["src/**/*"],
|
|
36
|
+
"exclude": ["node_modules", "dist", "tests"]
|
|
37
|
+
}
|