@mohamedtebo/convai-platform 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +155 -0
  2. package/dist/adapters/index.d.ts +2 -0
  3. package/dist/adapters/index.d.ts.map +1 -0
  4. package/dist/adapters/index.js +6 -0
  5. package/dist/adapters/index.js.map +1 -0
  6. package/dist/adapters/memory-conversation.store.d.ts +12 -0
  7. package/dist/adapters/memory-conversation.store.d.ts.map +1 -0
  8. package/dist/adapters/memory-conversation.store.js +25 -0
  9. package/dist/adapters/memory-conversation.store.js.map +1 -0
  10. package/dist/composed/platform-client.d.ts +29 -0
  11. package/dist/composed/platform-client.d.ts.map +1 -0
  12. package/dist/composed/platform-client.js +16 -0
  13. package/dist/composed/platform-client.js.map +1 -0
  14. package/dist/errors/index.d.ts +4 -0
  15. package/dist/errors/index.d.ts.map +1 -0
  16. package/dist/errors/index.js +11 -0
  17. package/dist/errors/index.js.map +1 -0
  18. package/dist/errors/provider.error.d.ts +16 -0
  19. package/dist/errors/provider.error.d.ts.map +1 -0
  20. package/dist/errors/provider.error.js +15 -0
  21. package/dist/errors/provider.error.js.map +1 -0
  22. package/dist/errors/sdk.error.d.ts +15 -0
  23. package/dist/errors/sdk.error.d.ts.map +1 -0
  24. package/dist/errors/sdk.error.js +16 -0
  25. package/dist/errors/sdk.error.js.map +1 -0
  26. package/dist/errors/tool-loop.error.d.ts +11 -0
  27. package/dist/errors/tool-loop.error.d.ts.map +1 -0
  28. package/dist/errors/tool-loop.error.js +30 -0
  29. package/dist/errors/tool-loop.error.js.map +1 -0
  30. package/dist/factory/index.d.ts +2 -0
  31. package/dist/factory/index.d.ts.map +1 -0
  32. package/dist/factory/index.js +6 -0
  33. package/dist/factory/index.js.map +1 -0
  34. package/dist/factory/provider.factory.d.ts +8 -0
  35. package/dist/factory/provider.factory.d.ts.map +1 -0
  36. package/dist/factory/provider.factory.js +49 -0
  37. package/dist/factory/provider.factory.js.map +1 -0
  38. package/dist/index.d.ts +13 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +34 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/providers/anthropic/anthropic.provider.d.ts +22 -0
  43. package/dist/providers/anthropic/anthropic.provider.d.ts.map +1 -0
  44. package/dist/providers/anthropic/anthropic.provider.js +34 -0
  45. package/dist/providers/anthropic/anthropic.provider.js.map +1 -0
  46. package/dist/providers/anthropic/loops/claude-tool.loop.d.ts +11 -0
  47. package/dist/providers/anthropic/loops/claude-tool.loop.d.ts.map +1 -0
  48. package/dist/providers/anthropic/loops/claude-tool.loop.js +58 -0
  49. package/dist/providers/anthropic/loops/claude-tool.loop.js.map +1 -0
  50. package/dist/providers/anthropic/utils/error-mapper.d.ts +4 -0
  51. package/dist/providers/anthropic/utils/error-mapper.d.ts.map +1 -0
  52. package/dist/providers/anthropic/utils/error-mapper.js +35 -0
  53. package/dist/providers/anthropic/utils/error-mapper.js.map +1 -0
  54. package/dist/providers/openai/builders/conversation-or-create.builder.d.ts +15 -0
  55. package/dist/providers/openai/builders/conversation-or-create.builder.d.ts.map +1 -0
  56. package/dist/providers/openai/builders/conversation-or-create.builder.js +18 -0
  57. package/dist/providers/openai/builders/conversation-or-create.builder.js.map +1 -0
  58. package/dist/providers/openai/loops/assistants-tool.loop.d.ts +19 -0
  59. package/dist/providers/openai/loops/assistants-tool.loop.d.ts.map +1 -0
  60. package/dist/providers/openai/loops/assistants-tool.loop.js +58 -0
  61. package/dist/providers/openai/loops/assistants-tool.loop.js.map +1 -0
  62. package/dist/providers/openai/loops/responses-tool.loop.d.ts +14 -0
  63. package/dist/providers/openai/loops/responses-tool.loop.d.ts.map +1 -0
  64. package/dist/providers/openai/loops/responses-tool.loop.js +87 -0
  65. package/dist/providers/openai/loops/responses-tool.loop.js.map +1 -0
  66. package/dist/providers/openai/openai-assistants.provider.d.ts +27 -0
  67. package/dist/providers/openai/openai-assistants.provider.d.ts.map +1 -0
  68. package/dist/providers/openai/openai-assistants.provider.js +40 -0
  69. package/dist/providers/openai/openai-assistants.provider.js.map +1 -0
  70. package/dist/providers/openai/openai-responses.provider.d.ts +25 -0
  71. package/dist/providers/openai/openai-responses.provider.d.ts.map +1 -0
  72. package/dist/providers/openai/openai-responses.provider.js +35 -0
  73. package/dist/providers/openai/openai-responses.provider.js.map +1 -0
  74. package/dist/providers/openai/operations/create-conversation.operation.d.ts +7 -0
  75. package/dist/providers/openai/operations/create-conversation.operation.d.ts.map +1 -0
  76. package/dist/providers/openai/operations/create-conversation.operation.js +22 -0
  77. package/dist/providers/openai/operations/create-conversation.operation.js.map +1 -0
  78. package/dist/providers/openai/operations/create-response.operation.d.ts +13 -0
  79. package/dist/providers/openai/operations/create-response.operation.d.ts.map +1 -0
  80. package/dist/providers/openai/operations/create-response.operation.js +27 -0
  81. package/dist/providers/openai/operations/create-response.operation.js.map +1 -0
  82. package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts +17 -0
  83. package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +1 -0
  84. package/dist/providers/openai/operations/submit-tool-outputs.operation.js +33 -0
  85. package/dist/providers/openai/operations/submit-tool-outputs.operation.js.map +1 -0
  86. package/dist/providers/openai/utils/error-mapper.d.ts +4 -0
  87. package/dist/providers/openai/utils/error-mapper.d.ts.map +1 -0
  88. package/dist/providers/openai/utils/error-mapper.js +45 -0
  89. package/dist/providers/openai/utils/error-mapper.js.map +1 -0
  90. package/dist/providers/openai/utils/usage-mapper.d.ts +10 -0
  91. package/dist/providers/openai/utils/usage-mapper.d.ts.map +1 -0
  92. package/dist/providers/openai/utils/usage-mapper.js +16 -0
  93. package/dist/providers/openai/utils/usage-mapper.js.map +1 -0
  94. package/dist/safe/index.d.ts +2 -0
  95. package/dist/safe/index.d.ts.map +1 -0
  96. package/dist/safe/index.js +6 -0
  97. package/dist/safe/index.js.map +1 -0
  98. package/dist/safe/safe-platform.client.d.ts +14 -0
  99. package/dist/safe/safe-platform.client.d.ts.map +1 -0
  100. package/dist/safe/safe-platform.client.js +56 -0
  101. package/dist/safe/safe-platform.client.js.map +1 -0
  102. package/dist/src/adapters/index.d.ts +2 -0
  103. package/dist/src/adapters/index.d.ts.map +1 -0
  104. package/dist/src/adapters/index.js +6 -0
  105. package/dist/src/adapters/index.js.map +1 -0
  106. package/dist/src/adapters/memory-conversation.store.d.ts +12 -0
  107. package/dist/src/adapters/memory-conversation.store.d.ts.map +1 -0
  108. package/dist/src/adapters/memory-conversation.store.js +25 -0
  109. package/dist/src/adapters/memory-conversation.store.js.map +1 -0
  110. package/dist/src/composed/platform-client.d.ts +29 -0
  111. package/dist/src/composed/platform-client.d.ts.map +1 -0
  112. package/dist/src/composed/platform-client.js +16 -0
  113. package/dist/src/composed/platform-client.js.map +1 -0
  114. package/dist/src/errors/index.d.ts +4 -0
  115. package/dist/src/errors/index.d.ts.map +1 -0
  116. package/dist/src/errors/index.js +11 -0
  117. package/dist/src/errors/index.js.map +1 -0
  118. package/dist/src/errors/provider.error.d.ts +16 -0
  119. package/dist/src/errors/provider.error.d.ts.map +1 -0
  120. package/dist/src/errors/provider.error.js +15 -0
  121. package/dist/src/errors/provider.error.js.map +1 -0
  122. package/dist/src/errors/sdk.error.d.ts +15 -0
  123. package/dist/src/errors/sdk.error.d.ts.map +1 -0
  124. package/dist/src/errors/sdk.error.js +16 -0
  125. package/dist/src/errors/sdk.error.js.map +1 -0
  126. package/dist/src/errors/tool-loop.error.d.ts +11 -0
  127. package/dist/src/errors/tool-loop.error.d.ts.map +1 -0
  128. package/dist/src/errors/tool-loop.error.js +30 -0
  129. package/dist/src/errors/tool-loop.error.js.map +1 -0
  130. package/dist/src/factory/index.d.ts +2 -0
  131. package/dist/src/factory/index.d.ts.map +1 -0
  132. package/dist/src/factory/index.js +6 -0
  133. package/dist/src/factory/index.js.map +1 -0
  134. package/dist/src/factory/provider.factory.d.ts +8 -0
  135. package/dist/src/factory/provider.factory.d.ts.map +1 -0
  136. package/dist/src/factory/provider.factory.js +49 -0
  137. package/dist/src/factory/provider.factory.js.map +1 -0
  138. package/dist/src/index.d.ts +13 -0
  139. package/dist/src/index.d.ts.map +1 -0
  140. package/dist/src/index.js +34 -0
  141. package/dist/src/index.js.map +1 -0
  142. package/dist/src/providers/anthropic/anthropic.provider.d.ts +22 -0
  143. package/dist/src/providers/anthropic/anthropic.provider.d.ts.map +1 -0
  144. package/dist/src/providers/anthropic/anthropic.provider.js +34 -0
  145. package/dist/src/providers/anthropic/anthropic.provider.js.map +1 -0
  146. package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts +11 -0
  147. package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts.map +1 -0
  148. package/dist/src/providers/anthropic/loops/claude-tool.loop.js +58 -0
  149. package/dist/src/providers/anthropic/loops/claude-tool.loop.js.map +1 -0
  150. package/dist/src/providers/anthropic/utils/error-mapper.d.ts +4 -0
  151. package/dist/src/providers/anthropic/utils/error-mapper.d.ts.map +1 -0
  152. package/dist/src/providers/anthropic/utils/error-mapper.js +35 -0
  153. package/dist/src/providers/anthropic/utils/error-mapper.js.map +1 -0
  154. package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts +15 -0
  155. package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts.map +1 -0
  156. package/dist/src/providers/openai/builders/conversation-or-create.builder.js +18 -0
  157. package/dist/src/providers/openai/builders/conversation-or-create.builder.js.map +1 -0
  158. package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts +19 -0
  159. package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts.map +1 -0
  160. package/dist/src/providers/openai/loops/assistants-tool.loop.js +58 -0
  161. package/dist/src/providers/openai/loops/assistants-tool.loop.js.map +1 -0
  162. package/dist/src/providers/openai/loops/responses-tool.loop.d.ts +14 -0
  163. package/dist/src/providers/openai/loops/responses-tool.loop.d.ts.map +1 -0
  164. package/dist/src/providers/openai/loops/responses-tool.loop.js +87 -0
  165. package/dist/src/providers/openai/loops/responses-tool.loop.js.map +1 -0
  166. package/dist/src/providers/openai/openai-assistants.provider.d.ts +27 -0
  167. package/dist/src/providers/openai/openai-assistants.provider.d.ts.map +1 -0
  168. package/dist/src/providers/openai/openai-assistants.provider.js +40 -0
  169. package/dist/src/providers/openai/openai-assistants.provider.js.map +1 -0
  170. package/dist/src/providers/openai/openai-responses.provider.d.ts +25 -0
  171. package/dist/src/providers/openai/openai-responses.provider.d.ts.map +1 -0
  172. package/dist/src/providers/openai/openai-responses.provider.js +35 -0
  173. package/dist/src/providers/openai/openai-responses.provider.js.map +1 -0
  174. package/dist/src/providers/openai/operations/create-conversation.operation.d.ts +7 -0
  175. package/dist/src/providers/openai/operations/create-conversation.operation.d.ts.map +1 -0
  176. package/dist/src/providers/openai/operations/create-conversation.operation.js +22 -0
  177. package/dist/src/providers/openai/operations/create-conversation.operation.js.map +1 -0
  178. package/dist/src/providers/openai/operations/create-response.operation.d.ts +13 -0
  179. package/dist/src/providers/openai/operations/create-response.operation.d.ts.map +1 -0
  180. package/dist/src/providers/openai/operations/create-response.operation.js +27 -0
  181. package/dist/src/providers/openai/operations/create-response.operation.js.map +1 -0
  182. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts +17 -0
  183. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +1 -0
  184. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js +33 -0
  185. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js.map +1 -0
  186. package/dist/src/providers/openai/utils/error-mapper.d.ts +4 -0
  187. package/dist/src/providers/openai/utils/error-mapper.d.ts.map +1 -0
  188. package/dist/src/providers/openai/utils/error-mapper.js +45 -0
  189. package/dist/src/providers/openai/utils/error-mapper.js.map +1 -0
  190. package/dist/src/providers/openai/utils/usage-mapper.d.ts +10 -0
  191. package/dist/src/providers/openai/utils/usage-mapper.d.ts.map +1 -0
  192. package/dist/src/providers/openai/utils/usage-mapper.js +16 -0
  193. package/dist/src/providers/openai/utils/usage-mapper.js.map +1 -0
  194. package/dist/src/safe/index.d.ts +2 -0
  195. package/dist/src/safe/index.d.ts.map +1 -0
  196. package/dist/src/safe/index.js +6 -0
  197. package/dist/src/safe/index.js.map +1 -0
  198. package/dist/src/safe/safe-platform.client.d.ts +14 -0
  199. package/dist/src/safe/safe-platform.client.d.ts.map +1 -0
  200. package/dist/src/safe/safe-platform.client.js +56 -0
  201. package/dist/src/safe/safe-platform.client.js.map +1 -0
  202. package/dist/src/types/ask-with-tools.types.d.ts +48 -0
  203. package/dist/src/types/ask-with-tools.types.d.ts.map +1 -0
  204. package/dist/src/types/ask-with-tools.types.js +3 -0
  205. package/dist/src/types/ask-with-tools.types.js.map +1 -0
  206. package/dist/src/types/client-config.interface.d.ts +33 -0
  207. package/dist/src/types/client-config.interface.d.ts.map +1 -0
  208. package/dist/src/types/client-config.interface.js +3 -0
  209. package/dist/src/types/client-config.interface.js.map +1 -0
  210. package/dist/src/types/conversation-store.interface.d.ts +24 -0
  211. package/dist/src/types/conversation-store.interface.d.ts.map +1 -0
  212. package/dist/src/types/conversation-store.interface.js +3 -0
  213. package/dist/src/types/conversation-store.interface.js.map +1 -0
  214. package/dist/src/types/index.d.ts +8 -0
  215. package/dist/src/types/index.d.ts.map +1 -0
  216. package/dist/src/types/index.js +7 -0
  217. package/dist/src/types/index.js.map +1 -0
  218. package/dist/src/types/provider.interface.d.ts +13 -0
  219. package/dist/src/types/provider.interface.d.ts.map +1 -0
  220. package/dist/src/types/provider.interface.js +3 -0
  221. package/dist/src/types/provider.interface.js.map +1 -0
  222. package/dist/src/types/sdk-result.interface.d.ts +30 -0
  223. package/dist/src/types/sdk-result.interface.d.ts.map +1 -0
  224. package/dist/src/types/sdk-result.interface.js +11 -0
  225. package/dist/src/types/sdk-result.interface.js.map +1 -0
  226. package/dist/src/types/tool-handler.interface.d.ts +45 -0
  227. package/dist/src/types/tool-handler.interface.d.ts.map +1 -0
  228. package/dist/src/types/tool-handler.interface.js +3 -0
  229. package/dist/src/types/tool-handler.interface.js.map +1 -0
  230. package/dist/tests/safe-client.test.d.ts +2 -0
  231. package/dist/tests/safe-client.test.d.ts.map +1 -0
  232. package/dist/tests/safe-client.test.js +66 -0
  233. package/dist/tests/safe-client.test.js.map +1 -0
  234. package/dist/types/ask-with-tools.types.d.ts +48 -0
  235. package/dist/types/ask-with-tools.types.d.ts.map +1 -0
  236. package/dist/types/ask-with-tools.types.js +3 -0
  237. package/dist/types/ask-with-tools.types.js.map +1 -0
  238. package/dist/types/client-config.interface.d.ts +33 -0
  239. package/dist/types/client-config.interface.d.ts.map +1 -0
  240. package/dist/types/client-config.interface.js +3 -0
  241. package/dist/types/client-config.interface.js.map +1 -0
  242. package/dist/types/conversation-store.interface.d.ts +24 -0
  243. package/dist/types/conversation-store.interface.d.ts.map +1 -0
  244. package/dist/types/conversation-store.interface.js +3 -0
  245. package/dist/types/conversation-store.interface.js.map +1 -0
  246. package/dist/types/index.d.ts +8 -0
  247. package/dist/types/index.d.ts.map +1 -0
  248. package/dist/types/index.js +7 -0
  249. package/dist/types/index.js.map +1 -0
  250. package/dist/types/provider.interface.d.ts +13 -0
  251. package/dist/types/provider.interface.d.ts.map +1 -0
  252. package/dist/types/provider.interface.js +3 -0
  253. package/dist/types/provider.interface.js.map +1 -0
  254. package/dist/types/sdk-result.interface.d.ts +30 -0
  255. package/dist/types/sdk-result.interface.d.ts.map +1 -0
  256. package/dist/types/sdk-result.interface.js +11 -0
  257. package/dist/types/sdk-result.interface.js.map +1 -0
  258. package/dist/types/tool-handler.interface.d.ts +45 -0
  259. package/dist/types/tool-handler.interface.d.ts.map +1 -0
  260. package/dist/types/tool-handler.interface.js +3 -0
  261. package/dist/types/tool-handler.interface.js.map +1 -0
  262. package/package.json +38 -0
