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,94 @@
|
|
|
1
|
+
export class FamilyAIError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
statusCode;
|
|
4
|
+
details;
|
|
5
|
+
constructor(message, code, statusCode = 500, details) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'FamilyAIError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.statusCode = statusCode;
|
|
10
|
+
this.details = details;
|
|
11
|
+
Error.captureStackTrace(this, this.constructor);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class ConfigurationError extends FamilyAIError {
|
|
15
|
+
constructor(message, details) {
|
|
16
|
+
super(message, 'CONFIGURATION_ERROR', 500, details);
|
|
17
|
+
this.name = 'ConfigurationError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class LLMError extends FamilyAIError {
|
|
21
|
+
constructor(message, details) {
|
|
22
|
+
super(message, 'LLM_ERROR', 502, details);
|
|
23
|
+
this.name = 'LLMError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class MemoryError extends FamilyAIError {
|
|
27
|
+
constructor(message, details) {
|
|
28
|
+
super(message, 'MEMORY_ERROR', 500, details);
|
|
29
|
+
this.name = 'MemoryError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class ToolExecutionError extends FamilyAIError {
|
|
33
|
+
constructor(message, toolName, details) {
|
|
34
|
+
super(message, 'TOOL_EXECUTION_ERROR', 500, { toolName, ...details });
|
|
35
|
+
this.name = 'ToolExecutionError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class SafetyError extends FamilyAIError {
|
|
39
|
+
constructor(message, details) {
|
|
40
|
+
super(message, 'SAFETY_ERROR', 403, details);
|
|
41
|
+
this.name = 'SafetyError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class ValidationError extends FamilyAIError {
|
|
45
|
+
constructor(message, details) {
|
|
46
|
+
super(message, 'VALIDATION_ERROR', 400, details);
|
|
47
|
+
this.name = 'ValidationError';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export class AgentError extends FamilyAIError {
|
|
51
|
+
constructor(message, agentId, details) {
|
|
52
|
+
super(message, 'AGENT_ERROR', 500, { agentId, ...details });
|
|
53
|
+
this.name = 'AgentError';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class RateLimitError extends FamilyAIError {
|
|
57
|
+
constructor(retryAfter) {
|
|
58
|
+
super('Rate limit exceeded', 'RATE_LIMIT_ERROR', 429, { retryAfter });
|
|
59
|
+
this.name = 'RateLimitError';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class SandboxError extends FamilyAIError {
|
|
63
|
+
constructor(message, details) {
|
|
64
|
+
super(message, 'SANDBOX_ERROR', 500, details);
|
|
65
|
+
this.name = 'SandboxError';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function isRetryableError(error) {
|
|
69
|
+
if (error instanceof FamilyAIError) {
|
|
70
|
+
return (error.code === 'LLM_ERROR' ||
|
|
71
|
+
error.code === 'RATE_LIMIT_ERROR' ||
|
|
72
|
+
error.statusCode >= 500);
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
export function formatErrorForUser(error) {
|
|
77
|
+
if (error instanceof SafetyError) {
|
|
78
|
+
return `Request blocked: ${error.message}`;
|
|
79
|
+
}
|
|
80
|
+
if (error instanceof ValidationError) {
|
|
81
|
+
return `Invalid input: ${error.message}`;
|
|
82
|
+
}
|
|
83
|
+
if (error instanceof RateLimitError) {
|
|
84
|
+
return 'Too many requests. Please wait a moment and try again.';
|
|
85
|
+
}
|
|
86
|
+
if (error instanceof FamilyAIError) {
|
|
87
|
+
return `An error occurred: ${error.message}`;
|
|
88
|
+
}
|
|
89
|
+
if (error instanceof Error) {
|
|
90
|
+
return `Unexpected error: ${error.message}`;
|
|
91
|
+
}
|
|
92
|
+
return 'An unexpected error occurred';
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
export declare const logger: winston.Logger;
|
|
3
|
+
export declare function createLogger(component: string): winston.Logger;
|
|
4
|
+
export declare function logAgentAction(agentId: string, action: string, details: Record<string, unknown>): void;
|
|
5
|
+
export declare function logToolExecution(toolName: string, input: unknown, output: unknown, durationMs: number): void;
|
|
6
|
+
export declare function logMemoryOperation(operation: 'read' | 'write' | 'search', memoryType: string, details: Record<string, unknown>): void;
|
|
7
|
+
export declare function logSafetyEvent(eventType: string, blocked: boolean, reason?: string, details?: Record<string, unknown>): void;
|
|
8
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAkB9B,eAAO,MAAM,MAAM,gBAcjB,CAAC;AAGH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,kBAE7C;AAGD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAGjC;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,MAAM,QAGnB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,EACtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAGjC;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAIlC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import { config } from '../config/index.js';
|
|
3
|
+
const { combine, timestamp, printf, colorize, json } = winston.format;
|
|
4
|
+
const prettyFormat = printf(({ level, message, timestamp, ...metadata }) => {
|
|
5
|
+
let msg = `${timestamp} [${level}]: ${message}`;
|
|
6
|
+
if (Object.keys(metadata).length > 0) {
|
|
7
|
+
msg += ` ${JSON.stringify(metadata)}`;
|
|
8
|
+
}
|
|
9
|
+
return msg;
|
|
10
|
+
});
|
|
11
|
+
const logFormat = config.LOG_FORMAT === 'pretty'
|
|
12
|
+
? combine(colorize(), timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), prettyFormat)
|
|
13
|
+
: combine(timestamp(), json());
|
|
14
|
+
export const logger = winston.createLogger({
|
|
15
|
+
level: config.LOG_LEVEL,
|
|
16
|
+
format: logFormat,
|
|
17
|
+
defaultMeta: { service: 'family-ai-agent' },
|
|
18
|
+
transports: [
|
|
19
|
+
new winston.transports.Console(),
|
|
20
|
+
new winston.transports.File({
|
|
21
|
+
filename: 'logs/error.log',
|
|
22
|
+
level: 'error',
|
|
23
|
+
}),
|
|
24
|
+
new winston.transports.File({
|
|
25
|
+
filename: 'logs/combined.log',
|
|
26
|
+
}),
|
|
27
|
+
],
|
|
28
|
+
});
|
|
29
|
+
// Create a child logger for specific components
|
|
30
|
+
export function createLogger(component) {
|
|
31
|
+
return logger.child({ component });
|
|
32
|
+
}
|
|
33
|
+
// Structured logging helpers
|
|
34
|
+
export function logAgentAction(agentId, action, details) {
|
|
35
|
+
logger.info('Agent action', { agentId, action, ...details });
|
|
36
|
+
}
|
|
37
|
+
export function logToolExecution(toolName, input, output, durationMs) {
|
|
38
|
+
logger.debug('Tool execution', { toolName, input, output, durationMs });
|
|
39
|
+
}
|
|
40
|
+
export function logMemoryOperation(operation, memoryType, details) {
|
|
41
|
+
logger.debug('Memory operation', { operation, memoryType, ...details });
|
|
42
|
+
}
|
|
43
|
+
export function logSafetyEvent(eventType, blocked, reason, details) {
|
|
44
|
+
const level = blocked ? 'warn' : 'info';
|
|
45
|
+
logger.log(level, 'Safety event', { eventType, blocked, reason, ...details });
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;AAEtE,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE;IACzE,IAAI,GAAG,GAAG,GAAG,SAAS,KAAK,KAAK,MAAM,OAAO,EAAE,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GACb,MAAM,CAAC,UAAU,KAAK,QAAQ;IAC5B,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,YAAY,CAAC;IACjF,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC,SAAS;IACvB,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE;IAC3C,UAAU,EAAE;QACV,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,OAAO;SACf,CAAC;QACF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,mBAAmB;SAC9B,CAAC;KACH;CACF,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,MAAc,EACd,OAAgC;IAEhC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,KAAc,EACd,MAAe,EACf,UAAkB;IAElB,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAsC,EACtC,UAAkB,EAClB,OAAgC;IAEhC,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,OAAgB,EAChB,MAAe,EACf,OAAiC;IAEjC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
-- Enable pgvector extension
|
|
2
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
3
|
+
|
|
4
|
+
-- Memory tables
|
|
5
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
6
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
7
|
+
thread_id VARCHAR(255) NOT NULL,
|
|
8
|
+
user_id VARCHAR(255),
|
|
9
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
10
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
14
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
15
|
+
conversation_id UUID REFERENCES conversations(id) ON DELETE CASCADE,
|
|
16
|
+
role VARCHAR(50) NOT NULL,
|
|
17
|
+
content TEXT NOT NULL,
|
|
18
|
+
metadata JSONB DEFAULT '{}',
|
|
19
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
-- Long-term memory with vector embeddings
|
|
23
|
+
CREATE TABLE IF NOT EXISTS long_term_memories (
|
|
24
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
25
|
+
user_id VARCHAR(255),
|
|
26
|
+
memory_type VARCHAR(50) NOT NULL, -- 'semantic', 'episodic', 'procedural'
|
|
27
|
+
content TEXT NOT NULL,
|
|
28
|
+
embedding vector(1536), -- OpenAI embedding dimension
|
|
29
|
+
importance FLOAT DEFAULT 0.5,
|
|
30
|
+
access_count INTEGER DEFAULT 0,
|
|
31
|
+
last_accessed TIMESTAMP WITH TIME ZONE,
|
|
32
|
+
metadata JSONB DEFAULT '{}',
|
|
33
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
34
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
-- Create HNSW index for fast similarity search
|
|
38
|
+
CREATE INDEX IF NOT EXISTS long_term_memories_embedding_idx
|
|
39
|
+
ON long_term_memories
|
|
40
|
+
USING hnsw (embedding vector_cosine_ops);
|
|
41
|
+
|
|
42
|
+
-- Knowledge base documents
|
|
43
|
+
CREATE TABLE IF NOT EXISTS documents (
|
|
44
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
45
|
+
user_id VARCHAR(255),
|
|
46
|
+
filename VARCHAR(500) NOT NULL,
|
|
47
|
+
file_type VARCHAR(50),
|
|
48
|
+
file_size INTEGER,
|
|
49
|
+
content TEXT,
|
|
50
|
+
metadata JSONB DEFAULT '{}',
|
|
51
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
-- Document chunks with embeddings (for RAG)
|
|
55
|
+
CREATE TABLE IF NOT EXISTS document_chunks (
|
|
56
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
57
|
+
document_id UUID REFERENCES documents(id) ON DELETE CASCADE,
|
|
58
|
+
chunk_index INTEGER NOT NULL,
|
|
59
|
+
content TEXT NOT NULL,
|
|
60
|
+
embedding vector(1536),
|
|
61
|
+
metadata JSONB DEFAULT '{}',
|
|
62
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
CREATE INDEX IF NOT EXISTS document_chunks_embedding_idx
|
|
66
|
+
ON document_chunks
|
|
67
|
+
USING hnsw (embedding vector_cosine_ops);
|
|
68
|
+
|
|
69
|
+
-- LangGraph checkpointer tables
|
|
70
|
+
CREATE TABLE IF NOT EXISTS checkpoints (
|
|
71
|
+
thread_id VARCHAR(255) NOT NULL,
|
|
72
|
+
checkpoint_ns VARCHAR(255) NOT NULL DEFAULT '',
|
|
73
|
+
checkpoint_id VARCHAR(255) NOT NULL,
|
|
74
|
+
parent_checkpoint_id VARCHAR(255),
|
|
75
|
+
type VARCHAR(50),
|
|
76
|
+
checkpoint JSONB NOT NULL,
|
|
77
|
+
metadata JSONB DEFAULT '{}',
|
|
78
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
79
|
+
PRIMARY KEY (thread_id, checkpoint_ns, checkpoint_id)
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS checkpoint_writes (
|
|
83
|
+
thread_id VARCHAR(255) NOT NULL,
|
|
84
|
+
checkpoint_ns VARCHAR(255) NOT NULL DEFAULT '',
|
|
85
|
+
checkpoint_id VARCHAR(255) NOT NULL,
|
|
86
|
+
task_id VARCHAR(255) NOT NULL,
|
|
87
|
+
idx INTEGER NOT NULL,
|
|
88
|
+
channel VARCHAR(255) NOT NULL,
|
|
89
|
+
type VARCHAR(50),
|
|
90
|
+
value JSONB,
|
|
91
|
+
PRIMARY KEY (thread_id, checkpoint_ns, checkpoint_id, task_id, idx)
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
-- Audit log for safety
|
|
95
|
+
CREATE TABLE IF NOT EXISTS audit_logs (
|
|
96
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
97
|
+
user_id VARCHAR(255),
|
|
98
|
+
agent_id VARCHAR(255),
|
|
99
|
+
action_type VARCHAR(100) NOT NULL,
|
|
100
|
+
action_details JSONB NOT NULL,
|
|
101
|
+
input_hash VARCHAR(64),
|
|
102
|
+
output_hash VARCHAR(64),
|
|
103
|
+
status VARCHAR(50) DEFAULT 'success',
|
|
104
|
+
error_message TEXT,
|
|
105
|
+
execution_time_ms INTEGER,
|
|
106
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
CREATE INDEX IF NOT EXISTS audit_logs_user_idx ON audit_logs(user_id);
|
|
110
|
+
CREATE INDEX IF NOT EXISTS audit_logs_agent_idx ON audit_logs(agent_id);
|
|
111
|
+
CREATE INDEX IF NOT EXISTS audit_logs_created_idx ON audit_logs(created_at);
|
|
112
|
+
|
|
113
|
+
-- Task queue for automation
|
|
114
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
115
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
116
|
+
user_id VARCHAR(255),
|
|
117
|
+
task_type VARCHAR(100) NOT NULL,
|
|
118
|
+
priority INTEGER DEFAULT 5,
|
|
119
|
+
status VARCHAR(50) DEFAULT 'pending', -- pending, running, completed, failed
|
|
120
|
+
payload JSONB NOT NULL,
|
|
121
|
+
result JSONB,
|
|
122
|
+
scheduled_at TIMESTAMP WITH TIME ZONE,
|
|
123
|
+
started_at TIMESTAMP WITH TIME ZONE,
|
|
124
|
+
completed_at TIMESTAMP WITH TIME ZONE,
|
|
125
|
+
error_message TEXT,
|
|
126
|
+
retry_count INTEGER DEFAULT 0,
|
|
127
|
+
max_retries INTEGER DEFAULT 3,
|
|
128
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
CREATE INDEX IF NOT EXISTS tasks_status_idx ON tasks(status);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS tasks_scheduled_idx ON tasks(scheduled_at);
|
|
133
|
+
|
|
134
|
+
-- Update timestamp trigger
|
|
135
|
+
CREATE OR REPLACE FUNCTION update_updated_at()
|
|
136
|
+
RETURNS TRIGGER AS $$
|
|
137
|
+
BEGIN
|
|
138
|
+
NEW.updated_at = NOW();
|
|
139
|
+
RETURN NEW;
|
|
140
|
+
END;
|
|
141
|
+
$$ LANGUAGE plpgsql;
|
|
142
|
+
|
|
143
|
+
CREATE TRIGGER conversations_updated_at
|
|
144
|
+
BEFORE UPDATE ON conversations
|
|
145
|
+
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
|
146
|
+
|
|
147
|
+
CREATE TRIGGER long_term_memories_updated_at
|
|
148
|
+
BEFORE UPDATE ON long_term_memories
|
|
149
|
+
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Sandbox container for isolated code execution
|
|
2
|
+
FROM node:20-alpine
|
|
3
|
+
|
|
4
|
+
# Install Python and common tools
|
|
5
|
+
RUN apk add --no-cache \
|
|
6
|
+
python3 \
|
|
7
|
+
py3-pip \
|
|
8
|
+
bash \
|
|
9
|
+
curl \
|
|
10
|
+
git \
|
|
11
|
+
&& rm -rf /var/cache/apk/*
|
|
12
|
+
|
|
13
|
+
# Create non-root user for security
|
|
14
|
+
RUN addgroup -g 1001 sandbox && \
|
|
15
|
+
adduser -D -u 1001 -G sandbox sandbox
|
|
16
|
+
|
|
17
|
+
# Create workspace directory
|
|
18
|
+
WORKDIR /workspace
|
|
19
|
+
RUN chown sandbox:sandbox /workspace
|
|
20
|
+
|
|
21
|
+
# Switch to non-root user
|
|
22
|
+
USER sandbox
|
|
23
|
+
|
|
24
|
+
# Set resource limits via environment
|
|
25
|
+
ENV NODE_OPTIONS="--max-old-space-size=256"
|
|
26
|
+
ENV PYTHONDONTWRITEBYTECODE=1
|
|
27
|
+
|
|
28
|
+
# Default command
|
|
29
|
+
CMD ["sh"]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
postgres:
|
|
5
|
+
image: pgvector/pgvector:pg16
|
|
6
|
+
container_name: family-ai-db
|
|
7
|
+
restart: unless-stopped
|
|
8
|
+
environment:
|
|
9
|
+
POSTGRES_USER: ${DB_USER:-familyai}
|
|
10
|
+
POSTGRES_PASSWORD: ${DB_PASSWORD:-familyai123}
|
|
11
|
+
POSTGRES_DB: ${DB_NAME:-familyai}
|
|
12
|
+
ports:
|
|
13
|
+
- "${DB_PORT:-5432}:5432"
|
|
14
|
+
volumes:
|
|
15
|
+
- postgres_data:/var/lib/postgresql/data
|
|
16
|
+
- ./docker/init-db.sql:/docker-entrypoint-initdb.d/init.sql
|
|
17
|
+
healthcheck:
|
|
18
|
+
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-familyai} -d ${DB_NAME:-familyai}"]
|
|
19
|
+
interval: 10s
|
|
20
|
+
timeout: 5s
|
|
21
|
+
retries: 5
|
|
22
|
+
|
|
23
|
+
redis:
|
|
24
|
+
image: redis:7-alpine
|
|
25
|
+
container_name: family-ai-redis
|
|
26
|
+
restart: unless-stopped
|
|
27
|
+
ports:
|
|
28
|
+
- "${REDIS_PORT:-6379}:6379"
|
|
29
|
+
volumes:
|
|
30
|
+
- redis_data:/data
|
|
31
|
+
healthcheck:
|
|
32
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
33
|
+
interval: 10s
|
|
34
|
+
timeout: 5s
|
|
35
|
+
retries: 5
|
|
36
|
+
|
|
37
|
+
sandbox:
|
|
38
|
+
build:
|
|
39
|
+
context: ./docker/sandbox
|
|
40
|
+
dockerfile: Dockerfile.sandbox
|
|
41
|
+
container_name: family-ai-sandbox
|
|
42
|
+
restart: unless-stopped
|
|
43
|
+
privileged: false
|
|
44
|
+
security_opt:
|
|
45
|
+
- no-new-privileges:true
|
|
46
|
+
read_only: true
|
|
47
|
+
tmpfs:
|
|
48
|
+
- /tmp:size=256M
|
|
49
|
+
mem_limit: 512m
|
|
50
|
+
cpus: 1
|
|
51
|
+
networks:
|
|
52
|
+
- sandbox_network
|
|
53
|
+
|
|
54
|
+
volumes:
|
|
55
|
+
postgres_data:
|
|
56
|
+
redis_data:
|
|
57
|
+
|
|
58
|
+
networks:
|
|
59
|
+
sandbox_network:
|
|
60
|
+
driver: bridge
|
|
61
|
+
internal: true
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "family-ai-agent",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Multi-agent AI system with memory and autonomous capabilities",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "tsx watch src/index.ts",
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"start": "node dist/index.js",
|
|
11
|
+
"cli": "tsx src/cli/index.ts",
|
|
12
|
+
"db:migrate": "tsx scripts/migrate.ts",
|
|
13
|
+
"db:setup": "docker-compose up -d && npm run db:migrate",
|
|
14
|
+
"lint": "eslint src --ext .ts",
|
|
15
|
+
"format": "prettier --write src/**/*.ts",
|
|
16
|
+
"test": "vitest",
|
|
17
|
+
"test:coverage": "vitest --coverage"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@langchain/core": "^0.3.26",
|
|
21
|
+
"@langchain/langgraph": "^0.2.42",
|
|
22
|
+
"@langchain/openai": "^0.3.17",
|
|
23
|
+
"@langchain/community": "^0.3.24",
|
|
24
|
+
"@langchain/textsplitters": "^0.1.0",
|
|
25
|
+
"@fastify/cors": "^10.0.1",
|
|
26
|
+
"@fastify/rate-limit": "^10.2.0",
|
|
27
|
+
"@fastify/websocket": "^11.0.1",
|
|
28
|
+
"fastify": "^5.1.0",
|
|
29
|
+
"pg": "^8.13.1",
|
|
30
|
+
"pgvector": "^0.2.0",
|
|
31
|
+
"drizzle-orm": "^0.38.2",
|
|
32
|
+
"playwright": "^1.49.1",
|
|
33
|
+
"cheerio": "^1.0.0",
|
|
34
|
+
"pdf-parse": "^1.1.1",
|
|
35
|
+
"mammoth": "^1.8.0",
|
|
36
|
+
"commander": "^12.1.0",
|
|
37
|
+
"inquirer": "^12.2.0",
|
|
38
|
+
"chalk": "^5.3.0",
|
|
39
|
+
"ora": "^8.1.1",
|
|
40
|
+
"boxen": "^8.0.1",
|
|
41
|
+
"winston": "^3.17.0",
|
|
42
|
+
"nanoid": "^5.0.9",
|
|
43
|
+
"p-retry": "^6.2.1",
|
|
44
|
+
"dotenv": "^16.4.7",
|
|
45
|
+
"zod": "^3.24.1",
|
|
46
|
+
"dompurify": "^3.2.2",
|
|
47
|
+
"jsdom": "^25.0.1",
|
|
48
|
+
"validator": "^13.12.0",
|
|
49
|
+
"dockerode": "^4.0.2",
|
|
50
|
+
"marked": "^15.0.4"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^22.10.2",
|
|
54
|
+
"@types/pg": "^8.11.10",
|
|
55
|
+
"@types/dompurify": "^3.0.5",
|
|
56
|
+
"@types/jsdom": "^21.1.7",
|
|
57
|
+
"@types/validator": "^13.12.2",
|
|
58
|
+
"typescript": "^5.7.2",
|
|
59
|
+
"tsx": "^4.19.2",
|
|
60
|
+
"vitest": "^2.1.8",
|
|
61
|
+
"eslint": "^9.17.0",
|
|
62
|
+
"prettier": "^3.4.2",
|
|
63
|
+
"drizzle-kit": "^0.30.1",
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "^8.18.1",
|
|
65
|
+
"@typescript-eslint/parser": "^8.18.1"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": ">=20.0.0"
|
|
69
|
+
},
|
|
70
|
+
"keywords": [
|
|
71
|
+
"ai",
|
|
72
|
+
"agent",
|
|
73
|
+
"multi-agent",
|
|
74
|
+
"langchain",
|
|
75
|
+
"langgraph",
|
|
76
|
+
"openrouter"
|
|
77
|
+
],
|
|
78
|
+
"author": "",
|
|
79
|
+
"license": "MIT"
|
|
80
|
+
}
|