@optima-chat/agentic-sdk 0.1.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 (73) hide show
  1. package/dist/client/conversation-api.d.ts +23 -0
  2. package/dist/client/conversation-api.d.ts.map +1 -0
  3. package/dist/client/conversation-api.js +207 -0
  4. package/dist/client/conversation-api.js.map +1 -0
  5. package/dist/client/error-mapper.d.ts +5 -0
  6. package/dist/client/error-mapper.d.ts.map +1 -0
  7. package/dist/client/error-mapper.js +19 -0
  8. package/dist/client/error-mapper.js.map +1 -0
  9. package/dist/client/event-parser.d.ts +79 -0
  10. package/dist/client/event-parser.d.ts.map +1 -0
  11. package/dist/client/event-parser.js +219 -0
  12. package/dist/client/event-parser.js.map +1 -0
  13. package/dist/client/gateway-client.d.ts +45 -0
  14. package/dist/client/gateway-client.d.ts.map +1 -0
  15. package/dist/client/gateway-client.js +172 -0
  16. package/dist/client/gateway-client.js.map +1 -0
  17. package/dist/hooks/use-approval.d.ts +8 -0
  18. package/dist/hooks/use-approval.d.ts.map +1 -0
  19. package/dist/hooks/use-approval.js +39 -0
  20. package/dist/hooks/use-approval.js.map +1 -0
  21. package/dist/hooks/use-connection-state.d.ts +7 -0
  22. package/dist/hooks/use-connection-state.d.ts.map +1 -0
  23. package/dist/hooks/use-connection-state.js +12 -0
  24. package/dist/hooks/use-connection-state.js.map +1 -0
  25. package/dist/hooks/use-conversations.d.ts +12 -0
  26. package/dist/hooks/use-conversations.d.ts.map +1 -0
  27. package/dist/hooks/use-conversations.js +42 -0
  28. package/dist/hooks/use-conversations.js.map +1 -0
  29. package/dist/hooks/use-current-chat.d.ts +14 -0
  30. package/dist/hooks/use-current-chat.d.ts.map +1 -0
  31. package/dist/hooks/use-current-chat.js +142 -0
  32. package/dist/hooks/use-current-chat.js.map +1 -0
  33. package/dist/hooks/use-question.d.ts +7 -0
  34. package/dist/hooks/use-question.d.ts.map +1 -0
  35. package/dist/hooks/use-question.js +17 -0
  36. package/dist/hooks/use-question.js.map +1 -0
  37. package/dist/hooks/use-session.d.ts +7 -0
  38. package/dist/hooks/use-session.d.ts.map +1 -0
  39. package/dist/hooks/use-session.js +13 -0
  40. package/dist/hooks/use-session.js.map +1 -0
  41. package/dist/hooks/use-switch-config.d.ts +7 -0
  42. package/dist/hooks/use-switch-config.d.ts.map +1 -0
  43. package/dist/hooks/use-switch-config.js +30 -0
  44. package/dist/hooks/use-switch-config.js.map +1 -0
  45. package/dist/index.d.ts +13 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +12 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/provider/chat-context.d.ts +14 -0
  50. package/dist/provider/chat-context.d.ts.map +1 -0
  51. package/dist/provider/chat-context.js +10 -0
  52. package/dist/provider/chat-context.js.map +1 -0
  53. package/dist/provider/chat-provider.d.ts +16 -0
  54. package/dist/provider/chat-provider.d.ts.map +1 -0
  55. package/dist/provider/chat-provider.js +200 -0
  56. package/dist/provider/chat-provider.js.map +1 -0
  57. package/dist/store/chat-store.d.ts +65 -0
  58. package/dist/store/chat-store.d.ts.map +1 -0
  59. package/dist/store/chat-store.js +220 -0
  60. package/dist/store/chat-store.js.map +1 -0
  61. package/dist/types.d.ts +152 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +10 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/workspace/default-provider.d.ts +14 -0
  66. package/dist/workspace/default-provider.d.ts.map +1 -0
  67. package/dist/workspace/default-provider.js +46 -0
  68. package/dist/workspace/default-provider.js.map +1 -0
  69. package/dist/workspace/types.d.ts +11 -0
  70. package/dist/workspace/types.d.ts.map +1 -0
  71. package/dist/workspace/types.js +2 -0
  72. package/dist/workspace/types.js.map +1 -0
  73. package/package.json +49 -0