package/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # @mohamedtebo/convai-platform
2
+
3
+ > Multi-provider AI conversation SDK — OpenAI Responses/Conversations API, OpenAI Assistants (legacy), and Anthropic Claude — with explicit tool loops, pluggable persistence, and strict Single Responsibility architecture.
4
+
5
+ ---
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @mohamedtebo/convai-platform openai
11
+ # optional: add Anthropic support
12
+ npm install @anthropic-ai/sdk
13
+ ```
14
+
15
+ ---
16
+
17
+ ## Quick start
18
+
19
+ ```typescript
20
+ import { createPlatformClient, MemoryConversationStore } from '@mohamedtebo/convai-platform';
21
+
22
+ const client = createPlatformClient({
23
+ provider: 'openai-responses',
24
+ apiKey: process.env.OPENAI_API_KEY!,
25
+ model: 'gpt-4o',
26
+ conversationStore: new MemoryConversationStore(),
27
+ });
28
+
29
+ const result = await client.safe.askWithTools({
30
+ threadKey: 'thread_abc123',
31
+ chatbotId: 'bot_001',
32
+ userQuestion: 'Hello, how can I book a ticket?',
33
+ instructions: 'You are a helpful booking assistant.',
34
+ });
35
+
36
+ if (result.success) {
37
+ console.log(result.data.outputText);
38
+ } else {
39
+ console.error(result.error.hint);
40
+ }
41
+ ```
42
+
43
+ ---
44
+
45
+ ## Architecture
46
+
47
+ ```
48
+ src/
49
+ ├── index.ts ← Public API (exports)
50
+ ├── composed/
51
+ │ └── platform-client.ts ← createPlatformClient() — composed entry point
52
+ ├── factory/
53
+ │ └── provider.factory.ts ← Maps ClientConfig → AIProvider
54
+ ├── safe/
55
+ │ └── safe-platform.client.ts ← SdkResult<T> wrapper (never throws)
56
+ ├── types/ ← Shared interfaces (all ≤ 60 lines)
57
+ │ ├── ask-with-tools.types.ts
58
+ │ ├── client-config.interface.ts
59
+ │ ├── conversation-store.interface.ts
60
+ │ ├── provider.interface.ts
61
+ │ ├── sdk-result.interface.ts
62
+ │ └── tool-handler.interface.ts
63
+ ├── errors/ ← Typed error hierarchy
64
+ │ ├── sdk.error.ts
65
+ │ ├── provider.error.ts
66
+ │ └── tool-loop.error.ts
67
+ ├── adapters/
68
+ │ └── memory-conversation.store.ts ← In-memory ConversationStore (for tests)
69
+ └── providers/
70
+ ├── openai/
71
+ │ ├── openai-responses.provider.ts ← NEW API: Responses + Conversations
72
+ │ ├── openai-assistants.provider.ts ← LEGACY API: beta.threads (deprecated)
73
+ │ ├── operations/ ← Single-operation files (createResponse, etc.)
74
+ │ ├── loops/ ← Tool loop implementations
75
+ │ ├── builders/ ← State builders (resolveConversationId)
76
+ │ └── utils/ ← error-mapper, usage-mapper
77
+ └── anthropic/
78
+ ├── anthropic.provider.ts
79
+ ├── loops/claude-tool.loop.ts
80
+ └── utils/error-mapper.ts
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Providers
86
+
87
+ | Provider | Config `provider` value | Notes |
88
+ |---|---|---|
89
+ | OpenAI Responses + Conversations | `openai-responses` | **Recommended** |
90
+ | OpenAI Assistants (legacy) | `openai-assistants` | Deprecated — use during migration |
91
+ | Anthropic Claude | `anthropic` | Requires `@anthropic-ai/sdk` peer dep |
92
+
93
+ ---
94
+
95
+ ## Pluggable Persistence — ConversationStore
96
+
97
+ ```typescript
98
+ export interface ConversationStore {
99
+ load(threadKey: string): Promise<ConversationState | null>;
100
+ save(threadKey: string, state: ConversationState): Promise<void>;
101
+ create(threadKey: string, conversationId: string): Promise<ConversationState>;
102
+ }
103
+ ```
104
+
105
+ Telbany ships a `MongoConversationStore` inside `api/src/core/convai-adapters/` that reads/writes `Thread.openai_conversation_id` and `Thread.last_response_id`.
106
+
107
+ ---
108
+
109
+ ## Pluggable Tool Handling — ToolHandler
110
+
111
+ ```typescript
112
+ export interface ToolHandler {
113
+ buildOutput(call: RawToolCall, ctx: ToolHandlerContext): Promise<ToolOutput | undefined>;
114
+ extractResult(calls: RawToolCall[], outputs: ToolOutput[], ctx: ToolHandlerContext): Promise<unknown>;
115
+ }
116
+ ```
117
+
118
+ Telbany ships a `TelbanyToolHandler` that delegates to existing run-completion services so all business logic stays in `telbany`, not in the SDK.
119
+
120
+ ---
121
+
122
+ ## Result type
123
+
124
+ ```typescript
125
+ const result = await client.safe.askWithTools(params);
126
+
127
+ if (result.success) {
128
+ if (result.data.kind === 'text') {
129
+ console.log(result.data.outputText); // plain AI reply
130
+ } else {
131
+ console.log(result.data.toolCallResult); // ticket, product, etc.
132
+ }
133
+ } else {
134
+ console.error(result.error.code, result.error.hint);
135
+ }
136
+ ```
137
+
138
+ ---
139
+
140
+ ## Build & Publish
141
+
142
+ ```bash
143
+ # inside convai-platform/
144
+ npm install
145
+ npm run build
146
+ npm publish --access public
147
+ ```
148
+
149
+ Requires npm login under `mohamedtebo` account, or `npm login --registry https://registry.npmjs.org`.
150
+
151
+ ---
152
+
153
+ ## License
154
+
155
+ MIT © mohamedtebo
@@ -0,0 +1,2 @@
1
+ export { MemoryConversationStore } from './memory-conversation.store';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryConversationStore = void 0;
4
+ var memory_conversation_store_1 = require("./memory-conversation.store");
5
+ Object.defineProperty(exports, "MemoryConversationStore", { enumerable: true, get: function () { return memory_conversation_store_1.MemoryConversationStore; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;AAAA,yEAAsE;AAA7D,oIAAA,uBAAuB,OAAA"}
@@ -0,0 +1,12 @@
1
+ import type { ConversationState, ConversationStore } from '../types/conversation-store.interface';
2
+ /**
3
+ * In-memory ConversationStore — useful for tests and lightweight apps.
4
+ * State is lost when the process restarts. Use MongoConversationStore in production.
5
+ */
6
+ export declare class MemoryConversationStore implements ConversationStore {
7
+ private readonly map;
8
+ load(threadKey: string): Promise<ConversationState | null>;
9
+ save(threadKey: string, state: ConversationState): Promise<void>;
10
+ create(threadKey: string, conversationId: string): Promise<ConversationState>;
11
+ }
12
+ //# sourceMappingURL=memory-conversation.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-conversation.store.d.ts","sourceRoot":"","sources":["../../src/adapters/memory-conversation.store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAElG;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwC;IAEtD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAI1D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAKpF"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryConversationStore = void 0;
4
+ /**
5
+ * In-memory ConversationStore — useful for tests and lightweight apps.
6
+ * State is lost when the process restarts. Use MongoConversationStore in production.
7
+ */
8
+ class MemoryConversationStore {
9
+ constructor() {
10
+ this.map = new Map();
11
+ }
12
+ async load(threadKey) {
13
+ return this.map.get(threadKey) ?? null;
14
+ }
15
+ async save(threadKey, state) {
16
+ this.map.set(threadKey, state);
17
+ }
18
+ async create(threadKey, conversationId) {
19
+ const state = { conversationId };
20
+ this.map.set(threadKey, state);
21
+ return state;
22
+ }
23
+ }
24
+ exports.MemoryConversationStore = MemoryConversationStore;
25
+ //# sourceMappingURL=memory-conversation.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-conversation.store.js","sourceRoot":"","sources":["../../src/adapters/memory-conversation.store.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,uBAAuB;IAApC;QACmB,QAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IAe9D,CAAC;IAbC,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,KAAwB;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,cAAsB;QACpD,MAAM,KAAK,GAAsB,EAAE,cAAc,EAAE,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAhBD,0DAgBC"}
@@ -0,0 +1,29 @@
1
+ import type { ClientConfig } from '../types/client-config.interface';
2
+ import type { AskWithToolsParams, AskWithToolsResult } from '../types/ask-with-tools.types';
3
+ import type { SdkResult } from '../types/sdk-result.interface';
4
+ /**
5
+ * Fully composed SDK client.
6
+ * Exposes both a raw API (throws on error) and a safe API (returns SdkResult).
7
+ *
8
+ * @example
9
+ * const client = createPlatformClient({
10
+ * provider: 'openai-responses',
11
+ * apiKey: process.env.OPENAI_API_KEY!,
12
+ * model: 'gpt-4o',
13
+ * conversationStore: new MongoConversationStore(),
14
+ * toolHandler: new TelbanyToolHandler(),
15
+ * });
16
+ *
17
+ * const result = await client.safe.askWithTools({ ... });
18
+ * if (result.success) console.log(result.data.outputText);
19
+ */
20
+ export interface PlatformClient {
21
+ /** Call askWithTools directly — throws SdkError on failure. */
22
+ askWithTools(params: AskWithToolsParams): Promise<AskWithToolsResult>;
23
+ /** Safe version — never throws, returns SdkResult<T>. */
24
+ safe: {
25
+ askWithTools(params: AskWithToolsParams): Promise<SdkResult<AskWithToolsResult>>;
26
+ };
27
+ }
28
+ export declare function createPlatformClient(config: ClientConfig): PlatformClient;
29
+ //# sourceMappingURL=platform-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-client.d.ts","sourceRoot":"","sources":["../../src/composed/platform-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI/D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtE,yDAAyD;IACzD,IAAI,EAAE;QACJ,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC;KAClF,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAUzE"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPlatformClient = createPlatformClient;
4
+ const provider_factory_1 = require("../factory/provider.factory");
5
+ const safe_platform_client_1 = require("../safe/safe-platform.client");
6
+ function createPlatformClient(config) {
7
+ const provider = (0, provider_factory_1.buildProvider)(config);
8
+ const safeClient = new safe_platform_client_1.SafePlatformClient(provider);
9
+ return {
10
+ askWithTools: (params) => provider.askWithTools(params),
11
+ safe: {
12
+ askWithTools: (params) => safeClient.askWithTools(params),
13
+ },
14
+ };
15
+ }
16
+ //# sourceMappingURL=platform-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-client.js","sourceRoot":"","sources":["../../src/composed/platform-client.ts"],"names":[],"mappings":";;AA+BA,oDAUC;AAtCD,kEAA4D;AAC5D,uEAAkE;AA2BlE,SAAgB,oBAAoB,CAAC,MAAoB;IACvD,MAAM,QAAQ,GAAG,IAAA,gCAAa,EAAC,MAAM,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,yCAAkB,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO;QACL,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;QACvD,IAAI,EAAE;YACJ,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;SAC1D;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { SdkError } from './sdk.error';
2
+ export { ProviderError } from './provider.error';
3
+ export { ToolLoopError, NoToolHandlerError } from './tool-loop.error';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoToolHandlerError = exports.ToolLoopError = exports.ProviderError = exports.SdkError = void 0;
4
+ var sdk_error_1 = require("./sdk.error");
5
+ Object.defineProperty(exports, "SdkError", { enumerable: true, get: function () { return sdk_error_1.SdkError; } });
6
+ var provider_error_1 = require("./provider.error");
7
+ Object.defineProperty(exports, "ProviderError", { enumerable: true, get: function () { return provider_error_1.ProviderError; } });
8
+ var tool_loop_error_1 = require("./tool-loop.error");
9
+ Object.defineProperty(exports, "ToolLoopError", { enumerable: true, get: function () { return tool_loop_error_1.ToolLoopError; } });
10
+ Object.defineProperty(exports, "NoToolHandlerError", { enumerable: true, get: function () { return tool_loop_error_1.NoToolHandlerError; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,qDAAsE;AAA7D,gHAAA,aAAa,OAAA;AAAE,qHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,16 @@
1
+ import { SdkError } from './sdk.error';
2
+ /** Error from the AI provider itself (API error, rate limit, auth failure). */
3
+ export declare class ProviderError extends SdkError {
4
+ readonly statusCode?: number;
5
+ readonly provider: string;
6
+ constructor({ provider, code, message, statusCode, retryable, retryAfterMs, requestId, }: {
7
+ provider: string;
8
+ code: string;
9
+ message: string;
10
+ statusCode?: number;
11
+ retryable?: boolean;
12
+ retryAfterMs?: number;
13
+ requestId?: string;
14
+ });
15
+ }
16
+ //# sourceMappingURL=provider.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.error.d.ts","sourceRoot":"","sources":["../../src/errors/provider.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,+EAA+E;AAC/E,qBAAa,aAAc,SAAQ,QAAQ;IACzC,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAErB,EACV,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,UAAU,EACV,SAAiB,EACjB,YAAY,EACZ,SAAS,GACV,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;CAMF"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProviderError = void 0;
4
+ const sdk_error_1 = require("./sdk.error");
5
+ /** Error from the AI provider itself (API error, rate limit, auth failure). */
6
+ class ProviderError extends sdk_error_1.SdkError {
7
+ constructor({ provider, code, message, statusCode, retryable = false, retryAfterMs, requestId, }) {
8
+ super({ code, message, retryable, retryAfterMs, requestId });
9
+ this.name = 'ProviderError';
10
+ this.provider = provider;
11
+ this.statusCode = statusCode;
12
+ }
13
+ }
14
+ exports.ProviderError = ProviderError;
15
+ //# sourceMappingURL=provider.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.error.js","sourceRoot":"","sources":["../../src/errors/provider.error.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AAEvC,+EAA+E;AAC/E,MAAa,aAAc,SAAQ,oBAAQ;IAIzC,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,UAAU,EACV,SAAS,GAAG,KAAK,EACjB,YAAY,EACZ,SAAS,GASV;QACC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AA1BD,sCA0BC"}
@@ -0,0 +1,15 @@
1
+ /** Base SDK error — all thrown errors extend this. */
2
+ export declare class SdkError extends Error {
3
+ readonly code: string;
4
+ readonly retryable: boolean;
5
+ readonly retryAfterMs?: number;
6
+ readonly requestId?: string;
7
+ constructor({ code, message, retryable, retryAfterMs, requestId, }: {
8
+ code: string;
9
+ message: string;
10
+ retryable?: boolean;
11
+ retryAfterMs?: number;
12
+ requestId?: string;
13
+ });
14
+ }
15
+ //# sourceMappingURL=sdk.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.error.d.ts","sourceRoot":"","sources":["../../src/errors/sdk.error.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,SAAgB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtC,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEvB,EACV,IAAI,EACJ,OAAO,EACP,SAAiB,EACjB,YAAY,EACZ,SAAS,GACV,EAAE;QACD,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;CAQF"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SdkError = void 0;
4
+ /** Base SDK error — all thrown errors extend this. */
5
+ class SdkError extends Error {
6
+ constructor({ code, message, retryable = false, retryAfterMs, requestId, }) {
7
+ super(message);
8
+ this.name = 'SdkError';
9
+ this.code = code;
10
+ this.retryable = retryable;
11
+ this.retryAfterMs = retryAfterMs;
12
+ this.requestId = requestId;
13
+ }
14
+ }
15
+ exports.SdkError = SdkError;
16
+ //# sourceMappingURL=sdk.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.error.js","sourceRoot":"","sources":["../../src/errors/sdk.error.ts"],"names":[],"mappings":";;;AAAA,sDAAsD;AACtD,MAAa,QAAS,SAAQ,KAAK;IAMjC,YAAY,EACV,IAAI,EACJ,OAAO,EACP,SAAS,GAAG,KAAK,EACjB,YAAY,EACZ,SAAS,GAOV;QACC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AA1BD,4BA0BC"}
@@ -0,0 +1,11 @@
1
+ import { SdkError } from './sdk.error';
2
+ /** Error thrown when the AI tool loop exceeds the maximum number of turns. */
3
+ export declare class ToolLoopError extends SdkError {
4
+ readonly turnsExceeded: number;
5
+ constructor(turnsExceeded: number);
6
+ }
7
+ /** Error thrown when no tool handler is configured but the AI requests tool calls. */
8
+ export declare class NoToolHandlerError extends SdkError {
9
+ constructor();
10
+ }
11
+ //# sourceMappingURL=tool-loop.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-loop.error.d.ts","sourceRoot":"","sources":["../../src/errors/tool-loop.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,8EAA8E;AAC9E,qBAAa,aAAc,SAAQ,QAAQ;IACzC,SAAgB,aAAa,EAAE,MAAM,CAAC;gBAE1B,aAAa,EAAE,MAAM;CASlC;AAED,sFAAsF;AACtF,qBAAa,kBAAmB,SAAQ,QAAQ;;CAS/C"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoToolHandlerError = exports.ToolLoopError = void 0;
4
+ const sdk_error_1 = require("./sdk.error");
5
+ /** Error thrown when the AI tool loop exceeds the maximum number of turns. */
6
+ class ToolLoopError extends sdk_error_1.SdkError {
7
+ constructor(turnsExceeded) {
8
+ super({
9
+ code: 'TOOL_LOOP_MAX_TURNS_EXCEEDED',
10
+ message: `Tool loop exceeded ${turnsExceeded} turns without a final answer`,
11
+ retryable: false,
12
+ });
13
+ this.name = 'ToolLoopError';
14
+ this.turnsExceeded = turnsExceeded;
15
+ }
16
+ }
17
+ exports.ToolLoopError = ToolLoopError;
18
+ /** Error thrown when no tool handler is configured but the AI requests tool calls. */
19
+ class NoToolHandlerError extends sdk_error_1.SdkError {
20
+ constructor() {
21
+ super({
22
+ code: 'NO_TOOL_HANDLER_CONFIGURED',
23
+ message: 'AI requested tool calls but no ToolHandler was configured in ClientConfig',
24
+ retryable: false,
25
+ });
26
+ this.name = 'NoToolHandlerError';
27
+ }
28
+ }
29
+ exports.NoToolHandlerError = NoToolHandlerError;
30
+ //# sourceMappingURL=tool-loop.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-loop.error.js","sourceRoot":"","sources":["../../src/errors/tool-loop.error.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AAEvC,8EAA8E;AAC9E,MAAa,aAAc,SAAQ,oBAAQ;IAGzC,YAAY,aAAqB;QAC/B,KAAK,CAAC;YACJ,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,sBAAsB,aAAa,+BAA+B;YAC3E,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAZD,sCAYC;AAED,sFAAsF;AACtF,MAAa,kBAAmB,SAAQ,oBAAQ;IAC9C;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,2EAA2E;YACpF,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AATD,gDASC"}
@@ -0,0 +1,2 @@
1
+ export { buildProvider } from './provider.factory';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProvider = void 0;
4
+ var provider_factory_1 = require("./provider.factory");
5
+ Object.defineProperty(exports, "buildProvider", { enumerable: true, get: function () { return provider_factory_1.buildProvider; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAA1C,iHAAA,aAAa,OAAA"}
@@ -0,0 +1,8 @@
1
+ import type { ClientConfig } from '../types/client-config.interface';
2
+ import type { AIProvider } from '../types/provider.interface';
3
+ /**
4
+ * Build the correct AIProvider implementation from a ClientConfig.
5
+ * Add new providers here without touching any other file.
6
+ */
7
+ export declare function buildProvider(config: ClientConfig): AIProvider;
8
+ //# sourceMappingURL=provider.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.factory.d.ts","sourceRoot":"","sources":["../../src/factory/provider.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAM9D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAoC9D"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildProvider = buildProvider;
4
+ const openai_responses_provider_1 = require("../providers/openai/openai-responses.provider");
5
+ const openai_assistants_provider_1 = require("../providers/openai/openai-assistants.provider");
6
+ const anthropic_provider_1 = require("../providers/anthropic/anthropic.provider");
7
+ const memory_conversation_store_1 = require("../adapters/memory-conversation.store");
8
+ /**
9
+ * Build the correct AIProvider implementation from a ClientConfig.
10
+ * Add new providers here without touching any other file.
11
+ */
12
+ function buildProvider(config) {
13
+ switch (config.provider) {
14
+ case 'openai-responses': {
15
+ const store = config.conversationStore ?? new memory_conversation_store_1.MemoryConversationStore();
16
+ return new openai_responses_provider_1.OpenAIResponsesProvider({
17
+ apiKey: config.apiKey,
18
+ model: config.model ?? 'gpt-4o',
19
+ conversationStore: store,
20
+ toolHandler: config.toolHandler,
21
+ maxRetries: config.maxRetries,
22
+ timeoutMs: config.timeoutMs,
23
+ });
24
+ }
25
+ case 'openai-assistants': {
26
+ return new openai_assistants_provider_1.OpenAIAssistantsProvider({
27
+ apiKey: config.apiKey,
28
+ assistantId: config.model ?? '',
29
+ model: 'gpt-4o',
30
+ toolHandler: config.toolHandler,
31
+ maxRetries: config.maxRetries,
32
+ timeoutMs: config.timeoutMs,
33
+ });
34
+ }
35
+ case 'anthropic': {
36
+ return new anthropic_provider_1.AnthropicProvider({
37
+ apiKey: config.apiKey,
38
+ model: config.model ?? 'claude-opus-4-5',
39
+ toolHandler: config.toolHandler,
40
+ maxRetries: config.maxRetries,
41
+ });
42
+ }
43
+ default: {
44
+ const exhaustive = config.provider;
45
+ throw new Error(`Unknown provider: ${String(exhaustive)}`);
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=provider.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.factory.js","sourceRoot":"","sources":["../../src/factory/provider.factory.ts"],"names":[],"mappings":";;AAWA,sCAoCC;AA7CD,6FAAwF;AACxF,+FAA0F;AAC1F,kFAA8E;AAC9E,qFAAgF;AAEhF;;;GAGG;AACH,SAAgB,aAAa,CAAC,MAAoB;IAChD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,MAAM,CAAC,iBAAiB,IAAI,IAAI,mDAAuB,EAAE,CAAC;YACxE,OAAO,IAAI,mDAAuB,CAAC;gBACjC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ;gBAC/B,iBAAiB,EAAE,KAAK;gBACxB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,OAAO,IAAI,qDAAwB,CAAC;gBAClC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;gBAC/B,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,sCAAiB,CAAC;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,iBAAiB;gBACxC,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,UAAU,GAAU,MAAM,CAAC,QAAQ,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { createPlatformClient } from './composed/platform-client';
2
+ export type { PlatformClient } from './composed/platform-client';
3
+ export type { ClientConfig, ProviderType, AIProvider, AskWithToolsParams, AskWithToolsResult, TextResult, ToolResult, UsageMetrics, ConversationState, ConversationStore, RawToolCall, ToolOutput, ToolHandler, ToolHandlerContext, SdkResult, FormattedError, } from './types';
4
+ export { ok, fail } from './types';
5
+ export { SdkError } from './errors/sdk.error';
6
+ export { ProviderError } from './errors/provider.error';
7
+ export { ToolLoopError, NoToolHandlerError } from './errors/tool-loop.error';
8
+ export { MemoryConversationStore } from './adapters/memory-conversation.store';
9
+ export { OpenAIResponsesProvider } from './providers/openai/openai-responses.provider';
10
+ export { OpenAIAssistantsProvider } from './providers/openai/openai-assistants.provider';
11
+ export { AnthropicProvider } from './providers/anthropic/anthropic.provider';
12
+ export { SafePlatformClient } from './safe/safe-platform.client';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ // ──────────────────────────────────────────────────────────────────────
3
+ // @mohamedtebo/convai-platform — public API
4
+ // ──────────────────────────────────────────────────────────────────────
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SafePlatformClient = exports.AnthropicProvider = exports.OpenAIAssistantsProvider = exports.OpenAIResponsesProvider = exports.MemoryConversationStore = exports.NoToolHandlerError = exports.ToolLoopError = exports.ProviderError = exports.SdkError = exports.fail = exports.ok = exports.createPlatformClient = void 0;
7
+ // Primary composed entry point
8
+ var platform_client_1 = require("./composed/platform-client");
9
+ Object.defineProperty(exports, "createPlatformClient", { enumerable: true, get: function () { return platform_client_1.createPlatformClient; } });
10
+ var types_1 = require("./types");
11
+ Object.defineProperty(exports, "ok", { enumerable: true, get: function () { return types_1.ok; } });
12
+ Object.defineProperty(exports, "fail", { enumerable: true, get: function () { return types_1.fail; } });
13
+ // Errors
14
+ var sdk_error_1 = require("./errors/sdk.error");
15
+ Object.defineProperty(exports, "SdkError", { enumerable: true, get: function () { return sdk_error_1.SdkError; } });
16
+ var provider_error_1 = require("./errors/provider.error");
17
+ Object.defineProperty(exports, "ProviderError", { enumerable: true, get: function () { return provider_error_1.ProviderError; } });
18
+ var tool_loop_error_1 = require("./errors/tool-loop.error");
19
+ Object.defineProperty(exports, "ToolLoopError", { enumerable: true, get: function () { return tool_loop_error_1.ToolLoopError; } });
20
+ Object.defineProperty(exports, "NoToolHandlerError", { enumerable: true, get: function () { return tool_loop_error_1.NoToolHandlerError; } });
21
+ // Built-in adapters
22
+ var memory_conversation_store_1 = require("./adapters/memory-conversation.store");
23
+ Object.defineProperty(exports, "MemoryConversationStore", { enumerable: true, get: function () { return memory_conversation_store_1.MemoryConversationStore; } });
24
+ // Individual providers (for consumers who want fine-grained control)
25
+ var openai_responses_provider_1 = require("./providers/openai/openai-responses.provider");
26
+ Object.defineProperty(exports, "OpenAIResponsesProvider", { enumerable: true, get: function () { return openai_responses_provider_1.OpenAIResponsesProvider; } });
27
+ var openai_assistants_provider_1 = require("./providers/openai/openai-assistants.provider");
28
+ Object.defineProperty(exports, "OpenAIAssistantsProvider", { enumerable: true, get: function () { return openai_assistants_provider_1.OpenAIAssistantsProvider; } });
29
+ var anthropic_provider_1 = require("./providers/anthropic/anthropic.provider");
30
+ Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return anthropic_provider_1.AnthropicProvider; } });
31
+ // Safe layer (standalone)
32
+ var safe_platform_client_1 = require("./safe/safe-platform.client");
33
+ Object.defineProperty(exports, "SafePlatformClient", { enumerable: true, get: function () { return safe_platform_client_1.SafePlatformClient; } });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,4CAA4C;AAC5C,yEAAyE;;;AAEzE,+BAA+B;AAC/B,8DAAkE;AAAzD,uHAAA,oBAAoB,OAAA;AAsB7B,iCAAmC;AAA1B,2FAAA,EAAE,OAAA;AAAE,6FAAA,IAAI,OAAA;AAEjB,SAAS;AACT,gDAA8C;AAArC,qGAAA,QAAQ,OAAA;AACjB,0DAAwD;AAA/C,+GAAA,aAAa,OAAA;AACtB,4DAA6E;AAApE,gHAAA,aAAa,OAAA;AAAE,qHAAA,kBAAkB,OAAA;AAE1C,oBAAoB;AACpB,kFAA+E;AAAtE,oIAAA,uBAAuB,OAAA;AAEhC,qEAAqE;AACrE,0FAAuF;AAA9E,oIAAA,uBAAuB,OAAA;AAChC,4FAAyF;AAAhF,sIAAA,wBAAwB,OAAA;AACjC,+EAA6E;AAApE,uHAAA,iBAAiB,OAAA;AAE1B,0BAA0B;AAC1B,oEAAiE;AAAxD,0HAAA,kBAAkB,OAAA"}
@@ -0,0 +1,22 @@
1
+ import type { AIProvider } from '../../types/provider.interface';
2
+ import type { AskWithToolsParams, AskWithToolsResult } from '../../types/ask-with-tools.types';
3
+ import type { ToolHandler } from '../../types/tool-handler.interface';
4
+ export interface AnthropicProviderConfig {
5
+ apiKey: string;
6
+ model: string;
7
+ toolHandler?: ToolHandler;
8
+ maxRetries?: number;
9
+ }
10
+ /**
11
+ * Anthropic Claude provider.
12
+ * Implements the same AIProvider interface as the OpenAI providers
13
+ * so telbany can swap providers by changing a single config field.
14
+ */
15
+ export declare class AnthropicProvider implements AIProvider {
16
+ private readonly anthropic;
17
+ private readonly model;
18
+ private readonly handler?;
19
+ constructor(config: AnthropicProviderConfig);
20
+ askWithTools(params: AskWithToolsParams): Promise<AskWithToolsResult>;
21
+ }
22
+ //# sourceMappingURL=anthropic.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/anthropic.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAItE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,UAAU;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAc;gBAE3B,MAAM,EAAE,uBAAuB;IAYrC,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAU5E"}