@xynehq/jaf 0.1.2
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/LICENSE +21 -0
- package/README.md +596 -0
- package/dist/a2a/agent-card.d.ts +28 -0
- package/dist/a2a/agent-card.d.ts.map +1 -0
- package/dist/a2a/agent-card.js +250 -0
- package/dist/a2a/agent-card.js.map +1 -0
- package/dist/a2a/agent.d.ts +38 -0
- package/dist/a2a/agent.d.ts.map +1 -0
- package/dist/a2a/agent.js +223 -0
- package/dist/a2a/agent.js.map +1 -0
- package/dist/a2a/client.d.ts +35 -0
- package/dist/a2a/client.d.ts.map +1 -0
- package/dist/a2a/client.js +337 -0
- package/dist/a2a/client.js.map +1 -0
- package/dist/a2a/examples/client-example.d.ts +104 -0
- package/dist/a2a/examples/client-example.d.ts.map +1 -0
- package/dist/a2a/examples/client-example.js +232 -0
- package/dist/a2a/examples/client-example.js.map +1 -0
- package/dist/a2a/examples/server-example.d.ts +9 -0
- package/dist/a2a/examples/server-example.d.ts.map +1 -0
- package/dist/a2a/examples/server-example.js +209 -0
- package/dist/a2a/examples/server-example.js.map +1 -0
- package/dist/a2a/examples/weather-agent.d.ts +8 -0
- package/dist/a2a/examples/weather-agent.d.ts.map +1 -0
- package/dist/a2a/examples/weather-agent.js +232 -0
- package/dist/a2a/examples/weather-agent.js.map +1 -0
- package/dist/a2a/executor.d.ts +43 -0
- package/dist/a2a/executor.d.ts.map +1 -0
- package/dist/a2a/executor.js +507 -0
- package/dist/a2a/executor.js.map +1 -0
- package/dist/a2a/index.d.ts +378 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +72 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/a2a/memory/cleanup.d.ts +58 -0
- package/dist/a2a/memory/cleanup.d.ts.map +1 -0
- package/dist/a2a/memory/cleanup.js +281 -0
- package/dist/a2a/memory/cleanup.js.map +1 -0
- package/dist/a2a/memory/factory.d.ts +38 -0
- package/dist/a2a/memory/factory.d.ts.map +1 -0
- package/dist/a2a/memory/factory.js +369 -0
- package/dist/a2a/memory/factory.js.map +1 -0
- package/dist/a2a/memory/index.d.ts +13 -0
- package/dist/a2a/memory/index.d.ts.map +1 -0
- package/dist/a2a/memory/index.js +16 -0
- package/dist/a2a/memory/index.js.map +1 -0
- package/dist/a2a/memory/providers/in-memory.d.ts +10 -0
- package/dist/a2a/memory/providers/in-memory.d.ts.map +1 -0
- package/dist/a2a/memory/providers/in-memory.js +539 -0
- package/dist/a2a/memory/providers/in-memory.js.map +1 -0
- package/dist/a2a/memory/providers/postgres.d.ts +10 -0
- package/dist/a2a/memory/providers/postgres.d.ts.map +1 -0
- package/dist/a2a/memory/providers/postgres.js +404 -0
- package/dist/a2a/memory/providers/postgres.js.map +1 -0
- package/dist/a2a/memory/providers/redis.d.ts +10 -0
- package/dist/a2a/memory/providers/redis.d.ts.map +1 -0
- package/dist/a2a/memory/providers/redis.js +435 -0
- package/dist/a2a/memory/providers/redis.js.map +1 -0
- package/dist/a2a/memory/serialization.d.ts +53 -0
- package/dist/a2a/memory/serialization.d.ts.map +1 -0
- package/dist/a2a/memory/serialization.js +233 -0
- package/dist/a2a/memory/serialization.js.map +1 -0
- package/dist/a2a/memory/types.d.ts +395 -0
- package/dist/a2a/memory/types.d.ts.map +1 -0
- package/dist/a2a/memory/types.js +85 -0
- package/dist/a2a/memory/types.js.map +1 -0
- package/dist/a2a/protocol.d.ts +38 -0
- package/dist/a2a/protocol.d.ts.map +1 -0
- package/dist/a2a/protocol.js +211 -0
- package/dist/a2a/protocol.js.map +1 -0
- package/dist/a2a/server.d.ts +343 -0
- package/dist/a2a/server.d.ts.map +1 -0
- package/dist/a2a/server.js +362 -0
- package/dist/a2a/server.js.map +1 -0
- package/dist/a2a/types.d.ts +730 -0
- package/dist/a2a/types.d.ts.map +1 -0
- package/dist/a2a/types.js +73 -0
- package/dist/a2a/types.js.map +1 -0
- package/dist/adk/agents/index.d.ts +48 -0
- package/dist/adk/agents/index.d.ts.map +1 -0
- package/dist/adk/agents/index.js +277 -0
- package/dist/adk/agents/index.js.map +1 -0
- package/dist/adk/artifacts/index.d.ts +62 -0
- package/dist/adk/artifacts/index.d.ts.map +1 -0
- package/dist/adk/artifacts/index.js +394 -0
- package/dist/adk/artifacts/index.js.map +1 -0
- package/dist/adk/config/llm-config.d.ts +75 -0
- package/dist/adk/config/llm-config.d.ts.map +1 -0
- package/dist/adk/config/llm-config.js +422 -0
- package/dist/adk/config/llm-config.js.map +1 -0
- package/dist/adk/content/index.d.ts +58 -0
- package/dist/adk/content/index.d.ts.map +1 -0
- package/dist/adk/content/index.js +220 -0
- package/dist/adk/content/index.js.map +1 -0
- package/dist/adk/examples/advanced-features.d.ts +22 -0
- package/dist/adk/examples/advanced-features.d.ts.map +1 -0
- package/dist/adk/examples/advanced-features.js +380 -0
- package/dist/adk/examples/advanced-features.js.map +1 -0
- package/dist/adk/examples/basic-agent.d.ts +28 -0
- package/dist/adk/examples/basic-agent.d.ts.map +1 -0
- package/dist/adk/examples/basic-agent.js +207 -0
- package/dist/adk/examples/basic-agent.js.map +1 -0
- package/dist/adk/examples/multi-agent.d.ts +24 -0
- package/dist/adk/examples/multi-agent.d.ts.map +1 -0
- package/dist/adk/examples/multi-agent.js +321 -0
- package/dist/adk/examples/multi-agent.js.map +1 -0
- package/dist/adk/examples/streaming-example.d.ts +9 -0
- package/dist/adk/examples/streaming-example.d.ts.map +1 -0
- package/dist/adk/examples/streaming-example.js +193 -0
- package/dist/adk/examples/streaming-example.js.map +1 -0
- package/dist/adk/index.d.ts +65 -0
- package/dist/adk/index.d.ts.map +1 -0
- package/dist/adk/index.js +251 -0
- package/dist/adk/index.js.map +1 -0
- package/dist/adk/models.d.ts +338 -0
- package/dist/adk/models.d.ts.map +1 -0
- package/dist/adk/models.js +466 -0
- package/dist/adk/models.js.map +1 -0
- package/dist/adk/providers/error-handler.d.ts +100 -0
- package/dist/adk/providers/error-handler.d.ts.map +1 -0
- package/dist/adk/providers/error-handler.js +289 -0
- package/dist/adk/providers/error-handler.js.map +1 -0
- package/dist/adk/providers/llm-service.d.ts +41 -0
- package/dist/adk/providers/llm-service.d.ts.map +1 -0
- package/dist/adk/providers/llm-service.js +520 -0
- package/dist/adk/providers/llm-service.js.map +1 -0
- package/dist/adk/providers/type-converters.d.ts +34 -0
- package/dist/adk/providers/type-converters.d.ts.map +1 -0
- package/dist/adk/providers/type-converters.js +436 -0
- package/dist/adk/providers/type-converters.js.map +1 -0
- package/dist/adk/runners/index.d.ts +33 -0
- package/dist/adk/runners/index.d.ts.map +1 -0
- package/dist/adk/runners/index.js +466 -0
- package/dist/adk/runners/index.js.map +1 -0
- package/dist/adk/schemas/index.d.ts +85 -0
- package/dist/adk/schemas/index.d.ts.map +1 -0
- package/dist/adk/schemas/index.js +363 -0
- package/dist/adk/schemas/index.js.map +1 -0
- package/dist/adk/sessions/examples/session-provider-usage.d.ts +10 -0
- package/dist/adk/sessions/examples/session-provider-usage.d.ts.map +1 -0
- package/dist/adk/sessions/examples/session-provider-usage.js +145 -0
- package/dist/adk/sessions/examples/session-provider-usage.js.map +1 -0
- package/dist/adk/sessions/index.d.ts +53 -0
- package/dist/adk/sessions/index.d.ts.map +1 -0
- package/dist/adk/sessions/index.js +451 -0
- package/dist/adk/sessions/index.js.map +1 -0
- package/dist/adk/sessions/postgres-provider.d.ts +22 -0
- package/dist/adk/sessions/postgres-provider.d.ts.map +1 -0
- package/dist/adk/sessions/postgres-provider.js +293 -0
- package/dist/adk/sessions/postgres-provider.js.map +1 -0
- package/dist/adk/sessions/redis-provider.d.ts +19 -0
- package/dist/adk/sessions/redis-provider.d.ts.map +1 -0
- package/dist/adk/sessions/redis-provider.js +237 -0
- package/dist/adk/sessions/redis-provider.js.map +1 -0
- package/dist/adk/streaming/index.d.ts +76 -0
- package/dist/adk/streaming/index.d.ts.map +1 -0
- package/dist/adk/streaming/index.js +419 -0
- package/dist/adk/streaming/index.js.map +1 -0
- package/dist/adk/tools/index.d.ts +27 -0
- package/dist/adk/tools/index.d.ts.map +1 -0
- package/dist/adk/tools/index.js +506 -0
- package/dist/adk/tools/index.js.map +1 -0
- package/dist/adk/types.d.ts +351 -0
- package/dist/adk/types.d.ts.map +1 -0
- package/dist/adk/types.js +107 -0
- package/dist/adk/types.js.map +1 -0
- package/dist/core/engine.d.ts +3 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +438 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +84 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/tool-results.d.ts +57 -0
- package/dist/core/tool-results.d.ts.map +1 -0
- package/dist/core/tool-results.js +133 -0
- package/dist/core/tool-results.js.map +1 -0
- package/dist/core/tracing.d.ts +32 -0
- package/dist/core/tracing.d.ts.map +1 -0
- package/dist/core/tracing.js +132 -0
- package/dist/core/tracing.js.map +1 -0
- package/dist/core/types.d.ts +165 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/demo/agents.d.ts +23 -0
- package/dist/demo/agents.d.ts.map +1 -0
- package/dist/demo/agents.js +69 -0
- package/dist/demo/agents.js.map +1 -0
- package/dist/demo/index.d.ts +2 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +250 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/mock-provider.d.ts +22 -0
- package/dist/demo/mock-provider.d.ts.map +1 -0
- package/dist/demo/mock-provider.js +138 -0
- package/dist/demo/mock-provider.js.map +1 -0
- package/dist/demo/tools.d.ts +14 -0
- package/dist/demo/tools.d.ts.map +1 -0
- package/dist/demo/tools.js +115 -0
- package/dist/demo/tools.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/factory.d.ts +22 -0
- package/dist/memory/factory.d.ts.map +1 -0
- package/dist/memory/factory.js +88 -0
- package/dist/memory/factory.js.map +1 -0
- package/dist/memory/providers/in-memory.d.ts +7 -0
- package/dist/memory/providers/in-memory.d.ts.map +1 -0
- package/dist/memory/providers/in-memory.js +287 -0
- package/dist/memory/providers/in-memory.js.map +1 -0
- package/dist/memory/providers/postgres.d.ts +15 -0
- package/dist/memory/providers/postgres.d.ts.map +1 -0
- package/dist/memory/providers/postgres.js +495 -0
- package/dist/memory/providers/postgres.js.map +1 -0
- package/dist/memory/providers/redis.d.ts +18 -0
- package/dist/memory/providers/redis.d.ts.map +1 -0
- package/dist/memory/providers/redis.js +354 -0
- package/dist/memory/providers/redis.js.map +1 -0
- package/dist/memory/types.d.ts +296 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +93 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/policies/handoff.d.ts +16 -0
- package/dist/policies/handoff.d.ts.map +1 -0
- package/dist/policies/handoff.js +20 -0
- package/dist/policies/handoff.js.map +1 -0
- package/dist/policies/validation.d.ts +14 -0
- package/dist/policies/validation.d.ts.map +1 -0
- package/dist/policies/validation.js +92 -0
- package/dist/policies/validation.js.map +1 -0
- package/dist/providers/mcp.d.ts +17 -0
- package/dist/providers/mcp.d.ts.map +1 -0
- package/dist/providers/mcp.js +111 -0
- package/dist/providers/mcp.js.map +1 -0
- package/dist/providers/model.d.ts +3 -0
- package/dist/providers/model.d.ts.map +1 -0
- package/dist/providers/model.js +113 -0
- package/dist/providers/model.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +66 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/server.d.ts +12 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +394 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +456 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +75 -0
- package/dist/server/types.js.map +1 -0
- package/dist/test-utils/db-setup.d.ts +34 -0
- package/dist/test-utils/db-setup.d.ts.map +1 -0
- package/dist/test-utils/db-setup.js +149 -0
- package/dist/test-utils/db-setup.js.map +1 -0
- package/dist/utils/logger.d.ts +63 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +199 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/safe-math.d.ts +31 -0
- package/dist/utils/safe-math.d.ts.map +1 -0
- package/dist/utils/safe-math.js +86 -0
- package/dist/utils/safe-math.js.map +1 -0
- package/dist/visualization/example.d.ts +9 -0
- package/dist/visualization/example.d.ts.map +1 -0
- package/dist/visualization/example.js +236 -0
- package/dist/visualization/example.js.map +1 -0
- package/dist/visualization/graphviz.d.ts +42 -0
- package/dist/visualization/graphviz.d.ts.map +1 -0
- package/dist/visualization/graphviz.js +403 -0
- package/dist/visualization/graphviz.js.map +1 -0
- package/dist/visualization/index.d.ts +10 -0
- package/dist/visualization/index.d.ts.map +1 -0
- package/dist/visualization/index.js +12 -0
- package/dist/visualization/index.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real PostgreSQL Session Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* This provides a production-ready PostgreSQL-based session provider
|
|
5
|
+
* with proper connection pooling, transactions, and error handling
|
|
6
|
+
*/
|
|
7
|
+
import { throwSessionError } from '../types.js';
|
|
8
|
+
import { createSession } from './index.js';
|
|
9
|
+
// SQL queries as constants for better maintainability
|
|
10
|
+
const SQL_CREATE_TABLE = `
|
|
11
|
+
CREATE TABLE IF NOT EXISTS $1 (
|
|
12
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
13
|
+
app_name VARCHAR(255) NOT NULL,
|
|
14
|
+
user_id VARCHAR(255) NOT NULL,
|
|
15
|
+
messages JSONB NOT NULL DEFAULT '[]',
|
|
16
|
+
artifacts JSONB NOT NULL DEFAULT '{}',
|
|
17
|
+
metadata JSONB NOT NULL DEFAULT '{}',
|
|
18
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
19
|
+
last_accessed_at TIMESTAMP WITH TIME ZONE,
|
|
20
|
+
CONSTRAINT idx_user_sessions UNIQUE (user_id, id)
|
|
21
|
+
);
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_user_id ON $1 (user_id);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_created_at ON $1 (created_at DESC);
|
|
24
|
+
`;
|
|
25
|
+
export const createPostgresSessionProvider = (config) => {
|
|
26
|
+
let pool;
|
|
27
|
+
const tableName = config.tableName || 'jaf_sessions';
|
|
28
|
+
// Require real PostgreSQL - no fallback
|
|
29
|
+
try {
|
|
30
|
+
// Dynamic import to avoid breaking if pg not installed
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
32
|
+
const { Pool } = require('pg');
|
|
33
|
+
pool = new Pool({
|
|
34
|
+
connectionString: config.connectionString,
|
|
35
|
+
max: config.poolSize || 10,
|
|
36
|
+
idleTimeoutMillis: config.idleTimeoutMillis || 30000,
|
|
37
|
+
connectionTimeoutMillis: config.connectionTimeoutMillis || 2000,
|
|
38
|
+
});
|
|
39
|
+
// Handle pool events
|
|
40
|
+
pool.on('error', (err, client) => {
|
|
41
|
+
console.error('[ADK:Sessions] PostgreSQL pool error:', err);
|
|
42
|
+
});
|
|
43
|
+
pool.on('connect', (client) => {
|
|
44
|
+
console.log('[ADK:Sessions] New PostgreSQL client connected');
|
|
45
|
+
});
|
|
46
|
+
pool.on('acquire', (client) => {
|
|
47
|
+
console.log('[ADK:Sessions] PostgreSQL client acquired from pool');
|
|
48
|
+
});
|
|
49
|
+
pool.on('remove', (client) => {
|
|
50
|
+
console.log('[ADK:Sessions] PostgreSQL client removed from pool');
|
|
51
|
+
});
|
|
52
|
+
// Initialize table
|
|
53
|
+
initializeTable().catch(err => {
|
|
54
|
+
console.error('[ADK:Sessions] Failed to initialize PostgreSQL table:', err);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error('PostgreSQL session provider requires pg to be installed. ' +
|
|
59
|
+
'Please install it with: npm install pg');
|
|
60
|
+
}
|
|
61
|
+
// Initialize database table
|
|
62
|
+
async function initializeTable() {
|
|
63
|
+
const client = await pool.connect();
|
|
64
|
+
try {
|
|
65
|
+
// Use dynamic table name safely
|
|
66
|
+
const createTableQuery = SQL_CREATE_TABLE.replace(/\$1/g, tableName);
|
|
67
|
+
await client.query(createTableQuery);
|
|
68
|
+
console.log(`[ADK:Sessions] PostgreSQL table ${tableName} initialized`);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error('[ADK:Sessions] Failed to create table:', error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
client.release();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Helper to serialize/deserialize sessions
|
|
79
|
+
const sessionToRow = (session) => {
|
|
80
|
+
return {
|
|
81
|
+
id: session.id,
|
|
82
|
+
app_name: session.appName,
|
|
83
|
+
user_id: session.userId,
|
|
84
|
+
messages: JSON.stringify(session.messages),
|
|
85
|
+
artifacts: JSON.stringify(session.artifacts),
|
|
86
|
+
metadata: JSON.stringify({
|
|
87
|
+
...session.metadata,
|
|
88
|
+
created: undefined, // Store in created_at column
|
|
89
|
+
lastAccessed: undefined // Store in last_accessed_at column
|
|
90
|
+
}),
|
|
91
|
+
created_at: session.metadata.created,
|
|
92
|
+
last_accessed_at: session.metadata.lastAccessed || null
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
const rowToSession = (row) => {
|
|
96
|
+
const metadata = typeof row.metadata === 'string'
|
|
97
|
+
? JSON.parse(row.metadata)
|
|
98
|
+
: row.metadata;
|
|
99
|
+
return {
|
|
100
|
+
id: row.id,
|
|
101
|
+
appName: row.app_name,
|
|
102
|
+
userId: row.user_id,
|
|
103
|
+
messages: typeof row.messages === 'string'
|
|
104
|
+
? JSON.parse(row.messages)
|
|
105
|
+
: row.messages,
|
|
106
|
+
artifacts: typeof row.artifacts === 'string'
|
|
107
|
+
? JSON.parse(row.artifacts)
|
|
108
|
+
: row.artifacts,
|
|
109
|
+
metadata: {
|
|
110
|
+
...metadata,
|
|
111
|
+
created: new Date(row.created_at),
|
|
112
|
+
lastAccessed: row.last_accessed_at ? new Date(row.last_accessed_at) : undefined
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
// Database operation helpers
|
|
117
|
+
async function executeQuery(query, params) {
|
|
118
|
+
const client = await pool.connect();
|
|
119
|
+
try {
|
|
120
|
+
const result = await client.query(query, params);
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
client.release();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function executeTransaction(operations) {
|
|
128
|
+
const client = await pool.connect();
|
|
129
|
+
try {
|
|
130
|
+
await client.query('BEGIN');
|
|
131
|
+
for (const op of operations) {
|
|
132
|
+
await client.query(op.query, op.params);
|
|
133
|
+
}
|
|
134
|
+
await client.query('COMMIT');
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
await client.query('ROLLBACK');
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
client.release();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
createSession: async (context) => {
|
|
146
|
+
const session = createSession(context.appName, context.userId, context.sessionId);
|
|
147
|
+
try {
|
|
148
|
+
const row = sessionToRow(session);
|
|
149
|
+
const query = `
|
|
150
|
+
INSERT INTO ${tableName}
|
|
151
|
+
(id, app_name, user_id, messages, artifacts, metadata, created_at, last_accessed_at)
|
|
152
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
153
|
+
RETURNING *
|
|
154
|
+
`;
|
|
155
|
+
const result = await executeQuery(query, [
|
|
156
|
+
row.id,
|
|
157
|
+
row.app_name,
|
|
158
|
+
row.user_id,
|
|
159
|
+
row.messages,
|
|
160
|
+
row.artifacts,
|
|
161
|
+
row.metadata,
|
|
162
|
+
row.created_at,
|
|
163
|
+
row.last_accessed_at
|
|
164
|
+
]);
|
|
165
|
+
return rowToSession(result.rows[0]);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
throwSessionError(`Failed to create session in PostgreSQL: ${error}`, session.id);
|
|
169
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
getSession: async (sessionId) => {
|
|
173
|
+
try {
|
|
174
|
+
const query = `
|
|
175
|
+
UPDATE ${tableName}
|
|
176
|
+
SET last_accessed_at = CURRENT_TIMESTAMP
|
|
177
|
+
WHERE id = $1
|
|
178
|
+
RETURNING *
|
|
179
|
+
`;
|
|
180
|
+
const result = await executeQuery(query, [sessionId]);
|
|
181
|
+
if (result.rows.length === 0) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return rowToSession(result.rows[0]);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
throwSessionError(`Failed to get session from PostgreSQL: ${error}`, sessionId);
|
|
188
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
updateSession: async (session) => {
|
|
192
|
+
try {
|
|
193
|
+
session.metadata.lastAccessed = new Date();
|
|
194
|
+
const row = sessionToRow(session);
|
|
195
|
+
const query = `
|
|
196
|
+
UPDATE ${tableName}
|
|
197
|
+
SET
|
|
198
|
+
messages = $2,
|
|
199
|
+
artifacts = $3,
|
|
200
|
+
metadata = $4,
|
|
201
|
+
last_accessed_at = $5
|
|
202
|
+
WHERE id = $1
|
|
203
|
+
RETURNING *
|
|
204
|
+
`;
|
|
205
|
+
const result = await executeQuery(query, [
|
|
206
|
+
session.id,
|
|
207
|
+
row.messages,
|
|
208
|
+
row.artifacts,
|
|
209
|
+
row.metadata,
|
|
210
|
+
row.last_accessed_at
|
|
211
|
+
]);
|
|
212
|
+
if (result.rows.length === 0) {
|
|
213
|
+
throw new Error('Session not found');
|
|
214
|
+
}
|
|
215
|
+
return rowToSession(result.rows[0]);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
throwSessionError(`Failed to update session in PostgreSQL: ${error}`, session.id);
|
|
219
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
listSessions: async (userId) => {
|
|
223
|
+
try {
|
|
224
|
+
const query = `
|
|
225
|
+
SELECT * FROM ${tableName}
|
|
226
|
+
WHERE user_id = $1
|
|
227
|
+
ORDER BY created_at DESC
|
|
228
|
+
`;
|
|
229
|
+
const result = await executeQuery(query, [userId]);
|
|
230
|
+
return result.rows.map(rowToSession);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
throwSessionError(`Failed to list sessions from PostgreSQL: ${error}`);
|
|
234
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
deleteSession: async (sessionId) => {
|
|
238
|
+
try {
|
|
239
|
+
const query = `
|
|
240
|
+
DELETE FROM ${tableName}
|
|
241
|
+
WHERE id = $1
|
|
242
|
+
`;
|
|
243
|
+
const result = await executeQuery(query, [sessionId]);
|
|
244
|
+
return result.rowCount > 0;
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
throwSessionError(`Failed to delete session from PostgreSQL: ${error}`, sessionId);
|
|
248
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
};
|
|
253
|
+
// Additional utility functions
|
|
254
|
+
export const closePostgresPool = async (provider) => {
|
|
255
|
+
// Access the internal pool if available
|
|
256
|
+
if (provider._pool && typeof provider._pool.end === 'function') {
|
|
257
|
+
await provider._pool.end();
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
export const getPoolStats = (provider) => {
|
|
261
|
+
if (provider._pool) {
|
|
262
|
+
return {
|
|
263
|
+
totalCount: provider._pool.totalCount,
|
|
264
|
+
idleCount: provider._pool.idleCount,
|
|
265
|
+
waitingCount: provider._pool.waitingCount
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
return null;
|
|
269
|
+
};
|
|
270
|
+
// Migration helper for existing data
|
|
271
|
+
export const migrateFromRedisToPostgres = async (redisProvider, postgresProvider, userIds) => {
|
|
272
|
+
let migrated = 0;
|
|
273
|
+
const errors = [];
|
|
274
|
+
for (const userId of userIds) {
|
|
275
|
+
try {
|
|
276
|
+
const sessions = await redisProvider.listSessions(userId);
|
|
277
|
+
for (const session of sessions) {
|
|
278
|
+
try {
|
|
279
|
+
await postgresProvider.updateSession(session);
|
|
280
|
+
migrated++;
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
errors.push(`Failed to migrate session ${session.id}: ${error}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
errors.push(`Failed to list sessions for user ${userId}: ${error}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return { migrated, errors };
|
|
292
|
+
};
|
|
293
|
+
//# sourceMappingURL=postgres-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-provider.js","sourceRoot":"","sources":["../../../src/adk/sessions/postgres-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real Redis Session Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* This provides a production-ready Redis-based session provider
|
|
5
|
+
* with proper error handling and connection management
|
|
6
|
+
*/
|
|
7
|
+
import { SessionProvider } from '../types.js';
|
|
8
|
+
export interface RedisConfig {
|
|
9
|
+
host: string;
|
|
10
|
+
port: number;
|
|
11
|
+
password?: string;
|
|
12
|
+
database?: number;
|
|
13
|
+
keyPrefix?: string;
|
|
14
|
+
ttl?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare const createRedisSessionProvider: (config: RedisConfig) => SessionProvider;
|
|
17
|
+
export declare const closeRedisConnection: (provider: any) => Promise<void>;
|
|
18
|
+
export declare const pingRedis: (provider: any) => Promise<boolean>;
|
|
19
|
+
//# sourceMappingURL=redis-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-provider.d.ts","sourceRoot":"","sources":["../../../src/adk/sessions/redis-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EAIhB,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,0BAA0B,GAAI,QAAQ,WAAW,KAAG,eA4OhE,CAAC;AAIF,eAAO,MAAM,oBAAoB,GAAU,UAAU,GAAG,KAAG,OAAO,CAAC,IAAI,CAKtE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,UAAU,GAAG,KAAG,OAAO,CAAC,OAAO,CAU9D,CAAC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real Redis Session Provider Implementation
|
|
3
|
+
*
|
|
4
|
+
* This provides a production-ready Redis-based session provider
|
|
5
|
+
* with proper error handling and connection management
|
|
6
|
+
*/
|
|
7
|
+
import { throwSessionError } from '../types.js';
|
|
8
|
+
import { createSession } from './index.js';
|
|
9
|
+
export const createRedisSessionProvider = (config) => {
|
|
10
|
+
let redis;
|
|
11
|
+
// Require real Redis - no fallback
|
|
12
|
+
try {
|
|
13
|
+
// Dynamic import to avoid breaking if ioredis not installed
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
15
|
+
const Redis = require('ioredis');
|
|
16
|
+
redis = new Redis({
|
|
17
|
+
host: config.host,
|
|
18
|
+
port: config.port,
|
|
19
|
+
password: config.password,
|
|
20
|
+
db: config.database || 0,
|
|
21
|
+
retryStrategy: (times) => {
|
|
22
|
+
const delay = Math.min(times * 50, 2000);
|
|
23
|
+
return delay;
|
|
24
|
+
},
|
|
25
|
+
enableOfflineQueue: true,
|
|
26
|
+
maxRetriesPerRequest: 3,
|
|
27
|
+
lazyConnect: false,
|
|
28
|
+
connectTimeout: 10000,
|
|
29
|
+
commandTimeout: 5000
|
|
30
|
+
});
|
|
31
|
+
// Handle connection events
|
|
32
|
+
redis.on('error', (err) => {
|
|
33
|
+
console.error('[ADK:Sessions] Redis connection error:', err);
|
|
34
|
+
});
|
|
35
|
+
redis.on('connect', () => {
|
|
36
|
+
console.log('[ADK:Sessions] Connected to Redis');
|
|
37
|
+
});
|
|
38
|
+
redis.on('ready', () => {
|
|
39
|
+
console.log('[ADK:Sessions] Redis ready for commands');
|
|
40
|
+
});
|
|
41
|
+
redis.on('close', () => {
|
|
42
|
+
console.log('[ADK:Sessions] Redis connection closed');
|
|
43
|
+
});
|
|
44
|
+
redis.on('reconnecting', (delay) => {
|
|
45
|
+
console.log(`[ADK:Sessions] Reconnecting to Redis in ${delay}ms`);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw new Error('Redis session provider requires ioredis to be installed. ' +
|
|
50
|
+
'Please install it with: npm install ioredis');
|
|
51
|
+
}
|
|
52
|
+
const keyPrefix = config.keyPrefix || 'jaf_adk_session:';
|
|
53
|
+
const sessionTTL = config.ttl || 86400; // Default 24 hours
|
|
54
|
+
const getKey = (sessionId) => `${keyPrefix}${sessionId}`;
|
|
55
|
+
const getUserKey = (userId) => `${keyPrefix}user:${userId}`;
|
|
56
|
+
// Helper to serialize/deserialize sessions
|
|
57
|
+
const serializeSession = (session) => {
|
|
58
|
+
return JSON.stringify(session);
|
|
59
|
+
};
|
|
60
|
+
const deserializeSession = (sessionData) => {
|
|
61
|
+
const session = JSON.parse(sessionData);
|
|
62
|
+
// Restore Date objects from strings
|
|
63
|
+
if (session.metadata.created && typeof session.metadata.created === 'string') {
|
|
64
|
+
session.metadata.created = new Date(session.metadata.created);
|
|
65
|
+
}
|
|
66
|
+
if (session.metadata.lastAccessed && typeof session.metadata.lastAccessed === 'string') {
|
|
67
|
+
session.metadata.lastAccessed = new Date(session.metadata.lastAccessed);
|
|
68
|
+
}
|
|
69
|
+
return session;
|
|
70
|
+
};
|
|
71
|
+
// Redis operation helpers with proper async handling
|
|
72
|
+
const redisGet = async (key) => {
|
|
73
|
+
try {
|
|
74
|
+
return await redis.get(key);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error(`[ADK:Sessions] Redis GET error for key ${key}:`, error);
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const redisSet = async (key, value, ttlSeconds) => {
|
|
82
|
+
try {
|
|
83
|
+
if (ttlSeconds) {
|
|
84
|
+
await redis.setex(key, ttlSeconds, value);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
await redis.set(key, value);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error(`[ADK:Sessions] Redis SET error for key ${key}:`, error);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
// Note: redisDelete, redisSAdd, and redisSRem are used in the deleteSession method
|
|
96
|
+
// which uses the redis.multi() approach for atomic operations
|
|
97
|
+
const redisSMembers = async (key) => {
|
|
98
|
+
try {
|
|
99
|
+
return await redis.smembers(key);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error(`[ADK:Sessions] Redis SMEMBERS error for key ${key}:`, error);
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
// Multi/Pipeline operations for performance
|
|
107
|
+
const redisMulti = () => {
|
|
108
|
+
return redis.multi();
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
createSession: async (context) => {
|
|
112
|
+
const session = createSession(context.appName, context.userId, context.sessionId);
|
|
113
|
+
try {
|
|
114
|
+
// Use multi for atomic operations
|
|
115
|
+
const multi = redisMulti();
|
|
116
|
+
multi.setex(getKey(session.id), sessionTTL, serializeSession(session));
|
|
117
|
+
multi.sadd(getUserKey(context.userId), session.id);
|
|
118
|
+
await multi.exec();
|
|
119
|
+
return session;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
throwSessionError(`Failed to create session in Redis: ${error}`, session.id);
|
|
123
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
getSession: async (sessionId) => {
|
|
127
|
+
try {
|
|
128
|
+
const sessionData = await redisGet(getKey(sessionId));
|
|
129
|
+
if (!sessionData) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const session = deserializeSession(sessionData);
|
|
133
|
+
// Update last accessed time and refresh TTL
|
|
134
|
+
session.metadata.lastAccessed = new Date();
|
|
135
|
+
await redisSet(getKey(sessionId), serializeSession(session), sessionTTL);
|
|
136
|
+
return session;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throwSessionError(`Failed to get session from Redis: ${error}`, sessionId);
|
|
140
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
updateSession: async (session) => {
|
|
144
|
+
try {
|
|
145
|
+
session.metadata.lastAccessed = new Date();
|
|
146
|
+
await redisSet(getKey(session.id), serializeSession(session), sessionTTL);
|
|
147
|
+
return session;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
throwSessionError(`Failed to update session in Redis: ${error}`, session.id);
|
|
151
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
listSessions: async (userId) => {
|
|
155
|
+
try {
|
|
156
|
+
const userKey = getUserKey(userId);
|
|
157
|
+
const sessionIds = await redisSMembers(userKey);
|
|
158
|
+
if (sessionIds.length === 0) {
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
const sessions = [];
|
|
162
|
+
const deadSessionIds = [];
|
|
163
|
+
// Retrieve all sessions for user
|
|
164
|
+
for (const sessionId of sessionIds) {
|
|
165
|
+
const sessionData = await redisGet(getKey(sessionId));
|
|
166
|
+
if (sessionData) {
|
|
167
|
+
try {
|
|
168
|
+
sessions.push(deserializeSession(sessionData));
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
// Skip invalid sessions
|
|
172
|
+
console.warn(`[ADK:Sessions] Skipping invalid session ${sessionId}:`, error);
|
|
173
|
+
deadSessionIds.push(sessionId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Session expired or deleted
|
|
178
|
+
deadSessionIds.push(sessionId);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Clean up dead session references
|
|
182
|
+
if (deadSessionIds.length > 0) {
|
|
183
|
+
const multi = redis.multi();
|
|
184
|
+
for (const deadId of deadSessionIds) {
|
|
185
|
+
multi.srem(userKey, deadId);
|
|
186
|
+
}
|
|
187
|
+
await multi.exec();
|
|
188
|
+
}
|
|
189
|
+
// Sort by creation date (newest first)
|
|
190
|
+
return sessions.sort((a, b) => b.metadata.created.getTime() - a.metadata.created.getTime());
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throwSessionError(`Failed to list sessions from Redis: ${error}`);
|
|
194
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
deleteSession: async (sessionId) => {
|
|
198
|
+
try {
|
|
199
|
+
const sessionData = await redisGet(getKey(sessionId));
|
|
200
|
+
if (!sessionData) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
const session = deserializeSession(sessionData);
|
|
204
|
+
// Use multi for atomic deletion
|
|
205
|
+
const multi = redis.multi();
|
|
206
|
+
multi.del(getKey(sessionId));
|
|
207
|
+
multi.srem(getUserKey(session.userId), sessionId);
|
|
208
|
+
const results = await multi.exec();
|
|
209
|
+
return results?.[0]?.[1] === 1;
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
throwSessionError(`Failed to delete session from Redis: ${error}`, sessionId);
|
|
213
|
+
throw error; // TypeScript needs this even though throwSessionError never returns
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
// Additional utility functions
|
|
219
|
+
export const closeRedisConnection = async (provider) => {
|
|
220
|
+
// Access the internal redis client if available
|
|
221
|
+
if (provider._redis && typeof provider._redis.disconnect === 'function') {
|
|
222
|
+
await provider._redis.disconnect();
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
export const pingRedis = async (provider) => {
|
|
226
|
+
try {
|
|
227
|
+
if (provider._redis && typeof provider._redis.ping === 'function') {
|
|
228
|
+
const result = await provider._redis.ping();
|
|
229
|
+
return result === 'PONG';
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
//# sourceMappingURL=redis-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-provider.js","sourceRoot":"","sources":["../../../src/adk/sessions/redis-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JAF ADK Layer - Streaming System
|
|
3
|
+
*
|
|
4
|
+
* Functional streaming and live interaction utilities
|
|
5
|
+
*/
|
|
6
|
+
import { LiveRequestQueue, Content, AgentEvent, AgentEventType, StreamConfig, ResponseModality, FunctionCall, FunctionResponse } from '../types';
|
|
7
|
+
export declare const createLiveRequestQueue: () => LiveRequestQueue;
|
|
8
|
+
export declare const createAgentEvent: (type: AgentEventType, data?: {
|
|
9
|
+
content?: Content;
|
|
10
|
+
functionCall?: FunctionCall;
|
|
11
|
+
functionResponse?: FunctionResponse;
|
|
12
|
+
error?: string;
|
|
13
|
+
metadata?: Record<string, unknown>;
|
|
14
|
+
}) => AgentEvent;
|
|
15
|
+
export declare const createMessageStartEvent: (content?: Content) => AgentEvent;
|
|
16
|
+
export declare const createMessageDeltaEvent: (content: Content) => AgentEvent;
|
|
17
|
+
export declare const createMessageCompleteEvent: (content?: Content) => AgentEvent;
|
|
18
|
+
export declare const createFunctionCallStartEvent: (functionCall: FunctionCall) => AgentEvent;
|
|
19
|
+
export declare const createFunctionCallCompleteEvent: (functionResponse: FunctionResponse) => AgentEvent;
|
|
20
|
+
export declare const createAgentTransferEvent: (targetAgent: string, metadata?: Record<string, unknown>) => AgentEvent;
|
|
21
|
+
export declare const createConversationEndEvent: (metadata?: Record<string, unknown>) => AgentEvent;
|
|
22
|
+
export declare const createErrorEvent: (error: string, metadata?: Record<string, unknown>) => AgentEvent;
|
|
23
|
+
export declare const streamToQueue: (stream: AsyncGenerator<AgentEvent>, queue: LiveRequestQueue) => Promise<void>;
|
|
24
|
+
export declare const queueToStream: (queue: LiveRequestQueue) => AsyncGenerator<AgentEvent>;
|
|
25
|
+
export declare const combineStreams: (...streams: AsyncGenerator<AgentEvent>[]) => AsyncGenerator<AgentEvent>;
|
|
26
|
+
export declare const filterEventStream: (stream: AsyncGenerator<AgentEvent>, predicate: (event: AgentEvent) => boolean) => AsyncGenerator<AgentEvent>;
|
|
27
|
+
export declare const mapEventStream: <T>(stream: AsyncGenerator<AgentEvent>, mapper: (event: AgentEvent) => T) => AsyncGenerator<T>;
|
|
28
|
+
export declare const createStreamConfig: (responseModalities?: ResponseModality[], options?: {
|
|
29
|
+
bufferSize?: number;
|
|
30
|
+
timeout?: number;
|
|
31
|
+
}) => StreamConfig;
|
|
32
|
+
export declare const createTextStreamConfig: () => StreamConfig;
|
|
33
|
+
export declare const createAudioStreamConfig: () => StreamConfig;
|
|
34
|
+
export declare const createMultiModalStreamConfig: () => StreamConfig;
|
|
35
|
+
export declare const createBufferedStream: (stream: AsyncGenerator<AgentEvent>, bufferSize?: number) => AsyncGenerator<AgentEvent[]>;
|
|
36
|
+
export declare const createThrottledStream: (stream: AsyncGenerator<AgentEvent>, intervalMs?: number) => AsyncGenerator<AgentEvent>;
|
|
37
|
+
export declare const createDebouncedStream: (stream: AsyncGenerator<AgentEvent>, delayMs?: number) => AsyncGenerator<AgentEvent>;
|
|
38
|
+
export declare const collectEvents: (stream: AsyncGenerator<AgentEvent>, predicate?: (event: AgentEvent) => boolean) => Promise<AgentEvent[]>;
|
|
39
|
+
export declare const findFirstEvent: (stream: AsyncGenerator<AgentEvent>, predicate: (event: AgentEvent) => boolean) => Promise<AgentEvent | null>;
|
|
40
|
+
export declare const waitForEvent: (stream: AsyncGenerator<AgentEvent>, type: AgentEventType, timeout?: number) => Promise<AgentEvent | null>;
|
|
41
|
+
export declare const countEvents: (stream: AsyncGenerator<AgentEvent>, predicate?: (event: AgentEvent) => boolean) => Promise<number>;
|
|
42
|
+
export declare const isMessageEvent: (event: AgentEvent) => boolean;
|
|
43
|
+
export declare const isFunctionEvent: (event: AgentEvent) => boolean;
|
|
44
|
+
export declare const isControlEvent: (event: AgentEvent) => boolean;
|
|
45
|
+
export declare const isErrorEvent: (event: AgentEvent) => boolean;
|
|
46
|
+
export declare const filterMessageEvents: (stream: AsyncGenerator<AgentEvent>) => AsyncGenerator<AgentEvent, any, any>;
|
|
47
|
+
export declare const filterFunctionEvents: (stream: AsyncGenerator<AgentEvent>) => AsyncGenerator<AgentEvent, any, any>;
|
|
48
|
+
export declare const filterControlEvents: (stream: AsyncGenerator<AgentEvent>) => AsyncGenerator<AgentEvent, any, any>;
|
|
49
|
+
export declare const filterErrorEvents: (stream: AsyncGenerator<AgentEvent>) => AsyncGenerator<AgentEvent, any, any>;
|
|
50
|
+
export declare const monitorStream: (stream: AsyncGenerator<AgentEvent>, monitor: (event: AgentEvent) => void) => AsyncGenerator<AgentEvent>;
|
|
51
|
+
export declare const logStream: (prefix?: string) => (event: AgentEvent) => void;
|
|
52
|
+
export declare const metricsMonitor: () => {
|
|
53
|
+
monitor: (event: AgentEvent) => void;
|
|
54
|
+
getMetrics: () => {
|
|
55
|
+
duration: number;
|
|
56
|
+
eventsPerSecond: number;
|
|
57
|
+
eventCount: number;
|
|
58
|
+
eventsByType: Record<AgentEventType, number>;
|
|
59
|
+
errors: number;
|
|
60
|
+
startTime: number;
|
|
61
|
+
firstEventTime: number | null;
|
|
62
|
+
lastEventTime: number | null;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
export declare const withStreamErrorHandling: (stream: AsyncGenerator<AgentEvent>, errorHandler?: (error: Error) => AgentEvent | null) => AsyncGenerator<AgentEvent>;
|
|
66
|
+
export declare const retryStream: (streamFactory: () => AsyncGenerator<AgentEvent>, maxRetries?: number, delayMs?: number) => AsyncGenerator<AgentEvent>;
|
|
67
|
+
export interface BidirectionalStream {
|
|
68
|
+
send: (message: Content) => Promise<void>;
|
|
69
|
+
receive: () => AsyncGenerator<AgentEvent>;
|
|
70
|
+
close: () => void;
|
|
71
|
+
}
|
|
72
|
+
export declare const createBidirectionalStream: () => BidirectionalStream;
|
|
73
|
+
export declare const streamToArray: <T>(stream: AsyncGenerator<T>) => Promise<T[]>;
|
|
74
|
+
export declare const takeFromStream: <T>(stream: AsyncGenerator<T>, count: number) => AsyncGenerator<T>;
|
|
75
|
+
export declare const skipFromStream: <T>(stream: AsyncGenerator<T>, count: number) => AsyncGenerator<T>;
|
|
76
|
+
//# sourceMappingURL=index.d.ts.map
|