@attrove/sdk 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/{src/__mocks__ → __mocks__}/version.js +1 -2
- package/cjs/{src/admin-client.js → admin-client.js} +23 -22
- package/cjs/{src/client.js → client.js} +40 -39
- package/cjs/{src/constants.js → constants.js} +20 -22
- package/cjs/{src/errors → errors}/index.js +26 -27
- package/cjs/{src/index.js → index.js} +35 -36
- package/cjs/package.json +1 -56
- package/cjs/{src/resources → resources}/conversations.js +1 -2
- package/cjs/{src/resources → resources}/index.js +10 -11
- package/cjs/{src/resources → resources}/integrations.js +0 -1
- package/cjs/{src/resources → resources}/messages.js +3 -4
- package/cjs/{src/resources → resources}/query.js +4 -5
- package/cjs/{src/resources → resources}/users.js +0 -1
- package/cjs/{src/types → types}/index.js +88 -61
- package/cjs/{src/utils → utils}/fetch.js +67 -55
- package/cjs/{src/utils → utils}/index.js +5 -6
- package/cjs/{src/utils → utils}/streaming.js +59 -45
- package/cjs/{src/version.js → version.js} +3 -4
- package/esm/__mocks__/version.d.ts.map +1 -0
- package/esm/{src/__mocks__ → __mocks__}/version.js +1 -1
- package/esm/__mocks__/version.js.map +1 -0
- package/{types/src → esm}/admin-client.d.ts +2 -2
- package/esm/admin-client.d.ts.map +1 -0
- package/esm/{src/admin-client.js → admin-client.js} +18 -16
- package/esm/admin-client.js.map +1 -0
- package/{types/src → esm}/client.d.ts +6 -6
- package/esm/client.d.ts.map +1 -0
- package/esm/{src/client.js → client.js} +28 -26
- package/esm/client.js.map +1 -0
- package/{types/src → esm}/constants.d.ts +3 -4
- package/esm/constants.d.ts.map +1 -0
- package/esm/{src/constants.js → constants.js} +20 -21
- package/esm/constants.js.map +1 -0
- package/{types/src → esm}/errors/index.d.ts +1 -1
- package/{types/src → esm}/errors/index.d.ts.map +1 -1
- package/esm/{src/errors → errors}/index.js +13 -13
- package/esm/errors/index.js.map +1 -0
- package/{types/src → esm}/index.d.ts +14 -14
- package/esm/index.d.ts.map +1 -0
- package/esm/{src/index.js → index.js} +8 -8
- package/esm/index.js.map +1 -0
- package/esm/package.json +1 -56
- package/{types/src → esm}/resources/conversations.d.ts +2 -2
- package/esm/resources/conversations.d.ts.map +1 -0
- package/esm/{src/resources → resources}/conversations.js +1 -1
- package/esm/resources/conversations.js.map +1 -0
- package/esm/resources/index.d.ts +12 -0
- package/esm/resources/index.d.ts.map +1 -0
- package/esm/resources/index.js +9 -0
- package/esm/resources/index.js.map +1 -0
- package/{types/src → esm}/resources/integrations.d.ts +2 -2
- package/esm/resources/integrations.d.ts.map +1 -0
- package/esm/resources/integrations.js.map +1 -0
- package/{types/src → esm}/resources/messages.d.ts +2 -2
- package/esm/resources/messages.d.ts.map +1 -0
- package/esm/{src/resources → resources}/messages.js +3 -3
- package/{cjs/src → esm}/resources/messages.js.map +1 -1
- package/{types/src → esm}/resources/query.d.ts +2 -2
- package/esm/resources/query.d.ts.map +1 -0
- package/esm/{src/resources → resources}/query.js +4 -4
- package/esm/resources/query.js.map +1 -0
- package/{types/src → esm}/resources/users.d.ts +2 -2
- package/esm/resources/users.d.ts.map +1 -0
- package/esm/resources/users.js.map +1 -0
- package/{types/src → esm}/types/index.d.ts +28 -28
- package/esm/types/index.d.ts.map +1 -0
- package/esm/{src/types → types}/index.js +88 -60
- package/esm/types/index.js.map +1 -0
- package/{types/src → esm}/utils/fetch.d.ts +10 -10
- package/esm/utils/fetch.d.ts.map +1 -0
- package/esm/{src/utils → utils}/fetch.js +57 -44
- package/esm/utils/fetch.js.map +1 -0
- package/esm/utils/index.d.ts +8 -0
- package/esm/utils/index.d.ts.map +1 -0
- package/esm/utils/index.js +6 -0
- package/esm/utils/index.js.map +1 -0
- package/{types/src → esm}/utils/streaming.d.ts +5 -5
- package/esm/utils/streaming.d.ts.map +1 -0
- package/esm/{src/utils → utils}/streaming.js +47 -32
- package/esm/utils/streaming.js.map +1 -0
- package/{types/src → esm}/version.d.ts +1 -1
- package/esm/version.d.ts.map +1 -0
- package/esm/{src/version.js → version.js} +2 -2
- package/esm/version.js.map +1 -0
- package/package.json +13 -10
- package/cjs/README.md +0 -247
- package/cjs/src/__mocks__/version.js.map +0 -1
- package/cjs/src/admin-client.js.map +0 -1
- package/cjs/src/client.js.map +0 -1
- package/cjs/src/constants.js.map +0 -1
- package/cjs/src/errors/index.js.map +0 -1
- package/cjs/src/index.js.map +0 -1
- package/cjs/src/resources/conversations.js.map +0 -1
- package/cjs/src/resources/index.js.map +0 -1
- package/cjs/src/resources/integrations.js.map +0 -1
- package/cjs/src/resources/query.js.map +0 -1
- package/cjs/src/resources/users.js.map +0 -1
- package/cjs/src/types/index.js.map +0 -1
- package/cjs/src/utils/fetch.js.map +0 -1
- package/cjs/src/utils/index.js.map +0 -1
- package/cjs/src/utils/streaming.js.map +0 -1
- package/cjs/src/version.js.map +0 -1
- package/esm/README.md +0 -247
- package/esm/src/__mocks__/version.js.map +0 -1
- package/esm/src/admin-client.js.map +0 -1
- package/esm/src/client.js.map +0 -1
- package/esm/src/constants.js.map +0 -1
- package/esm/src/errors/index.js.map +0 -1
- package/esm/src/index.js.map +0 -1
- package/esm/src/resources/conversations.js.map +0 -1
- package/esm/src/resources/index.js +0 -9
- package/esm/src/resources/index.js.map +0 -1
- package/esm/src/resources/integrations.js.map +0 -1
- package/esm/src/resources/messages.js.map +0 -1
- package/esm/src/resources/query.js.map +0 -1
- package/esm/src/resources/users.js.map +0 -1
- package/esm/src/types/index.js.map +0 -1
- package/esm/src/utils/fetch.js.map +0 -1
- package/esm/src/utils/index.js +0 -6
- package/esm/src/utils/index.js.map +0 -1
- package/esm/src/utils/streaming.js.map +0 -1
- package/esm/src/version.js.map +0 -1
- package/types/src/__mocks__/version.d.ts.map +0 -1
- package/types/src/admin-client.d.ts.map +0 -1
- package/types/src/client.d.ts.map +0 -1
- package/types/src/constants.d.ts.map +0 -1
- package/types/src/index.d.ts.map +0 -1
- package/types/src/resources/conversations.d.ts.map +0 -1
- package/types/src/resources/index.d.ts +0 -12
- package/types/src/resources/index.d.ts.map +0 -1
- package/types/src/resources/integrations.d.ts.map +0 -1
- package/types/src/resources/messages.d.ts.map +0 -1
- package/types/src/resources/query.d.ts.map +0 -1
- package/types/src/resources/users.d.ts.map +0 -1
- package/types/src/types/index.d.ts.map +0 -1
- package/types/src/utils/fetch.d.ts.map +0 -1
- package/types/src/utils/index.d.ts +0 -8
- package/types/src/utils/index.d.ts.map +0 -1
- package/types/src/utils/streaming.d.ts.map +0 -1
- package/types/src/version.d.ts.map +0 -1
- /package/{types/src → esm}/__mocks__/version.d.ts +0 -0
- /package/esm/{src/resources → resources}/integrations.js +0 -0
- /package/esm/{src/resources → resources}/users.js +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility exports
|
|
3
|
+
*/
|
|
4
|
+
export { HttpClient } from "./fetch.js";
|
|
5
|
+
export type { HttpMethod, RequestConfig, HttpClientConfig } from "./fetch.js";
|
|
6
|
+
export { StreamingClient, generateMessageId } from "./streaming.js";
|
|
7
|
+
export type { StreamOptions, StreamResult } from "./streaming.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/sdk/src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/sdk/src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* - Tokens may be visible in network inspection tools
|
|
11
11
|
* - Using short-lived tokens is recommended for production use
|
|
12
12
|
*/
|
|
13
|
-
import { ConversationMessage, QueryOptions, StreamState, StreamEndReason } from
|
|
13
|
+
import { ConversationMessage, QueryOptions, StreamState, StreamEndReason } from "../types/index.js";
|
|
14
14
|
/**
|
|
15
15
|
* Options for streaming queries.
|
|
16
16
|
*
|
|
@@ -75,15 +75,15 @@ export interface StreamOptions {
|
|
|
75
75
|
export type CancelResult = {
|
|
76
76
|
/** Cancel message was sent successfully. */
|
|
77
77
|
success: true;
|
|
78
|
-
reason:
|
|
78
|
+
reason: "sent";
|
|
79
79
|
} | {
|
|
80
80
|
/** No stream is currently active to cancel. */
|
|
81
81
|
success: false;
|
|
82
|
-
reason:
|
|
82
|
+
reason: "no_active_stream";
|
|
83
83
|
} | {
|
|
84
84
|
/** Failed to send the cancel message (connection may be closed). */
|
|
85
85
|
success: false;
|
|
86
|
-
reason:
|
|
86
|
+
reason: "send_failed";
|
|
87
87
|
/** Error message describing the failure. */
|
|
88
88
|
error: string;
|
|
89
89
|
};
|
|
@@ -158,7 +158,7 @@ export declare class StreamingClient {
|
|
|
158
158
|
* @throws {TimeoutError} If connection times out
|
|
159
159
|
* @throws {AttroveError} If the server returns an error
|
|
160
160
|
*/
|
|
161
|
-
stream(query: string, messageId: string, history: ConversationMessage[], queryOptions?: Omit<QueryOptions,
|
|
161
|
+
stream(query: string, messageId: string, history: ConversationMessage[], queryOptions?: Omit<QueryOptions, "history">, streamOptions?: StreamOptions): Promise<StreamResult>;
|
|
162
162
|
/**
|
|
163
163
|
* Cancel the current stream.
|
|
164
164
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../../../../packages/sdk/src/utils/streaming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAGL,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAoB3B;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAEvC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAE1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAEzE;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,4CAA4C;IAC5C,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,+CAA+C;IAC/C,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;CAC5B,GACD;IACE,oEAAoE;IACpE,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAE/B;;OAEG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAAC,CAGR;gBAEE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAO1C;;;;;OAKG;YACW,OAAO;IAqDrB;;;;;;;;;;;;;OAaG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,EAAE,EAC9B,YAAY,GAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAM,EAChD,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,YAAY,CAAC;IAqOxB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,IAAI,YAAY;IAiCtB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;IAsBf;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
* - Tokens may be visible in network inspection tools
|
|
11
11
|
* - Using short-lived tokens is recommended for production use
|
|
12
12
|
*/
|
|
13
|
-
import { isValidStreamFrame } from
|
|
14
|
-
import { AttroveError, NetworkError, TimeoutError } from
|
|
15
|
-
import { ErrorCodes } from
|
|
16
|
-
import { getWsCloseReason, DEFAULT_TIMEOUT } from
|
|
13
|
+
import { isValidStreamFrame, } from "../types/index.js";
|
|
14
|
+
import { AttroveError, NetworkError, TimeoutError } from "../errors/index.js";
|
|
15
|
+
import { ErrorCodes } from "../types/index.js";
|
|
16
|
+
import { getWsCloseReason, DEFAULT_TIMEOUT } from "../constants.js";
|
|
17
17
|
/**
|
|
18
18
|
* Streaming query client for WebSocket-based LLM responses.
|
|
19
19
|
*
|
|
@@ -41,7 +41,7 @@ export class StreamingClient {
|
|
|
41
41
|
this.ws = null;
|
|
42
42
|
this.currentMessageId = null;
|
|
43
43
|
// Convert HTTP URL to WebSocket URL
|
|
44
|
-
const wsBaseUrl = baseUrl.replace(/^http/,
|
|
44
|
+
const wsBaseUrl = baseUrl.replace(/^http/, "ws");
|
|
45
45
|
this.wsUrl = `${wsBaseUrl}/ws/llm-stream`;
|
|
46
46
|
this.token = token;
|
|
47
47
|
}
|
|
@@ -61,7 +61,7 @@ export class StreamingClient {
|
|
|
61
61
|
// doesn't support custom headers in browsers. This is a common pattern
|
|
62
62
|
// but means the token may appear in server logs.
|
|
63
63
|
const url = new URL(this.wsUrl);
|
|
64
|
-
url.searchParams.set(
|
|
64
|
+
url.searchParams.set("token", this.token);
|
|
65
65
|
const ws = new WebSocket(url.toString());
|
|
66
66
|
ws.onopen = () => {
|
|
67
67
|
clearTimeout(timeoutId);
|
|
@@ -100,10 +100,10 @@ export class StreamingClient {
|
|
|
100
100
|
* @throws {AttroveError} If the server returns an error
|
|
101
101
|
*/
|
|
102
102
|
async stream(query, messageId, history, queryOptions = {}, streamOptions = {}) {
|
|
103
|
-
const { onChunk, onState, onStart, onError, onEnd, onWarning, signal, timeout = DEFAULT_TIMEOUT } = streamOptions;
|
|
103
|
+
const { onChunk, onState, onStart, onError, onEnd, onWarning, signal, timeout = DEFAULT_TIMEOUT, } = streamOptions;
|
|
104
104
|
// Store warning callback for use in cancel() and cleanup()
|
|
105
105
|
this.onWarning = onWarning;
|
|
106
|
-
let answer =
|
|
106
|
+
let answer = "";
|
|
107
107
|
let usedMessageIds = [];
|
|
108
108
|
let cancelled = false;
|
|
109
109
|
let completed = false;
|
|
@@ -112,7 +112,7 @@ export class StreamingClient {
|
|
|
112
112
|
this.currentMessageId = messageId;
|
|
113
113
|
return new Promise((resolve, reject) => {
|
|
114
114
|
if (!this.ws) {
|
|
115
|
-
reject(new NetworkError(
|
|
115
|
+
reject(new NetworkError("WebSocket not connected"));
|
|
116
116
|
return;
|
|
117
117
|
}
|
|
118
118
|
const ws = this.ws;
|
|
@@ -122,7 +122,7 @@ export class StreamingClient {
|
|
|
122
122
|
const cleanupAndFinish = () => {
|
|
123
123
|
completed = true;
|
|
124
124
|
if (signal && abortHandler) {
|
|
125
|
-
signal.removeEventListener(
|
|
125
|
+
signal.removeEventListener("abort", abortHandler);
|
|
126
126
|
}
|
|
127
127
|
this.cleanup();
|
|
128
128
|
};
|
|
@@ -134,7 +134,7 @@ export class StreamingClient {
|
|
|
134
134
|
cancelled = true;
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
|
-
signal.addEventListener(
|
|
137
|
+
signal.addEventListener("abort", abortHandler);
|
|
138
138
|
// Check if already aborted
|
|
139
139
|
if (signal.aborted) {
|
|
140
140
|
this.cancel();
|
|
@@ -143,15 +143,16 @@ export class StreamingClient {
|
|
|
143
143
|
}
|
|
144
144
|
// Send the query to the server after connection is established
|
|
145
145
|
const queryPayload = {
|
|
146
|
-
type:
|
|
146
|
+
type: "query",
|
|
147
147
|
message_id: messageId,
|
|
148
148
|
query,
|
|
149
|
-
client_timezone: queryOptions.timezone ||
|
|
149
|
+
client_timezone: queryOptions.timezone ||
|
|
150
|
+
Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
150
151
|
history: history.length > 0 ? history : undefined,
|
|
151
152
|
integration_ids: queryOptions.integrationIds,
|
|
152
153
|
conversation_ids: queryOptions.conversationIds,
|
|
153
154
|
allow_bot_messages: queryOptions.allowBotMessages,
|
|
154
|
-
expand: queryOptions.includeSources ?
|
|
155
|
+
expand: queryOptions.includeSources ? "sources" : undefined,
|
|
155
156
|
};
|
|
156
157
|
try {
|
|
157
158
|
ws.send(JSON.stringify(queryPayload));
|
|
@@ -170,7 +171,10 @@ export class StreamingClient {
|
|
|
170
171
|
parsed = JSON.parse(event.data);
|
|
171
172
|
}
|
|
172
173
|
catch (parseErr) {
|
|
173
|
-
const error = new AttroveError(`Failed to parse stream message: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`, ErrorCodes.INTERNAL_ERROR, undefined, {
|
|
174
|
+
const error = new AttroveError(`Failed to parse stream message: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`, ErrorCodes.INTERNAL_ERROR, undefined, {
|
|
175
|
+
category: "parse",
|
|
176
|
+
rawDataPreview: String(event.data).substring(0, 200),
|
|
177
|
+
});
|
|
174
178
|
onError?.(error);
|
|
175
179
|
cleanupAndFinish();
|
|
176
180
|
reject(error);
|
|
@@ -178,7 +182,10 @@ export class StreamingClient {
|
|
|
178
182
|
}
|
|
179
183
|
// Validate the frame structure at runtime
|
|
180
184
|
if (!isValidStreamFrame(parsed)) {
|
|
181
|
-
const error = new AttroveError(
|
|
185
|
+
const error = new AttroveError("Received invalid stream frame format from server", ErrorCodes.INTERNAL_ERROR, undefined, {
|
|
186
|
+
category: "parse",
|
|
187
|
+
rawDataPreview: JSON.stringify(parsed).substring(0, 200),
|
|
188
|
+
});
|
|
182
189
|
onError?.(error);
|
|
183
190
|
cleanupAndFinish();
|
|
184
191
|
reject(error);
|
|
@@ -193,7 +200,7 @@ export class StreamingClient {
|
|
|
193
200
|
frameType: frame.type,
|
|
194
201
|
};
|
|
195
202
|
if (onWarning) {
|
|
196
|
-
onWarning(
|
|
203
|
+
onWarning("Received message with mismatched message_id, ignoring", warningContext);
|
|
197
204
|
}
|
|
198
205
|
else {
|
|
199
206
|
// prettier-ignore
|
|
@@ -203,28 +210,28 @@ export class StreamingClient {
|
|
|
203
210
|
}
|
|
204
211
|
// Process the parsed frame - callback errors will propagate naturally
|
|
205
212
|
switch (frame.type) {
|
|
206
|
-
case
|
|
213
|
+
case "stream_start":
|
|
207
214
|
onStart?.();
|
|
208
215
|
break;
|
|
209
|
-
case
|
|
216
|
+
case "state":
|
|
210
217
|
onState?.(frame.state);
|
|
211
218
|
break;
|
|
212
|
-
case
|
|
219
|
+
case "chunk":
|
|
213
220
|
answer += frame.content;
|
|
214
221
|
onChunk?.(frame.content);
|
|
215
222
|
break;
|
|
216
|
-
case
|
|
223
|
+
case "message_ids":
|
|
217
224
|
usedMessageIds = frame.used_message_ids;
|
|
218
225
|
break;
|
|
219
|
-
case
|
|
226
|
+
case "error": {
|
|
220
227
|
const error = new AttroveError(frame.error, ErrorCodes.INTERNAL_ERROR);
|
|
221
228
|
onError?.(error);
|
|
222
229
|
cleanupAndFinish();
|
|
223
230
|
reject(error);
|
|
224
231
|
break;
|
|
225
232
|
}
|
|
226
|
-
case
|
|
227
|
-
cancelled = frame.reason ===
|
|
233
|
+
case "end": {
|
|
234
|
+
cancelled = frame.reason === "cancelled";
|
|
228
235
|
if (frame.used_message_ids) {
|
|
229
236
|
usedMessageIds = frame.used_message_ids;
|
|
230
237
|
}
|
|
@@ -232,7 +239,7 @@ export class StreamingClient {
|
|
|
232
239
|
// Build updated history
|
|
233
240
|
const updatedHistory = [
|
|
234
241
|
...history,
|
|
235
|
-
{ role:
|
|
242
|
+
{ role: "assistant", content: answer },
|
|
236
243
|
];
|
|
237
244
|
cleanupAndFinish();
|
|
238
245
|
resolve({
|
|
@@ -288,27 +295,33 @@ export class StreamingClient {
|
|
|
288
295
|
*/
|
|
289
296
|
cancel() {
|
|
290
297
|
if (!this.ws || !this.currentMessageId) {
|
|
291
|
-
return { success: false, reason:
|
|
298
|
+
return { success: false, reason: "no_active_stream" };
|
|
292
299
|
}
|
|
293
300
|
try {
|
|
294
301
|
this.ws.send(JSON.stringify({
|
|
295
|
-
type:
|
|
302
|
+
type: "stop",
|
|
296
303
|
message_id: this.currentMessageId,
|
|
297
304
|
}));
|
|
298
|
-
return { success: true, reason:
|
|
305
|
+
return { success: true, reason: "sent" };
|
|
299
306
|
}
|
|
300
307
|
catch (err) {
|
|
301
308
|
// Cancellation is best-effort - the WebSocket may already be closed
|
|
302
309
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
303
|
-
const context = {
|
|
310
|
+
const context = {
|
|
311
|
+
messageId: this.currentMessageId,
|
|
312
|
+
wsReadyState: this.ws?.readyState,
|
|
313
|
+
};
|
|
304
314
|
if (this.onWarning) {
|
|
305
|
-
this.onWarning(
|
|
315
|
+
this.onWarning("Failed to send cancel message", {
|
|
316
|
+
error: errorMessage,
|
|
317
|
+
...context,
|
|
318
|
+
});
|
|
306
319
|
}
|
|
307
320
|
else {
|
|
308
321
|
// prettier-ignore
|
|
309
322
|
console.warn('[AttroveSDK] Failed to send cancel message:', errorMessage, context);
|
|
310
323
|
}
|
|
311
|
-
return { success: false, reason:
|
|
324
|
+
return { success: false, reason: "send_failed", error: errorMessage };
|
|
312
325
|
}
|
|
313
326
|
}
|
|
314
327
|
/**
|
|
@@ -327,7 +340,9 @@ export class StreamingClient {
|
|
|
327
340
|
// Cleanup is best-effort - the WebSocket may already be closed
|
|
328
341
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
329
342
|
if (this.onWarning) {
|
|
330
|
-
this.onWarning(
|
|
343
|
+
this.onWarning("Failed to close WebSocket cleanly", {
|
|
344
|
+
error: errorMessage,
|
|
345
|
+
});
|
|
331
346
|
}
|
|
332
347
|
else {
|
|
333
348
|
// prettier-ignore
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../../../packages/sdk/src/utils/streaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Get the SDK version.
|
|
9
9
|
*
|
|
10
10
|
* Returns the SDK version string from the hardcoded constant.
|
|
11
|
-
* This value
|
|
11
|
+
* This value is automatically synced with package.json during releases.
|
|
12
12
|
*/
|
|
13
13
|
export declare function getVersion(): string;
|
|
14
14
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../packages/sdk/src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Provides version information for the SDK using a static constant.
|
|
5
5
|
* This ensures browser compatibility while keeping the API consistent.
|
|
6
6
|
*/
|
|
7
|
-
import { SDK_VERSION } from
|
|
7
|
+
import { SDK_VERSION } from "./constants.js";
|
|
8
8
|
/**
|
|
9
9
|
* Get the SDK version.
|
|
10
10
|
*
|
|
11
11
|
* Returns the SDK version string from the hardcoded constant.
|
|
12
|
-
* This value
|
|
12
|
+
* This value is automatically synced with package.json during releases.
|
|
13
13
|
*/
|
|
14
14
|
export function getVersion() {
|
|
15
15
|
return SDK_VERSION;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../packages/sdk/src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,2CAA2C;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@attrove/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Official TypeScript SDK for the Attrove API - AI-powered context retrieval for your apps",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./cjs/index.js",
|
|
7
|
+
"module": "./esm/index.js",
|
|
8
|
+
"types": "./esm/index.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
11
|
"import": {
|
|
11
|
-
"types": "./
|
|
12
|
-
"default": "./esm/
|
|
12
|
+
"types": "./esm/index.d.ts",
|
|
13
|
+
"default": "./esm/index.js"
|
|
13
14
|
},
|
|
14
15
|
"require": {
|
|
15
|
-
"types": "./
|
|
16
|
-
"default": "./cjs/
|
|
16
|
+
"types": "./esm/index.d.ts",
|
|
17
|
+
"default": "./cjs/index.js"
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
},
|
|
20
21
|
"files": [
|
|
21
22
|
"cjs",
|
|
22
23
|
"esm",
|
|
23
|
-
"types",
|
|
24
24
|
"README.md"
|
|
25
25
|
],
|
|
26
26
|
"sideEffects": false,
|
|
@@ -52,6 +52,9 @@
|
|
|
52
52
|
"build": "nx build sdk",
|
|
53
53
|
"test": "nx test sdk"
|
|
54
54
|
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"tslib": "^2.6.0"
|
|
57
|
+
},
|
|
55
58
|
"devDependencies": {
|
|
56
59
|
"@types/node": "^20.0.0",
|
|
57
60
|
"typescript": "~5.7.0"
|
|
@@ -59,4 +62,4 @@
|
|
|
59
62
|
"publishConfig": {
|
|
60
63
|
"access": "public"
|
|
61
64
|
}
|
|
62
|
-
}
|
|
65
|
+
}
|
package/cjs/README.md
DELETED
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
# @attrove/sdk
|
|
2
|
-
|
|
3
|
-
Official TypeScript SDK for the Attrove API. Access AI-powered context from your users' Gmail, Slack, Google Calendar, and more.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @attrove/sdk
|
|
9
|
-
# or
|
|
10
|
-
yarn add @attrove/sdk
|
|
11
|
-
# or
|
|
12
|
-
pnpm add @attrove/sdk
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Quick Start
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
import { Attrove } from '@attrove/sdk';
|
|
19
|
-
|
|
20
|
-
// Create a client
|
|
21
|
-
const attrove = new Attrove({
|
|
22
|
-
apiKey: 'sk_...', // API key from your dashboard
|
|
23
|
-
userId: 'user-uuid' // User ID from provisioning
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
// Query user's context
|
|
27
|
-
const response = await attrove.query('What meetings do I have tomorrow?');
|
|
28
|
-
console.log(response.answer);
|
|
29
|
-
|
|
30
|
-
// Search for specific information
|
|
31
|
-
const results = await attrove.search('quarterly report');
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Core Methods
|
|
35
|
-
|
|
36
|
-
### `query(prompt, options?)`
|
|
37
|
-
|
|
38
|
-
Ask questions about the user's unified context with AI-generated answers.
|
|
39
|
-
|
|
40
|
-
```typescript
|
|
41
|
-
// Simple query
|
|
42
|
-
const response = await attrove.query('What did Sarah say about the Q4 budget?');
|
|
43
|
-
console.log(response.answer);
|
|
44
|
-
|
|
45
|
-
// Multi-turn conversation - pass history from previous response
|
|
46
|
-
let history = response.history;
|
|
47
|
-
const followUp = await attrove.query('What about Q3?', { history });
|
|
48
|
-
// Update history for subsequent queries
|
|
49
|
-
history = followUp.history;
|
|
50
|
-
|
|
51
|
-
// With filters
|
|
52
|
-
const filtered = await attrove.query('Latest updates', {
|
|
53
|
-
integrationIds: ['integration-uuid'], // Only search specific integration
|
|
54
|
-
includeSources: true // Include source snippets
|
|
55
|
-
});
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### `search(query, options?)`
|
|
59
|
-
|
|
60
|
-
Semantic search that returns raw messages without AI summarization.
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
const results = await attrove.search('product launch', {
|
|
64
|
-
afterDate: '2024-01-01T00:00:00Z',
|
|
65
|
-
senderDomains: ['acme.com'],
|
|
66
|
-
includeBodyText: true
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
for (const [convId, conv] of Object.entries(results.conversations)) {
|
|
70
|
-
console.log(`Conversation: ${conv.conversation_name}`);
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Resource Namespaces
|
|
75
|
-
|
|
76
|
-
### Users
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
// Get user profile and integrations
|
|
80
|
-
const { user, integrations } = await attrove.users.get();
|
|
81
|
-
|
|
82
|
-
// Update user profile
|
|
83
|
-
await attrove.users.update({
|
|
84
|
-
timezone: 'America/New_York'
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// Get sync statistics
|
|
88
|
-
const stats = await attrove.users.syncStats();
|
|
89
|
-
console.log(`Messages: ${stats.totals.messages.count}`);
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Messages
|
|
93
|
-
|
|
94
|
-
```typescript
|
|
95
|
-
// List messages
|
|
96
|
-
const { data, pagination } = await attrove.messages.list({
|
|
97
|
-
limit: 20,
|
|
98
|
-
expand: ['body_text']
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
// Get specific messages (e.g., after a query)
|
|
102
|
-
const { data: messages } = await attrove.messages.list({
|
|
103
|
-
ids: response.used_message_ids,
|
|
104
|
-
expand: ['body_text']
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// Get a single message by ID
|
|
108
|
-
const message = await attrove.messages.get('message-uuid');
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Conversations
|
|
112
|
-
|
|
113
|
-
```typescript
|
|
114
|
-
// List conversations
|
|
115
|
-
const { data: conversations } = await attrove.conversations.list({
|
|
116
|
-
syncedOnly: true
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
// Update sync settings
|
|
120
|
-
await attrove.conversations.updateSync([
|
|
121
|
-
{ id: 'conversation-uuid-1', importMessages: true },
|
|
122
|
-
{ id: 'conversation-uuid-2', importMessages: false }
|
|
123
|
-
]);
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### Integrations
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
// List integrations
|
|
130
|
-
const integrations = await attrove.integrations.list();
|
|
131
|
-
|
|
132
|
-
// Disconnect an integration
|
|
133
|
-
await attrove.integrations.disconnect('integration-uuid');
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## Server-to-Server (Admin) API
|
|
137
|
-
|
|
138
|
-
Use the admin client for operations that require partner authentication:
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
import { Attrove } from '@attrove/sdk';
|
|
142
|
-
|
|
143
|
-
// Create admin client
|
|
144
|
-
const admin = Attrove.admin({
|
|
145
|
-
clientId: 'your-client-id',
|
|
146
|
-
clientSecret: 'your-client-secret'
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Create a user
|
|
150
|
-
const { id, apiKey } = await admin.users.create({
|
|
151
|
-
email: 'user@example.com',
|
|
152
|
-
firstName: 'John',
|
|
153
|
-
lastName: 'Doe'
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
// Generate integration token for OAuth flow
|
|
157
|
-
const { token: connectToken, expires_at } = await admin.users.createConnectToken(id);
|
|
158
|
-
|
|
159
|
-
// Use the apiKey for subsequent API calls
|
|
160
|
-
const attrove = new Attrove({ apiKey, userId: id });
|
|
161
|
-
|
|
162
|
-
// Redirect user to OAuth flow
|
|
163
|
-
// The URL format depends on your deployment - check your dashboard for the exact URL
|
|
164
|
-
// Example: const oauthUrl = `${YOUR_BASE_URL}/connect/gmail?token=${connectToken}`;
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
## Error Handling
|
|
168
|
-
|
|
169
|
-
The SDK provides typed errors for better error handling:
|
|
170
|
-
|
|
171
|
-
```typescript
|
|
172
|
-
import {
|
|
173
|
-
Attrove,
|
|
174
|
-
AttroveError,
|
|
175
|
-
AuthenticationError,
|
|
176
|
-
NotFoundError,
|
|
177
|
-
RateLimitError
|
|
178
|
-
} from '@attrove/sdk';
|
|
179
|
-
|
|
180
|
-
try {
|
|
181
|
-
const response = await attrove.query('...');
|
|
182
|
-
} catch (error) {
|
|
183
|
-
if (error instanceof AuthenticationError) {
|
|
184
|
-
console.log('Invalid API key');
|
|
185
|
-
} else if (error instanceof RateLimitError) {
|
|
186
|
-
console.log(`Rate limited. Retry after ${error.retryAfter}s`);
|
|
187
|
-
} else if (error instanceof NotFoundError) {
|
|
188
|
-
console.log('Resource not found');
|
|
189
|
-
} else if (error instanceof AttroveError) {
|
|
190
|
-
console.log(`Error: ${error.code} - ${error.message}`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## Streaming (Advanced)
|
|
196
|
-
|
|
197
|
-
For real-time streaming of query responses:
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
const result = await attrove.stream('What happened in the meeting?', {
|
|
201
|
-
onChunk: (chunk) => process.stdout.write(chunk),
|
|
202
|
-
onState: (state) => console.log('State:', state),
|
|
203
|
-
onEnd: (reason) => console.log('Stream ended:', reason)
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
console.log('Full answer:', result.answer);
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
> **Note:** Streaming uses WebSocket connections and requires the same API key authentication as other SDK methods. It is primarily intended for end-user facing applications where progressive display of responses improves the user experience.
|
|
210
|
-
|
|
211
|
-
## Configuration
|
|
212
|
-
|
|
213
|
-
```typescript
|
|
214
|
-
const attrove = new Attrove({
|
|
215
|
-
apiKey: 'sk_...', // Required: API key
|
|
216
|
-
userId: 'user-uuid', // Required: User ID
|
|
217
|
-
baseUrl: 'https://api.attrove.com', // Optional: API base URL
|
|
218
|
-
timeout: 30000, // Optional: Request timeout (ms)
|
|
219
|
-
maxRetries: 3 // Optional: Retry attempts
|
|
220
|
-
});
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
## TypeScript Support
|
|
224
|
-
|
|
225
|
-
The SDK is fully typed. Import types as needed:
|
|
226
|
-
|
|
227
|
-
```typescript
|
|
228
|
-
import {
|
|
229
|
-
QueryOptions,
|
|
230
|
-
QueryResponse,
|
|
231
|
-
SearchOptions,
|
|
232
|
-
SearchResponse,
|
|
233
|
-
User,
|
|
234
|
-
Message,
|
|
235
|
-
Integration,
|
|
236
|
-
ConversationMessage
|
|
237
|
-
} from '@attrove/sdk';
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
## Requirements
|
|
241
|
-
|
|
242
|
-
- Node.js 18.0.0 or later
|
|
243
|
-
- TypeScript 4.7+ (if using TypeScript)
|
|
244
|
-
|
|
245
|
-
## License
|
|
246
|
-
|
|
247
|
-
MIT
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../../../packages/sdk/src/__mocks__/version.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,SAAgB,UAAU;IACxB,OAAO,YAAY,CAAC;AACtB,CAAC;AAFD,gCAEC;AAED,SAAgB,iBAAiB;IAC/B,gBAAgB;AAClB,CAAC;AAFD,8CAEC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin-client.js","sourceRoot":"","sources":["../../../../../packages/sdk/src/admin-client.ts"],"names":[],"mappings":"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"}
|