assistant-cloud 0.2.1 → 0.2.3
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/README.md +24 -8
- package/dist/AssistantCloud.d.ts +16 -19
- package/dist/AssistantCloud.d.ts.map +1 -1
- package/dist/AssistantCloud.js +7 -2
- package/dist/AssistantCloud.js.map +1 -1
- package/dist/AssistantCloudAPI.d.ts +74 -72
- package/dist/AssistantCloudAPI.d.ts.map +1 -1
- package/dist/AssistantCloudAPI.js.map +1 -1
- package/dist/AssistantCloudAuthStrategy.d.ts +29 -32
- package/dist/AssistantCloudAuthStrategy.d.ts.map +1 -1
- package/dist/AssistantCloudAuthTokens.d.ts +7 -9
- package/dist/AssistantCloudAuthTokens.d.ts.map +1 -1
- package/dist/AssistantCloudEvents.d.ts +35 -29
- package/dist/AssistantCloudEvents.d.ts.map +1 -1
- package/dist/AssistantCloudEvents.js +66 -17
- package/dist/AssistantCloudEvents.js.map +1 -1
- package/dist/AssistantCloudFiles.d.ts +27 -29
- package/dist/AssistantCloudFiles.d.ts.map +1 -1
- package/dist/AssistantCloudProjectThreadMessages.d.ts +11 -13
- package/dist/AssistantCloudProjectThreadMessages.d.ts.map +1 -1
- package/dist/AssistantCloudProjectThreads.d.ts +12 -14
- package/dist/AssistantCloudProjectThreads.d.ts.map +1 -1
- package/dist/AssistantCloudProjects.d.ts +4 -7
- package/dist/AssistantCloudProjects.d.ts.map +1 -1
- package/dist/AssistantCloudRuns.d.ts +67 -56
- package/dist/AssistantCloudRuns.d.ts.map +1 -1
- package/dist/AssistantCloudRuns.js +9 -4
- package/dist/AssistantCloudRuns.js.map +1 -1
- package/dist/AssistantCloudScores.d.ts +20 -23
- package/dist/AssistantCloudScores.d.ts.map +1 -1
- package/dist/AssistantCloudThreadMessages.d.ts +41 -38
- package/dist/AssistantCloudThreadMessages.d.ts.map +1 -1
- package/dist/AssistantCloudThreadMessages.js +16 -4
- package/dist/AssistantCloudThreadMessages.js.map +1 -1
- package/dist/AssistantCloudThreads.d.ts +42 -44
- package/dist/AssistantCloudThreads.d.ts.map +1 -1
- package/dist/CloudEngagementReporter.d.ts +56 -58
- package/dist/CloudEngagementReporter.d.ts.map +1 -1
- package/dist/CloudEngagementReporter.js +4 -1
- package/dist/CloudEngagementReporter.js.map +1 -1
- package/dist/CloudMessagePersistence.d.ts +56 -58
- package/dist/CloudMessagePersistence.d.ts.map +1 -1
- package/dist/CloudMessagePersistence.js +3 -0
- package/dist/CloudMessagePersistence.js.map +1 -1
- package/dist/CloudRunReporter.d.ts +10 -13
- package/dist/CloudRunReporter.d.ts.map +1 -1
- package/dist/CloudRunReporter.js +13 -4
- package/dist/CloudRunReporter.js.map +1 -1
- package/dist/FormattedCloudPersistence.d.ts +36 -39
- package/dist/FormattedCloudPersistence.d.ts.map +1 -1
- package/dist/ai-sdk/index.d.ts +14 -17
- package/dist/ai-sdk/index.d.ts.map +1 -1
- package/dist/cloudResponse.d.ts +14 -17
- package/dist/cloudResponse.d.ts.map +1 -1
- package/dist/generateThreadTitle.d.ts +9 -12
- package/dist/generateThreadTitle.d.ts.map +1 -1
- package/dist/index.d.ts +18 -17
- package/dist/index.d.ts.map +1 -0
- package/dist/instrumentMcpSampling.d.ts +36 -39
- package/dist/instrumentMcpSampling.d.ts.map +1 -1
- package/dist/runTelemetry.d.ts +101 -94
- package/dist/runTelemetry.d.ts.map +1 -1
- package/dist/runTelemetry.js +57 -15
- package/dist/runTelemetry.js.map +1 -1
- package/dist/telemetry/index.d.ts +20 -23
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/version.d.ts +1 -4
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +10 -9
- package/src/AssistantCloud.ts +17 -2
- package/src/AssistantCloudAPI.ts +4 -0
- package/src/AssistantCloudEvents.test.ts +157 -0
- package/src/AssistantCloudEvents.ts +82 -20
- package/src/AssistantCloudRuns.ts +35 -5
- package/src/AssistantCloudThreadMessages.test.ts +53 -2
- package/src/AssistantCloudThreadMessages.ts +34 -2
- package/src/BackendTranscriptCopy.test.ts +79 -0
- package/src/CloudEngagementReporter.ts +9 -3
- package/src/CloudMessagePersistence.ts +4 -0
- package/src/CloudRunReporter.ts +16 -4
- package/src/ai-sdk/index.test.ts +2 -2
- package/src/runTelemetry.test.ts +226 -2
- package/src/runTelemetry.ts +121 -17
- package/src/tests/AssistantCloud.test.ts +22 -0
- package/src/tests/AssistantCloudRuns.test.ts +28 -0
- package/src/tests/CloudEngagementReporter.test.ts +45 -0
- package/src/tests/CloudRunReporter.test.ts +49 -2
- package/dist/tests/setup.d.ts +0 -1
- package/dist/tests/setup.js +0 -7
- package/dist/tests/setup.js.map +0 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ Server- and client-side SDK for [Assistant Cloud](https://cloud.assistant-ui.com
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm install @assistant-ui/react @assistant-ui/ai-sdk assistant-cloud
|
|
12
|
+
npm install @assistant-ui/react @assistant-ui/ai-sdk ai assistant-cloud
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## Usage
|
|
@@ -37,7 +37,7 @@ The pieces every client integration needs live in the package, so a runtime bind
|
|
|
37
37
|
|
|
38
38
|
Every API request carries `Aui-Sdk` with the client's own version and the identities integrations pass to `registerSdk` (the anonymous token bootstrap requests do not), so the cloud can tell which packages talk to a project.
|
|
39
39
|
|
|
40
|
-
- `CloudRunReporter` sends run reports: nothing while telemetry is off, the cloud's environment, release and tags on every report, the `beforeReport` hook applied last, and a failed send that never surfaces.
|
|
40
|
+
- `CloudRunReporter` sends run reports: nothing while telemetry is off, the cloud's environment, release and tags on every report, the `beforeReport` hook applied last, and a failed send that never surfaces. Keyed reports are deduplicated while in flight and after an attempt, while rate limiting releases the key for a later attempt; without a key every call reports.
|
|
41
41
|
- `CloudEngagementReporter` derives engagement events (`message_sent`, `run_stopped`, `error_shown`, `suggestions_shown` and the rest) from what a chat integration observes and keeps the per thread state they need, such as a run's start for the stop duration. An id resolver turns the integration's own thread and message ids into the ids the cloud stores.
|
|
42
42
|
- `assistant-cloud/ai-sdk` holds the AI SDK specifics: `aiSDKV6FormatAdapter`, the stored form of a `UIMessage`, and `extractAISDKRunTelemetry`, which reads the run report fields out of one run's assistant messages. The entry types its messages with `ai` and needs no runtime from it.
|
|
43
43
|
|
|
@@ -59,12 +59,14 @@ if (run) {
|
|
|
59
59
|
|
|
60
60
|
## Server telemetry
|
|
61
61
|
|
|
62
|
-
Send AI SDK 7 GenAI spans to Assistant Cloud from a Next.js
|
|
62
|
+
Send AI SDK 7 GenAI spans to Assistant Cloud from a Next.js app. The AI SDK emits spans through `@ai-sdk/otel`, and the `assistant-cloud/telemetry` entry needs the OpenTelemetry packages installed next to it:
|
|
63
63
|
|
|
64
64
|
```sh
|
|
65
|
-
npm i @vercel/otel @opentelemetry/api @opentelemetry/sdk-trace-base @opentelemetry/exporter-trace-otlp-http
|
|
65
|
+
npm i @vercel/otel @ai-sdk/otel @opentelemetry/api @opentelemetry/sdk-trace-base @opentelemetry/exporter-trace-otlp-http
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
+
Register the span processor in `instrumentation.ts` so it starts once per server process:
|
|
69
|
+
|
|
68
70
|
```ts
|
|
69
71
|
import { registerOTel } from "@vercel/otel";
|
|
70
72
|
import {
|
|
@@ -87,16 +89,30 @@ export function register() {
|
|
|
87
89
|
}
|
|
88
90
|
```
|
|
89
91
|
|
|
90
|
-
|
|
92
|
+
In the route that calls `streamText`, enable the OpenTelemetry integration and pass the active trace ID to the browser with `messageMetadata`:
|
|
91
93
|
|
|
92
94
|
```ts
|
|
95
|
+
import { OpenTelemetry } from "@ai-sdk/otel";
|
|
96
|
+
import { openai } from "@ai-sdk/openai";
|
|
97
|
+
import { convertToModelMessages, streamText } from "ai";
|
|
93
98
|
import { withAssistantCloudTraceMetadata } from "assistant-cloud/telemetry";
|
|
94
99
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
export async function POST(request: Request) {
|
|
101
|
+
const { messages } = await request.json();
|
|
102
|
+
const result = streamText({
|
|
103
|
+
model: openai("gpt-6-luna"),
|
|
104
|
+
messages: await convertToModelMessages(messages),
|
|
105
|
+
telemetry: { integrations: [new OpenTelemetry()] },
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return result.toUIMessageStreamResponse({
|
|
109
|
+
messageMetadata: withAssistantCloudTraceMetadata(),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
98
112
|
```
|
|
99
113
|
|
|
114
|
+
[Traces](https://www.assistant-ui.com/docs/cloud/traces) covers the exporter options, the span filter, and how Assistant Cloud merges a trace with the browser's run report.
|
|
115
|
+
|
|
100
116
|
## Authentication
|
|
101
117
|
|
|
102
118
|
| Mode | Required fields | Use case |
|
package/dist/AssistantCloud.d.ts
CHANGED
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { AssistantCloudConfig, AssistantCloudTelemetryConfig, SdkIdentity } from "./AssistantCloudAPI.js";
|
|
1
|
+
import { type AssistantCloudConfig, type SdkIdentity, type AssistantCloudTelemetryConfig } from "./AssistantCloudAPI.js";
|
|
3
2
|
import { AssistantCloudAuthTokens } from "./AssistantCloudAuthTokens.js";
|
|
4
|
-
import { AssistantCloudThreads } from "./AssistantCloudThreads.js";
|
|
5
3
|
import { AssistantCloudProjects } from "./AssistantCloudProjects.js";
|
|
4
|
+
import { AssistantCloudRuns } from "./AssistantCloudRuns.js";
|
|
5
|
+
import { AssistantCloudThreads } from "./AssistantCloudThreads.js";
|
|
6
6
|
import { AssistantCloudFiles } from "./AssistantCloudFiles.js";
|
|
7
7
|
import { AssistantCloudEvents } from "./AssistantCloudEvents.js";
|
|
8
8
|
import { AssistantCloudScores } from "./AssistantCloudScores.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
constructor(config: AssistantCloudConfig);
|
|
9
|
+
export declare class AssistantCloud {
|
|
10
|
+
readonly threads: AssistantCloudThreads;
|
|
11
|
+
readonly projects: AssistantCloudProjects;
|
|
12
|
+
readonly auth: {
|
|
13
|
+
tokens: AssistantCloudAuthTokens;
|
|
14
|
+
};
|
|
15
|
+
readonly runs: AssistantCloudRuns;
|
|
16
|
+
readonly files: AssistantCloudFiles;
|
|
17
|
+
readonly events: AssistantCloudEvents;
|
|
18
|
+
readonly scores: AssistantCloudScores;
|
|
19
|
+
readonly telemetry: AssistantCloudTelemetryConfig;
|
|
20
|
+
readonly registerSdk: (sdk: SdkIdentity) => void;
|
|
21
|
+
constructor(config: AssistantCloudConfig);
|
|
23
22
|
}
|
|
24
|
-
//#endregion
|
|
25
|
-
export { AssistantCloud };
|
|
26
23
|
//# sourceMappingURL=AssistantCloud.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloud.d.ts","
|
|
1
|
+
{"version":3,"file":"AssistantCloud.d.ts","sourceRoot":"","sources":["../src/AssistantCloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,6BAA6B,EACnC,+BAA4B;AAC7B,OAAO,EAAE,wBAAwB,EAAE,sCAAmC;AACtE,OAAO,EAAE,sBAAsB,EAAE,oCAAiC;AAClE,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,OAAO,EAAE,qBAAqB,EAAE,mCAAgC;AAChE,OAAO,EAAE,mBAAmB,EAAE,iCAA8B;AAC5D,OAAO,EACL,oBAAoB,EAErB,kCAA+B;AAChC,OAAO,EAAE,oBAAoB,EAAE,kCAA+B;AAE9D,qBAAa,cAAc;IACzB,SAAgB,OAAO,wBAAC;IACxB,SAAgB,QAAQ,yBAAC;IACzB,SAAgB,IAAI;;MAAC;IACrB,SAAgB,IAAI,qBAAC;IACrB,SAAgB,KAAK,sBAAC;IACtB,SAAgB,MAAM,uBAAC;IACvB,SAAgB,MAAM,uBAAC;IACvB,SAAgB,SAAS,EAAE,6BAA6B,CAAC;IACzD,SAAgB,WAAW,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;gBAE5C,MAAM,EAAE,oBAAoB;CAuCzC"}
|
package/dist/AssistantCloud.js
CHANGED
|
@@ -4,7 +4,7 @@ import { AssistantCloudThreads } from "./AssistantCloudThreads.js";
|
|
|
4
4
|
import { AssistantCloudProjects } from "./AssistantCloudProjects.js";
|
|
5
5
|
import { AssistantCloudRuns } from "./AssistantCloudRuns.js";
|
|
6
6
|
import { AssistantCloudFiles } from "./AssistantCloudFiles.js";
|
|
7
|
-
import { AssistantCloudEvents } from "./AssistantCloudEvents.js";
|
|
7
|
+
import { AssistantCloudEvents, clearPendingAssistantCloudEvents } from "./AssistantCloudEvents.js";
|
|
8
8
|
import { AssistantCloudScores } from "./AssistantCloudScores.js";
|
|
9
9
|
//#region src/AssistantCloud.ts
|
|
10
10
|
var AssistantCloud = class {
|
|
@@ -21,10 +21,15 @@ var AssistantCloud = class {
|
|
|
21
21
|
const api = new AssistantCloudAPI(config);
|
|
22
22
|
this.registerSdk = api.registerSdk;
|
|
23
23
|
const t = config.telemetry;
|
|
24
|
-
|
|
24
|
+
const telemetry = t === false ? { enabled: false } : t === true || t === void 0 ? { enabled: true } : {
|
|
25
25
|
...t,
|
|
26
26
|
enabled: t.enabled !== false
|
|
27
27
|
};
|
|
28
|
+
this.telemetry = new Proxy(telemetry, { set: (target, property, value) => {
|
|
29
|
+
const updated = Reflect.set(target, property, value);
|
|
30
|
+
if ((property === "enabled" || property === "events") && (target.enabled === false || target.events === false)) clearPendingAssistantCloudEvents(this.events);
|
|
31
|
+
return updated;
|
|
32
|
+
} });
|
|
28
33
|
this.threads = new AssistantCloudThreads(api);
|
|
29
34
|
this.projects = new AssistantCloudProjects(api);
|
|
30
35
|
this.auth = { tokens: new AssistantCloudAuthTokens(api) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloud.js","names":[],"sources":["../src/AssistantCloud.ts"],"sourcesContent":["import {\n AssistantCloudAPI,\n type AssistantCloudConfig,\n type SdkIdentity,\n type AssistantCloudTelemetryConfig,\n} from \"./AssistantCloudAPI\";\nimport { AssistantCloudAuthTokens } from \"./AssistantCloudAuthTokens\";\nimport { AssistantCloudProjects } from \"./AssistantCloudProjects\";\nimport { AssistantCloudRuns } from \"./AssistantCloudRuns\";\nimport { AssistantCloudThreads } from \"./AssistantCloudThreads\";\nimport { AssistantCloudFiles } from \"./AssistantCloudFiles\";\nimport {
|
|
1
|
+
{"version":3,"file":"AssistantCloud.js","names":[],"sources":["../src/AssistantCloud.ts"],"sourcesContent":["import {\n AssistantCloudAPI,\n type AssistantCloudConfig,\n type SdkIdentity,\n type AssistantCloudTelemetryConfig,\n} from \"./AssistantCloudAPI\";\nimport { AssistantCloudAuthTokens } from \"./AssistantCloudAuthTokens\";\nimport { AssistantCloudProjects } from \"./AssistantCloudProjects\";\nimport { AssistantCloudRuns } from \"./AssistantCloudRuns\";\nimport { AssistantCloudThreads } from \"./AssistantCloudThreads\";\nimport { AssistantCloudFiles } from \"./AssistantCloudFiles\";\nimport {\n AssistantCloudEvents,\n clearPendingAssistantCloudEvents,\n} from \"./AssistantCloudEvents\";\nimport { AssistantCloudScores } from \"./AssistantCloudScores\";\n\nexport class AssistantCloud {\n public readonly threads;\n public readonly projects;\n public readonly auth;\n public readonly runs;\n public readonly files;\n public readonly events;\n public readonly scores;\n public readonly telemetry: AssistantCloudTelemetryConfig;\n public readonly registerSdk: (sdk: SdkIdentity) => void;\n\n constructor(config: AssistantCloudConfig) {\n const api = new AssistantCloudAPI(config);\n this.registerSdk = api.registerSdk;\n const t = config.telemetry;\n const telemetry =\n t === false\n ? { enabled: false }\n : t === true || t === undefined\n ? { enabled: true }\n : {\n ...t,\n enabled: t.enabled !== false,\n };\n this.telemetry = new Proxy(telemetry, {\n set: (target, property, value) => {\n const updated = Reflect.set(target, property, value);\n if (\n (property === \"enabled\" || property === \"events\") &&\n (target.enabled === false || target.events === false)\n ) {\n clearPendingAssistantCloudEvents(this.events);\n }\n return updated;\n },\n });\n\n this.threads = new AssistantCloudThreads(api);\n this.projects = new AssistantCloudProjects(api);\n this.auth = {\n tokens: new AssistantCloudAuthTokens(api),\n };\n this.runs = new AssistantCloudRuns(api);\n this.files = new AssistantCloudFiles(api);\n this.events = new AssistantCloudEvents(\n api,\n () => this.telemetry.enabled !== false && this.telemetry.events !== false,\n );\n this.scores = new AssistantCloudScores(api);\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,QAA8B;EACxC,MAAM,MAAM,IAAI,kBAAkB,MAAM;EACxC,KAAK,cAAc,IAAI;EACvB,MAAM,IAAI,OAAO;EACjB,MAAM,YACJ,MAAM,QACF,EAAE,SAAS,MAAM,IACjB,MAAM,QAAQ,MAAM,KAAA,IAClB,EAAE,SAAS,KAAK,IAChB;GACE,GAAG;GACH,SAAS,EAAE,YAAY;EACzB;EACR,KAAK,YAAY,IAAI,MAAM,WAAW,EACpC,MAAM,QAAQ,UAAU,UAAU;GAChC,MAAM,UAAU,QAAQ,IAAI,QAAQ,UAAU,KAAK;GACnD,KACG,aAAa,aAAa,aAAa,cACvC,OAAO,YAAY,SAAS,OAAO,WAAW,QAE/C,iCAAiC,KAAK,MAAM;GAE9C,OAAO;EACT,EACF,CAAC;EAED,KAAK,UAAU,IAAI,sBAAsB,GAAG;EAC5C,KAAK,WAAW,IAAI,uBAAuB,GAAG;EAC9C,KAAK,OAAO,EACV,QAAQ,IAAI,yBAAyB,GAAG,EAC1C;EACA,KAAK,OAAO,IAAI,mBAAmB,GAAG;EACtC,KAAK,QAAQ,IAAI,oBAAoB,GAAG;EACxC,KAAK,SAAS,IAAI,qBAChB,WACM,KAAK,UAAU,YAAY,SAAS,KAAK,UAAU,WAAW,KACtE;EACA,KAAK,SAAS,IAAI,qBAAqB,GAAG;CAC5C;AACF"}
|
|
@@ -1,83 +1,85 @@
|
|
|
1
|
-
import { AssistantCloudAuthStrategy } from "./AssistantCloudAuthStrategy.js";
|
|
2
|
-
import { AssistantCloudRunReport } from "./AssistantCloudRuns.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
version: string;
|
|
1
|
+
import { type AssistantCloudAuthStrategy } from "./AssistantCloudAuthStrategy.js";
|
|
2
|
+
import type { AssistantCloudRunReport } from "./AssistantCloudRuns.js";
|
|
3
|
+
export type SdkIdentity = {
|
|
4
|
+
name: string;
|
|
5
|
+
version: string;
|
|
7
6
|
};
|
|
8
|
-
type AssistantCloudTelemetryConfig = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
7
|
+
export type AssistantCloudTelemetryConfig = {
|
|
8
|
+
/**
|
|
9
|
+
* Enables Assistant Cloud telemetry. Defaults to `true`. Set to `false` to
|
|
10
|
+
* disable both run reports and engagement events.
|
|
11
|
+
*/
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Enables Assistant Cloud engagement events. Defaults to `true` when
|
|
15
|
+
* telemetry is enabled. Set to `false` to keep run reports while disabling
|
|
16
|
+
* engagement events.
|
|
17
|
+
*/
|
|
18
|
+
events?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Stores the messages of runtimes whose backend keeps the transcript (LangGraph, LangChain, Google ADK, custom external stores), so the dashboard can show them. Defaults to `true` when telemetry is enabled. Set to `false` to keep run reports and events without storing those messages.
|
|
21
|
+
*/
|
|
22
|
+
messages?: boolean;
|
|
23
|
+
release?: string;
|
|
24
|
+
environment?: string;
|
|
25
|
+
tags?: string[];
|
|
26
|
+
/**
|
|
27
|
+
* Called before each telemetry report is sent.
|
|
28
|
+
* Return a modified report to enrich it (e.g. add `model_id`),
|
|
29
|
+
* or return `null` to skip the report.
|
|
30
|
+
*/
|
|
31
|
+
beforeReport?: (report: AssistantCloudRunReport) => AssistantCloudRunReport | null;
|
|
29
32
|
};
|
|
30
|
-
type AssistantCloudConfig = ({
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
export type AssistantCloudConfig = ({
|
|
34
|
+
baseUrl: string;
|
|
35
|
+
authToken: () => Promise<string | null>;
|
|
33
36
|
} | {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
baseUrl?: string;
|
|
38
|
+
apiKey: string;
|
|
39
|
+
userId: string;
|
|
40
|
+
workspaceId: string;
|
|
38
41
|
} | {
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
baseUrl: string;
|
|
43
|
+
anonymous: true;
|
|
41
44
|
}) & {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Client-side run telemetry reporting. Default: `true`.
|
|
47
|
+
*
|
|
48
|
+
* When enabled, the SDK automatically reports run metadata (status, step
|
|
49
|
+
* count, tool calls, and token usage) to Assistant Cloud after each
|
|
50
|
+
* assistant message is saved. Reports can also include assistant output,
|
|
51
|
+
* tool arguments and results, errors, and metadata, which may contain
|
|
52
|
+
* sensitive content. Use `beforeReport` to redact or drop reports, or
|
|
53
|
+
* `telemetry: false` to disable reporting.
|
|
54
|
+
*
|
|
55
|
+
* - `true` / `undefined` — enabled with defaults
|
|
56
|
+
* - `false` — disabled
|
|
57
|
+
* - `{ beforeReport }` — enabled with a hook to enrich or filter reports
|
|
58
|
+
*/
|
|
59
|
+
telemetry?: boolean | AssistantCloudTelemetryConfig;
|
|
57
60
|
};
|
|
58
|
-
declare class CloudAPIError extends Error {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
export declare class CloudAPIError extends Error {
|
|
62
|
+
readonly status: number;
|
|
63
|
+
readonly code?: string;
|
|
64
|
+
readonly details?: Record<string, unknown>;
|
|
65
|
+
constructor(message: string, status: number, code?: string, details?: Record<string, unknown>);
|
|
63
66
|
}
|
|
64
67
|
type MakeRequestOptions = {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
method?: "POST" | "PUT" | "DELETE" | undefined;
|
|
69
|
+
headers?: Record<string, string> | undefined;
|
|
70
|
+
query?: Record<string, string | number | boolean> | undefined;
|
|
71
|
+
body?: object | undefined;
|
|
72
|
+
keepalive?: boolean | undefined;
|
|
70
73
|
};
|
|
71
|
-
declare class AssistantCloudAPI {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
export declare class AssistantCloudAPI {
|
|
75
|
+
_auth: AssistantCloudAuthStrategy;
|
|
76
|
+
_baseUrl: string;
|
|
77
|
+
readonly registerSdk: (sdk: SdkIdentity) => void;
|
|
78
|
+
readonly sdkHeader: () => string;
|
|
79
|
+
constructor(config: AssistantCloudConfig);
|
|
80
|
+
initializeAuth(): Promise<boolean>;
|
|
81
|
+
makeRawRequest(endpoint: string, options?: MakeRequestOptions): Promise<Response>;
|
|
82
|
+
makeRequest(endpoint: string, options?: MakeRequestOptions): Promise<any>;
|
|
80
83
|
}
|
|
81
|
-
|
|
82
|
-
export { AssistantCloudAPI, AssistantCloudConfig, AssistantCloudTelemetryConfig, CloudAPIError, SdkIdentity };
|
|
84
|
+
export {};
|
|
83
85
|
//# sourceMappingURL=AssistantCloudAPI.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudAPI.d.ts","
|
|
1
|
+
{"version":3,"file":"AssistantCloudAPI.d.ts","sourceRoot":"","sources":["../src/AssistantCloudAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAKhC,wCAAqC;AACtC,OAAO,KAAK,EAAE,uBAAuB,EAAE,gCAA6B;AAGpE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,uBAAuB,KAC5B,uBAAuB,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAC/B;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACzC,GACD;IACE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CACJ,GAAG;IACF;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,6BAA6B,CAAC;CACrD,CAAC;AAEF,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGhD,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQpC;AAED,KAAK,kBAAkB,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC;IAC9D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC,CAAC;AAIF,qBAAa,iBAAiB;IACrB,KAAK,EAAE,0BAA0B,CAAC;IAClC,QAAQ,SAAC;IAChB,SAAgB,WAAW,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACxD,SAAgB,SAAS,EAAE,MAAM,MAAM,CAAC;gBAE5B,MAAM,EAAE,oBAAoB;IAuC3B,cAAc;IAId,cAAc,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB;IAkErB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;CAa5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudAPI.js","names":[],"sources":["../src/AssistantCloudAPI.ts"],"sourcesContent":["import {\n type AssistantCloudAuthStrategy,\n AssistantCloudJWTAuthStrategy,\n AssistantCloudAPIKeyAuthStrategy,\n AssistantCloudAnonymousAuthStrategy,\n normalizeBaseUrl,\n} from \"./AssistantCloudAuthStrategy\";\nimport type { AssistantCloudRunReport } from \"./AssistantCloudRuns\";\nimport { ASSISTANT_CLOUD_VERSION } from \"./version\";\n\nexport type SdkIdentity = {\n name: string;\n version: string;\n};\n\nexport type AssistantCloudTelemetryConfig = {\n /**\n * Enables Assistant Cloud telemetry. Defaults to `true`. Set to `false` to\n * disable both run reports and engagement events.\n */\n enabled?: boolean;\n /**\n * Enables Assistant Cloud engagement events. Defaults to `true` when\n * telemetry is enabled. Set to `false` to keep run reports while disabling\n * engagement events.\n */\n events?: boolean;\n release?: string;\n environment?: string;\n tags?: string[];\n /**\n * Called before each telemetry report is sent.\n * Return a modified report to enrich it (e.g. add `model_id`),\n * or return `null` to skip the report.\n */\n beforeReport?: (\n report: AssistantCloudRunReport,\n ) => AssistantCloudRunReport | null;\n};\n\nexport type AssistantCloudConfig = (\n | {\n baseUrl: string;\n authToken: () => Promise<string | null>;\n }\n | {\n baseUrl?: string;\n apiKey: string;\n userId: string;\n workspaceId: string;\n }\n | {\n baseUrl: string;\n anonymous: true;\n }\n) & {\n /**\n * Client-side run telemetry reporting. Default: `true`.\n *\n * When enabled, the SDK automatically reports run metadata (status, step\n * count, tool calls, and token usage) to Assistant Cloud after each\n * assistant message is saved. Reports can also include assistant output,\n * tool arguments and results, errors, and metadata, which may contain\n * sensitive content. Use `beforeReport` to redact or drop reports, or\n * `telemetry: false` to disable reporting.\n *\n * - `true` / `undefined` — enabled with defaults\n * - `false` — disabled\n * - `{ beforeReport }` — enabled with a hook to enrich or filter reports\n */\n telemetry?: boolean | AssistantCloudTelemetryConfig;\n};\n\nexport class CloudAPIError extends Error {\n public readonly status: number;\n public readonly code?: string;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n message: string,\n status: number,\n code?: string,\n details?: Record<string, unknown>,\n ) {\n super(message);\n this.status = status;\n if (code !== undefined) this.code = code;\n if (details !== undefined) this.details = details;\n this.name = \"CloudAPIError\";\n }\n}\n\ntype MakeRequestOptions = {\n method?: \"POST\" | \"PUT\" | \"DELETE\" | undefined;\n headers?: Record<string, string> | undefined;\n query?: Record<string, string | number | boolean> | undefined;\n body?: object | undefined;\n keepalive?: boolean | undefined;\n};\n\nconst HEADER_TOKEN = /^[\\x21-\\x7e]+$/;\n\nexport class AssistantCloudAPI {\n public _auth: AssistantCloudAuthStrategy;\n public _baseUrl;\n public readonly registerSdk: (sdk: SdkIdentity) => void;\n public readonly sdkHeader: () => string;\n\n constructor(config: AssistantCloudConfig) {\n const sdks = new Map<string, SdkIdentity>();\n this.registerSdk = (sdk) => {\n const name = sdk.name.trim();\n const version = sdk.version.trim();\n if (!HEADER_TOKEN.test(name) || !HEADER_TOKEN.test(version)) return;\n sdks.set(`${name}/${version}`, { name, version });\n };\n this.sdkHeader = () =>\n [\n `assistant-cloud/${ASSISTANT_CLOUD_VERSION}`,\n ...Array.from(\n sdks.values(),\n ({ name, version }) => `${name}/${version}`,\n ),\n ].join(\" \");\n\n if (\"authToken\" in config) {\n this._baseUrl = normalizeBaseUrl(config.baseUrl);\n this._auth = new AssistantCloudJWTAuthStrategy(config.authToken);\n } else if (\"apiKey\" in config) {\n this._baseUrl = normalizeBaseUrl(\n config.baseUrl ?? \"https://backend.assistant-api.com\",\n );\n this._auth = new AssistantCloudAPIKeyAuthStrategy(\n config.apiKey,\n config.userId,\n config.workspaceId,\n );\n } else if (\"anonymous\" in config) {\n this._baseUrl = normalizeBaseUrl(config.baseUrl);\n this._auth = new AssistantCloudAnonymousAuthStrategy(this._baseUrl);\n } else {\n throw new Error(\n \"Invalid configuration: Must provide authToken, apiKey, or anonymous configuration\",\n );\n }\n }\n\n public async initializeAuth() {\n return !!(await this._auth.getAuthHeaders());\n }\n\n public async makeRawRequest(\n endpoint: string,\n options: MakeRequestOptions = {},\n ) {\n const authHeaders = await this._auth.getAuthHeaders();\n if (!authHeaders) throw new Error(\"Authorization failed\");\n\n const headers = {\n ...authHeaders,\n ...options.headers,\n \"Content-Type\": \"application/json\",\n \"Aui-Sdk\": this.sdkHeader(),\n };\n\n const queryParams = new URLSearchParams();\n if (options.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value === false) continue;\n if (value === true) {\n queryParams.set(key, \"true\");\n } else {\n queryParams.set(key, value.toString());\n }\n }\n }\n\n const url = new URL(`${this._baseUrl}/v1${endpoint}`);\n url.search = queryParams.toString();\n\n const response = await fetch(url, {\n method: options.method ?? \"GET\",\n headers,\n body: options.body ? JSON.stringify(options.body) : null,\n ...(options.keepalive ? { keepalive: true } : {}),\n });\n\n this._auth.readAuthHeaders(response.headers);\n\n if (!response.ok) {\n const text = await response.text();\n let message: string | undefined;\n let code: string | undefined;\n let details: Record<string, unknown> | undefined;\n try {\n const body = JSON.parse(text) as unknown;\n if (typeof body === \"object\" && body !== null && !Array.isArray(body)) {\n const record = body as Record<string, unknown>;\n if (typeof record.message === \"string\" && record.message.length > 0) {\n message = record.message;\n }\n if (typeof record.error === \"string\") {\n code = record.error;\n details = { ...record };\n delete details.error;\n }\n }\n } catch {}\n throw new CloudAPIError(\n message ?? `Request failed with status ${response.status}, ${text}`,\n response.status,\n code,\n details,\n );\n }\n\n return response;\n }\n\n public async makeRequest(endpoint: string, options: MakeRequestOptions = {}) {\n const response = await this.makeRawRequest(endpoint, options);\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n )\n return undefined;\n\n const text = await response.text();\n if (text.trim() === \"\") return undefined;\n\n return JSON.parse(text);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssistantCloudAPI.js","names":[],"sources":["../src/AssistantCloudAPI.ts"],"sourcesContent":["import {\n type AssistantCloudAuthStrategy,\n AssistantCloudJWTAuthStrategy,\n AssistantCloudAPIKeyAuthStrategy,\n AssistantCloudAnonymousAuthStrategy,\n normalizeBaseUrl,\n} from \"./AssistantCloudAuthStrategy\";\nimport type { AssistantCloudRunReport } from \"./AssistantCloudRuns\";\nimport { ASSISTANT_CLOUD_VERSION } from \"./version\";\n\nexport type SdkIdentity = {\n name: string;\n version: string;\n};\n\nexport type AssistantCloudTelemetryConfig = {\n /**\n * Enables Assistant Cloud telemetry. Defaults to `true`. Set to `false` to\n * disable both run reports and engagement events.\n */\n enabled?: boolean;\n /**\n * Enables Assistant Cloud engagement events. Defaults to `true` when\n * telemetry is enabled. Set to `false` to keep run reports while disabling\n * engagement events.\n */\n events?: boolean;\n /**\n * Stores the messages of runtimes whose backend keeps the transcript (LangGraph, LangChain, Google ADK, custom external stores), so the dashboard can show them. Defaults to `true` when telemetry is enabled. Set to `false` to keep run reports and events without storing those messages.\n */\n messages?: boolean;\n release?: string;\n environment?: string;\n tags?: string[];\n /**\n * Called before each telemetry report is sent.\n * Return a modified report to enrich it (e.g. add `model_id`),\n * or return `null` to skip the report.\n */\n beforeReport?: (\n report: AssistantCloudRunReport,\n ) => AssistantCloudRunReport | null;\n};\n\nexport type AssistantCloudConfig = (\n | {\n baseUrl: string;\n authToken: () => Promise<string | null>;\n }\n | {\n baseUrl?: string;\n apiKey: string;\n userId: string;\n workspaceId: string;\n }\n | {\n baseUrl: string;\n anonymous: true;\n }\n) & {\n /**\n * Client-side run telemetry reporting. Default: `true`.\n *\n * When enabled, the SDK automatically reports run metadata (status, step\n * count, tool calls, and token usage) to Assistant Cloud after each\n * assistant message is saved. Reports can also include assistant output,\n * tool arguments and results, errors, and metadata, which may contain\n * sensitive content. Use `beforeReport` to redact or drop reports, or\n * `telemetry: false` to disable reporting.\n *\n * - `true` / `undefined` — enabled with defaults\n * - `false` — disabled\n * - `{ beforeReport }` — enabled with a hook to enrich or filter reports\n */\n telemetry?: boolean | AssistantCloudTelemetryConfig;\n};\n\nexport class CloudAPIError extends Error {\n public readonly status: number;\n public readonly code?: string;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n message: string,\n status: number,\n code?: string,\n details?: Record<string, unknown>,\n ) {\n super(message);\n this.status = status;\n if (code !== undefined) this.code = code;\n if (details !== undefined) this.details = details;\n this.name = \"CloudAPIError\";\n }\n}\n\ntype MakeRequestOptions = {\n method?: \"POST\" | \"PUT\" | \"DELETE\" | undefined;\n headers?: Record<string, string> | undefined;\n query?: Record<string, string | number | boolean> | undefined;\n body?: object | undefined;\n keepalive?: boolean | undefined;\n};\n\nconst HEADER_TOKEN = /^[\\x21-\\x7e]+$/;\n\nexport class AssistantCloudAPI {\n public _auth: AssistantCloudAuthStrategy;\n public _baseUrl;\n public readonly registerSdk: (sdk: SdkIdentity) => void;\n public readonly sdkHeader: () => string;\n\n constructor(config: AssistantCloudConfig) {\n const sdks = new Map<string, SdkIdentity>();\n this.registerSdk = (sdk) => {\n const name = sdk.name.trim();\n const version = sdk.version.trim();\n if (!HEADER_TOKEN.test(name) || !HEADER_TOKEN.test(version)) return;\n sdks.set(`${name}/${version}`, { name, version });\n };\n this.sdkHeader = () =>\n [\n `assistant-cloud/${ASSISTANT_CLOUD_VERSION}`,\n ...Array.from(\n sdks.values(),\n ({ name, version }) => `${name}/${version}`,\n ),\n ].join(\" \");\n\n if (\"authToken\" in config) {\n this._baseUrl = normalizeBaseUrl(config.baseUrl);\n this._auth = new AssistantCloudJWTAuthStrategy(config.authToken);\n } else if (\"apiKey\" in config) {\n this._baseUrl = normalizeBaseUrl(\n config.baseUrl ?? \"https://backend.assistant-api.com\",\n );\n this._auth = new AssistantCloudAPIKeyAuthStrategy(\n config.apiKey,\n config.userId,\n config.workspaceId,\n );\n } else if (\"anonymous\" in config) {\n this._baseUrl = normalizeBaseUrl(config.baseUrl);\n this._auth = new AssistantCloudAnonymousAuthStrategy(this._baseUrl);\n } else {\n throw new Error(\n \"Invalid configuration: Must provide authToken, apiKey, or anonymous configuration\",\n );\n }\n }\n\n public async initializeAuth() {\n return !!(await this._auth.getAuthHeaders());\n }\n\n public async makeRawRequest(\n endpoint: string,\n options: MakeRequestOptions = {},\n ) {\n const authHeaders = await this._auth.getAuthHeaders();\n if (!authHeaders) throw new Error(\"Authorization failed\");\n\n const headers = {\n ...authHeaders,\n ...options.headers,\n \"Content-Type\": \"application/json\",\n \"Aui-Sdk\": this.sdkHeader(),\n };\n\n const queryParams = new URLSearchParams();\n if (options.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value === false) continue;\n if (value === true) {\n queryParams.set(key, \"true\");\n } else {\n queryParams.set(key, value.toString());\n }\n }\n }\n\n const url = new URL(`${this._baseUrl}/v1${endpoint}`);\n url.search = queryParams.toString();\n\n const response = await fetch(url, {\n method: options.method ?? \"GET\",\n headers,\n body: options.body ? JSON.stringify(options.body) : null,\n ...(options.keepalive ? { keepalive: true } : {}),\n });\n\n this._auth.readAuthHeaders(response.headers);\n\n if (!response.ok) {\n const text = await response.text();\n let message: string | undefined;\n let code: string | undefined;\n let details: Record<string, unknown> | undefined;\n try {\n const body = JSON.parse(text) as unknown;\n if (typeof body === \"object\" && body !== null && !Array.isArray(body)) {\n const record = body as Record<string, unknown>;\n if (typeof record.message === \"string\" && record.message.length > 0) {\n message = record.message;\n }\n if (typeof record.error === \"string\") {\n code = record.error;\n details = { ...record };\n delete details.error;\n }\n }\n } catch {}\n throw new CloudAPIError(\n message ?? `Request failed with status ${response.status}, ${text}`,\n response.status,\n code,\n details,\n );\n }\n\n return response;\n }\n\n public async makeRequest(endpoint: string, options: MakeRequestOptions = {}) {\n const response = await this.makeRawRequest(endpoint, options);\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n )\n return undefined;\n\n const text = await response.text();\n if (text.trim() === \"\") return undefined;\n\n return JSON.parse(text);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,38 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
readAuthHeaders(headers: Headers): void;
|
|
1
|
+
export type AssistantCloudAuthStrategy = {
|
|
2
|
+
readonly strategy: "anon" | "jwt" | "api-key";
|
|
3
|
+
getAuthHeaders(): Promise<Record<string, string> | false>;
|
|
4
|
+
readAuthHeaders(headers: Headers): void;
|
|
6
5
|
};
|
|
7
|
-
declare class AssistantCloudJWTAuthStrategy implements AssistantCloudAuthStrategy {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
export declare class AssistantCloudJWTAuthStrategy implements AssistantCloudAuthStrategy {
|
|
7
|
+
#private;
|
|
8
|
+
readonly strategy = "jwt";
|
|
9
|
+
private cachedToken;
|
|
10
|
+
private tokenExpiry;
|
|
11
|
+
private tokenRequest;
|
|
12
|
+
constructor(authTokenCallback: () => Promise<string | null>);
|
|
13
|
+
getAuthHeaders(): Promise<Record<string, string> | false>;
|
|
14
|
+
private fetchAuthHeaders;
|
|
15
|
+
readAuthHeaders(headers: Headers): void;
|
|
17
16
|
}
|
|
18
|
-
declare class AssistantCloudAPIKeyAuthStrategy implements AssistantCloudAuthStrategy {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
export declare class AssistantCloudAPIKeyAuthStrategy implements AssistantCloudAuthStrategy {
|
|
18
|
+
#private;
|
|
19
|
+
readonly strategy = "api-key";
|
|
20
|
+
constructor(apiKey: string, userId: string, workspaceId: string);
|
|
21
|
+
getAuthHeaders(): Promise<Record<string, string>>;
|
|
22
|
+
readAuthHeaders(): void;
|
|
24
23
|
}
|
|
25
|
-
declare const normalizeBaseUrl: (baseUrl: string) => string;
|
|
24
|
+
export declare const normalizeBaseUrl: (baseUrl: string) => string;
|
|
26
25
|
/** The refresh token of the anonymous identity this browser holds for `baseUrl`, or null when it has none. */
|
|
27
|
-
declare const readAnonymousRefreshToken: (baseUrl: string) => string | null;
|
|
28
|
-
declare class AssistantCloudAnonymousAuthStrategy implements AssistantCloudAuthStrategy {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
export declare const readAnonymousRefreshToken: (baseUrl: string) => string | null;
|
|
27
|
+
export declare class AssistantCloudAnonymousAuthStrategy implements AssistantCloudAuthStrategy {
|
|
28
|
+
readonly strategy = "anon";
|
|
29
|
+
private baseUrl;
|
|
30
|
+
private jwtStrategy;
|
|
31
|
+
constructor(baseUrl: string);
|
|
32
|
+
getAuthHeaders(): Promise<Record<string, string> | false>;
|
|
33
|
+
readAuthHeaders(headers: Headers): void;
|
|
35
34
|
}
|
|
36
|
-
//#endregion
|
|
37
|
-
export { AssistantCloudAPIKeyAuthStrategy, AssistantCloudAnonymousAuthStrategy, AssistantCloudAuthStrategy, AssistantCloudJWTAuthStrategy, normalizeBaseUrl, readAnonymousRefreshToken };
|
|
38
35
|
//# sourceMappingURL=AssistantCloudAuthStrategy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudAuthStrategy.d.ts","
|
|
1
|
+
{"version":3,"file":"AssistantCloudAuthStrategy.d.ts","sourceRoot":"","sources":["../src/AssistantCloudAuthStrategy.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC9C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1D,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzC,CAAC;AAkFF,qBAAa,6BAA8B,YAAW,0BAA0B;;IAC9E,SAAgB,QAAQ,SAAS;IAEjC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAwD;gBAGhE,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;YA0BxD,gBAAgB;IAWvB,eAAe,CAAC,OAAO,EAAE,OAAO;CAaxC;AAED,qBAAa,gCAAiC,YAAW,0BAA0B;;IACjF,SAAgB,QAAQ,aAAa;gBAMzB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAMlD,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAQvD,eAAe;CAGvB;AAoDD,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MAGlD,CAAC;AAEF,8GAA8G;AAC9G,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,IAKpE,CAAC;AAmEF,qBAAa,mCAAoC,YAAW,0BAA0B;IACpF,SAAgB,QAAQ,UAAU;IAElC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAgC;gBAEvC,OAAO,EAAE,MAAM;IAwFd,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IAI/D,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAG/C"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { AssistantCloudAPI } from "./AssistantCloudAPI.js";
|
|
2
|
-
//#region src/AssistantCloudAuthTokens.d.ts
|
|
1
|
+
import type { AssistantCloudAPI } from "./AssistantCloudAPI.js";
|
|
3
2
|
type AssistantCloudAuthTokensCreateResponse = {
|
|
4
|
-
|
|
3
|
+
token: string;
|
|
5
4
|
};
|
|
6
|
-
declare class AssistantCloudAuthTokens {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
export declare class AssistantCloudAuthTokens {
|
|
6
|
+
private cloud;
|
|
7
|
+
constructor(cloud: AssistantCloudAPI);
|
|
8
|
+
create(): Promise<AssistantCloudAuthTokensCreateResponse>;
|
|
10
9
|
}
|
|
11
|
-
|
|
12
|
-
export { AssistantCloudAuthTokens };
|
|
10
|
+
export {};
|
|
13
11
|
//# sourceMappingURL=AssistantCloudAuthTokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudAuthTokens.d.ts","
|
|
1
|
+
{"version":3,"file":"AssistantCloudAuthTokens.d.ts","sourceRoot":"","sources":["../src/AssistantCloudAuthTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,+BAA4B;AAG7D,KAAK,sCAAsC,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,KAAK,CAAoB;gBAErB,KAAK,EAAE,iBAAiB;IAIvB,MAAM,IAAI,OAAO,CAAC,sCAAsC,CAAC;CAQvE"}
|
|
@@ -1,32 +1,38 @@
|
|
|
1
|
-
import { AssistantCloudAPI } from "./AssistantCloudAPI.js";
|
|
2
|
-
|
|
3
|
-
type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
props?: Readonly<Record<string, string | number | boolean>> | undefined;
|
|
1
|
+
import type { AssistantCloudAPI } from "./AssistantCloudAPI.js";
|
|
2
|
+
export type AssistantCloudEventKind = "message_sent" | "message_edited" | "run_stopped" | "message_regenerated" | "message_copied" | "branch_switched" | "suggestions_shown" | "suggestion_clicked" | "attachment_added" | "attachment_failed" | "thread_switched" | "tool_approved" | "tool_rejected" | "speech_started" | "voice_started" | "error_shown";
|
|
3
|
+
export type AssistantCloudEvent = {
|
|
4
|
+
kind: AssistantCloudEventKind;
|
|
5
|
+
thread_id?: string | undefined;
|
|
6
|
+
message_id?: string | undefined;
|
|
7
|
+
run_id?: string | undefined;
|
|
8
|
+
value?: number | undefined;
|
|
9
|
+
props?: Readonly<Record<string, string | number | boolean>> | undefined;
|
|
11
10
|
};
|
|
12
|
-
declare
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
11
|
+
export declare const clearPendingAssistantCloudEvents: (events: AssistantCloudEvents) => void;
|
|
12
|
+
export declare class AssistantCloudEvents {
|
|
13
|
+
private buffer;
|
|
14
|
+
private timer;
|
|
15
|
+
private flushing;
|
|
16
|
+
private retryTimer;
|
|
17
|
+
private resolveRetryDelay;
|
|
18
|
+
private bestEffortRequested;
|
|
19
|
+
private generation;
|
|
20
|
+
private readonly cloud;
|
|
21
|
+
private readonly isEnabled;
|
|
22
|
+
private listening;
|
|
23
|
+
constructor(cloud: AssistantCloudAPI, isEnabled: () => boolean);
|
|
24
|
+
track(event: AssistantCloudEvent): void;
|
|
25
|
+
private listen;
|
|
26
|
+
private unlisten;
|
|
27
|
+
dispose(): void;
|
|
28
|
+
private clearPending;
|
|
29
|
+
private onVisibilityChange;
|
|
30
|
+
private flushBestEffort;
|
|
31
|
+
private flush;
|
|
32
|
+
private flushPending;
|
|
33
|
+
private waitForRetry;
|
|
34
|
+
private interruptRetryDelay;
|
|
35
|
+
private scheduleFlush;
|
|
36
|
+
private clearFlushTimer;
|
|
29
37
|
}
|
|
30
|
-
//#endregion
|
|
31
|
-
export { AssistantCloudEvent, AssistantCloudEventKind, AssistantCloudEvents };
|
|
32
38
|
//# sourceMappingURL=AssistantCloudEvents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantCloudEvents.d.ts","
|
|
1
|
+
{"version":3,"file":"AssistantCloudEvents.d.ts","sourceRoot":"","sources":["../src/AssistantCloudEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,+BAA4B;AAE7D,MAAM,MAAM,uBAAuB,GAC/B,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,qBAAqB,GACrB,gBAAgB,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,aAAa,CAAC;AAElB,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACzE,CAAC;AAQF,eAAO,MAAM,gCAAgC,GAC3C,QAAQ,oBAAoB,KAC3B,IAEF,CAAC;AAEF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAE1C,OAAO,CAAC,SAAS,CAAS;gBAEd,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,OAAO;IAMvD,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAa9C,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,QAAQ;IAOT,OAAO,IAAI,IAAI;IAMtB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,kBAAkB,CAIxB;IAEF,OAAO,CAAC,eAAe,CAMrB;IAEF,OAAO,CAAC,KAAK,CAsBX;YAEY,YAAY;IAkC1B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;CAKxB"}
|