@teneo-protocol/sdk 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/.github/workflows/publish-npm.yml +8 -6
  2. package/CHANGELOG.md +265 -0
  3. package/README.md +406 -53
  4. package/dist/core/websocket-client.d.ts +13 -0
  5. package/dist/core/websocket-client.d.ts.map +1 -1
  6. package/dist/core/websocket-client.js +34 -3
  7. package/dist/core/websocket-client.js.map +1 -1
  8. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  9. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  10. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
  11. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  12. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  13. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  14. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
  15. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  16. package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
  17. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  18. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  19. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  20. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  21. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  22. package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
  23. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  24. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  25. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  26. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  27. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  28. package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
  29. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  30. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  31. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  32. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  33. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/index.d.ts +5 -0
  35. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  36. package/dist/handlers/message-handlers/index.js +23 -1
  37. package/dist/handlers/message-handlers/index.js.map +1 -1
  38. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
  39. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  40. package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
  41. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  42. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
  43. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
  45. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
  47. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  49. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  50. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  51. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/regular-message-handler.js +1 -0
  53. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  55. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  56. package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
  57. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  58. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  59. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/types.d.ts +2 -0
  61. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  62. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  63. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  64. package/dist/managers/agent-room-manager.d.ts +222 -0
  65. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  66. package/dist/managers/agent-room-manager.js +508 -0
  67. package/dist/managers/agent-room-manager.js.map +1 -0
  68. package/dist/managers/index.d.ts +2 -0
  69. package/dist/managers/index.d.ts.map +1 -1
  70. package/dist/managers/index.js +5 -1
  71. package/dist/managers/index.js.map +1 -1
  72. package/dist/managers/message-router.d.ts +1 -1
  73. package/dist/managers/message-router.d.ts.map +1 -1
  74. package/dist/managers/message-router.js +41 -4
  75. package/dist/managers/message-router.js.map +1 -1
  76. package/dist/managers/room-management-manager.d.ts +213 -0
  77. package/dist/managers/room-management-manager.d.ts.map +1 -0
  78. package/dist/managers/room-management-manager.js +440 -0
  79. package/dist/managers/room-management-manager.js.map +1 -0
  80. package/dist/managers/room-manager.d.ts +4 -4
  81. package/dist/managers/room-manager.d.ts.map +1 -1
  82. package/dist/managers/room-manager.js +1 -1
  83. package/dist/managers/room-manager.js.map +1 -1
  84. package/dist/teneo-sdk.d.ts +362 -14
  85. package/dist/teneo-sdk.d.ts.map +1 -1
  86. package/dist/teneo-sdk.js +497 -7
  87. package/dist/teneo-sdk.js.map +1 -1
  88. package/dist/types/config.d.ts +63 -54
  89. package/dist/types/config.d.ts.map +1 -1
  90. package/dist/types/config.js +9 -5
  91. package/dist/types/config.js.map +1 -1
  92. package/dist/types/error-codes.d.ts +2 -0
  93. package/dist/types/error-codes.d.ts.map +1 -1
  94. package/dist/types/error-codes.js +3 -0
  95. package/dist/types/error-codes.js.map +1 -1
  96. package/dist/types/events.d.ts +132 -68
  97. package/dist/types/events.d.ts.map +1 -1
  98. package/dist/types/events.js.map +1 -1
  99. package/dist/types/index.d.ts +1 -1
  100. package/dist/types/index.d.ts.map +1 -1
  101. package/dist/types/index.js +27 -2
  102. package/dist/types/index.js.map +1 -1
  103. package/dist/types/messages.d.ts +11396 -2559
  104. package/dist/types/messages.d.ts.map +1 -1
  105. package/dist/types/messages.js +294 -27
  106. package/dist/types/messages.js.map +1 -1
  107. package/dist/types/validation.d.ts.map +1 -1
  108. package/dist/types/validation.js +1 -1
  109. package/dist/types/validation.js.map +1 -1
  110. package/dist/utils/bounded-queue.d.ts +1 -1
  111. package/dist/utils/bounded-queue.js +6 -6
  112. package/dist/utils/circuit-breaker.d.ts.map +1 -1
  113. package/dist/utils/circuit-breaker.js.map +1 -1
  114. package/dist/utils/event-waiter.d.ts.map +1 -1
  115. package/dist/utils/event-waiter.js +2 -1
  116. package/dist/utils/event-waiter.js.map +1 -1
  117. package/dist/utils/rate-limiter.d.ts.map +1 -1
  118. package/dist/utils/rate-limiter.js +4 -6
  119. package/dist/utils/rate-limiter.js.map +1 -1
  120. package/dist/utils/secure-private-key.d.ts.map +1 -1
  121. package/dist/utils/secure-private-key.js +9 -15
  122. package/dist/utils/secure-private-key.js.map +1 -1
  123. package/dist/utils/signature-verifier.d.ts +2 -2
  124. package/dist/utils/signature-verifier.d.ts.map +1 -1
  125. package/dist/utils/signature-verifier.js +5 -5
  126. package/dist/utils/signature-verifier.js.map +1 -1
  127. package/examples/.env.example +1 -1
  128. package/examples/agent-room-management-example.ts +334 -0
  129. package/examples/claude-agent-x-follower/.env.example +117 -0
  130. package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
  131. package/examples/claude-agent-x-follower/README.md +540 -0
  132. package/examples/claude-agent-x-follower/index.ts +248 -0
  133. package/examples/claude-agent-x-follower/package.json +37 -0
  134. package/examples/claude-agent-x-follower/tsconfig.json +20 -0
  135. package/examples/n8n-teneo/.env.example +127 -0
  136. package/examples/n8n-teneo/Dockerfile +42 -0
  137. package/examples/n8n-teneo/README.md +564 -0
  138. package/examples/n8n-teneo/docker-compose.yml +71 -0
  139. package/examples/n8n-teneo/index.ts +177 -0
  140. package/examples/n8n-teneo/package.json +22 -0
  141. package/examples/n8n-teneo/tsconfig.json +12 -0
  142. package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
  143. package/examples/openai-teneo/.env.example +130 -0
  144. package/examples/openai-teneo/README.md +635 -0
  145. package/examples/openai-teneo/index.ts +280 -0
  146. package/examples/openai-teneo/package.json +24 -0
  147. package/examples/openai-teneo/tsconfig.json +16 -0
  148. package/examples/production-dashboard/.env.example +5 -3
  149. package/examples/production-dashboard/README.md +839 -0
  150. package/examples/production-dashboard/pnpm-lock.yaml +92 -0
  151. package/examples/production-dashboard/public/dashboard.html +1150 -504
  152. package/examples/production-dashboard/server.ts +428 -12
  153. package/examples/room-management-example.ts +285 -0
  154. package/examples/usage/.env.example +17 -0
  155. package/examples/usage/01-connect.ts +116 -0
  156. package/examples/usage/02-list-agents.ts +153 -0
  157. package/examples/usage/03-pick-agent.ts +201 -0
  158. package/examples/usage/04-find-by-capability.ts +237 -0
  159. package/examples/usage/05-webhook-example.ts +319 -0
  160. package/examples/usage/06-simple-api-server.ts +396 -0
  161. package/examples/usage/07-event-listener.ts +402 -0
  162. package/examples/usage/README.md +383 -0
  163. package/examples/usage/package.json +42 -0
  164. package/package.json +13 -3
  165. package/src/core/websocket-client.ts +43 -9
  166. package/src/formatters/response-formatter.test.ts +8 -2
  167. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
  168. package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
  169. package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
  170. package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
  171. package/src/handlers/message-handlers/index.ts +19 -0
  172. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  173. package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
  174. package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
  175. package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
  176. package/src/handlers/message-handlers/types.ts +6 -0
  177. package/src/handlers/webhook-handler.test.ts +13 -10
  178. package/src/managers/agent-room-manager.ts +609 -0
  179. package/src/managers/index.ts +2 -0
  180. package/src/managers/message-router.ts +48 -6
  181. package/src/managers/room-management-manager.ts +523 -0
  182. package/src/managers/room-manager.ts +12 -6
  183. package/src/teneo-sdk.ts +543 -10
  184. package/src/types/config.ts +13 -6
  185. package/src/types/error-codes.ts +4 -0
  186. package/src/types/events.ts +24 -0
  187. package/src/types/index.ts +55 -0
  188. package/src/types/messages.ts +374 -41
  189. package/src/types/validation.ts +4 -1
  190. package/src/utils/bounded-queue.ts +9 -9
  191. package/src/utils/circuit-breaker.ts +4 -1
  192. package/src/utils/deduplication-cache.test.ts +2 -6
  193. package/src/utils/event-waiter.test.ts +4 -1
  194. package/src/utils/event-waiter.ts +5 -7
  195. package/src/utils/rate-limiter.test.ts +5 -17
  196. package/src/utils/rate-limiter.ts +6 -9
  197. package/src/utils/secure-private-key.test.ts +66 -59
  198. package/src/utils/secure-private-key.ts +10 -16
  199. package/src/utils/signature-verifier.test.ts +75 -70
  200. package/src/utils/signature-verifier.ts +7 -8
  201. package/src/utils/ssrf-validator.test.ts +3 -3
  202. package/tests/integration/room-management.test.ts +514 -0
  203. package/tests/integration/websocket.test.ts +1 -1
  204. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
  205. package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
  206. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
  207. package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
  208. package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
  209. package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
  210. package/tests/unit/managers/agent-room-manager.test.ts +534 -0
  211. package/tests/unit/managers/room-management-manager.test.ts +438 -0
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Minimal example: Teneo Consumer SDK + OpenAI Codex Integration
3
+ *
4
+ * Simple REST API that combines OpenAI Codex agents with Teneo agents.
5
+ * Uses the OpenAI Codex SDK for thread-based conversations.
6
+ */
7
+
8
+ import 'dotenv/config';
9
+ import express, { Request, Response } from 'express';
10
+ import { Codex } from '@openai/codex-sdk';
11
+ import { SDKConfigBuilder, TeneoSDK } from '../../dist/index.js';
12
+
13
+ // Load environment variables
14
+ const WS_URL = process.env.WS_URL || '';
15
+ const PRIVATE_KEY = process.env.PRIVATE_KEY || '';
16
+ const WALLET_ADDRESS = process.env.WALLET_ADDRESS || '';
17
+ const DEFAULT_ROOM = process.env.DEFAULT_ROOM || 'general';
18
+ const LOG_LEVEL = (process.env.LOG_LEVEL || 'info') as 'debug' | 'info' | 'warn' | 'error' | 'silent';
19
+ const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === 'true';
20
+ const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(',').filter(Boolean) || [];
21
+ const ENABLE_CACHE = process.env.ENABLE_CACHE !== 'false';
22
+ const CACHE_TIMEOUT = parseInt(process.env.CACHE_TIMEOUT || '300000');
23
+ const MAX_CACHE_SIZE = parseInt(process.env.MAX_CACHE_SIZE || '100');
24
+ const ENABLE_RECONNECTION = process.env.ENABLE_RECONNECTION !== 'false';
25
+ const RECONNECT_DELAY = parseInt(process.env.RECONNECT_DELAY || '5000');
26
+ const MAX_RECONNECT_ATTEMPTS = parseInt(process.env.MAX_RECONNECT_ATTEMPTS || '10');
27
+ const OPENAI_API_KEY = process.env.OPENAI_API_KEY || '';
28
+
29
+ // Validate required environment variables
30
+ if (!WS_URL || !PRIVATE_KEY) {
31
+ console.error('Missing required environment variables: WS_URL, PRIVATE_KEY');
32
+ console.error('Note: OPENAI_API_KEY is optional - Codex SDK will use default auth if not provided');
33
+ process.exit(1);
34
+ }
35
+
36
+ const app = express();
37
+ app.use(express.json());
38
+
39
+ // Initialize Teneo SDK using SDKConfigBuilder pattern
40
+ const config = new SDKConfigBuilder()
41
+ .withWebSocketUrl(WS_URL)
42
+ .withAuthentication(PRIVATE_KEY, WALLET_ADDRESS) // Wallet auto-derived if not provided
43
+ .withAutoJoinRooms([DEFAULT_ROOM])
44
+ .withReconnection({
45
+ enabled: ENABLE_RECONNECTION,
46
+ delay: RECONNECT_DELAY,
47
+ maxAttempts: MAX_RECONNECT_ATTEMPTS
48
+ })
49
+ .withResponseFormat({ format: 'both', includeMetadata: true })
50
+ .withLogging(LOG_LEVEL)
51
+ .withCache(ENABLE_CACHE, CACHE_TIMEOUT, MAX_CACHE_SIZE)
52
+ .withSignatureVerification({
53
+ enabled: ENABLE_SIG_VERIFICATION,
54
+ trustedAddresses: TRUSTED_ADDRESSES,
55
+ requireFor: ['task_response', 'agent_selected'],
56
+ strictMode: false
57
+ })
58
+ .build();
59
+
60
+ const teneoSDK = new TeneoSDK(config);
61
+
62
+ // Initialize Codex SDK
63
+ // Explicitly set the API key from environment
64
+ const codex = new Codex({
65
+ apiKey: OPENAI_API_KEY || process.env.OPENAI_API_KEY
66
+ });
67
+
68
+ // Connect to Teneo
69
+ console.log('šŸ“” Connecting to Teneo network...');
70
+ await teneoSDK.connect();
71
+ console.log('āœ… Connected to Teneo\n');
72
+
73
+ // Health endpoint
74
+ app.get('/health', (_req: Request, res: Response) => {
75
+ const teneoHealth = teneoSDK.getHealth();
76
+ res.json({
77
+ status: 'ok',
78
+ teneo: {
79
+ connected: teneoHealth.connection.status === 'connected',
80
+ authenticated: teneoHealth.connection.authenticated
81
+ },
82
+ codex: {
83
+ initialized: true,
84
+ apiKeyConfigured: !!OPENAI_API_KEY
85
+ }
86
+ });
87
+ });
88
+
89
+ // Query endpoint - Codex analyzes, then routes to Teneo agent
90
+ app.post('/query', async (req: Request, res: Response) => {
91
+ try {
92
+ const { message } = req.body;
93
+
94
+ if (!message) {
95
+ return res.status(400).json({
96
+ success: false,
97
+ error: 'Message is required'
98
+ });
99
+ }
100
+
101
+ console.log(`\nšŸ” Query: ${message}`);
102
+
103
+ // Step 1: Get available Teneo agents
104
+ const agents = teneoSDK.getAgents();
105
+
106
+ // Step 2: Ask Codex to select the best agent
107
+ console.log('šŸ¤– Asking Codex to select best agent...');
108
+
109
+ const agentList = agents.map(a =>
110
+ `- ${a.name}: ${a.description || 'No description'}`
111
+ ).join('\n');
112
+
113
+ const thread = codex.startThread();
114
+ const codexResponse = await thread.run(
115
+ `You are an agent coordinator. Select the most appropriate agent for the user's query.
116
+
117
+ Available agents:
118
+ ${agentList}
119
+
120
+ User query: ${message}
121
+
122
+ Respond with ONLY the agent name, nothing else.`
123
+ );
124
+
125
+ // Extract text from Codex response
126
+ // Codex SDK returns an object with finalResponse property
127
+ let selectedAgentName: string;
128
+ if (typeof codexResponse === 'string') {
129
+ selectedAgentName = codexResponse.trim();
130
+ } else if (codexResponse && typeof codexResponse === 'object') {
131
+ // Extract from finalResponse property
132
+ selectedAgentName = (codexResponse as any).finalResponse
133
+ || (codexResponse as any).text
134
+ || (codexResponse as any).content
135
+ || String(codexResponse);
136
+ if (typeof selectedAgentName === 'object') {
137
+ selectedAgentName = JSON.stringify(selectedAgentName);
138
+ }
139
+ selectedAgentName = selectedAgentName.trim();
140
+ } else {
141
+ selectedAgentName = agents[0]?.name || '';
142
+ }
143
+
144
+ console.log(`āœ… Selected agent: ${selectedAgentName}`);
145
+
146
+ // Find the agent by name or ID
147
+ const selectedAgent = agents.find(a =>
148
+ a.name?.toLowerCase() === selectedAgentName.toLowerCase() ||
149
+ a.id?.toLowerCase() === selectedAgentName.toLowerCase()
150
+ );
151
+
152
+ if (!selectedAgent) {
153
+ return res.status(404).json({
154
+ success: false,
155
+ error: `Agent '${selectedAgentName}' not found. Available agents: ${agents.map(a => a.name || a.id).join(', ')}`
156
+ });
157
+ }
158
+
159
+ // Step 3: Send direct command to selected Teneo agent (bypasses coordinator)
160
+ // Use the SDK's built-in waitForResponse feature with the improved fallback matching
161
+ console.log(`šŸ“¤ Sending to Teneo agent: ${selectedAgent.name || selectedAgent.id}...`);
162
+ const teneoResponse = await teneoSDK.sendDirectCommand({
163
+ agent: selectedAgent.id,
164
+ command: message,
165
+ room: DEFAULT_ROOM
166
+ }, true); // waitForResponse = true
167
+
168
+ if (!teneoResponse || !teneoResponse.humanized) {
169
+ return res.json({
170
+ success: false,
171
+ error: 'No response from Teneo agent'
172
+ });
173
+ }
174
+
175
+ console.log(`āœ… Response received\n`);
176
+
177
+ // Return combined response
178
+ res.json({
179
+ success: true,
180
+ data: {
181
+ query: message,
182
+ selectedAgent: selectedAgent.name || selectedAgent.id,
183
+ selectedAgentId: selectedAgent.id,
184
+ response: teneoResponse.humanized,
185
+ codexSelection: selectedAgentName,
186
+ metadata: teneoResponse.metadata
187
+ }
188
+ });
189
+
190
+ } catch (error) {
191
+ console.error('āŒ Query error:', error);
192
+ res.status(500).json({
193
+ success: false,
194
+ error: error instanceof Error ? error.message : 'Unknown error'
195
+ });
196
+ }
197
+ });
198
+
199
+ // Direct Codex query (bypass Teneo)
200
+ app.post('/codex', async (req: Request, res: Response) => {
201
+ try {
202
+ const { message, threadId } = req.body;
203
+
204
+ if (!message) {
205
+ return res.status(400).json({
206
+ success: false,
207
+ error: 'Message is required'
208
+ });
209
+ }
210
+
211
+ console.log(`\nšŸ’¬ Codex query: ${message}`);
212
+
213
+ // Resume existing thread or start new one
214
+ const thread = threadId ? codex.resumeThread(threadId) : codex.startThread();
215
+ const codexResult = await thread.run(message);
216
+
217
+ // Extract text from Codex response
218
+ // Codex SDK returns an object with finalResponse property
219
+ let responseText: string;
220
+ if (typeof codexResult === 'string') {
221
+ responseText = codexResult;
222
+ } else if (codexResult && typeof codexResult === 'object') {
223
+ responseText = (codexResult as any).finalResponse
224
+ || (codexResult as any).text
225
+ || (codexResult as any).content
226
+ || JSON.stringify(codexResult);
227
+ } else {
228
+ responseText = String(codexResult);
229
+ }
230
+
231
+ res.json({
232
+ success: true,
233
+ data: {
234
+ response: responseText,
235
+ threadId: thread.id || 'new',
236
+ usage: (codexResult as any).usage // Include token usage if available
237
+ }
238
+ });
239
+
240
+ } catch (error) {
241
+ console.error('āŒ Codex error:', error);
242
+ res.status(500).json({
243
+ success: false,
244
+ error: error instanceof Error ? error.message : 'Unknown error'
245
+ });
246
+ }
247
+ });
248
+
249
+ // List Teneo agents
250
+ app.get('/agents', (_req: Request, res: Response) => {
251
+ const agents = teneoSDK.getAgents();
252
+ res.json({
253
+ success: true,
254
+ agents: agents.map(a => ({
255
+ id: a.id,
256
+ name: a.name,
257
+ description: a.description,
258
+ capabilities: a.capabilities
259
+ }))
260
+ });
261
+ });
262
+
263
+ const PORT = process.env.PORT || 3000;
264
+ app.listen(PORT, () => {
265
+ console.log(`šŸš€ Codex + Teneo Service running on http://localhost:${PORT}`);
266
+ console.log(` Health: GET http://localhost:${PORT}/health`);
267
+ console.log(` Query: POST http://localhost:${PORT}/query`);
268
+ console.log(` Body: { "message": "your query" }`);
269
+ console.log(` Codex: POST http://localhost:${PORT}/codex`);
270
+ console.log(` Body: { "message": "your query", "threadId": "optional" }`);
271
+ console.log(` Agents: GET http://localhost:${PORT}/agents\n`);
272
+ });
273
+
274
+ // Graceful shutdown
275
+ process.on('SIGINT', () => {
276
+ console.log('\nšŸ‘‹ Shutting down...');
277
+ teneoSDK.disconnect();
278
+ teneoSDK.destroy();
279
+ process.exit(0);
280
+ });
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "openai-teneo-integration",
3
+ "version": "1.0.0",
4
+ "description": "Minimal OpenAI + Teneo Consumer SDK integration example",
5
+ "type": "module",
6
+ "main": "index.ts",
7
+ "scripts": {
8
+ "start": "tsx index.ts",
9
+ "dev": "tsx watch index.ts"
10
+ },
11
+ "dependencies": {
12
+ "@openai/codex-sdk": "^0.46.0",
13
+ "@teneo-protocol/sdk": "file:../..",
14
+ "dotenv": "^16.3.1",
15
+ "express": "^4.18.2",
16
+ "openai": "^4.20.0"
17
+ },
18
+ "devDependencies": {
19
+ "@types/express": "^4.17.21",
20
+ "@types/node": "^20.10.5",
21
+ "tsx": "^4.7.0",
22
+ "typescript": "^5.3.3"
23
+ }
24
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "ESNext",
4
+ "moduleResolution": "node",
5
+ "target": "ES2022",
6
+ "lib": ["ES2022"],
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "strict": true,
10
+ "resolveJsonModule": true,
11
+ "outDir": "./dist",
12
+ "rootDir": "."
13
+ },
14
+ "include": ["*.ts"],
15
+ "exclude": ["node_modules", "dist"]
16
+ }
@@ -6,15 +6,17 @@
6
6
  # ============================================================================
7
7
 
8
8
  # WebSocket URL for Teneo AI Network
9
- WS_URL=wss://developer.chatroom.teneo-protocol.ai/ws
9
+ # Production: wss://your-production-server.com/ws
10
+ # Development: wss://your-teneo-server.com/ws
11
+ WS_URL=wss://your-teneo-server.com/ws
10
12
 
11
13
  # Ethereum Private Key (with 0x prefix)
12
14
  # IMPORTANT: Never commit your actual private key to version control!
13
- PRIVATE_KEY=0x
15
+ PRIVATE_KEY=0x1234567890123456789012345678901234567890123456789012345678901234
14
16
 
15
17
  # Ethereum Wallet Address (with 0x prefix)
16
18
  # If not provided, will be derived from the private key
17
- WALLET_ADDRESS=0x
19
+ WALLET_ADDRESS=0x1234567890123456789012345678901234567890
18
20
 
19
21
  # ============================================================================
20
22
  # OPTIONAL: Room Configuration