@almadar/server 1.0.17 → 1.2.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/dist/deepagent/memory.d.ts +20 -0
- package/dist/deepagent/memory.js +121 -0
- package/dist/deepagent/memory.js.map +1 -0
- package/dist/deepagent/session.d.ts +20 -0
- package/dist/deepagent/session.js +141 -0
- package/dist/deepagent/session.js.map +1 -0
- package/dist/deepagent/skill-agent.d.ts +24 -0
- package/dist/deepagent/skill-agent.js +179 -0
- package/dist/deepagent/skill-agent.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +235 -7
- package/dist/index.js.map +1 -1
- package/dist/middleware/multi-user.d.ts +37 -0
- package/dist/middleware/multi-user.js +150 -0
- package/dist/middleware/multi-user.js.map +1 -0
- package/dist/routes/observability.d.ts +12 -0
- package/dist/routes/observability.js +62 -0
- package/dist/routes/observability.js.map +1 -0
- package/dist/websocket/state-sync.d.ts +39 -0
- package/dist/websocket/state-sync.js +151 -0
- package/dist/websocket/state-sync.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MemoryManager } from '@almadar/agent';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Memory Manager Singleton
|
|
5
|
+
*
|
|
6
|
+
* Provides Firestore-backed memory management for DeepAgent.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get or create the MemoryManager singleton
|
|
13
|
+
*/
|
|
14
|
+
declare function getMemoryManager(): MemoryManager;
|
|
15
|
+
/**
|
|
16
|
+
* Reset the MemoryManager (useful for testing)
|
|
17
|
+
*/
|
|
18
|
+
declare function resetMemoryManager(): void;
|
|
19
|
+
|
|
20
|
+
export { getMemoryManager, resetMemoryManager };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { MemoryManager } from '@almadar/agent';
|
|
2
|
+
import admin from 'firebase-admin';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
|
|
6
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
7
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
8
|
+
}) : x)(function(x) {
|
|
9
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
10
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
11
|
+
});
|
|
12
|
+
dotenv.config();
|
|
13
|
+
var envSchema = z.object({
|
|
14
|
+
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
15
|
+
PORT: z.string().default("3030").transform((val) => parseInt(val, 10)),
|
|
16
|
+
CORS_ORIGIN: z.string().default("http://localhost:5173").transform((val) => val.includes(",") ? val.split(",").map((s) => s.trim()) : val),
|
|
17
|
+
// Database (Prisma/SQL) - optional
|
|
18
|
+
DATABASE_URL: z.string().optional(),
|
|
19
|
+
// Firebase/Firestore configuration
|
|
20
|
+
FIREBASE_PROJECT_ID: z.string().optional(),
|
|
21
|
+
FIREBASE_CLIENT_EMAIL: z.string().optional(),
|
|
22
|
+
FIREBASE_PRIVATE_KEY: z.string().optional(),
|
|
23
|
+
FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),
|
|
24
|
+
FIRESTORE_EMULATOR_HOST: z.string().optional(),
|
|
25
|
+
FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),
|
|
26
|
+
// API configuration
|
|
27
|
+
API_PREFIX: z.string().default("/api"),
|
|
28
|
+
// Mock data configuration
|
|
29
|
+
USE_MOCK_DATA: z.string().default("true").transform((v) => v === "true"),
|
|
30
|
+
MOCK_SEED: z.string().optional().transform((v) => v ? parseInt(v, 10) : void 0)
|
|
31
|
+
});
|
|
32
|
+
var parsed = envSchema.safeParse(process.env);
|
|
33
|
+
if (!parsed.success) {
|
|
34
|
+
console.error("\u274C Invalid environment variables:", parsed.error.flatten().fieldErrors);
|
|
35
|
+
throw new Error("Invalid environment variables");
|
|
36
|
+
}
|
|
37
|
+
var env = parsed.data;
|
|
38
|
+
|
|
39
|
+
// src/lib/db.ts
|
|
40
|
+
var firebaseApp = null;
|
|
41
|
+
function initializeFirebase() {
|
|
42
|
+
if (firebaseApp) {
|
|
43
|
+
return firebaseApp;
|
|
44
|
+
}
|
|
45
|
+
if (admin.apps.length > 0) {
|
|
46
|
+
firebaseApp = admin.apps[0];
|
|
47
|
+
return firebaseApp;
|
|
48
|
+
}
|
|
49
|
+
if (env.FIRESTORE_EMULATOR_HOST) {
|
|
50
|
+
firebaseApp = admin.initializeApp({
|
|
51
|
+
projectId: env.FIREBASE_PROJECT_ID || "demo-project"
|
|
52
|
+
});
|
|
53
|
+
console.log(`\u{1F527} Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);
|
|
54
|
+
return firebaseApp;
|
|
55
|
+
}
|
|
56
|
+
const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;
|
|
57
|
+
if (serviceAccountPath) {
|
|
58
|
+
const serviceAccount = __require(serviceAccountPath);
|
|
59
|
+
firebaseApp = admin.initializeApp({
|
|
60
|
+
credential: admin.credential.cert(serviceAccount),
|
|
61
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
62
|
+
});
|
|
63
|
+
} else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {
|
|
64
|
+
firebaseApp = admin.initializeApp({
|
|
65
|
+
credential: admin.credential.cert({
|
|
66
|
+
projectId: env.FIREBASE_PROJECT_ID,
|
|
67
|
+
clientEmail: env.FIREBASE_CLIENT_EMAIL,
|
|
68
|
+
privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, "\n")
|
|
69
|
+
}),
|
|
70
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
71
|
+
});
|
|
72
|
+
} else if (env.FIREBASE_PROJECT_ID) {
|
|
73
|
+
firebaseApp = admin.initializeApp({
|
|
74
|
+
credential: admin.credential.applicationDefault(),
|
|
75
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
firebaseApp = admin.initializeApp({
|
|
79
|
+
projectId: "demo-project"
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return firebaseApp;
|
|
83
|
+
}
|
|
84
|
+
function getFirestore() {
|
|
85
|
+
const app = initializeFirebase();
|
|
86
|
+
const db2 = app.firestore();
|
|
87
|
+
if (env.FIRESTORE_EMULATOR_HOST) {
|
|
88
|
+
db2.settings({
|
|
89
|
+
host: env.FIRESTORE_EMULATOR_HOST,
|
|
90
|
+
ssl: false
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return db2;
|
|
94
|
+
}
|
|
95
|
+
var db = getFirestore();
|
|
96
|
+
|
|
97
|
+
// src/deepagent/memory.ts
|
|
98
|
+
var memoryManager = null;
|
|
99
|
+
function getMemoryManager() {
|
|
100
|
+
if (!memoryManager) {
|
|
101
|
+
memoryManager = new MemoryManager({
|
|
102
|
+
db,
|
|
103
|
+
usersCollection: "agent_memory_users",
|
|
104
|
+
projectsCollection: "agent_memory_projects",
|
|
105
|
+
generationsCollection: "agent_memory_generations",
|
|
106
|
+
patternsCollection: "agent_memory_patterns",
|
|
107
|
+
interruptsCollection: "agent_memory_interrupts",
|
|
108
|
+
feedbackCollection: "agent_memory_feedback",
|
|
109
|
+
checkpointsCollection: "agent_memory_checkpoints",
|
|
110
|
+
toolPreferencesCollection: "agent_memory_tool_preferences"
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return memoryManager;
|
|
114
|
+
}
|
|
115
|
+
function resetMemoryManager() {
|
|
116
|
+
memoryManager = null;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export { getMemoryManager, resetMemoryManager };
|
|
120
|
+
//# sourceMappingURL=memory.js.map
|
|
121
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/env.ts","../../src/lib/db.ts","../../src/deepagent/memory.ts"],"names":["db"],"mappings":"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","file":"memory.js","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\n\n// Load environment variables\ndotenv.config();\n\nconst envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z\n .string()\n .default('3030')\n .transform((val) => parseInt(val, 10)),\n CORS_ORIGIN: z\n .string()\n .default('http://localhost:5173')\n .transform((val) => (val.includes(',') ? val.split(',').map((s) => s.trim()) : val)),\n \n // Database (Prisma/SQL) - optional\n DATABASE_URL: z.string().optional(),\n \n // Firebase/Firestore configuration\n FIREBASE_PROJECT_ID: z.string().optional(),\n FIREBASE_CLIENT_EMAIL: z.string().optional(),\n FIREBASE_PRIVATE_KEY: z.string().optional(),\n FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),\n FIRESTORE_EMULATOR_HOST: z.string().optional(),\n FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),\n \n // API configuration\n API_PREFIX: z.string().default('/api'),\n\n // Mock data configuration\n USE_MOCK_DATA: z.string().default('true').transform((v) => v === 'true'),\n MOCK_SEED: z\n .string()\n .optional()\n .transform((v) => (v ? parseInt(v, 10) : undefined)),\n});\n\nconst parsed = envSchema.safeParse(process.env);\n\nif (!parsed.success) {\n console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);\n throw new Error('Invalid environment variables');\n}\n\nexport const env = parsed.data;\n","/**\n * Database Configuration\n * \n * Supports both Prisma (SQL) and Firebase Admin (Firestore)\n * Generated apps can use either depending on the database option\n */\n\nimport admin from 'firebase-admin';\nimport { env } from './env.js';\n\n// ============ Firebase Admin / Firestore ============\n\nlet firebaseApp: admin.app.App | null = null;\n\n/**\n * Initialize Firebase Admin SDK\n */\nfunction initializeFirebase(): admin.app.App {\n if (firebaseApp) {\n return firebaseApp;\n }\n\n // Check if already initialized\n if (admin.apps.length > 0) {\n firebaseApp = admin.apps[0]!;\n return firebaseApp;\n }\n\n // Check for emulator mode FIRST (no credentials needed)\n if (env.FIRESTORE_EMULATOR_HOST) {\n // Emulator mode - no credentials needed\n firebaseApp = admin.initializeApp({\n projectId: env.FIREBASE_PROJECT_ID || 'demo-project',\n });\n console.log(`🔧 Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);\n return firebaseApp;\n }\n\n // Production mode - need credentials\n const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;\n \n if (serviceAccountPath) {\n // Use service account file\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const serviceAccount = require(serviceAccountPath);\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {\n // Use inline service account credentials\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert({\n projectId: env.FIREBASE_PROJECT_ID,\n clientEmail: env.FIREBASE_CLIENT_EMAIL,\n privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\\\n/g, '\\n'),\n }),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID) {\n // Use application default credentials (for Cloud Run, etc.)\n firebaseApp = admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else {\n // Emulator mode - use default credentials\n firebaseApp = admin.initializeApp({\n projectId: 'demo-project',\n });\n }\n\n return firebaseApp;\n}\n\n/**\n * Get Firestore instance\n */\nexport function getFirestore(): admin.firestore.Firestore {\n const app = initializeFirebase();\n const db = app.firestore();\n \n // Connect to emulator if configured\n if (env.FIRESTORE_EMULATOR_HOST) {\n db.settings({\n host: env.FIRESTORE_EMULATOR_HOST,\n ssl: false,\n });\n }\n \n return db;\n}\n\n/**\n * Get Firebase Auth instance\n */\nexport function getAuth(): admin.auth.Auth {\n const app = initializeFirebase();\n return app.auth();\n}\n\n// ============ Prisma (Optional - for SQL databases) ============\n\n// Uncomment if using Prisma with SQL database\n/*\nimport { PrismaClient } from '@prisma/client';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __db: PrismaClient | undefined;\n}\n\nconst createPrismaClient = () => {\n return new PrismaClient({\n log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],\n });\n};\n\nexport const db = globalThis.__db ?? createPrismaClient();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.__db = db;\n}\n*/\n\n// Re-export admin for convenience\nexport { admin };\n\n// Export db instance for handler convenience\nexport const db = getFirestore();\n","/**\n * Memory Manager Singleton\n *\n * Provides Firestore-backed memory management for DeepAgent.\n *\n * @packageDocumentation\n */\n\nimport { MemoryManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\n\nlet memoryManager: MemoryManager | null = null;\n\n/**\n * Get or create the MemoryManager singleton\n */\nexport function getMemoryManager(): MemoryManager {\n if (!memoryManager) {\n memoryManager = new MemoryManager({\n db,\n usersCollection: 'agent_memory_users',\n projectsCollection: 'agent_memory_projects',\n generationsCollection: 'agent_memory_generations',\n patternsCollection: 'agent_memory_patterns',\n interruptsCollection: 'agent_memory_interrupts',\n feedbackCollection: 'agent_memory_feedback',\n checkpointsCollection: 'agent_memory_checkpoints',\n toolPreferencesCollection: 'agent_memory_tool_preferences',\n });\n }\n return memoryManager;\n}\n\n/**\n * Reset the MemoryManager (useful for testing)\n */\nexport function resetMemoryManager(): void {\n memoryManager = null;\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SessionManager } from '@almadar/agent';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Session Manager Singleton
|
|
5
|
+
*
|
|
6
|
+
* Provides Firestore-backed session management with full GAP features.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get or create the SessionManager singleton
|
|
13
|
+
*/
|
|
14
|
+
declare function getSessionManager(): SessionManager;
|
|
15
|
+
/**
|
|
16
|
+
* Reset the SessionManager (useful for testing)
|
|
17
|
+
*/
|
|
18
|
+
declare function resetSessionManager(): void;
|
|
19
|
+
|
|
20
|
+
export { getSessionManager, resetSessionManager };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { SessionManager, MemoryManager } from '@almadar/agent';
|
|
2
|
+
import admin from 'firebase-admin';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
|
|
6
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
7
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
8
|
+
}) : x)(function(x) {
|
|
9
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
10
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
11
|
+
});
|
|
12
|
+
dotenv.config();
|
|
13
|
+
var envSchema = z.object({
|
|
14
|
+
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
15
|
+
PORT: z.string().default("3030").transform((val) => parseInt(val, 10)),
|
|
16
|
+
CORS_ORIGIN: z.string().default("http://localhost:5173").transform((val) => val.includes(",") ? val.split(",").map((s) => s.trim()) : val),
|
|
17
|
+
// Database (Prisma/SQL) - optional
|
|
18
|
+
DATABASE_URL: z.string().optional(),
|
|
19
|
+
// Firebase/Firestore configuration
|
|
20
|
+
FIREBASE_PROJECT_ID: z.string().optional(),
|
|
21
|
+
FIREBASE_CLIENT_EMAIL: z.string().optional(),
|
|
22
|
+
FIREBASE_PRIVATE_KEY: z.string().optional(),
|
|
23
|
+
FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),
|
|
24
|
+
FIRESTORE_EMULATOR_HOST: z.string().optional(),
|
|
25
|
+
FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),
|
|
26
|
+
// API configuration
|
|
27
|
+
API_PREFIX: z.string().default("/api"),
|
|
28
|
+
// Mock data configuration
|
|
29
|
+
USE_MOCK_DATA: z.string().default("true").transform((v) => v === "true"),
|
|
30
|
+
MOCK_SEED: z.string().optional().transform((v) => v ? parseInt(v, 10) : void 0)
|
|
31
|
+
});
|
|
32
|
+
var parsed = envSchema.safeParse(process.env);
|
|
33
|
+
if (!parsed.success) {
|
|
34
|
+
console.error("\u274C Invalid environment variables:", parsed.error.flatten().fieldErrors);
|
|
35
|
+
throw new Error("Invalid environment variables");
|
|
36
|
+
}
|
|
37
|
+
var env = parsed.data;
|
|
38
|
+
|
|
39
|
+
// src/lib/db.ts
|
|
40
|
+
var firebaseApp = null;
|
|
41
|
+
function initializeFirebase() {
|
|
42
|
+
if (firebaseApp) {
|
|
43
|
+
return firebaseApp;
|
|
44
|
+
}
|
|
45
|
+
if (admin.apps.length > 0) {
|
|
46
|
+
firebaseApp = admin.apps[0];
|
|
47
|
+
return firebaseApp;
|
|
48
|
+
}
|
|
49
|
+
if (env.FIRESTORE_EMULATOR_HOST) {
|
|
50
|
+
firebaseApp = admin.initializeApp({
|
|
51
|
+
projectId: env.FIREBASE_PROJECT_ID || "demo-project"
|
|
52
|
+
});
|
|
53
|
+
console.log(`\u{1F527} Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);
|
|
54
|
+
return firebaseApp;
|
|
55
|
+
}
|
|
56
|
+
const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;
|
|
57
|
+
if (serviceAccountPath) {
|
|
58
|
+
const serviceAccount = __require(serviceAccountPath);
|
|
59
|
+
firebaseApp = admin.initializeApp({
|
|
60
|
+
credential: admin.credential.cert(serviceAccount),
|
|
61
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
62
|
+
});
|
|
63
|
+
} else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {
|
|
64
|
+
firebaseApp = admin.initializeApp({
|
|
65
|
+
credential: admin.credential.cert({
|
|
66
|
+
projectId: env.FIREBASE_PROJECT_ID,
|
|
67
|
+
clientEmail: env.FIREBASE_CLIENT_EMAIL,
|
|
68
|
+
privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, "\n")
|
|
69
|
+
}),
|
|
70
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
71
|
+
});
|
|
72
|
+
} else if (env.FIREBASE_PROJECT_ID) {
|
|
73
|
+
firebaseApp = admin.initializeApp({
|
|
74
|
+
credential: admin.credential.applicationDefault(),
|
|
75
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
firebaseApp = admin.initializeApp({
|
|
79
|
+
projectId: "demo-project"
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return firebaseApp;
|
|
83
|
+
}
|
|
84
|
+
function getFirestore() {
|
|
85
|
+
const app = initializeFirebase();
|
|
86
|
+
const db2 = app.firestore();
|
|
87
|
+
if (env.FIRESTORE_EMULATOR_HOST) {
|
|
88
|
+
db2.settings({
|
|
89
|
+
host: env.FIRESTORE_EMULATOR_HOST,
|
|
90
|
+
ssl: false
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return db2;
|
|
94
|
+
}
|
|
95
|
+
var db = getFirestore();
|
|
96
|
+
var memoryManager = null;
|
|
97
|
+
function getMemoryManager() {
|
|
98
|
+
if (!memoryManager) {
|
|
99
|
+
memoryManager = new MemoryManager({
|
|
100
|
+
db,
|
|
101
|
+
usersCollection: "agent_memory_users",
|
|
102
|
+
projectsCollection: "agent_memory_projects",
|
|
103
|
+
generationsCollection: "agent_memory_generations",
|
|
104
|
+
patternsCollection: "agent_memory_patterns",
|
|
105
|
+
interruptsCollection: "agent_memory_interrupts",
|
|
106
|
+
feedbackCollection: "agent_memory_feedback",
|
|
107
|
+
checkpointsCollection: "agent_memory_checkpoints",
|
|
108
|
+
toolPreferencesCollection: "agent_memory_tool_preferences"
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return memoryManager;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// src/deepagent/session.ts
|
|
115
|
+
var sessionManager = null;
|
|
116
|
+
function createFirestoreAdapter(firestore) {
|
|
117
|
+
return firestore;
|
|
118
|
+
}
|
|
119
|
+
function getSessionManager() {
|
|
120
|
+
if (!sessionManager) {
|
|
121
|
+
sessionManager = new SessionManager({
|
|
122
|
+
mode: "firestore",
|
|
123
|
+
firestoreDb: createFirestoreAdapter(db),
|
|
124
|
+
memoryManager: getMemoryManager(),
|
|
125
|
+
// Enable GAP-002D
|
|
126
|
+
compactionConfig: {
|
|
127
|
+
maxTokens: 15e4,
|
|
128
|
+
keepRecentMessages: 10,
|
|
129
|
+
strategy: "last"
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return sessionManager;
|
|
134
|
+
}
|
|
135
|
+
function resetSessionManager() {
|
|
136
|
+
sessionManager = null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export { getSessionManager, resetSessionManager };
|
|
140
|
+
//# sourceMappingURL=session.js.map
|
|
141
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/env.ts","../../src/lib/db.ts","../../src/deepagent/memory.ts","../../src/deepagent/session.ts"],"names":["db"],"mappings":"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","file":"session.js","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\n\n// Load environment variables\ndotenv.config();\n\nconst envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z\n .string()\n .default('3030')\n .transform((val) => parseInt(val, 10)),\n CORS_ORIGIN: z\n .string()\n .default('http://localhost:5173')\n .transform((val) => (val.includes(',') ? val.split(',').map((s) => s.trim()) : val)),\n \n // Database (Prisma/SQL) - optional\n DATABASE_URL: z.string().optional(),\n \n // Firebase/Firestore configuration\n FIREBASE_PROJECT_ID: z.string().optional(),\n FIREBASE_CLIENT_EMAIL: z.string().optional(),\n FIREBASE_PRIVATE_KEY: z.string().optional(),\n FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),\n FIRESTORE_EMULATOR_HOST: z.string().optional(),\n FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),\n \n // API configuration\n API_PREFIX: z.string().default('/api'),\n\n // Mock data configuration\n USE_MOCK_DATA: z.string().default('true').transform((v) => v === 'true'),\n MOCK_SEED: z\n .string()\n .optional()\n .transform((v) => (v ? parseInt(v, 10) : undefined)),\n});\n\nconst parsed = envSchema.safeParse(process.env);\n\nif (!parsed.success) {\n console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);\n throw new Error('Invalid environment variables');\n}\n\nexport const env = parsed.data;\n","/**\n * Database Configuration\n * \n * Supports both Prisma (SQL) and Firebase Admin (Firestore)\n * Generated apps can use either depending on the database option\n */\n\nimport admin from 'firebase-admin';\nimport { env } from './env.js';\n\n// ============ Firebase Admin / Firestore ============\n\nlet firebaseApp: admin.app.App | null = null;\n\n/**\n * Initialize Firebase Admin SDK\n */\nfunction initializeFirebase(): admin.app.App {\n if (firebaseApp) {\n return firebaseApp;\n }\n\n // Check if already initialized\n if (admin.apps.length > 0) {\n firebaseApp = admin.apps[0]!;\n return firebaseApp;\n }\n\n // Check for emulator mode FIRST (no credentials needed)\n if (env.FIRESTORE_EMULATOR_HOST) {\n // Emulator mode - no credentials needed\n firebaseApp = admin.initializeApp({\n projectId: env.FIREBASE_PROJECT_ID || 'demo-project',\n });\n console.log(`🔧 Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);\n return firebaseApp;\n }\n\n // Production mode - need credentials\n const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;\n \n if (serviceAccountPath) {\n // Use service account file\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const serviceAccount = require(serviceAccountPath);\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {\n // Use inline service account credentials\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert({\n projectId: env.FIREBASE_PROJECT_ID,\n clientEmail: env.FIREBASE_CLIENT_EMAIL,\n privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\\\n/g, '\\n'),\n }),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID) {\n // Use application default credentials (for Cloud Run, etc.)\n firebaseApp = admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else {\n // Emulator mode - use default credentials\n firebaseApp = admin.initializeApp({\n projectId: 'demo-project',\n });\n }\n\n return firebaseApp;\n}\n\n/**\n * Get Firestore instance\n */\nexport function getFirestore(): admin.firestore.Firestore {\n const app = initializeFirebase();\n const db = app.firestore();\n \n // Connect to emulator if configured\n if (env.FIRESTORE_EMULATOR_HOST) {\n db.settings({\n host: env.FIRESTORE_EMULATOR_HOST,\n ssl: false,\n });\n }\n \n return db;\n}\n\n/**\n * Get Firebase Auth instance\n */\nexport function getAuth(): admin.auth.Auth {\n const app = initializeFirebase();\n return app.auth();\n}\n\n// ============ Prisma (Optional - for SQL databases) ============\n\n// Uncomment if using Prisma with SQL database\n/*\nimport { PrismaClient } from '@prisma/client';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __db: PrismaClient | undefined;\n}\n\nconst createPrismaClient = () => {\n return new PrismaClient({\n log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],\n });\n};\n\nexport const db = globalThis.__db ?? createPrismaClient();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.__db = db;\n}\n*/\n\n// Re-export admin for convenience\nexport { admin };\n\n// Export db instance for handler convenience\nexport const db = getFirestore();\n","/**\n * Memory Manager Singleton\n *\n * Provides Firestore-backed memory management for DeepAgent.\n *\n * @packageDocumentation\n */\n\nimport { MemoryManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\n\nlet memoryManager: MemoryManager | null = null;\n\n/**\n * Get or create the MemoryManager singleton\n */\nexport function getMemoryManager(): MemoryManager {\n if (!memoryManager) {\n memoryManager = new MemoryManager({\n db,\n usersCollection: 'agent_memory_users',\n projectsCollection: 'agent_memory_projects',\n generationsCollection: 'agent_memory_generations',\n patternsCollection: 'agent_memory_patterns',\n interruptsCollection: 'agent_memory_interrupts',\n feedbackCollection: 'agent_memory_feedback',\n checkpointsCollection: 'agent_memory_checkpoints',\n toolPreferencesCollection: 'agent_memory_tool_preferences',\n });\n }\n return memoryManager;\n}\n\n/**\n * Reset the MemoryManager (useful for testing)\n */\nexport function resetMemoryManager(): void {\n memoryManager = null;\n}\n","/**\n * Session Manager Singleton\n *\n * Provides Firestore-backed session management with full GAP features.\n *\n * @packageDocumentation\n */\n\nimport { SessionManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\nimport { getMemoryManager } from './memory.js';\nimport type { FirestoreDb } from '@almadar/agent';\n\nlet sessionManager: SessionManager | null = null;\n\n/**\n * Adapter to make Firebase Firestore compatible with @almadar/agent FirestoreDb interface\n */\nfunction createFirestoreAdapter(firestore: typeof db): FirestoreDb {\n return firestore as unknown as FirestoreDb;\n}\n\n/**\n * Get or create the SessionManager singleton\n */\nexport function getSessionManager(): SessionManager {\n if (!sessionManager) {\n sessionManager = new SessionManager({\n mode: 'firestore',\n firestoreDb: createFirestoreAdapter(db),\n memoryManager: getMemoryManager(), // Enable GAP-002D\n compactionConfig: {\n maxTokens: 150000,\n keepRecentMessages: 10,\n strategy: 'last',\n },\n });\n }\n return sessionManager;\n}\n\n/**\n * Reset the SessionManager (useful for testing)\n */\nexport function resetSessionManager(): void {\n sessionManager = null;\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SkillAgentOptions, SkillAgentResult } from '@almadar/agent';
|
|
2
|
+
export { getMemoryManager } from './memory.js';
|
|
3
|
+
export { getSessionManager } from './session.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Skill Agent Factory
|
|
7
|
+
*
|
|
8
|
+
* Creates DeepAgent instances with full GAP feature integration.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
interface ServerSkillAgentOptions extends SkillAgentOptions {
|
|
14
|
+
/** User ID from Firebase Auth */
|
|
15
|
+
userId: string;
|
|
16
|
+
/** App/Project ID for context */
|
|
17
|
+
appId?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a skill agent with full server-side GAP integration
|
|
21
|
+
*/
|
|
22
|
+
declare function createServerSkillAgent(options: ServerSkillAgentOptions): Promise<SkillAgentResult>;
|
|
23
|
+
|
|
24
|
+
export { createServerSkillAgent };
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { MemoryManager, SessionManager, getObservabilityCollector, getMultiUserManager, createSkillAgent } from '@almadar/agent';
|
|
2
|
+
import admin from 'firebase-admin';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
|
|
6
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
7
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
8
|
+
}) : x)(function(x) {
|
|
9
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
10
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
11
|
+
});
|
|
12
|
+
dotenv.config();
|
|
13
|
+
var envSchema = z.object({
|
|
14
|
+
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
15
|
+
PORT: z.string().default("3030").transform((val) => parseInt(val, 10)),
|
|
16
|
+
CORS_ORIGIN: z.string().default("http://localhost:5173").transform((val) => val.includes(",") ? val.split(",").map((s) => s.trim()) : val),
|
|
17
|
+
// Database (Prisma/SQL) - optional
|
|
18
|
+
DATABASE_URL: z.string().optional(),
|
|
19
|
+
// Firebase/Firestore configuration
|
|
20
|
+
FIREBASE_PROJECT_ID: z.string().optional(),
|
|
21
|
+
FIREBASE_CLIENT_EMAIL: z.string().optional(),
|
|
22
|
+
FIREBASE_PRIVATE_KEY: z.string().optional(),
|
|
23
|
+
FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),
|
|
24
|
+
FIRESTORE_EMULATOR_HOST: z.string().optional(),
|
|
25
|
+
FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),
|
|
26
|
+
// API configuration
|
|
27
|
+
API_PREFIX: z.string().default("/api"),
|
|
28
|
+
// Mock data configuration
|
|
29
|
+
USE_MOCK_DATA: z.string().default("true").transform((v) => v === "true"),
|
|
30
|
+
MOCK_SEED: z.string().optional().transform((v) => v ? parseInt(v, 10) : void 0)
|
|
31
|
+
});
|
|
32
|
+
var parsed = envSchema.safeParse(process.env);
|
|
33
|
+
if (!parsed.success) {
|
|
34
|
+
console.error("\u274C Invalid environment variables:", parsed.error.flatten().fieldErrors);
|
|
35
|
+
throw new Error("Invalid environment variables");
|
|
36
|
+
}
|
|
37
|
+
var env = parsed.data;
|
|
38
|
+
|
|
39
|
+
// src/lib/db.ts
|
|
40
|
+
var firebaseApp = null;
|
|
41
|
+
function initializeFirebase() {
|
|
42
|
+
if (firebaseApp) {
|
|
43
|
+
return firebaseApp;
|
|
44
|
+
}
|
|
45
|
+
if (admin.apps.length > 0) {
|
|
46
|
+
firebaseApp = admin.apps[0];
|
|
47
|
+
return firebaseApp;
|
|
48
|
+
}
|
|
49
|
+
if (env.FIRESTORE_EMULATOR_HOST) {
|
|
50
|
+
firebaseApp = admin.initializeApp({
|
|
51
|
+
projectId: env.FIREBASE_PROJECT_ID || "demo-project"
|
|
52
|
+
});
|
|
53
|
+
console.log(`\u{1F527} Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);
|
|
54
|
+
return firebaseApp;
|
|
55
|
+
}
|
|
56
|
+
const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;
|
|
57
|
+
if (serviceAccountPath) {
|
|
58
|
+
const serviceAccount = __require(serviceAccountPath);
|
|
59
|
+
firebaseApp = admin.initializeApp({
|
|
60
|
+
credential: admin.credential.cert(serviceAccount),
|
|
61
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
62
|
+
});
|
|
63
|
+
} else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {
|
|
64
|
+
firebaseApp = admin.initializeApp({
|
|
65
|
+
credential: admin.credential.cert({
|
|
66
|
+
projectId: env.FIREBASE_PROJECT_ID,
|
|
67
|
+
clientEmail: env.FIREBASE_CLIENT_EMAIL,
|
|
68
|
+
privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, "\n")
|
|
69
|
+
}),
|
|
70
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
71
|
+
});
|
|
72
|
+
} else if (env.FIREBASE_PROJECT_ID) {
|
|
73
|
+
firebaseApp = admin.initializeApp({
|
|
74
|
+
credential: admin.credential.applicationDefault(),
|
|
75
|
+
projectId: env.FIREBASE_PROJECT_ID
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
firebaseApp = admin.initializeApp({
|
|
79
|
+
projectId: "demo-project"
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return firebaseApp;
|
|
83
|
+
}
|
|
84
|
+
function getFirestore() {
|
|
85
|
+
const app = initializeFirebase();
|
|
86
|
+
const db2 = app.firestore();
|
|
87
|
+
if (env.FIRESTORE_EMULATOR_HOST) {
|
|
88
|
+
db2.settings({
|
|
89
|
+
host: env.FIRESTORE_EMULATOR_HOST,
|
|
90
|
+
ssl: false
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return db2;
|
|
94
|
+
}
|
|
95
|
+
var db = getFirestore();
|
|
96
|
+
|
|
97
|
+
// src/deepagent/memory.ts
|
|
98
|
+
var memoryManager = null;
|
|
99
|
+
function getMemoryManager() {
|
|
100
|
+
if (!memoryManager) {
|
|
101
|
+
memoryManager = new MemoryManager({
|
|
102
|
+
db,
|
|
103
|
+
usersCollection: "agent_memory_users",
|
|
104
|
+
projectsCollection: "agent_memory_projects",
|
|
105
|
+
generationsCollection: "agent_memory_generations",
|
|
106
|
+
patternsCollection: "agent_memory_patterns",
|
|
107
|
+
interruptsCollection: "agent_memory_interrupts",
|
|
108
|
+
feedbackCollection: "agent_memory_feedback",
|
|
109
|
+
checkpointsCollection: "agent_memory_checkpoints",
|
|
110
|
+
toolPreferencesCollection: "agent_memory_tool_preferences"
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return memoryManager;
|
|
114
|
+
}
|
|
115
|
+
var sessionManager = null;
|
|
116
|
+
function createFirestoreAdapter(firestore) {
|
|
117
|
+
return firestore;
|
|
118
|
+
}
|
|
119
|
+
function getSessionManager() {
|
|
120
|
+
if (!sessionManager) {
|
|
121
|
+
sessionManager = new SessionManager({
|
|
122
|
+
mode: "firestore",
|
|
123
|
+
firestoreDb: createFirestoreAdapter(db),
|
|
124
|
+
memoryManager: getMemoryManager(),
|
|
125
|
+
// Enable GAP-002D
|
|
126
|
+
compactionConfig: {
|
|
127
|
+
maxTokens: 15e4,
|
|
128
|
+
keepRecentMessages: 10,
|
|
129
|
+
strategy: "last"
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return sessionManager;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// src/deepagent/skill-agent.ts
|
|
137
|
+
async function createServerSkillAgent(options) {
|
|
138
|
+
const memoryManager2 = getMemoryManager();
|
|
139
|
+
getSessionManager();
|
|
140
|
+
const observability = getObservabilityCollector();
|
|
141
|
+
const multiUser = getMultiUserManager();
|
|
142
|
+
if (options.threadId) {
|
|
143
|
+
const access = multiUser.canAccessSession(options.threadId, {
|
|
144
|
+
userId: options.userId,
|
|
145
|
+
roles: ["user"]
|
|
146
|
+
});
|
|
147
|
+
if (!access.allowed) {
|
|
148
|
+
throw new Error(`Access denied: ${access.reason}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
observability.startSession(options.threadId ?? "new", options.userId);
|
|
152
|
+
try {
|
|
153
|
+
const result = await createSkillAgent({
|
|
154
|
+
...options,
|
|
155
|
+
memoryManager: memoryManager2,
|
|
156
|
+
// GAP-001: Enable memory
|
|
157
|
+
userId: options.userId,
|
|
158
|
+
// GAP-002D: Session → Memory sync
|
|
159
|
+
appId: options.appId
|
|
160
|
+
});
|
|
161
|
+
if (result.threadId) {
|
|
162
|
+
multiUser.assignSessionOwnership(result.threadId, options.userId);
|
|
163
|
+
}
|
|
164
|
+
observability.recordEvent({
|
|
165
|
+
type: "session_start",
|
|
166
|
+
sessionId: result.threadId,
|
|
167
|
+
userId: options.userId,
|
|
168
|
+
payload: { skill: options.skill }
|
|
169
|
+
});
|
|
170
|
+
return result;
|
|
171
|
+
} catch (error) {
|
|
172
|
+
observability.recordError(options.threadId ?? "new", error);
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { createServerSkillAgent, getMemoryManager, getSessionManager };
|
|
178
|
+
//# sourceMappingURL=skill-agent.js.map
|
|
179
|
+
//# sourceMappingURL=skill-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/env.ts","../../src/lib/db.ts","../../src/deepagent/memory.ts","../../src/deepagent/session.ts","../../src/deepagent/skill-agent.ts"],"names":["db","memoryManager"],"mappings":"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","file":"skill-agent.js","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\n\n// Load environment variables\ndotenv.config();\n\nconst envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z\n .string()\n .default('3030')\n .transform((val) => parseInt(val, 10)),\n CORS_ORIGIN: z\n .string()\n .default('http://localhost:5173')\n .transform((val) => (val.includes(',') ? val.split(',').map((s) => s.trim()) : val)),\n \n // Database (Prisma/SQL) - optional\n DATABASE_URL: z.string().optional(),\n \n // Firebase/Firestore configuration\n FIREBASE_PROJECT_ID: z.string().optional(),\n FIREBASE_CLIENT_EMAIL: z.string().optional(),\n FIREBASE_PRIVATE_KEY: z.string().optional(),\n FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),\n FIRESTORE_EMULATOR_HOST: z.string().optional(),\n FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),\n \n // API configuration\n API_PREFIX: z.string().default('/api'),\n\n // Mock data configuration\n USE_MOCK_DATA: z.string().default('true').transform((v) => v === 'true'),\n MOCK_SEED: z\n .string()\n .optional()\n .transform((v) => (v ? parseInt(v, 10) : undefined)),\n});\n\nconst parsed = envSchema.safeParse(process.env);\n\nif (!parsed.success) {\n console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);\n throw new Error('Invalid environment variables');\n}\n\nexport const env = parsed.data;\n","/**\n * Database Configuration\n * \n * Supports both Prisma (SQL) and Firebase Admin (Firestore)\n * Generated apps can use either depending on the database option\n */\n\nimport admin from 'firebase-admin';\nimport { env } from './env.js';\n\n// ============ Firebase Admin / Firestore ============\n\nlet firebaseApp: admin.app.App | null = null;\n\n/**\n * Initialize Firebase Admin SDK\n */\nfunction initializeFirebase(): admin.app.App {\n if (firebaseApp) {\n return firebaseApp;\n }\n\n // Check if already initialized\n if (admin.apps.length > 0) {\n firebaseApp = admin.apps[0]!;\n return firebaseApp;\n }\n\n // Check for emulator mode FIRST (no credentials needed)\n if (env.FIRESTORE_EMULATOR_HOST) {\n // Emulator mode - no credentials needed\n firebaseApp = admin.initializeApp({\n projectId: env.FIREBASE_PROJECT_ID || 'demo-project',\n });\n console.log(`🔧 Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);\n return firebaseApp;\n }\n\n // Production mode - need credentials\n const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;\n \n if (serviceAccountPath) {\n // Use service account file\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const serviceAccount = require(serviceAccountPath);\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {\n // Use inline service account credentials\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert({\n projectId: env.FIREBASE_PROJECT_ID,\n clientEmail: env.FIREBASE_CLIENT_EMAIL,\n privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\\\n/g, '\\n'),\n }),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID) {\n // Use application default credentials (for Cloud Run, etc.)\n firebaseApp = admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else {\n // Emulator mode - use default credentials\n firebaseApp = admin.initializeApp({\n projectId: 'demo-project',\n });\n }\n\n return firebaseApp;\n}\n\n/**\n * Get Firestore instance\n */\nexport function getFirestore(): admin.firestore.Firestore {\n const app = initializeFirebase();\n const db = app.firestore();\n \n // Connect to emulator if configured\n if (env.FIRESTORE_EMULATOR_HOST) {\n db.settings({\n host: env.FIRESTORE_EMULATOR_HOST,\n ssl: false,\n });\n }\n \n return db;\n}\n\n/**\n * Get Firebase Auth instance\n */\nexport function getAuth(): admin.auth.Auth {\n const app = initializeFirebase();\n return app.auth();\n}\n\n// ============ Prisma (Optional - for SQL databases) ============\n\n// Uncomment if using Prisma with SQL database\n/*\nimport { PrismaClient } from '@prisma/client';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __db: PrismaClient | undefined;\n}\n\nconst createPrismaClient = () => {\n return new PrismaClient({\n log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],\n });\n};\n\nexport const db = globalThis.__db ?? createPrismaClient();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.__db = db;\n}\n*/\n\n// Re-export admin for convenience\nexport { admin };\n\n// Export db instance for handler convenience\nexport const db = getFirestore();\n","/**\n * Memory Manager Singleton\n *\n * Provides Firestore-backed memory management for DeepAgent.\n *\n * @packageDocumentation\n */\n\nimport { MemoryManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\n\nlet memoryManager: MemoryManager | null = null;\n\n/**\n * Get or create the MemoryManager singleton\n */\nexport function getMemoryManager(): MemoryManager {\n if (!memoryManager) {\n memoryManager = new MemoryManager({\n db,\n usersCollection: 'agent_memory_users',\n projectsCollection: 'agent_memory_projects',\n generationsCollection: 'agent_memory_generations',\n patternsCollection: 'agent_memory_patterns',\n interruptsCollection: 'agent_memory_interrupts',\n feedbackCollection: 'agent_memory_feedback',\n checkpointsCollection: 'agent_memory_checkpoints',\n toolPreferencesCollection: 'agent_memory_tool_preferences',\n });\n }\n return memoryManager;\n}\n\n/**\n * Reset the MemoryManager (useful for testing)\n */\nexport function resetMemoryManager(): void {\n memoryManager = null;\n}\n","/**\n * Session Manager Singleton\n *\n * Provides Firestore-backed session management with full GAP features.\n *\n * @packageDocumentation\n */\n\nimport { SessionManager } from '@almadar/agent';\nimport { db } from '../lib/db.js';\nimport { getMemoryManager } from './memory.js';\nimport type { FirestoreDb } from '@almadar/agent';\n\nlet sessionManager: SessionManager | null = null;\n\n/**\n * Adapter to make Firebase Firestore compatible with @almadar/agent FirestoreDb interface\n */\nfunction createFirestoreAdapter(firestore: typeof db): FirestoreDb {\n return firestore as unknown as FirestoreDb;\n}\n\n/**\n * Get or create the SessionManager singleton\n */\nexport function getSessionManager(): SessionManager {\n if (!sessionManager) {\n sessionManager = new SessionManager({\n mode: 'firestore',\n firestoreDb: createFirestoreAdapter(db),\n memoryManager: getMemoryManager(), // Enable GAP-002D\n compactionConfig: {\n maxTokens: 150000,\n keepRecentMessages: 10,\n strategy: 'last',\n },\n });\n }\n return sessionManager;\n}\n\n/**\n * Reset the SessionManager (useful for testing)\n */\nexport function resetSessionManager(): void {\n sessionManager = null;\n}\n","/**\n * Skill Agent Factory\n *\n * Creates DeepAgent instances with full GAP feature integration.\n *\n * @packageDocumentation\n */\n\nimport {\n createSkillAgent,\n getObservabilityCollector,\n getMultiUserManager,\n type SkillAgentOptions,\n type SkillAgentResult,\n} from '@almadar/agent';\nimport { getMemoryManager } from './memory.js';\nimport { getSessionManager } from './session.js';\n\ninterface ServerSkillAgentOptions extends SkillAgentOptions {\n /** User ID from Firebase Auth */\n userId: string;\n /** App/Project ID for context */\n appId?: string;\n}\n\n/**\n * Create a skill agent with full server-side GAP integration\n */\nexport async function createServerSkillAgent(\n options: ServerSkillAgentOptions,\n): Promise<SkillAgentResult> {\n const memoryManager = getMemoryManager();\n const sessionManager = getSessionManager();\n const observability = getObservabilityCollector();\n const multiUser = getMultiUserManager();\n\n // Check access if resuming existing session\n if (options.threadId) {\n const access = multiUser.canAccessSession(options.threadId, {\n userId: options.userId,\n roles: ['user'],\n });\n if (!access.allowed) {\n throw new Error(`Access denied: ${access.reason}`);\n }\n }\n\n // Start observability\n observability.startSession(options.threadId ?? 'new', options.userId);\n\n try {\n const result = await createSkillAgent({\n ...options,\n memoryManager, // GAP-001: Enable memory\n userId: options.userId, // GAP-002D: Session → Memory sync\n appId: options.appId,\n });\n\n // Assign ownership for new sessions\n if (result.threadId) {\n multiUser.assignSessionOwnership(result.threadId, options.userId);\n }\n\n // Record successful creation\n observability.recordEvent({\n type: 'session_start',\n sessionId: result.threadId,\n userId: options.userId,\n payload: { skill: options.skill },\n });\n\n return result;\n } catch (error) {\n observability.recordError(options.threadId ?? 'new', error as Error);\n throw error;\n }\n}\n\n// Re-export for convenience\nexport { getMemoryManager, getSessionManager };\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,11 +4,19 @@ export { AppError, ConflictError, ForbiddenError, NotFoundError, UnauthorizedErr
|
|
|
4
4
|
export { D as DataService, E as EntitySchema, a as EntitySeedConfig, F as FieldSchema, M as MockDataService, P as PaginatedResult, b as PaginationOptions, d as dataService, m as mockDataService, s as seedMockData } from './index-D8fohXsO.js';
|
|
5
5
|
export { ChangeSetStore, SchemaProtectionService, SchemaStore, SnapshotStore, ValidationStore, fromFirestoreFormat, toFirestoreFormat } from './stores/index.js';
|
|
6
6
|
export { FirestoreWhereFilterOp, PaginationParams, ParsedFilter, applyFiltersToQuery, extractPaginationParams, parseQueryFilters } from './utils/index.js';
|
|
7
|
+
export { getMemoryManager as getAgentMemoryManager, getMemoryManager, resetMemoryManager } from './deepagent/memory.js';
|
|
8
|
+
export { getSessionManager as getAgentSessionManager, getSessionManager, resetSessionManager } from './deepagent/session.js';
|
|
9
|
+
export { createServerSkillAgent } from './deepagent/skill-agent.js';
|
|
10
|
+
export { multiUserMiddleware, verifyFirebaseAuth } from './middleware/multi-user.js';
|
|
11
|
+
export { setupStateSyncWebSocket } from './websocket/state-sync.js';
|
|
12
|
+
export { default as observabilityRouter } from './routes/observability.js';
|
|
7
13
|
export { default as admin } from 'firebase-admin';
|
|
8
14
|
import 'ws';
|
|
9
15
|
import 'http';
|
|
10
16
|
import 'zod';
|
|
11
17
|
import '@almadar/core';
|
|
18
|
+
import '@almadar/agent';
|
|
19
|
+
import 'express-serve-static-core';
|
|
12
20
|
|
|
13
21
|
/**
|
|
14
22
|
* Debug Events Router
|