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,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
+ }