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