@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.
Files changed (279) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +596 -0
  3. package/dist/a2a/agent-card.d.ts +28 -0
  4. package/dist/a2a/agent-card.d.ts.map +1 -0
  5. package/dist/a2a/agent-card.js +250 -0
  6. package/dist/a2a/agent-card.js.map +1 -0
  7. package/dist/a2a/agent.d.ts +38 -0
  8. package/dist/a2a/agent.d.ts.map +1 -0
  9. package/dist/a2a/agent.js +223 -0
  10. package/dist/a2a/agent.js.map +1 -0
  11. package/dist/a2a/client.d.ts +35 -0
  12. package/dist/a2a/client.d.ts.map +1 -0
  13. package/dist/a2a/client.js +337 -0
  14. package/dist/a2a/client.js.map +1 -0
  15. package/dist/a2a/examples/client-example.d.ts +104 -0
  16. package/dist/a2a/examples/client-example.d.ts.map +1 -0
  17. package/dist/a2a/examples/client-example.js +232 -0
  18. package/dist/a2a/examples/client-example.js.map +1 -0
  19. package/dist/a2a/examples/server-example.d.ts +9 -0
  20. package/dist/a2a/examples/server-example.d.ts.map +1 -0
  21. package/dist/a2a/examples/server-example.js +209 -0
  22. package/dist/a2a/examples/server-example.js.map +1 -0
  23. package/dist/a2a/examples/weather-agent.d.ts +8 -0
  24. package/dist/a2a/examples/weather-agent.d.ts.map +1 -0
  25. package/dist/a2a/examples/weather-agent.js +232 -0
  26. package/dist/a2a/examples/weather-agent.js.map +1 -0
  27. package/dist/a2a/executor.d.ts +43 -0
  28. package/dist/a2a/executor.d.ts.map +1 -0
  29. package/dist/a2a/executor.js +507 -0
  30. package/dist/a2a/executor.js.map +1 -0
  31. package/dist/a2a/index.d.ts +378 -0
  32. package/dist/a2a/index.d.ts.map +1 -0
  33. package/dist/a2a/index.js +72 -0
  34. package/dist/a2a/index.js.map +1 -0
  35. package/dist/a2a/memory/cleanup.d.ts +58 -0
  36. package/dist/a2a/memory/cleanup.d.ts.map +1 -0
  37. package/dist/a2a/memory/cleanup.js +281 -0
  38. package/dist/a2a/memory/cleanup.js.map +1 -0
  39. package/dist/a2a/memory/factory.d.ts +38 -0
  40. package/dist/a2a/memory/factory.d.ts.map +1 -0
  41. package/dist/a2a/memory/factory.js +369 -0
  42. package/dist/a2a/memory/factory.js.map +1 -0
  43. package/dist/a2a/memory/index.d.ts +13 -0
  44. package/dist/a2a/memory/index.d.ts.map +1 -0
  45. package/dist/a2a/memory/index.js +16 -0
  46. package/dist/a2a/memory/index.js.map +1 -0
  47. package/dist/a2a/memory/providers/in-memory.d.ts +10 -0
  48. package/dist/a2a/memory/providers/in-memory.d.ts.map +1 -0
  49. package/dist/a2a/memory/providers/in-memory.js +539 -0
  50. package/dist/a2a/memory/providers/in-memory.js.map +1 -0
  51. package/dist/a2a/memory/providers/postgres.d.ts +10 -0
  52. package/dist/a2a/memory/providers/postgres.d.ts.map +1 -0
  53. package/dist/a2a/memory/providers/postgres.js +404 -0
  54. package/dist/a2a/memory/providers/postgres.js.map +1 -0
  55. package/dist/a2a/memory/providers/redis.d.ts +10 -0
  56. package/dist/a2a/memory/providers/redis.d.ts.map +1 -0
  57. package/dist/a2a/memory/providers/redis.js +435 -0
  58. package/dist/a2a/memory/providers/redis.js.map +1 -0
  59. package/dist/a2a/memory/serialization.d.ts +53 -0
  60. package/dist/a2a/memory/serialization.d.ts.map +1 -0
  61. package/dist/a2a/memory/serialization.js +233 -0
  62. package/dist/a2a/memory/serialization.js.map +1 -0
  63. package/dist/a2a/memory/types.d.ts +395 -0
  64. package/dist/a2a/memory/types.d.ts.map +1 -0
  65. package/dist/a2a/memory/types.js +85 -0
  66. package/dist/a2a/memory/types.js.map +1 -0
  67. package/dist/a2a/protocol.d.ts +38 -0
  68. package/dist/a2a/protocol.d.ts.map +1 -0
  69. package/dist/a2a/protocol.js +211 -0
  70. package/dist/a2a/protocol.js.map +1 -0
  71. package/dist/a2a/server.d.ts +343 -0
  72. package/dist/a2a/server.d.ts.map +1 -0
  73. package/dist/a2a/server.js +362 -0
  74. package/dist/a2a/server.js.map +1 -0
  75. package/dist/a2a/types.d.ts +730 -0
  76. package/dist/a2a/types.d.ts.map +1 -0
  77. package/dist/a2a/types.js +73 -0
  78. package/dist/a2a/types.js.map +1 -0
  79. package/dist/adk/agents/index.d.ts +48 -0
  80. package/dist/adk/agents/index.d.ts.map +1 -0
  81. package/dist/adk/agents/index.js +277 -0
  82. package/dist/adk/agents/index.js.map +1 -0
  83. package/dist/adk/artifacts/index.d.ts +62 -0
  84. package/dist/adk/artifacts/index.d.ts.map +1 -0
  85. package/dist/adk/artifacts/index.js +394 -0
  86. package/dist/adk/artifacts/index.js.map +1 -0
  87. package/dist/adk/config/llm-config.d.ts +75 -0
  88. package/dist/adk/config/llm-config.d.ts.map +1 -0
  89. package/dist/adk/config/llm-config.js +422 -0
  90. package/dist/adk/config/llm-config.js.map +1 -0
  91. package/dist/adk/content/index.d.ts +58 -0
  92. package/dist/adk/content/index.d.ts.map +1 -0
  93. package/dist/adk/content/index.js +220 -0
  94. package/dist/adk/content/index.js.map +1 -0
  95. package/dist/adk/examples/advanced-features.d.ts +22 -0
  96. package/dist/adk/examples/advanced-features.d.ts.map +1 -0
  97. package/dist/adk/examples/advanced-features.js +380 -0
  98. package/dist/adk/examples/advanced-features.js.map +1 -0
  99. package/dist/adk/examples/basic-agent.d.ts +28 -0
  100. package/dist/adk/examples/basic-agent.d.ts.map +1 -0
  101. package/dist/adk/examples/basic-agent.js +207 -0
  102. package/dist/adk/examples/basic-agent.js.map +1 -0
  103. package/dist/adk/examples/multi-agent.d.ts +24 -0
  104. package/dist/adk/examples/multi-agent.d.ts.map +1 -0
  105. package/dist/adk/examples/multi-agent.js +321 -0
  106. package/dist/adk/examples/multi-agent.js.map +1 -0
  107. package/dist/adk/examples/streaming-example.d.ts +9 -0
  108. package/dist/adk/examples/streaming-example.d.ts.map +1 -0
  109. package/dist/adk/examples/streaming-example.js +193 -0
  110. package/dist/adk/examples/streaming-example.js.map +1 -0
  111. package/dist/adk/index.d.ts +65 -0
  112. package/dist/adk/index.d.ts.map +1 -0
  113. package/dist/adk/index.js +251 -0
  114. package/dist/adk/index.js.map +1 -0
  115. package/dist/adk/models.d.ts +338 -0
  116. package/dist/adk/models.d.ts.map +1 -0
  117. package/dist/adk/models.js +466 -0
  118. package/dist/adk/models.js.map +1 -0
  119. package/dist/adk/providers/error-handler.d.ts +100 -0
  120. package/dist/adk/providers/error-handler.d.ts.map +1 -0
  121. package/dist/adk/providers/error-handler.js +289 -0
  122. package/dist/adk/providers/error-handler.js.map +1 -0
  123. package/dist/adk/providers/llm-service.d.ts +41 -0
  124. package/dist/adk/providers/llm-service.d.ts.map +1 -0
  125. package/dist/adk/providers/llm-service.js +520 -0
  126. package/dist/adk/providers/llm-service.js.map +1 -0
  127. package/dist/adk/providers/type-converters.d.ts +34 -0
  128. package/dist/adk/providers/type-converters.d.ts.map +1 -0
  129. package/dist/adk/providers/type-converters.js +436 -0
  130. package/dist/adk/providers/type-converters.js.map +1 -0
  131. package/dist/adk/runners/index.d.ts +33 -0
  132. package/dist/adk/runners/index.d.ts.map +1 -0
  133. package/dist/adk/runners/index.js +466 -0
  134. package/dist/adk/runners/index.js.map +1 -0
  135. package/dist/adk/schemas/index.d.ts +85 -0
  136. package/dist/adk/schemas/index.d.ts.map +1 -0
  137. package/dist/adk/schemas/index.js +363 -0
  138. package/dist/adk/schemas/index.js.map +1 -0
  139. package/dist/adk/sessions/examples/session-provider-usage.d.ts +10 -0
  140. package/dist/adk/sessions/examples/session-provider-usage.d.ts.map +1 -0
  141. package/dist/adk/sessions/examples/session-provider-usage.js +145 -0
  142. package/dist/adk/sessions/examples/session-provider-usage.js.map +1 -0
  143. package/dist/adk/sessions/index.d.ts +53 -0
  144. package/dist/adk/sessions/index.d.ts.map +1 -0
  145. package/dist/adk/sessions/index.js +451 -0
  146. package/dist/adk/sessions/index.js.map +1 -0
  147. package/dist/adk/sessions/postgres-provider.d.ts +22 -0
  148. package/dist/adk/sessions/postgres-provider.d.ts.map +1 -0
  149. package/dist/adk/sessions/postgres-provider.js +293 -0
  150. package/dist/adk/sessions/postgres-provider.js.map +1 -0
  151. package/dist/adk/sessions/redis-provider.d.ts +19 -0
  152. package/dist/adk/sessions/redis-provider.d.ts.map +1 -0
  153. package/dist/adk/sessions/redis-provider.js +237 -0
  154. package/dist/adk/sessions/redis-provider.js.map +1 -0
  155. package/dist/adk/streaming/index.d.ts +76 -0
  156. package/dist/adk/streaming/index.d.ts.map +1 -0
  157. package/dist/adk/streaming/index.js +419 -0
  158. package/dist/adk/streaming/index.js.map +1 -0
  159. package/dist/adk/tools/index.d.ts +27 -0
  160. package/dist/adk/tools/index.d.ts.map +1 -0
  161. package/dist/adk/tools/index.js +506 -0
  162. package/dist/adk/tools/index.js.map +1 -0
  163. package/dist/adk/types.d.ts +351 -0
  164. package/dist/adk/types.d.ts.map +1 -0
  165. package/dist/adk/types.js +107 -0
  166. package/dist/adk/types.js.map +1 -0
  167. package/dist/core/engine.d.ts +3 -0
  168. package/dist/core/engine.d.ts.map +1 -0
  169. package/dist/core/engine.js +438 -0
  170. package/dist/core/engine.js.map +1 -0
  171. package/dist/core/errors.d.ts +8 -0
  172. package/dist/core/errors.d.ts.map +1 -0
  173. package/dist/core/errors.js +84 -0
  174. package/dist/core/errors.js.map +1 -0
  175. package/dist/core/tool-results.d.ts +57 -0
  176. package/dist/core/tool-results.d.ts.map +1 -0
  177. package/dist/core/tool-results.js +133 -0
  178. package/dist/core/tool-results.js.map +1 -0
  179. package/dist/core/tracing.d.ts +32 -0
  180. package/dist/core/tracing.d.ts.map +1 -0
  181. package/dist/core/tracing.js +132 -0
  182. package/dist/core/tracing.js.map +1 -0
  183. package/dist/core/types.d.ts +165 -0
  184. package/dist/core/types.d.ts.map +1 -0
  185. package/dist/core/types.js +3 -0
  186. package/dist/core/types.js.map +1 -0
  187. package/dist/demo/agents.d.ts +23 -0
  188. package/dist/demo/agents.d.ts.map +1 -0
  189. package/dist/demo/agents.js +69 -0
  190. package/dist/demo/agents.js.map +1 -0
  191. package/dist/demo/index.d.ts +2 -0
  192. package/dist/demo/index.d.ts.map +1 -0
  193. package/dist/demo/index.js +250 -0
  194. package/dist/demo/index.js.map +1 -0
  195. package/dist/demo/mock-provider.d.ts +22 -0
  196. package/dist/demo/mock-provider.d.ts.map +1 -0
  197. package/dist/demo/mock-provider.js +138 -0
  198. package/dist/demo/mock-provider.js.map +1 -0
  199. package/dist/demo/tools.d.ts +14 -0
  200. package/dist/demo/tools.d.ts.map +1 -0
  201. package/dist/demo/tools.js +115 -0
  202. package/dist/demo/tools.js.map +1 -0
  203. package/dist/index.d.ts +20 -0
  204. package/dist/index.d.ts.map +1 -0
  205. package/dist/index.js +30 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/memory/factory.d.ts +22 -0
  208. package/dist/memory/factory.d.ts.map +1 -0
  209. package/dist/memory/factory.js +88 -0
  210. package/dist/memory/factory.js.map +1 -0
  211. package/dist/memory/providers/in-memory.d.ts +7 -0
  212. package/dist/memory/providers/in-memory.d.ts.map +1 -0
  213. package/dist/memory/providers/in-memory.js +287 -0
  214. package/dist/memory/providers/in-memory.js.map +1 -0
  215. package/dist/memory/providers/postgres.d.ts +15 -0
  216. package/dist/memory/providers/postgres.d.ts.map +1 -0
  217. package/dist/memory/providers/postgres.js +495 -0
  218. package/dist/memory/providers/postgres.js.map +1 -0
  219. package/dist/memory/providers/redis.d.ts +18 -0
  220. package/dist/memory/providers/redis.d.ts.map +1 -0
  221. package/dist/memory/providers/redis.js +354 -0
  222. package/dist/memory/providers/redis.js.map +1 -0
  223. package/dist/memory/types.d.ts +296 -0
  224. package/dist/memory/types.d.ts.map +1 -0
  225. package/dist/memory/types.js +93 -0
  226. package/dist/memory/types.js.map +1 -0
  227. package/dist/policies/handoff.d.ts +16 -0
  228. package/dist/policies/handoff.d.ts.map +1 -0
  229. package/dist/policies/handoff.js +20 -0
  230. package/dist/policies/handoff.js.map +1 -0
  231. package/dist/policies/validation.d.ts +14 -0
  232. package/dist/policies/validation.d.ts.map +1 -0
  233. package/dist/policies/validation.js +92 -0
  234. package/dist/policies/validation.js.map +1 -0
  235. package/dist/providers/mcp.d.ts +17 -0
  236. package/dist/providers/mcp.d.ts.map +1 -0
  237. package/dist/providers/mcp.js +111 -0
  238. package/dist/providers/mcp.js.map +1 -0
  239. package/dist/providers/model.d.ts +3 -0
  240. package/dist/providers/model.d.ts.map +1 -0
  241. package/dist/providers/model.js +113 -0
  242. package/dist/providers/model.js.map +1 -0
  243. package/dist/server/index.d.ts +35 -0
  244. package/dist/server/index.d.ts.map +1 -0
  245. package/dist/server/index.js +66 -0
  246. package/dist/server/index.js.map +1 -0
  247. package/dist/server/server.d.ts +12 -0
  248. package/dist/server/server.d.ts.map +1 -0
  249. package/dist/server/server.js +394 -0
  250. package/dist/server/server.js.map +1 -0
  251. package/dist/server/types.d.ts +456 -0
  252. package/dist/server/types.d.ts.map +1 -0
  253. package/dist/server/types.js +75 -0
  254. package/dist/server/types.js.map +1 -0
  255. package/dist/test-utils/db-setup.d.ts +34 -0
  256. package/dist/test-utils/db-setup.d.ts.map +1 -0
  257. package/dist/test-utils/db-setup.js +149 -0
  258. package/dist/test-utils/db-setup.js.map +1 -0
  259. package/dist/utils/logger.d.ts +63 -0
  260. package/dist/utils/logger.d.ts.map +1 -0
  261. package/dist/utils/logger.js +199 -0
  262. package/dist/utils/logger.js.map +1 -0
  263. package/dist/utils/safe-math.d.ts +31 -0
  264. package/dist/utils/safe-math.d.ts.map +1 -0
  265. package/dist/utils/safe-math.js +86 -0
  266. package/dist/utils/safe-math.js.map +1 -0
  267. package/dist/visualization/example.d.ts +9 -0
  268. package/dist/visualization/example.d.ts.map +1 -0
  269. package/dist/visualization/example.js +236 -0
  270. package/dist/visualization/example.js.map +1 -0
  271. package/dist/visualization/graphviz.d.ts +42 -0
  272. package/dist/visualization/graphviz.d.ts.map +1 -0
  273. package/dist/visualization/graphviz.js +403 -0
  274. package/dist/visualization/graphviz.js.map +1 -0
  275. package/dist/visualization/index.d.ts +10 -0
  276. package/dist/visualization/index.d.ts.map +1 -0
  277. package/dist/visualization/index.js +12 -0
  278. package/dist/visualization/index.js.map +1 -0
  279. 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