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,233 @@
|
|
|
1
|
+
import { StateGraph, Annotation, END, START } from '@langchain/langgraph';
|
|
2
|
+
import { HumanMessage, AIMessage } from '@langchain/core/messages';
|
|
3
|
+
import { nanoid } from 'nanoid';
|
|
4
|
+
import { getAgentFactory } from '../agents/agent-factory.js';
|
|
5
|
+
import { createLogger } from '../../utils/logger.js';
|
|
6
|
+
const logger = createLogger('OrchestratorGraph');
|
|
7
|
+
// Define the state annotation for LangGraph
|
|
8
|
+
export const AgentStateAnnotation = Annotation.Root({
|
|
9
|
+
// Messages in the conversation
|
|
10
|
+
messages: Annotation({
|
|
11
|
+
reducer: (prev, next) => [...prev, ...next],
|
|
12
|
+
default: () => [],
|
|
13
|
+
}),
|
|
14
|
+
// Current user input
|
|
15
|
+
input: Annotation({
|
|
16
|
+
reducer: (_, next) => next,
|
|
17
|
+
default: () => '',
|
|
18
|
+
}),
|
|
19
|
+
// Current task being processed
|
|
20
|
+
currentTask: Annotation({
|
|
21
|
+
reducer: (_, next) => next,
|
|
22
|
+
default: () => null,
|
|
23
|
+
}),
|
|
24
|
+
// Active agents in this workflow
|
|
25
|
+
activeAgents: Annotation({
|
|
26
|
+
reducer: (prev, next) => {
|
|
27
|
+
// Merge unique agents
|
|
28
|
+
const existing = new Set(prev.map((a) => a.id));
|
|
29
|
+
return [...prev, ...next.filter((a) => !existing.has(a.id))];
|
|
30
|
+
},
|
|
31
|
+
default: () => [],
|
|
32
|
+
}),
|
|
33
|
+
// Shared context for multi-agent coordination
|
|
34
|
+
sharedContext: Annotation({
|
|
35
|
+
reducer: (prev, next) => ({ ...prev, ...next }),
|
|
36
|
+
default: () => ({}),
|
|
37
|
+
}),
|
|
38
|
+
// Results from completed tasks
|
|
39
|
+
taskResults: Annotation({
|
|
40
|
+
reducer: (prev, next) => [...prev, ...next],
|
|
41
|
+
default: () => [],
|
|
42
|
+
}),
|
|
43
|
+
// Retrieved memories for context
|
|
44
|
+
memories: Annotation({
|
|
45
|
+
reducer: (_, next) => next,
|
|
46
|
+
default: () => [],
|
|
47
|
+
}),
|
|
48
|
+
// Next agent to route to
|
|
49
|
+
nextAgent: Annotation({
|
|
50
|
+
reducer: (_, next) => next,
|
|
51
|
+
default: () => null,
|
|
52
|
+
}),
|
|
53
|
+
// Final response to user
|
|
54
|
+
response: Annotation({
|
|
55
|
+
reducer: (_, next) => next,
|
|
56
|
+
default: () => '',
|
|
57
|
+
}),
|
|
58
|
+
// Error state
|
|
59
|
+
error: Annotation({
|
|
60
|
+
reducer: (_, next) => next,
|
|
61
|
+
default: () => null,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
// Supervisor node - analyzes and routes tasks
|
|
65
|
+
async function supervisorNode(state) {
|
|
66
|
+
logger.debug('Supervisor analyzing task', { input: state.input?.slice(0, 100) });
|
|
67
|
+
const input = state.input.toLowerCase();
|
|
68
|
+
// Simple routing logic based on keywords
|
|
69
|
+
let nextAgent = 'chat';
|
|
70
|
+
// Research patterns
|
|
71
|
+
if (input.includes('search') ||
|
|
72
|
+
input.includes('find') ||
|
|
73
|
+
input.includes('research') ||
|
|
74
|
+
input.includes('look up') ||
|
|
75
|
+
input.includes('what is') ||
|
|
76
|
+
input.includes('who is') ||
|
|
77
|
+
input.includes('investigate')) {
|
|
78
|
+
nextAgent = 'research';
|
|
79
|
+
}
|
|
80
|
+
// Coding patterns
|
|
81
|
+
else if (input.includes('code') ||
|
|
82
|
+
input.includes('program') ||
|
|
83
|
+
input.includes('function') ||
|
|
84
|
+
input.includes('debug') ||
|
|
85
|
+
input.includes('fix bug') ||
|
|
86
|
+
input.includes('implement') ||
|
|
87
|
+
input.includes('write a script') ||
|
|
88
|
+
input.includes('refactor')) {
|
|
89
|
+
nextAgent = 'coding';
|
|
90
|
+
}
|
|
91
|
+
// Automation patterns
|
|
92
|
+
else if (input.includes('automate') ||
|
|
93
|
+
input.includes('schedule') ||
|
|
94
|
+
input.includes('every day') ||
|
|
95
|
+
input.includes('every hour') ||
|
|
96
|
+
input.includes('batch') ||
|
|
97
|
+
input.includes('workflow') ||
|
|
98
|
+
input.includes('recurring')) {
|
|
99
|
+
nextAgent = 'automation';
|
|
100
|
+
}
|
|
101
|
+
const task = {
|
|
102
|
+
id: nanoid(),
|
|
103
|
+
type: nextAgent === 'chat' ? 'chat' : nextAgent === 'coding' ? 'coding' : nextAgent === 'research' ? 'research' : 'automation',
|
|
104
|
+
description: state.input,
|
|
105
|
+
input: state.input,
|
|
106
|
+
priority: 'normal',
|
|
107
|
+
requiredCapabilities: [],
|
|
108
|
+
};
|
|
109
|
+
logger.info('Task routed', { taskId: task.id, targetAgent: nextAgent });
|
|
110
|
+
return {
|
|
111
|
+
currentTask: task,
|
|
112
|
+
nextAgent,
|
|
113
|
+
sharedContext: {
|
|
114
|
+
routedAt: new Date().toISOString(),
|
|
115
|
+
routingReason: `Routed to ${nextAgent} based on input analysis`,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// Generic agent execution node
|
|
120
|
+
async function agentNode(role) {
|
|
121
|
+
return async (state) => {
|
|
122
|
+
logger.debug(`${role} agent executing`, { taskId: state.currentTask?.id });
|
|
123
|
+
const factory = getAgentFactory();
|
|
124
|
+
const agent = factory.getAgent(role);
|
|
125
|
+
try {
|
|
126
|
+
const result = await agent.execute(state.input, state.sharedContext, state.memories);
|
|
127
|
+
const aiMessage = new AIMessage({
|
|
128
|
+
content: String(result.output),
|
|
129
|
+
name: agent.name,
|
|
130
|
+
});
|
|
131
|
+
return {
|
|
132
|
+
messages: [aiMessage],
|
|
133
|
+
taskResults: [result],
|
|
134
|
+
response: String(result.output),
|
|
135
|
+
activeAgents: [agent.getInfo()],
|
|
136
|
+
nextAgent: 'end',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
141
|
+
logger.error(`${role} agent failed`, { error: errorMessage });
|
|
142
|
+
return {
|
|
143
|
+
error: errorMessage,
|
|
144
|
+
response: `Sorry, I encountered an error: ${errorMessage}`,
|
|
145
|
+
nextAgent: 'end',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
factory.releaseAgent(agent.id);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Create agent nodes
|
|
154
|
+
const chatAgentNode = await agentNode('chat');
|
|
155
|
+
const researchAgentNode = await agentNode('research');
|
|
156
|
+
const codingAgentNode = await agentNode('coding');
|
|
157
|
+
const automationAgentNode = await agentNode('automation');
|
|
158
|
+
// Routing function
|
|
159
|
+
function routeToAgent(state) {
|
|
160
|
+
if (state.error) {
|
|
161
|
+
return 'end';
|
|
162
|
+
}
|
|
163
|
+
return state.nextAgent ?? 'chat';
|
|
164
|
+
}
|
|
165
|
+
// Build the graph
|
|
166
|
+
export function createOrchestratorGraph() {
|
|
167
|
+
const workflow = new StateGraph(AgentStateAnnotation)
|
|
168
|
+
// Add nodes
|
|
169
|
+
.addNode('supervisor', supervisorNode)
|
|
170
|
+
.addNode('chat', chatAgentNode)
|
|
171
|
+
.addNode('research', researchAgentNode)
|
|
172
|
+
.addNode('coding', codingAgentNode)
|
|
173
|
+
.addNode('automation', automationAgentNode)
|
|
174
|
+
// Entry point
|
|
175
|
+
.addEdge(START, 'supervisor')
|
|
176
|
+
// Conditional routing from supervisor
|
|
177
|
+
.addConditionalEdges('supervisor', routeToAgent, {
|
|
178
|
+
chat: 'chat',
|
|
179
|
+
research: 'research',
|
|
180
|
+
coding: 'coding',
|
|
181
|
+
automation: 'automation',
|
|
182
|
+
end: END,
|
|
183
|
+
})
|
|
184
|
+
// All agents go to END after execution
|
|
185
|
+
.addEdge('chat', END)
|
|
186
|
+
.addEdge('research', END)
|
|
187
|
+
.addEdge('coding', END)
|
|
188
|
+
.addEdge('automation', END);
|
|
189
|
+
return workflow.compile();
|
|
190
|
+
}
|
|
191
|
+
// Singleton graph instance
|
|
192
|
+
let graphInstance = null;
|
|
193
|
+
export function getOrchestratorGraph() {
|
|
194
|
+
if (!graphInstance) {
|
|
195
|
+
graphInstance = createOrchestratorGraph();
|
|
196
|
+
}
|
|
197
|
+
return graphInstance;
|
|
198
|
+
}
|
|
199
|
+
// Helper function to run the orchestrator
|
|
200
|
+
export async function runOrchestrator(input, context = {}, memories = []) {
|
|
201
|
+
const graph = getOrchestratorGraph();
|
|
202
|
+
const initialState = {
|
|
203
|
+
input,
|
|
204
|
+
messages: [new HumanMessage(input)],
|
|
205
|
+
sharedContext: context,
|
|
206
|
+
memories,
|
|
207
|
+
};
|
|
208
|
+
logger.info('Orchestrator started', { input: input.slice(0, 100) });
|
|
209
|
+
const result = await graph.invoke(initialState);
|
|
210
|
+
logger.info('Orchestrator completed', {
|
|
211
|
+
response: result.response?.slice(0, 100),
|
|
212
|
+
agentsUsed: result.activeAgents?.map((a) => a.name),
|
|
213
|
+
});
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
// Stream execution
|
|
217
|
+
export async function* streamOrchestrator(input, context = {}, memories = []) {
|
|
218
|
+
const graph = getOrchestratorGraph();
|
|
219
|
+
const initialState = {
|
|
220
|
+
input,
|
|
221
|
+
messages: [new HumanMessage(input)],
|
|
222
|
+
sharedContext: context,
|
|
223
|
+
memories,
|
|
224
|
+
};
|
|
225
|
+
const stream = await graph.stream(initialState);
|
|
226
|
+
for await (const chunk of stream) {
|
|
227
|
+
for (const [node, state] of Object.entries(chunk)) {
|
|
228
|
+
yield { node, state: state };
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
export default { createOrchestratorGraph, getOrchestratorGraph, runOrchestrator, streamOrchestrator };
|
|
233
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/core/orchestrator/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
export declare function getPool(): pg.Pool;
|
|
3
|
+
export declare function query<T extends pg.QueryResultRow = pg.QueryResultRow>(text: string, params?: unknown[]): Promise<pg.QueryResult<T>>;
|
|
4
|
+
export declare function getClient(): Promise<pg.PoolClient>;
|
|
5
|
+
export declare function transaction<T>(callback: (client: pg.PoolClient) => Promise<T>): Promise<T>;
|
|
6
|
+
export declare function healthCheck(): Promise<boolean>;
|
|
7
|
+
export declare function closePool(): Promise<void>;
|
|
8
|
+
export declare function initDatabase(): Promise<void>;
|
|
9
|
+
declare const _default: {
|
|
10
|
+
getPool: typeof getPool;
|
|
11
|
+
query: typeof query;
|
|
12
|
+
getClient: typeof getClient;
|
|
13
|
+
transaction: typeof transaction;
|
|
14
|
+
healthCheck: typeof healthCheck;
|
|
15
|
+
closePool: typeof closePool;
|
|
16
|
+
initDatabase: typeof initDatabase;
|
|
17
|
+
};
|
|
18
|
+
export default _default;
|
|
19
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB,wBAAgB,OAAO,IAAI,EAAE,CAAC,IAAI,CAmBjC;AAED,wBAAsB,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC,cAAc,EACzE,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAc5B;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAGxD;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GAC9C,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/C;AAGD,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD;;;;;;;;;;AAED,wBAQE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
import { getDatabaseUrl } from '../config/index.js';
|
|
3
|
+
import { createLogger } from '../utils/logger.js';
|
|
4
|
+
import { MemoryError } from '../utils/errors.js';
|
|
5
|
+
const { Pool } = pg;
|
|
6
|
+
const logger = createLogger('Database');
|
|
7
|
+
let pool = null;
|
|
8
|
+
export function getPool() {
|
|
9
|
+
if (!pool) {
|
|
10
|
+
pool = new Pool({
|
|
11
|
+
connectionString: getDatabaseUrl(),
|
|
12
|
+
max: 20,
|
|
13
|
+
idleTimeoutMillis: 30000,
|
|
14
|
+
connectionTimeoutMillis: 5000,
|
|
15
|
+
});
|
|
16
|
+
pool.on('error', (err) => {
|
|
17
|
+
logger.error('Unexpected pool error', { error: err.message });
|
|
18
|
+
});
|
|
19
|
+
pool.on('connect', () => {
|
|
20
|
+
logger.debug('New client connected to pool');
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return pool;
|
|
24
|
+
}
|
|
25
|
+
export async function query(text, params) {
|
|
26
|
+
const pool = getPool();
|
|
27
|
+
const start = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
const result = await pool.query(text, params);
|
|
30
|
+
const duration = Date.now() - start;
|
|
31
|
+
logger.debug('Query executed', { duration, rows: result.rowCount });
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
36
|
+
logger.error('Query failed', { error: errorMessage, query: text.slice(0, 100) });
|
|
37
|
+
throw new MemoryError(`Database query failed: ${errorMessage}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function getClient() {
|
|
41
|
+
const pool = getPool();
|
|
42
|
+
return pool.connect();
|
|
43
|
+
}
|
|
44
|
+
export async function transaction(callback) {
|
|
45
|
+
const client = await getClient();
|
|
46
|
+
try {
|
|
47
|
+
await client.query('BEGIN');
|
|
48
|
+
const result = await callback(client);
|
|
49
|
+
await client.query('COMMIT');
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
await client.query('ROLLBACK');
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
client.release();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export async function healthCheck() {
|
|
61
|
+
try {
|
|
62
|
+
const result = await query('SELECT 1 as health');
|
|
63
|
+
return result.rows.length > 0;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function closePool() {
|
|
70
|
+
if (pool) {
|
|
71
|
+
await pool.end();
|
|
72
|
+
pool = null;
|
|
73
|
+
logger.info('Database pool closed');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Initialize the database connection
|
|
77
|
+
export async function initDatabase() {
|
|
78
|
+
const healthy = await healthCheck();
|
|
79
|
+
if (healthy) {
|
|
80
|
+
logger.info('Database connection established');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
throw new MemoryError('Failed to connect to database');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export default {
|
|
87
|
+
getPool,
|
|
88
|
+
query,
|
|
89
|
+
getClient,
|
|
90
|
+
transaction,
|
|
91
|
+
healthCheck,
|
|
92
|
+
closePool,
|
|
93
|
+
initDatabase,
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Family AI Agent - Multi-Agent AI System
|
|
3
|
+
*
|
|
4
|
+
* A production-ready multi-agent AI system with:
|
|
5
|
+
* - Supervisor architecture for task routing
|
|
6
|
+
* - Specialized agents (Research, Coding, Automation, Chat)
|
|
7
|
+
* - Long-term memory with vector search
|
|
8
|
+
* - Knowledge base with RAG
|
|
9
|
+
* - Safety guardrails
|
|
10
|
+
*
|
|
11
|
+
* @module family-ai-agent
|
|
12
|
+
*/
|
|
13
|
+
export { BaseAgent } from './core/agents/base-agent.js';
|
|
14
|
+
export { ChatAgent, createChatAgent } from './core/agents/personalities/chat.js';
|
|
15
|
+
export { ResearchAgent, createResearchAgent } from './core/agents/personalities/research.js';
|
|
16
|
+
export { CodingAgent, createCodingAgent } from './core/agents/personalities/coding.js';
|
|
17
|
+
export { AutomationAgent, createAutomationAgent } from './core/agents/personalities/automation.js';
|
|
18
|
+
export { AgentFactory, getAgentFactory } from './core/agents/agent-factory.js';
|
|
19
|
+
export type { AgentRole, AgentStatus, AgentIdentity, AgentConfig, AgentState, TaskDefinition, TaskResult, RetrievedMemory, } from './core/agents/types.js';
|
|
20
|
+
export { createOrchestratorGraph, getOrchestratorGraph, runOrchestrator, streamOrchestrator, } from './core/orchestrator/graph.js';
|
|
21
|
+
export { VectorStore, getVectorStore } from './memory/longterm/vector-store.js';
|
|
22
|
+
export { ConversationMemory, getConversationMemory } from './memory/conversation/index.js';
|
|
23
|
+
export { KnowledgeBase, getKnowledgeBase } from './memory/knowledge-base/index.js';
|
|
24
|
+
export { OpenRouterClient, getOpenRouterClient } from './llm/openrouter-client.js';
|
|
25
|
+
export { InputGuardrail, getInputGuardrail, validateInput } from './safety/guardrails/input-guardrail.js';
|
|
26
|
+
export { OutputGuardrail, getOutputGuardrail, validateOutput } from './safety/guardrails/output-guardrail.js';
|
|
27
|
+
export { AuditLogger, getAuditLogger } from './safety/audit-logger.js';
|
|
28
|
+
export { initDatabase, closePool, query, transaction } from './database/client.js';
|
|
29
|
+
export { config, getDatabaseUrl, getRedisUrl, isProduction, isDevelopment } from './config/index.js';
|
|
30
|
+
export { AVAILABLE_MODELS, getModelConfig, getRecommendedModel } from './config/models.js';
|
|
31
|
+
export { logger, createLogger } from './utils/logger.js';
|
|
32
|
+
export * from './utils/errors.js';
|
|
33
|
+
export declare const VERSION = "1.0.0";
|
|
34
|
+
export declare function quickStart(): Promise<{
|
|
35
|
+
ask: (input: string) => Promise<string>;
|
|
36
|
+
remember: (content: string) => Promise<string>;
|
|
37
|
+
search: (query: string) => Promise<RetrievedMemory[]>;
|
|
38
|
+
shutdown: () => Promise<void>;
|
|
39
|
+
}>;
|
|
40
|
+
import type { RetrievedMemory } from './core/agents/types.js';
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAC/E,YAAY,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGnF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9G,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG3F,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc,mBAAmB,CAAC;AAGlC,eAAO,MAAM,OAAO,UAAU,CAAC;AAO/B,wBAAsB,UAAU,IAAI,OAAO,CAAC;IAC1C,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACtD,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC,CAyBD;AAED,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Family AI Agent - Multi-Agent AI System
|
|
3
|
+
*
|
|
4
|
+
* A production-ready multi-agent AI system with:
|
|
5
|
+
* - Supervisor architecture for task routing
|
|
6
|
+
* - Specialized agents (Research, Coding, Automation, Chat)
|
|
7
|
+
* - Long-term memory with vector search
|
|
8
|
+
* - Knowledge base with RAG
|
|
9
|
+
* - Safety guardrails
|
|
10
|
+
*
|
|
11
|
+
* @module family-ai-agent
|
|
12
|
+
*/
|
|
13
|
+
// Core exports
|
|
14
|
+
export { BaseAgent } from './core/agents/base-agent.js';
|
|
15
|
+
export { ChatAgent, createChatAgent } from './core/agents/personalities/chat.js';
|
|
16
|
+
export { ResearchAgent, createResearchAgent } from './core/agents/personalities/research.js';
|
|
17
|
+
export { CodingAgent, createCodingAgent } from './core/agents/personalities/coding.js';
|
|
18
|
+
export { AutomationAgent, createAutomationAgent } from './core/agents/personalities/automation.js';
|
|
19
|
+
export { AgentFactory, getAgentFactory } from './core/agents/agent-factory.js';
|
|
20
|
+
// Orchestrator exports
|
|
21
|
+
export { createOrchestratorGraph, getOrchestratorGraph, runOrchestrator, streamOrchestrator, } from './core/orchestrator/graph.js';
|
|
22
|
+
// Memory exports
|
|
23
|
+
export { VectorStore, getVectorStore } from './memory/longterm/vector-store.js';
|
|
24
|
+
export { ConversationMemory, getConversationMemory } from './memory/conversation/index.js';
|
|
25
|
+
export { KnowledgeBase, getKnowledgeBase } from './memory/knowledge-base/index.js';
|
|
26
|
+
// LLM exports
|
|
27
|
+
export { OpenRouterClient, getOpenRouterClient } from './llm/openrouter-client.js';
|
|
28
|
+
// Safety exports
|
|
29
|
+
export { InputGuardrail, getInputGuardrail, validateInput } from './safety/guardrails/input-guardrail.js';
|
|
30
|
+
export { OutputGuardrail, getOutputGuardrail, validateOutput } from './safety/guardrails/output-guardrail.js';
|
|
31
|
+
export { AuditLogger, getAuditLogger } from './safety/audit-logger.js';
|
|
32
|
+
// Database exports
|
|
33
|
+
export { initDatabase, closePool, query, transaction } from './database/client.js';
|
|
34
|
+
// Config exports
|
|
35
|
+
export { config, getDatabaseUrl, getRedisUrl, isProduction, isDevelopment } from './config/index.js';
|
|
36
|
+
export { AVAILABLE_MODELS, getModelConfig, getRecommendedModel } from './config/models.js';
|
|
37
|
+
// Utility exports
|
|
38
|
+
export { logger, createLogger } from './utils/logger.js';
|
|
39
|
+
export * from './utils/errors.js';
|
|
40
|
+
// Version
|
|
41
|
+
export const VERSION = '1.0.0';
|
|
42
|
+
// Quick start function
|
|
43
|
+
import { initDatabase } from './database/client.js';
|
|
44
|
+
import { runOrchestrator } from './core/orchestrator/graph.js';
|
|
45
|
+
import { getVectorStore } from './memory/longterm/vector-store.js';
|
|
46
|
+
export async function quickStart() {
|
|
47
|
+
await initDatabase();
|
|
48
|
+
const vectorStore = getVectorStore();
|
|
49
|
+
return {
|
|
50
|
+
async ask(input) {
|
|
51
|
+
const memories = await vectorStore.search(input, { limit: 3 });
|
|
52
|
+
const result = await runOrchestrator(input, {}, memories);
|
|
53
|
+
return result.response;
|
|
54
|
+
},
|
|
55
|
+
async remember(content) {
|
|
56
|
+
return vectorStore.store(content, 'semantic');
|
|
57
|
+
},
|
|
58
|
+
async search(query) {
|
|
59
|
+
return vectorStore.search(query);
|
|
60
|
+
},
|
|
61
|
+
async shutdown() {
|
|
62
|
+
const { closePool } = await import('./database/client.js');
|
|
63
|
+
await closePool();
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
2
|
+
import { OpenAIEmbeddings } from '@langchain/openai';
|
|
3
|
+
import { type ModelConfig } from '../config/models.js';
|
|
4
|
+
import type { BaseMessage } from '@langchain/core/messages';
|
|
5
|
+
export interface ChatOptions {
|
|
6
|
+
model?: string;
|
|
7
|
+
temperature?: number;
|
|
8
|
+
maxTokens?: number;
|
|
9
|
+
topP?: number;
|
|
10
|
+
frequencyPenalty?: number;
|
|
11
|
+
presencePenalty?: number;
|
|
12
|
+
stop?: string[];
|
|
13
|
+
streaming?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface CompletionResult {
|
|
16
|
+
content: string;
|
|
17
|
+
model: string;
|
|
18
|
+
usage: {
|
|
19
|
+
promptTokens: number;
|
|
20
|
+
completionTokens: number;
|
|
21
|
+
totalTokens: number;
|
|
22
|
+
};
|
|
23
|
+
finishReason: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class OpenRouterClient {
|
|
26
|
+
private defaultModel;
|
|
27
|
+
private fastModel;
|
|
28
|
+
private embeddingModel;
|
|
29
|
+
private chatModels;
|
|
30
|
+
private embeddings;
|
|
31
|
+
constructor();
|
|
32
|
+
private getChatModel;
|
|
33
|
+
getEmbeddings(): OpenAIEmbeddings;
|
|
34
|
+
getChatModelForAgent(options?: ChatOptions): ChatOpenAI;
|
|
35
|
+
getFastModel(options?: ChatOptions): ChatOpenAI;
|
|
36
|
+
complete(messages: BaseMessage[], options?: ChatOptions): Promise<CompletionResult>;
|
|
37
|
+
streamComplete(messages: BaseMessage[], options?: ChatOptions): AsyncGenerator<string, void, unknown>;
|
|
38
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
39
|
+
embedQuery(text: string): Promise<number[]>;
|
|
40
|
+
getModelInfo(modelId?: string): ModelConfig | undefined;
|
|
41
|
+
getAvailableModels(): string[];
|
|
42
|
+
}
|
|
43
|
+
export declare function getOpenRouterClient(): OpenRouterClient;
|
|
44
|
+
export default OpenRouterClient;
|
|
45
|
+
//# sourceMappingURL=openrouter-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter-client.d.ts","sourceRoot":"","sources":["../../src/llm/openrouter-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,UAAU,CAAiC;;IAQnD,OAAO,CAAC,YAAY;IA+BpB,aAAa,IAAI,gBAAgB;IAcjC,oBAAoB,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU;IAS3D,YAAY,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU;IAK7C,QAAQ,CACZ,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,gBAAgB,CAAC;IAmCrB,cAAc,CACnB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,GAAE,WAAgB,GACxB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAwBlC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAc3C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcjD,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKvD,kBAAkB,IAAI,MAAM,EAAE;CAG/B;AAKD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED,eAAe,gBAAgB,CAAC"}
|