@@ -0,0 +1,23 @@
1
+ import type { Conversation, Message } from '../types.js';
2
+ export type AuthenticatedFetchFn = (url: string, init?: RequestInit) => Promise<Response>;
3
+ /**
4
+ * REST API client for conversation CRUD and message history.
5
+ *
6
+ * Gateway REST responses use snake_case and some types do not match the
7
+ * agentic-sdk camelCase public types. This client performs all normalization
8
+ * internally so callers always see the SDK-native shapes.
9
+ */
10
+ export declare class ConversationAPI {
11
+ private readonly authenticatedFetch;
12
+ private readonly httpBase;
13
+ constructor(gatewayUrl: string, authenticatedFetch: AuthenticatedFetchFn);
14
+ listConversations(): Promise<Conversation[]>;
15
+ createConversation(title?: string): Promise<Conversation>;
16
+ deleteConversation(conversationId: string): Promise<void>;
17
+ renameConversation(conversationId: string, title: string): Promise<void>;
18
+ getMessages(conversationId: string, options?: {
19
+ skip?: number;
20
+ take?: number;
21
+ }): Promise<Message[]>;
22
+ }
23
+ //# sourceMappingURL=conversation-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-api.d.ts","sourceRoot":"","sources":["../../src/client/conversation-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAuB,MAAM,aAAa,CAAC;AAE9E,MAAM,MAAM,oBAAoB,GAAG,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB;;;;;;GAMG;AACH,qBAAa,eAAe;IAKxB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAJrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGhC,UAAU,EAAE,MAAM,EACD,kBAAkB,EAAE,oBAAoB;IAOrD,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAU5C,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAczD,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,kBAAkB,CACtB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAYV,WAAW,CACf,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACzC,OAAO,CAAC,OAAO,EAAE,CAAC;CAYtB"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * REST API client for conversation CRUD and message history.
3
+ *
4
+ * Gateway REST responses use snake_case and some types do not match the
5
+ * agentic-sdk camelCase public types. This client performs all normalization
6
+ * internally so callers always see the SDK-native shapes.
7
+ */
8
+ export class ConversationAPI {
9
+ authenticatedFetch;
10
+ httpBase;
11
+ constructor(gatewayUrl, authenticatedFetch) {
12
+ this.authenticatedFetch = authenticatedFetch;
13
+ // Derive REST base URL from the WebSocket gateway URL.
14
+ // e.g. wss://host/ws -> https://host
15
+ this.httpBase = deriveHttpBase(gatewayUrl);
16
+ }
17
+ async listConversations() {
18
+ const res = await this.authenticatedFetch(`${this.httpBase}/api/conversations`);
19
+ if (!res.ok)
20
+ throw await toChatError(res, 'listConversations');
21
+ const raw = (await res.json());
22
+ const list = extractList(raw);
23
+ return list.map(mapConversation);
24
+ }
25
+ async createConversation(title) {
26
+ const res = await this.authenticatedFetch(`${this.httpBase}/api/conversations`, {
27
+ method: 'POST',
28
+ headers: { 'Content-Type': 'application/json' },
29
+ body: JSON.stringify(title ? { title } : {}),
30
+ });
31
+ if (!res.ok)
32
+ throw await toChatError(res, 'createConversation');
33
+ const raw = (await res.json());
34
+ return mapConversation(raw);
35
+ }
36
+ async deleteConversation(conversationId) {
37
+ const res = await this.authenticatedFetch(`${this.httpBase}/api/conversations/${encodeURIComponent(conversationId)}`, { method: 'DELETE' });
38
+ if (!res.ok)
39
+ throw await toChatError(res, 'deleteConversation');
40
+ }
41
+ async renameConversation(conversationId, title) {
42
+ const res = await this.authenticatedFetch(`${this.httpBase}/api/conversations/${encodeURIComponent(conversationId)}`, {
43
+ method: 'PATCH',
44
+ headers: { 'Content-Type': 'application/json' },
45
+ body: JSON.stringify({ title }),
46
+ });
47
+ if (!res.ok)
48
+ throw await toChatError(res, 'renameConversation');
49
+ }
50
+ async getMessages(conversationId, options) {
51
+ const params = new URLSearchParams();
52
+ if (options?.skip !== undefined)
53
+ params.set('skip', String(options.skip));
54
+ if (options?.take !== undefined)
55
+ params.set('take', String(options.take));
56
+ const qs = params.toString();
57
+ const url = `${this.httpBase}/api/conversations/${encodeURIComponent(conversationId)}/messages${qs ? `?${qs}` : ''}`;
58
+ const res = await this.authenticatedFetch(url);
59
+ if (!res.ok)
60
+ throw await toChatError(res, 'getMessages');
61
+ const raw = (await res.json());
62
+ const list = extractList(raw);
63
+ return list.map((item, index) => mapMessage(item, conversationId, index));
64
+ }
65
+ }
66
+ // ---- helpers ----
67
+ function deriveHttpBase(gatewayUrl) {
68
+ try {
69
+ const u = new URL(gatewayUrl);
70
+ u.protocol = u.protocol === 'wss:' ? 'https:' : u.protocol === 'ws:' ? 'http:' : u.protocol;
71
+ // Strip path entirely — REST base is scheme://host[:port]
72
+ u.pathname = '/';
73
+ u.search = '';
74
+ u.hash = '';
75
+ const asString = u.toString();
76
+ return asString.endsWith('/') ? asString.slice(0, -1) : asString;
77
+ }
78
+ catch {
79
+ return gatewayUrl;
80
+ }
81
+ }
82
+ function extractList(raw) {
83
+ if (Array.isArray(raw))
84
+ return raw;
85
+ if (raw && typeof raw === 'object') {
86
+ const obj = raw;
87
+ if (Array.isArray(obj.items))
88
+ return obj.items;
89
+ if (Array.isArray(obj.data))
90
+ return obj.data;
91
+ if (Array.isArray(obj.conversations))
92
+ return obj.conversations;
93
+ if (Array.isArray(obj.messages))
94
+ return obj.messages;
95
+ }
96
+ return [];
97
+ }
98
+ function mapConversation(raw) {
99
+ const r = (raw ?? {});
100
+ const id = r.id ??
101
+ r.conversation_id ??
102
+ '';
103
+ const title = r.title ?? '';
104
+ const lastRaw = r.lastMessageAt ??
105
+ r.last_message_at;
106
+ const createdRaw = r.createdAt ??
107
+ r.created_at;
108
+ const messageCount = r.messageCount ??
109
+ r.message_count ??
110
+ 0;
111
+ return {
112
+ id,
113
+ title,
114
+ lastMessageAt: toEpochMs(lastRaw),
115
+ messageCount,
116
+ createdAt: toEpochMs(createdRaw),
117
+ };
118
+ }
119
+ function toEpochMs(v) {
120
+ if (v === undefined || v === null)
121
+ return 0;
122
+ if (typeof v === 'number')
123
+ return v;
124
+ const t = new Date(v).getTime();
125
+ return Number.isFinite(t) ? t : 0;
126
+ }
127
+ function mapMessage(raw, conversationId, index) {
128
+ const r = (raw ?? {});
129
+ const role = r.role ?? 'assistant';
130
+ const content = typeof r.content === 'string' ? r.content : '';
131
+ const rawToolCalls = r.toolCalls ?? r.tool_calls;
132
+ const toolCalls = Array.isArray(rawToolCalls)
133
+ ? rawToolCalls.map(mapToolCall)
134
+ : [];
135
+ const id = r.id ??
136
+ `${conversationId}-${index}-${Date.now()}`;
137
+ return {
138
+ id,
139
+ conversationId,
140
+ role,
141
+ content,
142
+ toolCalls,
143
+ status: 'complete',
144
+ createdAt: toEpochMs(r.createdAt ??
145
+ r.created_at),
146
+ };
147
+ }
148
+ function mapToolCall(raw) {
149
+ const r = (raw ?? {});
150
+ // SG format: { id, function: { name, arguments } }
151
+ const fn = r.function;
152
+ return {
153
+ id: r.id ?? crypto.randomUUID(),
154
+ toolName: r.toolName ??
155
+ r.tool_name ??
156
+ fn?.name ??
157
+ '',
158
+ arguments: r.arguments ?? fn?.arguments ?? '{}',
159
+ status: 'completed',
160
+ ...(r.result !== undefined ? { result: r.result } : {}),
161
+ };
162
+ }
163
+ async function toChatError(res, opName) {
164
+ let detail;
165
+ try {
166
+ detail = await res.clone().json();
167
+ }
168
+ catch {
169
+ try {
170
+ detail = await res.clone().text();
171
+ }
172
+ catch {
173
+ /* noop */
174
+ }
175
+ }
176
+ if (res.status === 401) {
177
+ return {
178
+ code: 'auth_expired',
179
+ message: `${opName}: authentication expired`,
180
+ retryable: false,
181
+ details: detail,
182
+ };
183
+ }
184
+ if (res.status === 404) {
185
+ return {
186
+ code: 'conversation_not_found',
187
+ message: `${opName}: conversation not found`,
188
+ retryable: false,
189
+ details: detail,
190
+ };
191
+ }
192
+ if (res.status >= 500) {
193
+ return {
194
+ code: 'server_error',
195
+ message: `${opName}: server error (${res.status})`,
196
+ retryable: true,
197
+ details: detail,
198
+ };
199
+ }
200
+ return {
201
+ code: 'server_error',
202
+ message: `${opName}: request failed (${res.status})`,
203
+ retryable: false,
204
+ details: detail,
205
+ };
206
+ }
207
+ //# sourceMappingURL=conversation-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-api.js","sourceRoot":"","sources":["../../src/client/conversation-api.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAKP;IAJF,QAAQ,CAAS;IAElC,YACE,UAAkB,EACD,kBAAwC;QAAxC,uBAAkB,GAAlB,kBAAkB,CAAsB;QAEzD,uDAAuD;QACvD,qCAAqC;QACrC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACvC,GAAG,IAAI,CAAC,QAAQ,oBAAoB,CACrC,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,WAAW,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAAc;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACvC,GAAG,IAAI,CAAC,QAAQ,oBAAoB,EACpC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CACF,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,WAAW,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAC;QAC1C,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACvC,GAAG,IAAI,CAAC,QAAQ,sBAAsB,kBAAkB,CAAC,cAAc,CAAC,EAAE,EAC1E,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,WAAW,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,cAAsB,EACtB,KAAa;QAEb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACvC,GAAG,IAAI,CAAC,QAAQ,sBAAsB,kBAAkB,CAAC,cAAc,CAAC,EAAE,EAC1E;YACE,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CACF,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,WAAW,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,WAAW,CACf,cAAsB,EACtB,OAA0C;QAE1C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,sBAAsB,kBAAkB,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACrH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF;AAED,oBAAoB;AAEpB,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5F,0DAA0D;QAC1D,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC;QACjB,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;QACd,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAA8B,CAAC;QAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;QAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;YAAE,OAAO,GAAG,CAAC,aAAa,CAAC;QAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;IACjD,MAAM,EAAE,GACL,CAAC,CAAC,EAAyB;QAC3B,CAAC,CAAC,eAAsC;QACzC,EAAE,CAAC;IACL,MAAM,KAAK,GAAI,CAAC,CAAC,KAA4B,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GACV,CAAC,CAAC,aAA6C;QAC/C,CAAC,CAAC,eAA+C,CAAC;IACrD,MAAM,UAAU,GACb,CAAC,CAAC,SAAyC;QAC3C,CAAC,CAAC,UAA0C,CAAC;IAChD,MAAM,YAAY,GACf,CAAC,CAAC,YAAmC;QACrC,CAAC,CAAC,aAAoC;QACvC,CAAC,CAAC;IACJ,OAAO;QACL,EAAE;QACF,KAAK;QACL,aAAa,EAAE,SAAS,CAAC,OAAO,CAAC;QACjC,YAAY;QACZ,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAqC;IACtD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,GAAY,EAAE,cAAsB,EAAE,KAAa;IACrE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;IACjD,MAAM,IAAI,GAAI,CAAC,CAAC,IAAoC,IAAI,WAAW,CAAC;IACpE,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC;IACjD,MAAM,SAAS,GAAe,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QACvD,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC;QAC/B,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,EAAE,GACL,CAAC,CAAC,EAAyB;QAC5B,GAAG,cAAc,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7C,OAAO;QACL,EAAE;QACF,cAAc;QACd,IAAI;QACJ,OAAO;QACP,SAAS;QACT,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,SAAS,CACjB,CAAC,CAAC,SAAyC;YACzC,CAAC,CAAC,UAA0C,CAChD;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;IACjD,mDAAmD;IACnD,MAAM,EAAE,GAAG,CAAC,CAAC,QAA6D,CAAC;IAC3E,OAAO;QACL,EAAE,EAAG,CAAC,CAAC,EAAyB,IAAI,MAAM,CAAC,UAAU,EAAE;QACvD,QAAQ,EACL,CAAC,CAAC,QAA+B;YACjC,CAAC,CAAC,SAAgC;YACnC,EAAE,EAAE,IAAI;YACR,EAAE;QACJ,SAAS,EACN,CAAC,CAAC,SAAgC,IAAI,EAAE,EAAE,SAAS,IAAI,IAAI;QAC9D,MAAM,EAAE,WAAW;QACnB,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAa,EAAE,MAAc;IACtD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,GAAG,MAAM,0BAA0B;YAC5C,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,GAAG,MAAM,0BAA0B;YAC5C,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,GAAG,MAAM,mBAAmB,GAAG,CAAC,MAAM,GAAG;YAClD,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,GAAG,MAAM,qBAAqB,GAAG,CAAC,MAAM,GAAG;QACpD,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,MAAM;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ErrorInfo, BillingError } from '@optima-chat/gateway-protocol';
2
+ import type { ChatError } from '../types.js';
3
+ export declare function mapGatewayError(error: ErrorInfo): ChatError;
4
+ export declare function mapBillingError(billing: BillingError): ChatError;
5
+ //# sourceMappingURL=error-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapper.d.ts","sourceRoot":"","sources":["../../src/client/error-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAS3D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAOhE"}
@@ -0,0 +1,19 @@
1
+ export function mapGatewayError(error) {
2
+ return {
3
+ code: error.code || 'server_error',
4
+ message: error.message,
5
+ retryable: error.retryable,
6
+ details: error.activeConversationId
7
+ ? { activeConversationId: error.activeConversationId }
8
+ : undefined,
9
+ };
10
+ }
11
+ export function mapBillingError(billing) {
12
+ return {
13
+ code: billing.reason || 'insufficient_credits',
14
+ message: billing.message,
15
+ retryable: false,
16
+ details: billing,
17
+ };
18
+ }
19
+ //# sourceMappingURL=error-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapper.js","sourceRoot":"","sources":["../../src/client/error-mapper.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,cAAc;QAClC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,oBAAoB;YACjC,CAAC,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,EAAE;YACtD,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,sBAAsB;QAC9C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,79 @@
1
+ import type { ServerEvent, FinishInfo, Question } from '@optima-chat/gateway-protocol';
2
+ import type { Conversation, ToolCall, ChatError, ApprovalRequestWithId } from '../types.js';
3
+ /**
4
+ * Output of parseServerEvent — a declarative action (or list of actions) for
5
+ * the caller to apply to the store + forward to consumer callbacks. Returning
6
+ * `null` means the event is intentionally ignored.
7
+ */
8
+ export type ParsedAction = {
9
+ type: 'setSessionInfo';
10
+ sessionId: string;
11
+ userId: string;
12
+ provider?: string;
13
+ model?: string;
14
+ } | {
15
+ type: 'setConversations';
16
+ conversations: Conversation[];
17
+ } | {
18
+ type: 'mergeConversations';
19
+ conversations: Conversation[];
20
+ } | {
21
+ type: 'recovery';
22
+ conversationId: string;
23
+ } | {
24
+ type: 'createAssistantMessage';
25
+ conversationId: string;
26
+ } | {
27
+ type: 'appendContent';
28
+ conversationId: string;
29
+ text: string;
30
+ } | {
31
+ type: 'addToolCall';
32
+ conversationId: string;
33
+ toolCall: ToolCall;
34
+ } | {
35
+ type: 'updateToolCall';
36
+ conversationId: string;
37
+ toolCallId: string;
38
+ updates: Partial<ToolCall>;
39
+ } | {
40
+ type: 'finishMessage';
41
+ conversationId: string;
42
+ finish: FinishInfo;
43
+ } | {
44
+ type: 'setError';
45
+ error: ChatError;
46
+ conversationId?: string;
47
+ } | {
48
+ type: 'setPendingQuestion';
49
+ requestId: string;
50
+ conversationId: string;
51
+ questions: Question[];
52
+ } | {
53
+ type: 'addPendingApproval';
54
+ approval: ApprovalRequestWithId;
55
+ } | {
56
+ type: 'updateConversationTitle';
57
+ conversationId: string;
58
+ title: string;
59
+ } | {
60
+ type: 'updateConversationActivity';
61
+ conversationId: string;
62
+ lastMessageAt: number;
63
+ } | {
64
+ type: 'notification';
65
+ notificationType: 'info' | 'warning' | 'error';
66
+ message: string;
67
+ code?: string;
68
+ } | {
69
+ type: 'tokenRefresh';
70
+ } | {
71
+ type: 'connectionStateChange';
72
+ state: 'reconnecting' | 'connected';
73
+ };
74
+ /**
75
+ * Parse a ServerEvent into zero or more declarative store actions.
76
+ * Returns null for events that are intentionally ignored.
77
+ */
78
+ export declare function parseServerEvent(event: ServerEvent, activeConversationId: string | null): ParsedAction | ParsedAction[] | null;
79
+ //# sourceMappingURL=event-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-parser.d.ts","sourceRoot":"","sources":["../../src/client/event-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACT,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAGrB;;;;GAIG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACnE;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;CACpB,GACD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D;IACE,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB,GACD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,EAAE,qBAAqB,CAAA;CAAE,GAC/D;IACE,IAAI,EAAE,yBAAyB,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,IAAI,EAAE,4BAA4B,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACD;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,KAAK,EAAE,cAAc,GAAG,WAAW,CAAA;CAAE,CAAC;AAO3E;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAClC,YAAY,GAAG,YAAY,EAAE,GAAG,IAAI,CAuOtC"}
@@ -0,0 +1,219 @@
1
+ import { mapGatewayError, mapBillingError } from './error-mapper.js';
2
+ function isoToEpoch(value) {
3
+ const ts = new Date(value).getTime();
4
+ return Number.isFinite(ts) ? ts : 0;
5
+ }
6
+ /**
7
+ * Parse a ServerEvent into zero or more declarative store actions.
8
+ * Returns null for events that are intentionally ignored.
9
+ */
10
+ export function parseServerEvent(event, activeConversationId) {
11
+ switch (event.type) {
12
+ case 'session_ready': {
13
+ const actions = [];
14
+ const session = event.session;
15
+ const session_info = {
16
+ type: 'setSessionInfo',
17
+ sessionId: session.sessionId,
18
+ userId: session.userId,
19
+ };
20
+ if (session.provider !== undefined) {
21
+ session_info.provider = session.provider;
22
+ }
23
+ if (session.model !== undefined) {
24
+ session_info.model = session.model;
25
+ }
26
+ actions.push(session_info);
27
+ const conversations = (session.conversations ?? []).map((c) => ({
28
+ id: c.id,
29
+ title: c.title,
30
+ lastMessageAt: isoToEpoch(c.lastMessageAt),
31
+ messageCount: c.messageCount,
32
+ // session_ready's ConversationSummary doesn't carry createdAt.
33
+ createdAt: 0,
34
+ }));
35
+ actions.push({ type: 'setConversations', conversations });
36
+ if (session.activeConversation) {
37
+ actions.push({
38
+ type: 'recovery',
39
+ conversationId: session.activeConversation.conversationId,
40
+ });
41
+ }
42
+ return actions;
43
+ }
44
+ case 'text_delta': {
45
+ return [
46
+ { type: 'appendContent', conversationId: event.conversation_id, text: event.delta.text },
47
+ ];
48
+ }
49
+ case 'content': {
50
+ return [
51
+ { type: 'appendContent', conversationId: event.conversation_id, text: event.content.text },
52
+ ];
53
+ }
54
+ case 'tool_call': {
55
+ const tc = event.tool_call;
56
+ const toolCall = {
57
+ id: tc.id,
58
+ toolName: tc.name,
59
+ arguments: tc.arguments,
60
+ status: 'executing',
61
+ };
62
+ return { type: 'addToolCall', conversationId: event.conversation_id, toolCall };
63
+ }
64
+ case 'tool_result': {
65
+ const tr = event.tool_result;
66
+ const updates = {
67
+ result: tr.output,
68
+ status: tr.error ? 'error' : 'completed',
69
+ };
70
+ if (tr.error !== undefined)
71
+ updates.error = tr.error;
72
+ if (tr.content_blocks !== undefined) {
73
+ updates.resultContentBlocks = tr.content_blocks;
74
+ }
75
+ return {
76
+ type: 'updateToolCall',
77
+ conversationId: event.conversation_id,
78
+ toolCallId: tr.tool_call_id,
79
+ updates,
80
+ };
81
+ }
82
+ case 'finish': {
83
+ return {
84
+ type: 'finishMessage',
85
+ conversationId: event.conversation_id,
86
+ finish: event.finish,
87
+ };
88
+ }
89
+ case 'error': {
90
+ return {
91
+ type: 'setError',
92
+ error: mapGatewayError(event.error),
93
+ };
94
+ }
95
+ case 'billing_error': {
96
+ const action = {
97
+ type: 'setError',
98
+ error: mapBillingError(event.billing),
99
+ };
100
+ const convId = event.conversation_id ?? activeConversationId ?? undefined;
101
+ if (convId) {
102
+ action.conversationId = convId;
103
+ }
104
+ return action;
105
+ }
106
+ case 'ask_question': {
107
+ const conversationId = event.conversation_id ?? activeConversationId ?? '';
108
+ return {
109
+ type: 'setPendingQuestion',
110
+ requestId: event.request_id,
111
+ conversationId,
112
+ questions: event.questions,
113
+ };
114
+ }
115
+ case 'approval_request': {
116
+ const conversationId = event.conversation_id ?? activeConversationId ?? '';
117
+ return {
118
+ type: 'addPendingApproval',
119
+ approval: {
120
+ requestId: event.approval.requestId,
121
+ conversationId,
122
+ toolName: event.approval.toolName,
123
+ args: event.approval.args,
124
+ ...(event.approval.description !== undefined
125
+ ? { description: event.approval.description }
126
+ : {}),
127
+ ...(event.approval.risk !== undefined ? { risk: event.approval.risk } : {}),
128
+ },
129
+ };
130
+ }
131
+ case 'conversation_title_updated': {
132
+ return {
133
+ type: 'updateConversationTitle',
134
+ conversationId: event.conversation_id,
135
+ title: event.title,
136
+ };
137
+ }
138
+ case 'conversation_update': {
139
+ return {
140
+ type: 'updateConversationActivity',
141
+ conversationId: event.update.conversation_id,
142
+ lastMessageAt: isoToEpoch(event.update.last_message_at),
143
+ };
144
+ }
145
+ case 'restore_conversations': {
146
+ const conversations = event.conversations.map((c) => ({
147
+ id: c.conversation_id,
148
+ title: c.title,
149
+ lastMessageAt: isoToEpoch(c.last_message_at),
150
+ messageCount: 0,
151
+ createdAt: isoToEpoch(c.created_at),
152
+ }));
153
+ return { type: 'mergeConversations', conversations };
154
+ }
155
+ case 'info': {
156
+ const action = {
157
+ type: 'notification',
158
+ notificationType: 'info',
159
+ message: event.info.message,
160
+ };
161
+ if (event.info.code !== undefined) {
162
+ action.code = event.info.code;
163
+ }
164
+ return action;
165
+ }
166
+ case 'warning': {
167
+ const action = {
168
+ type: 'notification',
169
+ notificationType: 'warning',
170
+ message: event.message,
171
+ code: event.code,
172
+ };
173
+ return action;
174
+ }
175
+ case 'session_recovering':
176
+ return [
177
+ { type: 'connectionStateChange', state: 'reconnecting' },
178
+ {
179
+ type: 'notification',
180
+ notificationType: 'info',
181
+ message: event.info.message,
182
+ ...(event.info.code !== undefined ? { code: event.info.code } : {}),
183
+ },
184
+ ];
185
+ case 'session_recovered':
186
+ return [
187
+ { type: 'connectionStateChange', state: 'connected' },
188
+ {
189
+ type: 'notification',
190
+ notificationType: 'info',
191
+ message: event.info.message,
192
+ ...(event.info.code !== undefined ? { code: event.info.code } : {}),
193
+ },
194
+ ];
195
+ case 'token_refresh_needed':
196
+ return { type: 'tokenRefresh' };
197
+ case 'restore_failed':
198
+ return {
199
+ type: 'notification',
200
+ notificationType: 'error',
201
+ message: event.reason ?? 'Conversation restore failed',
202
+ code: 'restore_failed',
203
+ };
204
+ // Intentionally ignored — consumers can still observe via onRawEvent.
205
+ case 'thinking':
206
+ case 'pong':
207
+ case 'init':
208
+ case 'ready':
209
+ case 'progress':
210
+ case 'restore_started':
211
+ case 'restore_complete':
212
+ case 'skills_synced':
213
+ case 'skills_sync_error':
214
+ return null;
215
+ default:
216
+ return null;
217
+ }
218
+ }
219
+ //# sourceMappingURL=event-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-parser.js","sourceRoot":"","sources":["../../src/client/event-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { ServerEvent, ClientEvent } from '@optima-chat/gateway-protocol';
2
+ import type { ChatError, ConnectionState } from '../types.js';
3
+ export interface GatewayClientOptions {
4
+ gatewayUrl: string;
5
+ tokenProvider: () => Promise<string> | string;
6
+ onEvent: (event: ServerEvent) => void;
7
+ onConnectionStateChange: (state: ConnectionState) => void;
8
+ onError: (error: ChatError) => void;
9
+ onAuthError: (error: ChatError) => void;
10
+ onBeforeSend?: (event: ClientEvent) => ClientEvent | null;
11
+ reconnectOptions?: {
12
+ maxRetries?: number;
13
+ baseDelay?: number;
14
+ maxDelay?: number;
15
+ };
16
+ heartbeatInterval?: number;
17
+ }
18
+ /**
19
+ * WebSocket client for the Optima gateway. Handles connect/reconnect,
20
+ * heartbeat, token-refresh signalling, and event dispatch. Does not own any
21
+ * state — everything flows out via the callbacks.
22
+ */
23
+ export declare class GatewayClient {
24
+ private readonly options;
25
+ private ws;
26
+ private heartbeatTimer;
27
+ private reconnectTimer;
28
+ private reconnectAttempt;
29
+ private intentionalDisconnect;
30
+ private readonly reconnectConfig;
31
+ private readonly heartbeatInterval;
32
+ constructor(options: GatewayClientOptions);
33
+ connect(): Promise<void>;
34
+ disconnect(): void;
35
+ /** Returns true if the event was dispatched, false otherwise. */
36
+ send(event: ClientEvent): boolean;
37
+ /** Exposed so ChatProvider can trigger token refresh manually if needed. */
38
+ handleTokenRefresh(): Promise<void>;
39
+ private openSocket;
40
+ private handleMessage;
41
+ private scheduleReconnect;
42
+ private startHeartbeat;
43
+ private stopHeartbeat;
44
+ }
45
+ //# sourceMappingURL=gateway-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-client.d.ts","sourceRoot":"","sources":["../../src/client/gateway-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACtC,uBAAuB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC;IAC1D,gBAAgB,CAAC,EAAE;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAQD;;;;GAIG;AACH,qBAAa,aAAa;IASZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAEd,OAAO,EAAE,oBAAoB;IASpD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,UAAU,IAAI,IAAI;IAkBlB,iEAAiE;IACjE,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAWjC,4EAA4E;IACtE,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;YAqB3B,UAAU;IAqDxB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;CAMtB"}