assistant-cloud 0.1.35 → 0.1.37

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 (76) hide show
  1. package/dist/AssistantCloud.d.ts +2 -0
  2. package/dist/AssistantCloud.d.ts.map +1 -1
  3. package/dist/AssistantCloud.js +4 -1
  4. package/dist/AssistantCloud.js.map +1 -1
  5. package/dist/AssistantCloudAPI.d.ts.map +1 -1
  6. package/dist/AssistantCloudAPI.js +8 -4
  7. package/dist/AssistantCloudAPI.js.map +1 -1
  8. package/dist/AssistantCloudAuthStrategy.d.ts +2 -0
  9. package/dist/AssistantCloudAuthStrategy.d.ts.map +1 -1
  10. package/dist/AssistantCloudAuthStrategy.js +15 -5
  11. package/dist/AssistantCloudAuthStrategy.js.map +1 -1
  12. package/dist/AssistantCloudAuthTokens.d.ts.map +1 -1
  13. package/dist/AssistantCloudAuthTokens.js.map +1 -1
  14. package/dist/AssistantCloudFiles.d.ts.map +1 -1
  15. package/dist/AssistantCloudFiles.js.map +1 -1
  16. package/dist/AssistantCloudProjectThreadMessages.d.ts +19 -0
  17. package/dist/AssistantCloudProjectThreadMessages.d.ts.map +1 -0
  18. package/dist/AssistantCloudProjectThreadMessages.js +16 -0
  19. package/dist/AssistantCloudProjectThreadMessages.js.map +1 -0
  20. package/dist/AssistantCloudProjectThreads.d.ts +21 -0
  21. package/dist/AssistantCloudProjectThreads.d.ts.map +1 -0
  22. package/dist/AssistantCloudProjectThreads.js +22 -0
  23. package/dist/AssistantCloudProjectThreads.js.map +1 -0
  24. package/dist/AssistantCloudProjects.d.ts +10 -0
  25. package/dist/AssistantCloudProjects.d.ts.map +1 -0
  26. package/dist/AssistantCloudProjects.js +12 -0
  27. package/dist/AssistantCloudProjects.js.map +1 -0
  28. package/dist/AssistantCloudRuns.d.ts.map +1 -1
  29. package/dist/AssistantCloudRuns.js.map +1 -1
  30. package/dist/AssistantCloudThreadMessages.d.ts +2 -1
  31. package/dist/AssistantCloudThreadMessages.d.ts.map +1 -1
  32. package/dist/AssistantCloudThreadMessages.js +15 -2
  33. package/dist/AssistantCloudThreadMessages.js.map +1 -1
  34. package/dist/AssistantCloudThreads.d.ts +3 -2
  35. package/dist/AssistantCloudThreads.d.ts.map +1 -1
  36. package/dist/AssistantCloudThreads.js +21 -4
  37. package/dist/AssistantCloudThreads.js.map +1 -1
  38. package/dist/CloudMessagePersistence.d.ts +2 -1
  39. package/dist/CloudMessagePersistence.d.ts.map +1 -1
  40. package/dist/CloudMessagePersistence.js +11 -6
  41. package/dist/CloudMessagePersistence.js.map +1 -1
  42. package/dist/FormattedCloudPersistence.d.ts.map +1 -1
  43. package/dist/cloudResponse.d.ts +16 -0
  44. package/dist/cloudResponse.d.ts.map +1 -0
  45. package/dist/cloudResponse.js +43 -0
  46. package/dist/cloudResponse.js.map +1 -0
  47. package/dist/index.d.ts +2 -1
  48. package/dist/index.js +2 -1
  49. package/dist/instrumentMcpSampling.d.ts.map +1 -1
  50. package/dist/tests/setup.d.ts +1 -1
  51. package/dist/tests/setup.js +2 -4
  52. package/dist/tests/setup.js.map +1 -1
  53. package/package.json +3 -3
  54. package/src/AssistantCloud.ts +3 -0
  55. package/src/AssistantCloudAPI.ts +15 -10
  56. package/src/AssistantCloudAuthStrategy.ts +21 -6
  57. package/src/AssistantCloudAuthTokens.ts +5 -1
  58. package/src/AssistantCloudFiles.ts +5 -1
  59. package/src/AssistantCloudProjectThreadMessages.ts +44 -0
  60. package/src/AssistantCloudProjectThreads.ts +50 -0
  61. package/src/AssistantCloudProjects.ts +10 -0
  62. package/src/AssistantCloudRuns.ts +5 -1
  63. package/src/AssistantCloudThreadMessages.test.ts +41 -0
  64. package/src/AssistantCloudThreadMessages.ts +43 -4
  65. package/src/AssistantCloudThreads.test.ts +74 -0
  66. package/src/AssistantCloudThreads.ts +55 -4
  67. package/src/CloudMessagePersistence.ts +18 -5
  68. package/src/cloudResponse.test.ts +28 -0
  69. package/src/cloudResponse.ts +72 -0
  70. package/src/index.ts +1 -0
  71. package/src/tests/AssistantCloudAPI.test.ts +5 -19
  72. package/src/tests/AssistantCloudAuthStrategy.test.ts +50 -22
  73. package/src/tests/AssistantCloudProjects.test.ts +121 -0
  74. package/src/tests/CloudMessagePersistence.test.ts +40 -0
  75. package/src/tests/setup.ts +2 -9
  76. package/src/tests/AssistantCloudFiles.test.ts +0 -562
@@ -2,10 +2,12 @@ import { AssistantCloudRuns } from "./AssistantCloudRuns.js";
2
2
  import { AssistantCloudConfig, AssistantCloudTelemetryConfig } from "./AssistantCloudAPI.js";
3
3
  import { AssistantCloudAuthTokens } from "./AssistantCloudAuthTokens.js";
4
4
  import { AssistantCloudThreads } from "./AssistantCloudThreads.js";
5
+ import { AssistantCloudProjects } from "./AssistantCloudProjects.js";
5
6
  import { AssistantCloudFiles } from "./AssistantCloudFiles.js";
6
7
  //#region src/AssistantCloud.d.ts
7
8
  declare class AssistantCloud {
8
9
  readonly threads: AssistantCloudThreads;
10
+ readonly projects: AssistantCloudProjects;
9
11
  readonly auth: {
10
12
  tokens: AssistantCloudAuthTokens;
11
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloud.d.ts","names":[],"sources":["../src/AssistantCloud.ts"],"mappings":";;;;;;cAUa;WACK,SAAO;WACP;;;WACA,MAAI;WACJ,OAAK;WACL,WAAW;cAEf,QAAQ"}
1
+ {"version":3,"file":"AssistantCloud.d.ts","names":[],"sources":["../src/AssistantCloud.ts"],"mappings":";;;;;;;cAWa;WACK,SAAO;WACP,UAAQ;WACR;;;WACA,MAAI;WACJ,OAAK;WACL,WAAW;EAEf,YAAA,QAAQ"}
@@ -1,11 +1,13 @@
1
1
  import { AssistantCloudAPI } from "./AssistantCloudAPI.js";
2
2
  import { AssistantCloudAuthTokens } from "./AssistantCloudAuthTokens.js";
3
- import { AssistantCloudRuns } from "./AssistantCloudRuns.js";
4
3
  import { AssistantCloudThreads } from "./AssistantCloudThreads.js";
4
+ import { AssistantCloudProjects } from "./AssistantCloudProjects.js";
5
+ import { AssistantCloudRuns } from "./AssistantCloudRuns.js";
5
6
  import { AssistantCloudFiles } from "./AssistantCloudFiles.js";
6
7
  //#region src/AssistantCloud.ts
7
8
  var AssistantCloud = class {
8
9
  threads;
10
+ projects;
9
11
  auth;
10
12
  runs;
11
13
  files;
@@ -13,6 +15,7 @@ var AssistantCloud = class {
13
15
  constructor(config) {
14
16
  const api = new AssistantCloudAPI(config);
15
17
  this.threads = new AssistantCloudThreads(api);
18
+ this.projects = new AssistantCloudProjects(api);
16
19
  this.auth = { tokens: new AssistantCloudAuthTokens(api) };
17
20
  this.runs = new AssistantCloudRuns(api);
18
21
  this.files = new AssistantCloudFiles(api);
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloud.js","names":[],"sources":["../src/AssistantCloud.ts"],"sourcesContent":["import {\n AssistantCloudAPI,\n type AssistantCloudConfig,\n type AssistantCloudTelemetryConfig,\n} from \"./AssistantCloudAPI\";\nimport { AssistantCloudAuthTokens } from \"./AssistantCloudAuthTokens\";\nimport { AssistantCloudRuns } from \"./AssistantCloudRuns\";\nimport { AssistantCloudThreads } from \"./AssistantCloudThreads\";\nimport { AssistantCloudFiles } from \"./AssistantCloudFiles\";\n\nexport class AssistantCloud {\n public readonly threads;\n public readonly auth;\n public readonly runs;\n public readonly files;\n public readonly telemetry: AssistantCloudTelemetryConfig;\n\n constructor(config: AssistantCloudConfig) {\n const api = new AssistantCloudAPI(config);\n this.threads = new AssistantCloudThreads(api);\n this.auth = {\n tokens: new AssistantCloudAuthTokens(api),\n };\n this.runs = new AssistantCloudRuns(api);\n this.files = new AssistantCloudFiles(api);\n\n const t = config.telemetry;\n this.telemetry =\n t === false\n ? { enabled: false }\n : t === true || t === undefined\n ? { enabled: true }\n : { enabled: t.enabled !== false, ...t };\n }\n}\n"],"mappings":";;;;;;AAUA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CACA;CACA;CAEA,YAAY,QAA8B;EACxC,MAAM,MAAM,IAAI,kBAAkB,MAAM;EACxC,KAAK,UAAU,IAAI,sBAAsB,GAAG;EAC5C,KAAK,OAAO,EACV,QAAQ,IAAI,yBAAyB,GAAG,EAC1C;EACA,KAAK,OAAO,IAAI,mBAAmB,GAAG;EACtC,KAAK,QAAQ,IAAI,oBAAoB,GAAG;EAExC,MAAM,IAAI,OAAO;EACjB,KAAK,YACH,MAAM,QACF,EAAE,SAAS,MAAM,IACjB,MAAM,QAAQ,MAAM,KAAA,IAClB,EAAE,SAAS,KAAK,IAChB;GAAE,SAAS,EAAE,YAAY;GAAO,GAAG;EAAE;CAC/C;AACF"}
1
+ {"version":3,"file":"AssistantCloud.js","names":[],"sources":["../src/AssistantCloud.ts"],"sourcesContent":["import {\n AssistantCloudAPI,\n type AssistantCloudConfig,\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\";\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 telemetry: AssistantCloudTelemetryConfig;\n\n constructor(config: AssistantCloudConfig) {\n const api = new AssistantCloudAPI(config);\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\n const t = config.telemetry;\n this.telemetry =\n t === false\n ? { enabled: false }\n : t === true || t === undefined\n ? { enabled: true }\n : { enabled: t.enabled !== false, ...t };\n }\n}\n"],"mappings":";;;;;;;AAWA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,QAA8B;EACxC,MAAM,MAAM,IAAI,kBAAkB,MAAM;EACxC,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;EAExC,MAAM,IAAI,OAAO;EACjB,KAAK,YACH,MAAM,QACF,EAAE,SAAS,MAAM,IACjB,MAAM,QAAQ,MAAM,KAAA,IAClB,EAAE,SAAS,KAAK,IAChB;GAAE,SAAS,EAAE,YAAY;GAAO,GAAG;EAAE;CAC/C;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudAPI.d.ts","names":[],"sources":["../src/AssistantCloudAPI.ts"],"mappings":";;;KAQY;EACV;;;;;;EAMA,gBACE,QAAQ,4BACL;;KAGK;EAEN;EACA,iBAAiB;;EAGjB;EACA;EACA;EACA;;EAGA;EACA;;;;;;;;;;;;;EAcJ,sBAAsB;;cAGX,sBAAsB;WAGf;cADhB,iBACgB;;KAOf;EACH;EACA,UAAU;EACV,QAAQ;EACR;;cAGW;EACJ,OAAO;EACP;cAEK,QAAQ;EAuBP,kBAAc;EAId,eACX,kBACA,UAAS,qBAAuB,QAAA;EAmDrB,YAAY,kBAAkB,UAAS,qBAAuB"}
1
+ {"version":3,"file":"AssistantCloudAPI.d.ts","names":[],"sources":["../src/AssistantCloudAPI.ts"],"mappings":";;;KAQY;EACV;;;;;;EAMA,gBACE,QAAQ,4BACL;;KAGK;EAEN;EACA,iBAAiB;;EAGjB;EACA;EACA;EACA;;EAGA;EACA;;;;;;;;;;;;;EAcJ,sBAAsB;;cAGX,sBAAsB;WACjB;EAEJ,YAAA,iBAAiB;;KAO1B;EACH;EACA,UAAU;EACV,QAAQ;EACR;;cAQW;EACJ,OAAO;EACP;EAEK,YAAA,QAAQ;EAuBP,kBAAc;EAId,eACX,kBACA,UAAS,qBAAuB,QAAA;EAmDrB,YAAY,kBAAkB,UAAS,qBAAuB"}
@@ -8,19 +8,23 @@ var CloudAPIError = class extends Error {
8
8
  this.name = "CloudAPIError";
9
9
  }
10
10
  };
11
+ const normalizeBaseUrl = (baseUrl) => {
12
+ if (!baseUrl || !baseUrl.endsWith("/")) return baseUrl;
13
+ return baseUrl.slice(0, -1);
14
+ };
11
15
  var AssistantCloudAPI = class {
12
16
  _auth;
13
17
  _baseUrl;
14
18
  constructor(config) {
15
19
  if ("authToken" in config) {
16
- this._baseUrl = config.baseUrl;
20
+ this._baseUrl = normalizeBaseUrl(config.baseUrl);
17
21
  this._auth = new AssistantCloudJWTAuthStrategy(config.authToken);
18
22
  } else if ("apiKey" in config) {
19
- this._baseUrl = (config.baseUrl ?? "https://backend.assistant-api.com").replace(/\/$/, "");
23
+ this._baseUrl = normalizeBaseUrl(config.baseUrl ?? "https://backend.assistant-api.com");
20
24
  this._auth = new AssistantCloudAPIKeyAuthStrategy(config.apiKey, config.userId, config.workspaceId);
21
25
  } else if ("anonymous" in config) {
22
- this._baseUrl = config.baseUrl;
23
- this._auth = new AssistantCloudAnonymousAuthStrategy(config.baseUrl);
26
+ this._baseUrl = normalizeBaseUrl(config.baseUrl);
27
+ this._auth = new AssistantCloudAnonymousAuthStrategy(this._baseUrl);
24
28
  } else throw new Error("Invalid configuration: Must provide authToken, apiKey, or anonymous configuration");
25
29
  }
26
30
  async initializeAuth() {
@@ -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} from \"./AssistantCloudAuthStrategy\";\nimport type { AssistantCloudRunReport } from \"./AssistantCloudRuns\";\n\nexport type AssistantCloudTelemetryConfig = {\n enabled?: boolean;\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. No message content is sent.\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 constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\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};\n\nexport class AssistantCloudAPI {\n public _auth: AssistantCloudAuthStrategy;\n public _baseUrl;\n\n constructor(config: AssistantCloudConfig) {\n if (\"authToken\" in config) {\n this._baseUrl = config.baseUrl;\n this._auth = new AssistantCloudJWTAuthStrategy(config.authToken);\n } else if (\"apiKey\" in config) {\n this._baseUrl = (\n config.baseUrl ?? \"https://backend.assistant-api.com\"\n ).replace(/\\/$/, \"\");\n this._auth = new AssistantCloudAPIKeyAuthStrategy(\n config.apiKey,\n config.userId,\n config.workspaceId,\n );\n } else if (\"anonymous\" in config) {\n this._baseUrl = config.baseUrl;\n this._auth = new AssistantCloudAnonymousAuthStrategy(config.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 };\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 });\n\n this._auth.readAuthHeaders(response.headers);\n\n if (!response.ok) {\n const text = await response.text();\n try {\n const body = JSON.parse(text);\n throw new CloudAPIError(body.message, response.status);\n } catch (error) {\n if (error instanceof CloudAPIError) throw error;\n throw new CloudAPIError(\n `Request failed with status ${response.status}, ${text}`,\n response.status,\n );\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":";;AAkDA,IAAa,gBAAb,cAAmC,MAAM;CAGrB;CAFlB,YACE,SACA,QACA;EACA,MAAM,OAAO;EAFG,KAAA,SAAA;EAGhB,KAAK,OAAO;CACd;AACF;AASA,IAAa,oBAAb,MAA+B;CAC7B;CACA;CAEA,YAAY,QAA8B;EACxC,IAAI,eAAe,QAAQ;GACzB,KAAK,WAAW,OAAO;GACvB,KAAK,QAAQ,IAAI,8BAA8B,OAAO,SAAS;EACjE,OAAO,IAAI,YAAY,QAAQ;GAC7B,KAAK,YACH,OAAO,WAAW,oCAAA,CAClB,QAAQ,OAAO,EAAE;GACnB,KAAK,QAAQ,IAAI,iCACf,OAAO,QACP,OAAO,QACP,OAAO,WACT;EACF,OAAO,IAAI,eAAe,QAAQ;GAChC,KAAK,WAAW,OAAO;GACvB,KAAK,QAAQ,IAAI,oCAAoC,OAAO,OAAO;EACrE,OACE,MAAM,IAAI,MACR,mFACF;CAEJ;CAEA,MAAa,iBAAiB;EAC5B,OAAO,CAAC,CAAE,MAAM,KAAK,MAAM,eAAe;CAC5C;CAEA,MAAa,eACX,UACA,UAA8B,CAAC,GAC/B;EACA,MAAM,cAAc,MAAM,KAAK,MAAM,eAAe;EACpD,IAAI,CAAC,aAAa,MAAM,IAAI,MAAM,sBAAsB;EAExD,MAAM,UAAU;GACd,GAAG;GACH,GAAG,QAAQ;GACX,gBAAgB;EAClB;EAEA,MAAM,cAAc,IAAI,gBAAgB;EACxC,IAAI,QAAQ,OACV,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,KAAK,GAAG;GACxD,IAAI,UAAU,OAAO;GACrB,IAAI,UAAU,MACZ,YAAY,IAAI,KAAK,MAAM;QAE3B,YAAY,IAAI,KAAK,MAAM,SAAS,CAAC;EAEzC;EAGF,MAAM,MAAM,IAAI,IAAI,GAAG,KAAK,SAAS,KAAK,UAAU;EACpD,IAAI,SAAS,YAAY,SAAS;EAElC,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ,QAAQ,UAAU;GAC1B;GACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;EACtD,CAAC;EAED,KAAK,MAAM,gBAAgB,SAAS,OAAO;EAE3C,IAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,KAAK;GACjC,IAAI;IAEF,MAAM,IAAI,cADG,KAAK,MAAM,IACA,CAAA,CAAK,SAAS,SAAS,MAAM;GACvD,SAAS,OAAO;IACd,IAAI,iBAAiB,eAAe,MAAM;IAC1C,MAAM,IAAI,cACR,8BAA8B,SAAS,OAAO,IAAI,QAClD,SAAS,MACX;GACF;EACF;EAEA,OAAO;CACT;CAEA,MAAa,YAAY,UAAkB,UAA8B,CAAC,GAAG;EAC3E,MAAM,WAAW,MAAM,KAAK,eAAe,UAAU,OAAO;EAC5D,IACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,gBAAgB,MAAM,KAE3C,OAAO,KAAA;EAET,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAA;EAE/B,OAAO,KAAK,MAAM,IAAI;CACxB;AACF"}
1
+ {"version":3,"file":"AssistantCloudAPI.js","names":[],"sources":["../src/AssistantCloudAPI.ts"],"sourcesContent":["import {\n type AssistantCloudAuthStrategy,\n AssistantCloudJWTAuthStrategy,\n AssistantCloudAPIKeyAuthStrategy,\n AssistantCloudAnonymousAuthStrategy,\n} from \"./AssistantCloudAuthStrategy\";\nimport type { AssistantCloudRunReport } from \"./AssistantCloudRuns\";\n\nexport type AssistantCloudTelemetryConfig = {\n enabled?: boolean;\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. No message content is sent.\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\n constructor(message: string, status: number) {\n super(message);\n this.status = status;\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};\n\nconst normalizeBaseUrl = (baseUrl: string) => {\n if (!baseUrl || !baseUrl.endsWith(\"/\")) return baseUrl;\n return baseUrl.slice(0, -1);\n};\n\nexport class AssistantCloudAPI {\n public _auth: AssistantCloudAuthStrategy;\n public _baseUrl;\n\n constructor(config: AssistantCloudConfig) {\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 };\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 });\n\n this._auth.readAuthHeaders(response.headers);\n\n if (!response.ok) {\n const text = await response.text();\n try {\n const body = JSON.parse(text);\n throw new CloudAPIError(body.message, response.status);\n } catch (error) {\n if (error instanceof CloudAPIError) throw error;\n throw new CloudAPIError(\n `Request failed with status ${response.status}, ${text}`,\n response.status,\n );\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":";;AAkDA,IAAa,gBAAb,cAAmC,MAAM;CACvC;CAEA,YAAY,SAAiB,QAAgB;EAC3C,MAAM,OAAO;EACb,KAAK,SAAS;EACd,KAAK,OAAO;CACd;AACF;AASA,MAAM,oBAAoB,YAAoB;CAC5C,IAAI,CAAC,WAAW,CAAC,QAAQ,SAAS,GAAG,GAAG,OAAO;CAC/C,OAAO,QAAQ,MAAM,GAAG,EAAE;AAC5B;AAEA,IAAa,oBAAb,MAA+B;CAC7B;CACA;CAEA,YAAY,QAA8B;EACxC,IAAI,eAAe,QAAQ;GACzB,KAAK,WAAW,iBAAiB,OAAO,OAAO;GAC/C,KAAK,QAAQ,IAAI,8BAA8B,OAAO,SAAS;EACjE,OAAO,IAAI,YAAY,QAAQ;GAC7B,KAAK,WAAW,iBACd,OAAO,WAAW,mCACpB;GACA,KAAK,QAAQ,IAAI,iCACf,OAAO,QACP,OAAO,QACP,OAAO,WACT;EACF,OAAO,IAAI,eAAe,QAAQ;GAChC,KAAK,WAAW,iBAAiB,OAAO,OAAO;GAC/C,KAAK,QAAQ,IAAI,oCAAoC,KAAK,QAAQ;EACpE,OACE,MAAM,IAAI,MACR,mFACF;CAEJ;CAEA,MAAa,iBAAiB;EAC5B,OAAO,CAAC,CAAE,MAAM,KAAK,MAAM,eAAe;CAC5C;CAEA,MAAa,eACX,UACA,UAA8B,CAAC,GAC/B;EACA,MAAM,cAAc,MAAM,KAAK,MAAM,eAAe;EACpD,IAAI,CAAC,aAAa,MAAM,IAAI,MAAM,sBAAsB;EAExD,MAAM,UAAU;GACd,GAAG;GACH,GAAG,QAAQ;GACX,gBAAgB;EAClB;EAEA,MAAM,cAAc,IAAI,gBAAgB;EACxC,IAAI,QAAQ,OACV,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,KAAK,GAAG;GACxD,IAAI,UAAU,OAAO;GACrB,IAAI,UAAU,MACZ,YAAY,IAAI,KAAK,MAAM;QAE3B,YAAY,IAAI,KAAK,MAAM,SAAS,CAAC;EAEzC;EAGF,MAAM,MAAM,IAAI,IAAI,GAAG,KAAK,SAAS,KAAK,UAAU;EACpD,IAAI,SAAS,YAAY,SAAS;EAElC,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ,QAAQ,UAAU;GAC1B;GACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;EACtD,CAAC;EAED,KAAK,MAAM,gBAAgB,SAAS,OAAO;EAE3C,IAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,KAAK;GACjC,IAAI;IAEF,MAAM,IAAI,cADG,KAAK,MAAM,IACA,CAAA,CAAK,SAAS,SAAS,MAAM;GACvD,SAAS,OAAO;IACd,IAAI,iBAAiB,eAAe,MAAM;IAC1C,MAAM,IAAI,cACR,8BAA8B,SAAS,OAAO,IAAI,QAClD,SAAS,MACX;GACF;EACF;EAEA,OAAO;CACT;CAEA,MAAa,YAAY,UAAkB,UAA8B,CAAC,GAAG;EAC3E,MAAM,WAAW,MAAM,KAAK,eAAe,UAAU,OAAO;EAC5D,IACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,gBAAgB,MAAM,KAE3C,OAAO,KAAA;EAET,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAA;EAE/B,OAAO,KAAK,MAAM,IAAI;CACxB;AACF"}
@@ -9,8 +9,10 @@ declare class AssistantCloudJWTAuthStrategy implements AssistantCloudAuthStrateg
9
9
  readonly strategy = "jwt";
10
10
  private cachedToken;
11
11
  private tokenExpiry;
12
+ private tokenRequest;
12
13
  constructor(authTokenCallback: () => Promise<string | null>);
13
14
  getAuthHeaders(): Promise<Record<string, string> | false>;
15
+ private fetchAuthHeaders;
14
16
  readAuthHeaders(headers: Headers): void;
15
17
  }
16
18
  declare class AssistantCloudAPIKeyAuthStrategy implements AssistantCloudAuthStrategy {
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudAuthStrategy.d.ts","names":[],"sources":["../src/AssistantCloudAuthStrategy.ts"],"mappings":";KAAY;WACD;EACT,kBAAkB,QAAQ;EAC1B,gBAAgB,SAAS;;cAiCd,yCAAyC;;WACpC;UAER;UACA;cAGI,yBAAyB;EAIxB,kBAAkB,QAAQ;EAsBhC,gBAAgB,SAAS;;cAcrB,4CAA4C;;WACvC;cAMJ,gBAAgB,gBAAgB;EAM/B,kBAAkB,QAAQ;EAQhC;;cAkDI,+CAA+C;WAC1C;UAER;UACA;cAEI;EAgDC,kBAAkB,QAAQ;EAIhC,gBAAgB,SAAS"}
1
+ {"version":3,"file":"AssistantCloudAuthStrategy.d.ts","names":[],"sources":["../src/AssistantCloudAuthStrategy.ts"],"mappings":";KAAY;WACD;EACT,kBAAkB,QAAQ;EAC1B,gBAAgB,SAAS;;cAiCd,yCAAyC;;WACpC;UAER;UACA;UACA;EAGI,YAAA,yBAAyB;EAIxB,kBAAkB,QAAQ;UA0BzB;EAUP,gBAAgB,SAAS;;cAcrB,4CAA4C;;WACvC;EAMJ,YAAA,gBAAgB,gBAAgB;EAM/B,kBAAkB,QAAQ;EAQhC;;cAkDI,+CAA+C;WAC1C;UAER;UACA;EAEI,YAAA;EAgDC,kBAAkB,QAAQ;EAIhC,gBAAgB,SAAS"}
@@ -17,6 +17,7 @@ var AssistantCloudJWTAuthStrategy = class {
17
17
  strategy = "jwt";
18
18
  cachedToken = null;
19
19
  tokenExpiry = null;
20
+ tokenRequest = null;
20
21
  #authTokenCallback;
21
22
  constructor(authTokenCallback) {
22
23
  this.#authTokenCallback = authTokenCallback;
@@ -24,11 +25,20 @@ var AssistantCloudJWTAuthStrategy = class {
24
25
  async getAuthHeaders() {
25
26
  const currentTime = Date.now();
26
27
  if (this.cachedToken && this.tokenExpiry && this.tokenExpiry - currentTime > 30 * 1e3) return { Authorization: `Bearer ${this.cachedToken}` };
27
- const newToken = await this.#authTokenCallback();
28
- if (!newToken) return false;
29
- this.cachedToken = newToken;
30
- this.tokenExpiry = getJwtExpiry(newToken);
31
- return { Authorization: `Bearer ${newToken}` };
28
+ if (!this.tokenRequest) this.tokenRequest = this.fetchAuthHeaders();
29
+ const tokenRequest = this.tokenRequest;
30
+ try {
31
+ return await tokenRequest;
32
+ } finally {
33
+ if (this.tokenRequest === tokenRequest) this.tokenRequest = null;
34
+ }
35
+ }
36
+ async fetchAuthHeaders() {
37
+ const token = await this.#authTokenCallback();
38
+ if (!token) return false;
39
+ this.cachedToken = token;
40
+ this.tokenExpiry = getJwtExpiry(token);
41
+ return { Authorization: `Bearer ${token}` };
32
42
  }
33
43
  readAuthHeaders(headers) {
34
44
  const authHeader = headers.get("Authorization");
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudAuthStrategy.js","names":["#authTokenCallback","#apiKey","#userId","#workspaceId"],"sources":["../src/AssistantCloudAuthStrategy.ts"],"sourcesContent":["export type AssistantCloudAuthStrategy = {\n readonly strategy: \"anon\" | \"jwt\" | \"api-key\";\n getAuthHeaders(): Promise<Record<string, string> | false>;\n readAuthHeaders(headers: Headers): void;\n};\n\nconst getJwtExpiry = (jwt: string): number => {\n try {\n const parts = jwt.split(\".\");\n const bodyPart = parts[1];\n if (!bodyPart) {\n throw new Error(\"Invalid JWT format\");\n }\n\n // Convert from Base64Url to Base64 and add padding if necessary\n let base64 = bodyPart.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4 !== 0) {\n base64 += \"=\";\n }\n\n // Decode the Base64 string and parse the payload\n const payload = atob(base64);\n const payloadObj = JSON.parse(payload);\n const exp = payloadObj.exp;\n\n if (!exp || typeof exp !== \"number\") {\n throw new Error('JWT does not contain a valid \"exp\" field');\n }\n\n // Convert expiration time to milliseconds\n return exp * 1000;\n } catch (error) {\n throw new Error(`Unable to determine the token expiry: ${error}`);\n }\n};\n\nexport class AssistantCloudJWTAuthStrategy implements AssistantCloudAuthStrategy {\n public readonly strategy = \"jwt\";\n\n private cachedToken: string | null = null;\n private tokenExpiry: number | null = null;\n #authTokenCallback: () => Promise<string | null>;\n\n constructor(authTokenCallback: () => Promise<string | null>) {\n this.#authTokenCallback = authTokenCallback;\n }\n\n public async getAuthHeaders(): Promise<Record<string, string> | false> {\n const currentTime = Date.now();\n\n // Use cached token if it's valid for at least 30 more seconds\n if (\n this.cachedToken &&\n this.tokenExpiry &&\n this.tokenExpiry - currentTime > 30 * 1000\n ) {\n return { Authorization: `Bearer ${this.cachedToken}` };\n }\n\n // Fetch a new token via the callback\n const newToken = await this.#authTokenCallback();\n if (!newToken) return false;\n\n this.cachedToken = newToken;\n this.tokenExpiry = getJwtExpiry(newToken);\n\n return { Authorization: `Bearer ${newToken}` };\n }\n\n public readAuthHeaders(headers: Headers) {\n const authHeader = headers.get(\"Authorization\");\n if (!authHeader) return;\n\n const [scheme, token] = authHeader.split(\" \");\n if (scheme !== \"Bearer\" || !token) {\n throw new Error(\"Invalid auth header received\");\n }\n\n this.cachedToken = token;\n this.tokenExpiry = getJwtExpiry(token);\n }\n}\n\nexport class AssistantCloudAPIKeyAuthStrategy implements AssistantCloudAuthStrategy {\n public readonly strategy = \"api-key\";\n\n #apiKey: string;\n #userId: string;\n #workspaceId: string;\n\n constructor(apiKey: string, userId: string, workspaceId: string) {\n this.#apiKey = apiKey;\n this.#userId = userId;\n this.#workspaceId = workspaceId;\n }\n\n public async getAuthHeaders(): Promise<Record<string, string>> {\n return {\n Authorization: `Bearer ${this.#apiKey}`,\n \"Aui-User-Id\": this.#userId,\n \"Aui-Workspace-Id\": this.#workspaceId,\n };\n }\n\n public readAuthHeaders() {\n // No operation needed for API key auth\n }\n}\n\nconst AUI_REFRESH_TOKEN_NAME = \"aui:refresh_token\";\n\nconst getLocalStorage = (): Storage | null => {\n if (!(\"localStorage\" in globalThis)) return null;\n try {\n return (globalThis as { localStorage: Storage }).localStorage;\n } catch {\n return null;\n }\n};\n\nconst readRefreshToken = ():\n | { token: string; expires_at: string }\n | undefined => {\n const storage = getLocalStorage();\n if (!storage) return undefined;\n try {\n const value = storage.getItem(AUI_REFRESH_TOKEN_NAME);\n return value\n ? (JSON.parse(value) as { token: string; expires_at: string })\n : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst writeRefreshToken = (refreshToken: {\n token: string;\n expires_at: string;\n}): void => {\n const storage = getLocalStorage();\n if (!storage) return;\n try {\n storage.setItem(AUI_REFRESH_TOKEN_NAME, JSON.stringify(refreshToken));\n } catch {}\n};\n\nconst removeRefreshToken = (): void => {\n const storage = getLocalStorage();\n if (!storage) return;\n try {\n storage.removeItem(AUI_REFRESH_TOKEN_NAME);\n } catch {}\n};\n\nexport class AssistantCloudAnonymousAuthStrategy implements AssistantCloudAuthStrategy {\n public readonly strategy = \"anon\";\n\n private baseUrl: string;\n private jwtStrategy: AssistantCloudJWTAuthStrategy;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl;\n this.jwtStrategy = new AssistantCloudJWTAuthStrategy(async () => {\n const currentTime = Date.now();\n const storedRefreshToken = readRefreshToken();\n\n if (storedRefreshToken) {\n const refreshExpiry = new Date(storedRefreshToken.expires_at).getTime();\n if (refreshExpiry - currentTime > 30 * 1000) {\n const response = await fetch(\n `${this.baseUrl}/v1/auth/tokens/refresh`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refresh_token: storedRefreshToken.token }),\n },\n );\n\n if (response.ok) {\n const data = await response.json();\n const { access_token, refresh_token } = data;\n if (refresh_token) {\n writeRefreshToken(refresh_token);\n }\n return access_token;\n }\n } else {\n removeRefreshToken();\n }\n }\n\n // No valid refresh token; request a new anonymous token\n const response = await fetch(`${this.baseUrl}/v1/auth/tokens/anonymous`, {\n method: \"POST\",\n });\n\n if (!response.ok) return null;\n\n const data = await response.json();\n const { access_token, refresh_token } = data;\n\n if (!access_token || !refresh_token) return null;\n\n writeRefreshToken(refresh_token);\n return access_token;\n });\n }\n\n public async getAuthHeaders(): Promise<Record<string, string> | false> {\n return this.jwtStrategy.getAuthHeaders();\n }\n\n public readAuthHeaders(headers: Headers): void {\n this.jwtStrategy.readAuthHeaders(headers);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantCloudAuthStrategy.js","names":["#authTokenCallback","#apiKey","#userId","#workspaceId"],"sources":["../src/AssistantCloudAuthStrategy.ts"],"sourcesContent":["export type AssistantCloudAuthStrategy = {\n readonly strategy: \"anon\" | \"jwt\" | \"api-key\";\n getAuthHeaders(): Promise<Record<string, string> | false>;\n readAuthHeaders(headers: Headers): void;\n};\n\nconst getJwtExpiry = (jwt: string): number => {\n try {\n const parts = jwt.split(\".\");\n const bodyPart = parts[1];\n if (!bodyPart) {\n throw new Error(\"Invalid JWT format\");\n }\n\n // Convert from Base64Url to Base64 and add padding if necessary\n let base64 = bodyPart.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (base64.length % 4 !== 0) {\n base64 += \"=\";\n }\n\n // Decode the Base64 string and parse the payload\n const payload = atob(base64);\n const payloadObj = JSON.parse(payload);\n const exp = payloadObj.exp;\n\n if (!exp || typeof exp !== \"number\") {\n throw new Error('JWT does not contain a valid \"exp\" field');\n }\n\n // Convert expiration time to milliseconds\n return exp * 1000;\n } catch (error) {\n throw new Error(`Unable to determine the token expiry: ${error}`);\n }\n};\n\nexport class AssistantCloudJWTAuthStrategy implements AssistantCloudAuthStrategy {\n public readonly strategy = \"jwt\";\n\n private cachedToken: string | null = null;\n private tokenExpiry: number | null = null;\n private tokenRequest: Promise<Record<string, string> | false> | null = null;\n #authTokenCallback: () => Promise<string | null>;\n\n constructor(authTokenCallback: () => Promise<string | null>) {\n this.#authTokenCallback = authTokenCallback;\n }\n\n public async getAuthHeaders(): Promise<Record<string, string> | false> {\n const currentTime = Date.now();\n\n // Use cached token if it's valid for at least 30 more seconds\n if (\n this.cachedToken &&\n this.tokenExpiry &&\n this.tokenExpiry - currentTime > 30 * 1000\n ) {\n return { Authorization: `Bearer ${this.cachedToken}` };\n }\n\n if (!this.tokenRequest) {\n this.tokenRequest = this.fetchAuthHeaders();\n }\n\n const tokenRequest = this.tokenRequest;\n try {\n return await tokenRequest;\n } finally {\n if (this.tokenRequest === tokenRequest) {\n this.tokenRequest = null;\n }\n }\n }\n\n private async fetchAuthHeaders(): Promise<Record<string, string> | false> {\n const token = await this.#authTokenCallback();\n if (!token) return false;\n\n this.cachedToken = token;\n this.tokenExpiry = getJwtExpiry(token);\n\n return { Authorization: `Bearer ${token}` };\n }\n\n public readAuthHeaders(headers: Headers) {\n const authHeader = headers.get(\"Authorization\");\n if (!authHeader) return;\n\n const [scheme, token] = authHeader.split(\" \");\n if (scheme !== \"Bearer\" || !token) {\n throw new Error(\"Invalid auth header received\");\n }\n\n this.cachedToken = token;\n this.tokenExpiry = getJwtExpiry(token);\n }\n}\n\nexport class AssistantCloudAPIKeyAuthStrategy implements AssistantCloudAuthStrategy {\n public readonly strategy = \"api-key\";\n\n #apiKey: string;\n #userId: string;\n #workspaceId: string;\n\n constructor(apiKey: string, userId: string, workspaceId: string) {\n this.#apiKey = apiKey;\n this.#userId = userId;\n this.#workspaceId = workspaceId;\n }\n\n public async getAuthHeaders(): Promise<Record<string, string>> {\n return {\n Authorization: `Bearer ${this.#apiKey}`,\n \"Aui-User-Id\": this.#userId,\n \"Aui-Workspace-Id\": this.#workspaceId,\n };\n }\n\n public readAuthHeaders() {\n // No operation needed for API key auth\n }\n}\n\nconst AUI_REFRESH_TOKEN_NAME = \"aui:refresh_token\";\n\nconst getLocalStorage = (): Storage | null => {\n if (!(\"localStorage\" in globalThis)) return null;\n try {\n return (globalThis as { localStorage: Storage }).localStorage;\n } catch {\n return null;\n }\n};\n\nconst readRefreshToken = ():\n | { token: string; expires_at: string }\n | undefined => {\n const storage = getLocalStorage();\n if (!storage) return undefined;\n try {\n const value = storage.getItem(AUI_REFRESH_TOKEN_NAME);\n return value\n ? (JSON.parse(value) as { token: string; expires_at: string })\n : undefined;\n } catch {\n return undefined;\n }\n};\n\nconst writeRefreshToken = (refreshToken: {\n token: string;\n expires_at: string;\n}): void => {\n const storage = getLocalStorage();\n if (!storage) return;\n try {\n storage.setItem(AUI_REFRESH_TOKEN_NAME, JSON.stringify(refreshToken));\n } catch {}\n};\n\nconst removeRefreshToken = (): void => {\n const storage = getLocalStorage();\n if (!storage) return;\n try {\n storage.removeItem(AUI_REFRESH_TOKEN_NAME);\n } catch {}\n};\n\nexport class AssistantCloudAnonymousAuthStrategy implements AssistantCloudAuthStrategy {\n public readonly strategy = \"anon\";\n\n private baseUrl: string;\n private jwtStrategy: AssistantCloudJWTAuthStrategy;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl;\n this.jwtStrategy = new AssistantCloudJWTAuthStrategy(async () => {\n const currentTime = Date.now();\n const storedRefreshToken = readRefreshToken();\n\n if (storedRefreshToken) {\n const refreshExpiry = new Date(storedRefreshToken.expires_at).getTime();\n if (refreshExpiry - currentTime > 30 * 1000) {\n const response = await fetch(\n `${this.baseUrl}/v1/auth/tokens/refresh`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refresh_token: storedRefreshToken.token }),\n },\n );\n\n if (response.ok) {\n const data = await response.json();\n const { access_token, refresh_token } = data;\n if (refresh_token) {\n writeRefreshToken(refresh_token);\n }\n return access_token;\n }\n } else {\n removeRefreshToken();\n }\n }\n\n // No valid refresh token; request a new anonymous token\n const response = await fetch(`${this.baseUrl}/v1/auth/tokens/anonymous`, {\n method: \"POST\",\n });\n\n if (!response.ok) return null;\n\n const data = await response.json();\n const { access_token, refresh_token } = data;\n\n if (!access_token || !refresh_token) return null;\n\n writeRefreshToken(refresh_token);\n return access_token;\n });\n }\n\n public async getAuthHeaders(): Promise<Record<string, string> | false> {\n return this.jwtStrategy.getAuthHeaders();\n }\n\n public readAuthHeaders(headers: Headers): void {\n this.jwtStrategy.readAuthHeaders(headers);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudAuthTokens.d.ts","names":[],"sources":["../src/AssistantCloudAuthTokens.ts"],"mappings":";;KAEK;EACH;;cAGW;UACS;cAAA,OAAO;EAEd,UAAU,QAAQ"}
1
+ {"version":3,"file":"AssistantCloudAuthTokens.d.ts","names":[],"sources":["../src/AssistantCloudAuthTokens.ts"],"mappings":";;KAEK;EACH;;cAGW;UACH;EAEI,YAAA,OAAO;EAIN,UAAU,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudAuthTokens.js","names":[],"sources":["../src/AssistantCloudAuthTokens.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\n\ntype AssistantCloudAuthTokensCreateResponse = {\n token: string;\n};\n\nexport class AssistantCloudAuthTokens {\n constructor(private cloud: AssistantCloudAPI) {}\n\n public async create(): Promise<AssistantCloudAuthTokensCreateResponse> {\n return this.cloud.makeRequest(\"/auth/tokens\", { method: \"POST\" });\n }\n}\n"],"mappings":";AAMA,IAAa,2BAAb,MAAsC;CAChB;CAApB,YAAY,OAAkC;EAA1B,KAAA,QAAA;CAA2B;CAE/C,MAAa,SAA0D;EACrE,OAAO,KAAK,MAAM,YAAY,gBAAgB,EAAE,QAAQ,OAAO,CAAC;CAClE;AACF"}
1
+ {"version":3,"file":"AssistantCloudAuthTokens.js","names":[],"sources":["../src/AssistantCloudAuthTokens.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\n\ntype AssistantCloudAuthTokensCreateResponse = {\n token: string;\n};\n\nexport class AssistantCloudAuthTokens {\n private cloud: AssistantCloudAPI;\n\n constructor(cloud: AssistantCloudAPI) {\n this.cloud = cloud;\n }\n\n public async create(): Promise<AssistantCloudAuthTokensCreateResponse> {\n return this.cloud.makeRequest(\"/auth/tokens\", { method: \"POST\" });\n }\n}\n"],"mappings":";AAMA,IAAa,2BAAb,MAAsC;CACpC;CAEA,YAAY,OAA0B;EACpC,KAAK,QAAQ;CACf;CAEA,MAAa,SAA0D;EACrE,OAAO,KAAK,MAAM,YAAY,gBAAgB,EAAE,QAAQ,OAAO,CAAC;CAClE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudFiles.d.ts","names":[],"sources":["../src/AssistantCloudFiles.ts"],"mappings":";;KAEK;EACH;EACA;;KAGG;EACH;EACA;EACA;;KAGG;EACH;;KAGG;EACH;EACA;EACA;EACA;;cAGW;UACS;cAAA,OAAO;EAEd,YACX,MAAM,yBACL,QAAQ;EAOE,2BACX,MAAM,wCACL,QAAQ"}
1
+ {"version":3,"file":"AssistantCloudFiles.d.ts","names":[],"sources":["../src/AssistantCloudFiles.ts"],"mappings":";;KAEK;EACH;EACA;;KAGG;EACH;EACA;EACA;;KAGG;EACH;;KAGG;EACH;EACA;EACA;EACA;;cAGW;UACH;EAEI,YAAA,OAAO;EAIN,YACX,MAAM,yBACL,QAAQ;EAOE,2BACX,MAAM,wCACL,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudFiles.js","names":[],"sources":["../src/AssistantCloudFiles.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\n\ntype PdfToImagesRequestBody = {\n file_blob?: string | undefined;\n file_url?: string | undefined;\n};\n\ntype PdfToImagesResponse = {\n success: boolean;\n urls: string[];\n message: string;\n};\n\ntype GeneratePresignedUploadUrlRequestBody = {\n filename: string;\n};\n\ntype GeneratePresignedUploadUrlResponse = {\n success: boolean;\n signedUrl: string;\n expiresAt: string;\n publicUrl: string;\n};\n\nexport class AssistantCloudFiles {\n constructor(private cloud: AssistantCloudAPI) {}\n\n public async pdfToImages(\n body: PdfToImagesRequestBody,\n ): Promise<PdfToImagesResponse> {\n return this.cloud.makeRequest(\"/files/pdf-to-images\", {\n method: \"POST\",\n body,\n });\n }\n\n public async generatePresignedUploadUrl(\n body: GeneratePresignedUploadUrlRequestBody,\n ): Promise<GeneratePresignedUploadUrlResponse> {\n return this.cloud.makeRequest(\n \"/files/attachments/generate-presigned-upload-url\",\n {\n method: \"POST\",\n body,\n },\n );\n }\n}\n"],"mappings":";AAwBA,IAAa,sBAAb,MAAiC;CACX;CAApB,YAAY,OAAkC;EAA1B,KAAA,QAAA;CAA2B;CAE/C,MAAa,YACX,MAC8B;EAC9B,OAAO,KAAK,MAAM,YAAY,wBAAwB;GACpD,QAAQ;GACR;EACF,CAAC;CACH;CAEA,MAAa,2BACX,MAC6C;EAC7C,OAAO,KAAK,MAAM,YAChB,oDACA;GACE,QAAQ;GACR;EACF,CACF;CACF;AACF"}
1
+ {"version":3,"file":"AssistantCloudFiles.js","names":[],"sources":["../src/AssistantCloudFiles.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\n\ntype PdfToImagesRequestBody = {\n file_blob?: string | undefined;\n file_url?: string | undefined;\n};\n\ntype PdfToImagesResponse = {\n success: boolean;\n urls: string[];\n message: string;\n};\n\ntype GeneratePresignedUploadUrlRequestBody = {\n filename: string;\n};\n\ntype GeneratePresignedUploadUrlResponse = {\n success: boolean;\n signedUrl: string;\n expiresAt: string;\n publicUrl: string;\n};\n\nexport class AssistantCloudFiles {\n private cloud: AssistantCloudAPI;\n\n constructor(cloud: AssistantCloudAPI) {\n this.cloud = cloud;\n }\n\n public async pdfToImages(\n body: PdfToImagesRequestBody,\n ): Promise<PdfToImagesResponse> {\n return this.cloud.makeRequest(\"/files/pdf-to-images\", {\n method: \"POST\",\n body,\n });\n }\n\n public async generatePresignedUploadUrl(\n body: GeneratePresignedUploadUrlRequestBody,\n ): Promise<GeneratePresignedUploadUrlResponse> {\n return this.cloud.makeRequest(\n \"/files/attachments/generate-presigned-upload-url\",\n {\n method: \"POST\",\n body,\n },\n );\n }\n}\n"],"mappings":";AAwBA,IAAa,sBAAb,MAAiC;CAC/B;CAEA,YAAY,OAA0B;EACpC,KAAK,QAAQ;CACf;CAEA,MAAa,YACX,MAC8B;EAC9B,OAAO,KAAK,MAAM,YAAY,wBAAwB;GACpD,QAAQ;GACR;EACF,CAAC;CACH;CAEA,MAAa,2BACX,MAC6C;EAC7C,OAAO,KAAK,MAAM,YAChB,oDACA;GACE,QAAQ;GACR;EACF,CACF;CACF;AACF"}
@@ -0,0 +1,19 @@
1
+ import { AssistantCloudAPI } from "./AssistantCloudAPI.js";
2
+ import { CloudMessage } from "./AssistantCloudThreadMessages.js";
3
+ //#region src/AssistantCloudProjectThreadMessages.d.ts
4
+ type AssistantCloudProjectThreadMessageListQuery = {
5
+ format?: string;
6
+ limit?: number;
7
+ after?: string;
8
+ };
9
+ type AssistantCloudProjectThreadMessageListResponse = {
10
+ messages: CloudMessage[];
11
+ };
12
+ declare class AssistantCloudProjectThreadMessages {
13
+ private cloud;
14
+ constructor(cloud: AssistantCloudAPI);
15
+ list(threadId: string, query?: AssistantCloudProjectThreadMessageListQuery): Promise<AssistantCloudProjectThreadMessageListResponse>;
16
+ }
17
+ //#endregion
18
+ export { AssistantCloudProjectThreadMessages };
19
+ //# sourceMappingURL=AssistantCloudProjectThreadMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantCloudProjectThreadMessages.d.ts","names":[],"sources":["../src/AssistantCloudProjectThreadMessages.ts"],"mappings":";;;KAOK;EACH;EACA;EACA;;KAGG;EACH,UAAU;;cAGC;UACH;EAEI,YAAA,OAAO;EAIN,KACX,kBACA,QAAQ,8CACP,QAAQ"}
@@ -0,0 +1,16 @@
1
+ import { readCloudArray, readCloudRecord } from "./cloudResponse.js";
2
+ import { decodeCloudMessage } from "./AssistantCloudThreadMessages.js";
3
+ //#region src/AssistantCloudProjectThreadMessages.ts
4
+ var AssistantCloudProjectThreadMessages = class {
5
+ cloud;
6
+ constructor(cloud) {
7
+ this.cloud = cloud;
8
+ }
9
+ async list(threadId, query) {
10
+ return { messages: readCloudArray(readCloudRecord(await this.cloud.makeRequest(`/projects/threads/${encodeURIComponent(threadId)}/messages`, { query }), "project thread message list response").messages, "messages").map((message, index) => decodeCloudMessage(message, `messages[${index}]`)) };
11
+ }
12
+ };
13
+ //#endregion
14
+ export { AssistantCloudProjectThreadMessages };
15
+
16
+ //# sourceMappingURL=AssistantCloudProjectThreadMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantCloudProjectThreadMessages.js","names":[],"sources":["../src/AssistantCloudProjectThreadMessages.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport {\n decodeCloudMessage,\n type CloudMessage,\n} from \"./AssistantCloudThreadMessages\";\nimport { readCloudArray, readCloudRecord } from \"./cloudResponse\";\n\ntype AssistantCloudProjectThreadMessageListQuery = {\n format?: string;\n limit?: number;\n after?: string;\n};\n\ntype AssistantCloudProjectThreadMessageListResponse = {\n messages: CloudMessage[];\n};\n\nexport class AssistantCloudProjectThreadMessages {\n private cloud: AssistantCloudAPI;\n\n constructor(cloud: AssistantCloudAPI) {\n this.cloud = cloud;\n }\n\n public async list(\n threadId: string,\n query?: AssistantCloudProjectThreadMessageListQuery,\n ): Promise<AssistantCloudProjectThreadMessageListResponse> {\n const response = readCloudRecord(\n await this.cloud.makeRequest(\n `/projects/threads/${encodeURIComponent(threadId)}/messages`,\n { query },\n ),\n \"project thread message list response\",\n );\n const messages = readCloudArray(response.messages, \"messages\");\n\n return {\n messages: messages.map((message, index) =>\n decodeCloudMessage(message, `messages[${index}]`),\n ),\n };\n }\n}\n"],"mappings":";;;AAiBA,IAAa,sCAAb,MAAiD;CAC/C;CAEA,YAAY,OAA0B;EACpC,KAAK,QAAQ;CACf;CAEA,MAAa,KACX,UACA,OACyD;EAUzD,OAAO,EACL,UAHe,eAPA,gBACf,MAAM,KAAK,MAAM,YACf,qBAAqB,mBAAmB,QAAQ,EAAE,YAClD,EAAE,MAAM,CACV,GACA,sCAEqC,CAAC,CAAC,UAAU,UAGhC,CAAC,CAAC,KAAK,SAAS,UAC/B,mBAAmB,SAAS,YAAY,MAAM,EAAE,CAClD,EACF;CACF;AACF"}
@@ -0,0 +1,21 @@
1
+ import { AssistantCloudAPI } from "./AssistantCloudAPI.js";
2
+ import { AssistantCloudProjectThreadMessages } from "./AssistantCloudProjectThreadMessages.js";
3
+ import { CloudThread } from "./AssistantCloudThreads.js";
4
+ //#region src/AssistantCloudProjectThreads.d.ts
5
+ type AssistantCloudProjectThreadsListQuery = {
6
+ is_archived?: boolean;
7
+ limit?: number;
8
+ after?: string;
9
+ };
10
+ type AssistantCloudProjectThreadsListResponse = {
11
+ threads: CloudThread[];
12
+ };
13
+ declare class AssistantCloudProjectThreads {
14
+ readonly messages: AssistantCloudProjectThreadMessages;
15
+ private cloud;
16
+ constructor(cloud: AssistantCloudAPI);
17
+ list(query?: AssistantCloudProjectThreadsListQuery): Promise<AssistantCloudProjectThreadsListResponse>;
18
+ }
19
+ //#endregion
20
+ export { AssistantCloudProjectThreads };
21
+ //# sourceMappingURL=AssistantCloudProjectThreads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantCloudProjectThreads.d.ts","names":[],"sources":["../src/AssistantCloudProjectThreads.ts"],"mappings":";;;;KAKK;EACH;EACA;EACA;;KAGG;EACH,SAAS;;cAGE;WACK,UAAU;UAElB;EAEI,YAAA,OAAO;EAKN,KACX,QAAQ,wCACP,QAAQ"}
@@ -0,0 +1,22 @@
1
+ import { readCloudArray, readCloudRecord } from "./cloudResponse.js";
2
+ import { AssistantCloudProjectThreadMessages } from "./AssistantCloudProjectThreadMessages.js";
3
+ import { decodeCloudThread } from "./AssistantCloudThreads.js";
4
+ //#region src/AssistantCloudProjectThreads.ts
5
+ var AssistantCloudProjectThreads = class {
6
+ messages;
7
+ cloud;
8
+ constructor(cloud) {
9
+ this.cloud = cloud;
10
+ this.messages = new AssistantCloudProjectThreadMessages(cloud);
11
+ }
12
+ async list(query) {
13
+ return { threads: readCloudArray(readCloudRecord(await this.cloud.makeRequest("/projects/threads", { query: {
14
+ ...query,
15
+ ...query?.is_archived !== void 0 ? { is_archived: String(query.is_archived) } : {}
16
+ } }), "project thread list response").threads, "threads").map((thread, index) => decodeCloudThread(thread, `threads[${index}]`)) };
17
+ }
18
+ };
19
+ //#endregion
20
+ export { AssistantCloudProjectThreads };
21
+
22
+ //# sourceMappingURL=AssistantCloudProjectThreads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantCloudProjectThreads.js","names":[],"sources":["../src/AssistantCloudProjectThreads.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport { AssistantCloudProjectThreadMessages } from \"./AssistantCloudProjectThreadMessages\";\nimport { decodeCloudThread, type CloudThread } from \"./AssistantCloudThreads\";\nimport { readCloudArray, readCloudRecord } from \"./cloudResponse\";\n\ntype AssistantCloudProjectThreadsListQuery = {\n is_archived?: boolean;\n limit?: number;\n after?: string;\n};\n\ntype AssistantCloudProjectThreadsListResponse = {\n threads: CloudThread[];\n};\n\nexport class AssistantCloudProjectThreads {\n public readonly messages: AssistantCloudProjectThreadMessages;\n\n private cloud: AssistantCloudAPI;\n\n constructor(cloud: AssistantCloudAPI) {\n this.cloud = cloud;\n this.messages = new AssistantCloudProjectThreadMessages(cloud);\n }\n\n public async list(\n query?: AssistantCloudProjectThreadsListQuery,\n ): Promise<AssistantCloudProjectThreadsListResponse> {\n const response = readCloudRecord(\n await this.cloud.makeRequest(\"/projects/threads\", {\n query: {\n ...query,\n // The shared query serializer drops `false`; the wire accepts the\n // string form, so the archive filter survives explicitly.\n ...(query?.is_archived !== undefined\n ? { is_archived: String(query.is_archived) }\n : {}),\n },\n }),\n \"project thread list response\",\n );\n const threads = readCloudArray(response.threads, \"threads\");\n\n return {\n threads: threads.map((thread, index) =>\n decodeCloudThread(thread, `threads[${index}]`),\n ),\n };\n }\n}\n"],"mappings":";;;;AAeA,IAAa,+BAAb,MAA0C;CACxC;CAEA;CAEA,YAAY,OAA0B;EACpC,KAAK,QAAQ;EACb,KAAK,WAAW,IAAI,oCAAoC,KAAK;CAC/D;CAEA,MAAa,KACX,OACmD;EAgBnD,OAAO,EACL,SAHc,eAbC,gBACf,MAAM,KAAK,MAAM,YAAY,qBAAqB,EAChD,OAAO;GACL,GAAG;GAGH,GAAI,OAAO,gBAAgB,KAAA,IACvB,EAAE,aAAa,OAAO,MAAM,WAAW,EAAE,IACzC,CAAC;EACP,EACF,CAAC,GACD,8BAEoC,CAAC,CAAC,SAAS,SAGhC,CAAC,CAAC,KAAK,QAAQ,UAC5B,kBAAkB,QAAQ,WAAW,MAAM,EAAE,CAC/C,EACF;CACF;AACF"}
@@ -0,0 +1,10 @@
1
+ import { AssistantCloudAPI } from "./AssistantCloudAPI.js";
2
+ import { AssistantCloudProjectThreads } from "./AssistantCloudProjectThreads.js";
3
+ //#region src/AssistantCloudProjects.d.ts
4
+ declare class AssistantCloudProjects {
5
+ readonly threads: AssistantCloudProjectThreads;
6
+ constructor(cloud: AssistantCloudAPI);
7
+ }
8
+ //#endregion
9
+ export { AssistantCloudProjects };
10
+ //# sourceMappingURL=AssistantCloudProjects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantCloudProjects.d.ts","names":[],"sources":["../src/AssistantCloudProjects.ts"],"mappings":";;;cAGa;WACK,SAAS;EAEb,YAAA,OAAO"}
@@ -0,0 +1,12 @@
1
+ import { AssistantCloudProjectThreads } from "./AssistantCloudProjectThreads.js";
2
+ //#region src/AssistantCloudProjects.ts
3
+ var AssistantCloudProjects = class {
4
+ threads;
5
+ constructor(cloud) {
6
+ this.threads = new AssistantCloudProjectThreads(cloud);
7
+ }
8
+ };
9
+ //#endregion
10
+ export { AssistantCloudProjects };
11
+
12
+ //# sourceMappingURL=AssistantCloudProjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantCloudProjects.js","names":[],"sources":["../src/AssistantCloudProjects.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport { AssistantCloudProjectThreads } from \"./AssistantCloudProjectThreads\";\n\nexport class AssistantCloudProjects {\n public readonly threads: AssistantCloudProjectThreads;\n\n constructor(cloud: AssistantCloudAPI) {\n this.threads = new AssistantCloudProjectThreads(cloud);\n }\n}\n"],"mappings":";;AAGA,IAAa,yBAAb,MAAoC;CAClC;CAEA,YAAY,OAA0B;EACpC,KAAK,UAAU,IAAI,6BAA6B,KAAK;CACvD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudRuns.d.ts","names":[],"sources":["../src/AssistantCloudRuns.ts"],"mappings":";;;;KAIK;EACH;EACA;EACA;;KAGG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;;KAMP;EACV;EACA;EACA;EACA,aAAa;EACb;IACE;IACA;IACA;IACA;IACA,aAAa;IACb;IACA;;EAEF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;;cAGA;UACS;cAAA,OAAO;EAEpB,+BAA+B;;;;;;;;;;;EAmBzB,OACX,MAAM,+BACL,QAAQ;EAWE,OACX,MAAM,0BACL;IAAU"}
1
+ {"version":3,"file":"AssistantCloudRuns.d.ts","names":[],"sources":["../src/AssistantCloudRuns.ts"],"mappings":";;;;KAIK;EACH;EACA;EACA;;KAGG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;;KAMP;EACV;EACA;EACA;EACA,aAAa;EACb;IACE;IACA;IACA;IACA;IACA,aAAa;IACb;IACA;;EAEF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;;cAGA;UACH;EAEI,YAAA,OAAO;EAIZ,+BAA+B;;;;;;;;;;;EAmBzB,OACX,MAAM,+BACL,QAAQ;EAWE,OACX,MAAM,0BACL;IAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudRuns.js","names":[],"sources":["../src/AssistantCloudRuns.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport type { SamplingCallData } from \"./instrumentMcpSampling\";\nimport { AssistantStream, PlainTextDecoder } from \"assistant-stream\";\n\ntype AssistantCloudRunsStreamBody = {\n thread_id: string;\n assistant_id: \"system/thread_title\";\n messages: readonly unknown[]; // TODO type\n};\n\ntype ReportToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n start_ms?: number;\n end_ms?: number;\n sampling_calls?: SamplingCallData[];\n};\n\n// NOTE: Keep this payload shape aligned with the strict runtime validator in\n// assistant-cloud: apps/aui-cloud-api/src/endpoints/runs/create.ts\n// (createRunSchema). New telemetry fields must be added in both repos together.\nexport type AssistantCloudRunReport = {\n thread_id: string;\n status: \"completed\" | \"incomplete\" | \"error\";\n total_steps?: number;\n tool_calls?: ReportToolCall[];\n steps?: {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: ReportToolCall[];\n start_ms?: number;\n end_ms?: number;\n }[];\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n model_id?: string;\n provider_type?: string;\n duration_ms?: number;\n output_text?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport class AssistantCloudRuns {\n constructor(private cloud: AssistantCloudAPI) {}\n\n public __internal_getAssistantOptions(assistantId: string) {\n return {\n api: `${this.cloud._baseUrl}/v1/runs/stream`,\n headers: async () => {\n const headers = await this.cloud._auth.getAuthHeaders();\n if (!headers) throw new Error(\"Authorization failed\");\n return {\n ...headers,\n Accept: \"text/plain\",\n };\n },\n body: {\n assistant_id: assistantId,\n response_format: \"vercel-ai-data-stream/v1\",\n thread_id: \"unstable_todo\",\n },\n };\n }\n\n public async stream(\n body: AssistantCloudRunsStreamBody,\n ): Promise<AssistantStream> {\n const response = await this.cloud.makeRawRequest(\"/runs/stream\", {\n method: \"POST\",\n headers: {\n Accept: \"text/plain\",\n },\n body,\n });\n return AssistantStream.fromResponse(response, new PlainTextDecoder());\n }\n\n public async report(\n body: AssistantCloudRunReport,\n ): Promise<{ run_id: string }> {\n return this.cloud.makeRequest(\"/runs\", { method: \"POST\", body });\n }\n}\n"],"mappings":";;AAiDA,IAAa,qBAAb,MAAgC;CACV;CAApB,YAAY,OAAkC;EAA1B,KAAA,QAAA;CAA2B;CAE/C,+BAAsC,aAAqB;EACzD,OAAO;GACL,KAAK,GAAG,KAAK,MAAM,SAAS;GAC5B,SAAS,YAAY;IACnB,MAAM,UAAU,MAAM,KAAK,MAAM,MAAM,eAAe;IACtD,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,sBAAsB;IACpD,OAAO;KACL,GAAG;KACH,QAAQ;IACV;GACF;GACA,MAAM;IACJ,cAAc;IACd,iBAAiB;IACjB,WAAW;GACb;EACF;CACF;CAEA,MAAa,OACX,MAC0B;EAC1B,MAAM,WAAW,MAAM,KAAK,MAAM,eAAe,gBAAgB;GAC/D,QAAQ;GACR,SAAS,EACP,QAAQ,aACV;GACA;EACF,CAAC;EACD,OAAO,gBAAgB,aAAa,UAAU,IAAI,iBAAiB,CAAC;CACtE;CAEA,MAAa,OACX,MAC6B;EAC7B,OAAO,KAAK,MAAM,YAAY,SAAS;GAAE,QAAQ;GAAQ;EAAK,CAAC;CACjE;AACF"}
1
+ {"version":3,"file":"AssistantCloudRuns.js","names":[],"sources":["../src/AssistantCloudRuns.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport type { SamplingCallData } from \"./instrumentMcpSampling\";\nimport { AssistantStream, PlainTextDecoder } from \"assistant-stream\";\n\ntype AssistantCloudRunsStreamBody = {\n thread_id: string;\n assistant_id: \"system/thread_title\";\n messages: readonly unknown[]; // TODO type\n};\n\ntype ReportToolCall = {\n tool_name: string;\n tool_call_id: string;\n tool_args?: string;\n tool_result?: string;\n tool_source?: \"mcp\" | \"frontend\" | \"backend\";\n start_ms?: number;\n end_ms?: number;\n sampling_calls?: SamplingCallData[];\n};\n\n// NOTE: Keep this payload shape aligned with the strict runtime validator in\n// assistant-cloud: apps/aui-cloud-api/src/endpoints/runs/create.ts\n// (createRunSchema). New telemetry fields must be added in both repos together.\nexport type AssistantCloudRunReport = {\n thread_id: string;\n status: \"completed\" | \"incomplete\" | \"error\";\n total_steps?: number;\n tool_calls?: ReportToolCall[];\n steps?: {\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n tool_calls?: ReportToolCall[];\n start_ms?: number;\n end_ms?: number;\n }[];\n input_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n model_id?: string;\n provider_type?: string;\n duration_ms?: number;\n output_text?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport class AssistantCloudRuns {\n private cloud: AssistantCloudAPI;\n\n constructor(cloud: AssistantCloudAPI) {\n this.cloud = cloud;\n }\n\n public __internal_getAssistantOptions(assistantId: string) {\n return {\n api: `${this.cloud._baseUrl}/v1/runs/stream`,\n headers: async () => {\n const headers = await this.cloud._auth.getAuthHeaders();\n if (!headers) throw new Error(\"Authorization failed\");\n return {\n ...headers,\n Accept: \"text/plain\",\n };\n },\n body: {\n assistant_id: assistantId,\n response_format: \"vercel-ai-data-stream/v1\",\n thread_id: \"unstable_todo\",\n },\n };\n }\n\n public async stream(\n body: AssistantCloudRunsStreamBody,\n ): Promise<AssistantStream> {\n const response = await this.cloud.makeRawRequest(\"/runs/stream\", {\n method: \"POST\",\n headers: {\n Accept: \"text/plain\",\n },\n body,\n });\n return AssistantStream.fromResponse(response, new PlainTextDecoder());\n }\n\n public async report(\n body: AssistantCloudRunReport,\n ): Promise<{ run_id: string }> {\n return this.cloud.makeRequest(\"/runs\", { method: \"POST\", body });\n }\n}\n"],"mappings":";;AAiDA,IAAa,qBAAb,MAAgC;CAC9B;CAEA,YAAY,OAA0B;EACpC,KAAK,QAAQ;CACf;CAEA,+BAAsC,aAAqB;EACzD,OAAO;GACL,KAAK,GAAG,KAAK,MAAM,SAAS;GAC5B,SAAS,YAAY;IACnB,MAAM,UAAU,MAAM,KAAK,MAAM,MAAM,eAAe;IACtD,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,sBAAsB;IACpD,OAAO;KACL,GAAG;KACH,QAAQ;IACV;GACF;GACA,MAAM;IACJ,cAAc;IACd,iBAAiB;IACjB,WAAW;GACb;EACF;CACF;CAEA,MAAa,OACX,MAC0B;EAC1B,MAAM,WAAW,MAAM,KAAK,MAAM,eAAe,gBAAgB;GAC/D,QAAQ;GACR,SAAS,EACP,QAAQ,aACV;GACA;EACF,CAAC;EACD,OAAO,gBAAgB,aAAa,UAAU,IAAI,iBAAiB,CAAC;CACtE;CAEA,MAAa,OACX,MAC6B;EAC7B,OAAO,KAAK,MAAM,YAAY,SAAS;GAAE,QAAQ;GAAQ;EAAK,CAAC;CACjE;AACF"}
@@ -27,6 +27,7 @@ type AssistantCloudMessageCreateResponse = {
27
27
  type AssistantCloudThreadMessageUpdateBody = {
28
28
  content: ReadonlyJSONObject;
29
29
  };
30
+ declare const decodeCloudMessage: (value: unknown, field: string) => CloudMessage;
30
31
  declare class AssistantCloudThreadMessages {
31
32
  private cloud;
32
33
  constructor(cloud: AssistantCloudAPI);
@@ -35,5 +36,5 @@ declare class AssistantCloudThreadMessages {
35
36
  update(threadId: string, messageId: string, body: AssistantCloudThreadMessageUpdateBody): Promise<void>;
36
37
  }
37
38
  //#endregion
38
- export { AssistantCloudThreadMessages, CloudMessage };
39
+ export { AssistantCloudThreadMessages, CloudMessage, decodeCloudMessage };
39
40
  //# sourceMappingURL=AssistantCloudThreadMessages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadMessages.d.ts","names":[],"sources":["../src/AssistantCloudThreadMessages.ts"],"mappings":";;;KAGY;EACV;EACA;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA,SAAS;;KAGN;EACH;;KAGG;EACH,UAAU;;KAGP;EACH;EACA;EACA,SAAS;;KAGN;EACH;;KAGG;EACH,SAAS;;cAGE;UACS;cAAA,OAAO;EAEd,KACX,kBACA,QAAQ,uCACP,QAAQ;EAOE,OACX,kBACA,MAAM,wCACL,QAAQ;EAOE,OACX,kBACA,mBACA,MAAM,wCACL"}
1
+ {"version":3,"file":"AssistantCloudThreadMessages.d.ts","names":[],"sources":["../src/AssistantCloudThreadMessages.ts"],"mappings":";;;KAYY;EACV;EACA;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA,SAAS;;KAGN;EACH;;KAGG;EACH,UAAU;;KAGP;EACH;EACA;EACA,SAAS;;KAGN;EACH;;KAGG;EACH,SAAS;;cAGE,qBACX,gBACA,kBACC;cAaU;UACH;EAEI,YAAA,OAAO;EAIN,KACX,kBACA,QAAQ,uCACP,QAAQ;EAiBE,OACX,kBACA,MAAM,wCACL,QAAQ;EAOE,OACX,kBACA,mBACA,MAAM,wCACL"}
@@ -1,11 +1,24 @@
1
+ import { readCloudArray, readCloudInteger, readCloudJSONObject, readCloudNullableString, readCloudRecord, readCloudString, readCloudTimestamp } from "./cloudResponse.js";
1
2
  //#region src/AssistantCloudThreadMessages.ts
3
+ const decodeCloudMessage = (value, field) => {
4
+ const message = readCloudRecord(value, field);
5
+ return {
6
+ id: readCloudString(message.id, `${field}.id`),
7
+ parent_id: readCloudNullableString(message.parent_id, `${field}.parent_id`),
8
+ height: readCloudInteger(message.height, `${field}.height`),
9
+ created_at: readCloudTimestamp(message.created_at, `${field}.created_at`),
10
+ updated_at: readCloudTimestamp(message.updated_at, `${field}.updated_at`),
11
+ format: readCloudString(message.format, `${field}.format`),
12
+ content: readCloudJSONObject(message.content, `${field}.content`)
13
+ };
14
+ };
2
15
  var AssistantCloudThreadMessages = class {
3
16
  cloud;
4
17
  constructor(cloud) {
5
18
  this.cloud = cloud;
6
19
  }
7
20
  async list(threadId, query) {
8
- return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}/messages`, { query });
21
+ return { messages: readCloudArray(readCloudRecord(await this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}/messages`, { query }), "thread message list response").messages, "messages").map((message, index) => decodeCloudMessage(message, `messages[${index}]`)) };
9
22
  }
10
23
  async create(threadId, body) {
11
24
  return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}/messages`, {
@@ -21,6 +34,6 @@ var AssistantCloudThreadMessages = class {
21
34
  }
22
35
  };
23
36
  //#endregion
24
- export { AssistantCloudThreadMessages };
37
+ export { AssistantCloudThreadMessages, decodeCloudMessage };
25
38
 
26
39
  //# sourceMappingURL=AssistantCloudThreadMessages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreadMessages.js","names":[],"sources":["../src/AssistantCloudThreadMessages.ts"],"sourcesContent":["import type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\n\nexport type CloudMessage = {\n id: string;\n parent_id: string | null;\n height: number;\n created_at: Date;\n updated_at: Date;\n format: \"aui/v0\" | string;\n content: ReadonlyJSONObject;\n};\n\ntype AssistantCloudThreadMessageListQuery = {\n format?: string;\n};\n\ntype AssistantCloudThreadMessageListResponse = {\n messages: CloudMessage[];\n};\n\ntype AssistantCloudThreadMessageCreateBody = {\n parent_id: string | null;\n format: \"aui/v0\" | string;\n content: ReadonlyJSONObject;\n};\n\ntype AssistantCloudMessageCreateResponse = {\n message_id: string;\n};\n\ntype AssistantCloudThreadMessageUpdateBody = {\n content: ReadonlyJSONObject;\n};\n\nexport class AssistantCloudThreadMessages {\n constructor(private cloud: AssistantCloudAPI) {}\n\n public async list(\n threadId: string,\n query?: AssistantCloudThreadMessageListQuery,\n ): Promise<AssistantCloudThreadMessageListResponse> {\n return this.cloud.makeRequest(\n `/threads/${encodeURIComponent(threadId)}/messages`,\n { query },\n );\n }\n\n public async create(\n threadId: string,\n body: AssistantCloudThreadMessageCreateBody,\n ): Promise<AssistantCloudMessageCreateResponse> {\n return this.cloud.makeRequest(\n `/threads/${encodeURIComponent(threadId)}/messages`,\n { method: \"POST\", body },\n );\n }\n\n public async update(\n threadId: string,\n messageId: string,\n body: AssistantCloudThreadMessageUpdateBody,\n ): Promise<void> {\n return this.cloud.makeRequest(\n `/threads/${encodeURIComponent(threadId)}/messages/${encodeURIComponent(messageId)}`,\n { method: \"PUT\", body },\n );\n }\n}\n"],"mappings":";AAmCA,IAAa,+BAAb,MAA0C;CACpB;CAApB,YAAY,OAAkC;EAA1B,KAAA,QAAA;CAA2B;CAE/C,MAAa,KACX,UACA,OACkD;EAClD,OAAO,KAAK,MAAM,YAChB,YAAY,mBAAmB,QAAQ,EAAE,YACzC,EAAE,MAAM,CACV;CACF;CAEA,MAAa,OACX,UACA,MAC8C;EAC9C,OAAO,KAAK,MAAM,YAChB,YAAY,mBAAmB,QAAQ,EAAE,YACzC;GAAE,QAAQ;GAAQ;EAAK,CACzB;CACF;CAEA,MAAa,OACX,UACA,WACA,MACe;EACf,OAAO,KAAK,MAAM,YAChB,YAAY,mBAAmB,QAAQ,EAAE,YAAY,mBAAmB,SAAS,KACjF;GAAE,QAAQ;GAAO;EAAK,CACxB;CACF;AACF"}
1
+ {"version":3,"file":"AssistantCloudThreadMessages.js","names":[],"sources":["../src/AssistantCloudThreadMessages.ts"],"sourcesContent":["import type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport {\n readCloudArray,\n readCloudInteger,\n readCloudJSONObject,\n readCloudNullableString,\n readCloudRecord,\n readCloudString,\n readCloudTimestamp,\n} from \"./cloudResponse\";\n\nexport type CloudMessage = {\n id: string;\n parent_id: string | null;\n height: number;\n created_at: Date;\n updated_at: Date;\n format: \"aui/v0\" | string;\n content: ReadonlyJSONObject;\n};\n\ntype AssistantCloudThreadMessageListQuery = {\n format?: string;\n};\n\ntype AssistantCloudThreadMessageListResponse = {\n messages: CloudMessage[];\n};\n\ntype AssistantCloudThreadMessageCreateBody = {\n parent_id: string | null;\n format: \"aui/v0\" | string;\n content: ReadonlyJSONObject;\n};\n\ntype AssistantCloudMessageCreateResponse = {\n message_id: string;\n};\n\ntype AssistantCloudThreadMessageUpdateBody = {\n content: ReadonlyJSONObject;\n};\n\nexport const decodeCloudMessage = (\n value: unknown,\n field: string,\n): CloudMessage => {\n const message = readCloudRecord(value, field);\n return {\n id: readCloudString(message.id, `${field}.id`),\n parent_id: readCloudNullableString(message.parent_id, `${field}.parent_id`),\n height: readCloudInteger(message.height, `${field}.height`),\n created_at: readCloudTimestamp(message.created_at, `${field}.created_at`),\n updated_at: readCloudTimestamp(message.updated_at, `${field}.updated_at`),\n format: readCloudString(message.format, `${field}.format`),\n content: readCloudJSONObject(message.content, `${field}.content`),\n };\n};\n\nexport class AssistantCloudThreadMessages {\n private cloud: AssistantCloudAPI;\n\n constructor(cloud: AssistantCloudAPI) {\n this.cloud = cloud;\n }\n\n public async list(\n threadId: string,\n query?: AssistantCloudThreadMessageListQuery,\n ): Promise<AssistantCloudThreadMessageListResponse> {\n const response = readCloudRecord(\n await this.cloud.makeRequest(\n `/threads/${encodeURIComponent(threadId)}/messages`,\n { query },\n ),\n \"thread message list response\",\n );\n const messages = readCloudArray(response.messages, \"messages\");\n\n return {\n messages: messages.map((message, index) =>\n decodeCloudMessage(message, `messages[${index}]`),\n ),\n };\n }\n\n public async create(\n threadId: string,\n body: AssistantCloudThreadMessageCreateBody,\n ): Promise<AssistantCloudMessageCreateResponse> {\n return this.cloud.makeRequest(\n `/threads/${encodeURIComponent(threadId)}/messages`,\n { method: \"POST\", body },\n );\n }\n\n public async update(\n threadId: string,\n messageId: string,\n body: AssistantCloudThreadMessageUpdateBody,\n ): Promise<void> {\n return this.cloud.makeRequest(\n `/threads/${encodeURIComponent(threadId)}/messages/${encodeURIComponent(messageId)}`,\n { method: \"PUT\", body },\n );\n }\n}\n"],"mappings":";;AA4CA,MAAa,sBACX,OACA,UACiB;CACjB,MAAM,UAAU,gBAAgB,OAAO,KAAK;CAC5C,OAAO;EACL,IAAI,gBAAgB,QAAQ,IAAI,GAAG,MAAM,IAAI;EAC7C,WAAW,wBAAwB,QAAQ,WAAW,GAAG,MAAM,WAAW;EAC1E,QAAQ,iBAAiB,QAAQ,QAAQ,GAAG,MAAM,QAAQ;EAC1D,YAAY,mBAAmB,QAAQ,YAAY,GAAG,MAAM,YAAY;EACxE,YAAY,mBAAmB,QAAQ,YAAY,GAAG,MAAM,YAAY;EACxE,QAAQ,gBAAgB,QAAQ,QAAQ,GAAG,MAAM,QAAQ;EACzD,SAAS,oBAAoB,QAAQ,SAAS,GAAG,MAAM,SAAS;CAClE;AACF;AAEA,IAAa,+BAAb,MAA0C;CACxC;CAEA,YAAY,OAA0B;EACpC,KAAK,QAAQ;CACf;CAEA,MAAa,KACX,UACA,OACkD;EAUlD,OAAO,EACL,UAHe,eAPA,gBACf,MAAM,KAAK,MAAM,YACf,YAAY,mBAAmB,QAAQ,EAAE,YACzC,EAAE,MAAM,CACV,GACA,8BAEqC,CAAC,CAAC,UAAU,UAGhC,CAAC,CAAC,KAAK,SAAS,UAC/B,mBAAmB,SAAS,YAAY,MAAM,EAAE,CAClD,EACF;CACF;CAEA,MAAa,OACX,UACA,MAC8C;EAC9C,OAAO,KAAK,MAAM,YAChB,YAAY,mBAAmB,QAAQ,EAAE,YACzC;GAAE,QAAQ;GAAQ;EAAK,CACzB;CACF;CAEA,MAAa,OACX,UACA,WACA,MACe;EACf,OAAO,KAAK,MAAM,YAChB,YAAY,mBAAmB,QAAQ,EAAE,YAAY,mBAAmB,SAAS,KACjF;GAAE,QAAQ;GAAO;EAAK,CACxB;CACF;AACF"}
@@ -36,9 +36,10 @@ type AssistantCloudThreadsUpdateBody = {
36
36
  metadata?: unknown | undefined;
37
37
  is_archived?: boolean | undefined;
38
38
  };
39
+ declare const decodeCloudThread: (value: unknown, field: string) => CloudThread;
39
40
  declare class AssistantCloudThreads {
40
- private cloud;
41
41
  readonly messages: AssistantCloudThreadMessages;
42
+ private cloud;
42
43
  constructor(cloud: AssistantCloudAPI);
43
44
  list(query?: AssistantCloudThreadsListQuery): Promise<AssistantCloudThreadsListResponse>;
44
45
  get(threadId: string): Promise<CloudThread>;
@@ -47,5 +48,5 @@ declare class AssistantCloudThreads {
47
48
  delete(threadId: string): Promise<void>;
48
49
  }
49
50
  //#endregion
50
- export { AssistantCloudThreads };
51
+ export { AssistantCloudThreads, CloudThread, decodeCloudThread };
51
52
  //# sourceMappingURL=AssistantCloudThreads.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreads.d.ts","names":[],"sources":["../src/AssistantCloudThreads.ts"],"mappings":";;;KAGK;EACH;EACA;EACA;;KAGG;EACH;EACA,iBAAiB;EACjB;EACA;EACA;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA;;KAGG;EACH,SAAS;;KAGN;EACH;EACA,iBAAiB;EACjB;EACA;;KAGG;EACH;;KAGG;EACH;EACA,kBAAkB;EAClB;EACA;;cAGW;UAGS;WAFJ,UAAU;cAEN,OAAO;EAId,KACX,QAAQ,iCACP,QAAQ;EAIE,IAAI,mBAAmB,QAAQ;EAI/B,OACX,MAAM,kCACL,QAAQ;EAIE,OACX,kBACA,MAAM,kCACL;EAOU,OAAO,mBAAmB"}
1
+ {"version":3,"file":"AssistantCloudThreads.d.ts","names":[],"sources":["../src/AssistantCloudThreads.ts"],"mappings":";;;KAWK;EACH;EACA;EACA;;KAGU;EACV;EACA,iBAAiB;EACjB;EACA;EACA;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA;;KAGG;EACH,SAAS;;KAGN;EACH;EACA,iBAAiB;EACjB;EACA;;KAGG;EACH;;KAGG;EACH;EACA,kBAAkB;EAClB;EACA;;cAGW,oBACX,gBACA,kBACC;cAsBU;WACK,UAAU;UAElB;EAEI,YAAA,OAAO;EAKN,KACX,QAAQ,iCACP,QAAQ;EAcE,IAAI,mBAAmB,QAAQ;EAS/B,OACX,MAAM,kCACL,QAAQ;EAIE,OACX,kBACA,MAAM,kCACL;EAOU,OAAO,mBAAmB"}
@@ -1,17 +1,34 @@
1
+ import { readCloudArray, readCloudBoolean, readCloudNullableString, readCloudRecord, readCloudString, readCloudTimestamp } from "./cloudResponse.js";
1
2
  import { AssistantCloudThreadMessages } from "./AssistantCloudThreadMessages.js";
2
3
  //#region src/AssistantCloudThreads.ts
4
+ const decodeCloudThread = (value, field) => {
5
+ const thread = readCloudRecord(value, field);
6
+ return {
7
+ title: readCloudNullableString(thread.title, `${field}.title`) ?? "",
8
+ last_message_at: readCloudTimestamp(thread.last_message_at, `${field}.last_message_at`),
9
+ metadata: thread.metadata,
10
+ external_id: readCloudNullableString(thread.external_id, `${field}.external_id`),
11
+ id: readCloudString(thread.id, `${field}.id`),
12
+ project_id: readCloudString(thread.project_id, `${field}.project_id`),
13
+ created_at: readCloudTimestamp(thread.created_at, `${field}.created_at`),
14
+ updated_at: readCloudTimestamp(thread.updated_at, `${field}.updated_at`),
15
+ workspace_id: readCloudString(thread.workspace_id, `${field}.workspace_id`),
16
+ is_archived: readCloudBoolean(thread.is_archived, `${field}.is_archived`)
17
+ };
18
+ };
3
19
  var AssistantCloudThreads = class {
4
- cloud;
5
20
  messages;
21
+ cloud;
6
22
  constructor(cloud) {
7
23
  this.cloud = cloud;
8
24
  this.messages = new AssistantCloudThreadMessages(cloud);
9
25
  }
10
26
  async list(query) {
11
- return this.cloud.makeRequest("/threads", { query });
27
+ return { threads: readCloudArray(readCloudRecord(await this.cloud.makeRequest("/threads", { query }), "thread list response").threads, "threads").map((thread, index) => decodeCloudThread(thread, `threads[${index}]`)) };
12
28
  }
13
29
  async get(threadId) {
14
- return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`);
30
+ const response = readCloudRecord(await this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`), "thread response");
31
+ return decodeCloudThread(response.thread, "thread");
15
32
  }
16
33
  async create(body) {
17
34
  return this.cloud.makeRequest("/threads", {
@@ -30,6 +47,6 @@ var AssistantCloudThreads = class {
30
47
  }
31
48
  };
32
49
  //#endregion
33
- export { AssistantCloudThreads };
50
+ export { AssistantCloudThreads, decodeCloudThread };
34
51
 
35
52
  //# sourceMappingURL=AssistantCloudThreads.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudThreads.js","names":[],"sources":["../src/AssistantCloudThreads.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport { AssistantCloudThreadMessages } from \"./AssistantCloudThreadMessages\";\n\ntype AssistantCloudThreadsListQuery = {\n is_archived?: boolean;\n limit?: number;\n after?: string;\n};\n\ntype CloudThread = {\n title: string;\n last_message_at: Date;\n metadata: unknown;\n external_id: string | null;\n id: string;\n project_id: string;\n created_at: Date;\n updated_at: Date;\n workspace_id: string;\n is_archived: boolean;\n};\n\ntype AssistantCloudThreadsListResponse = {\n threads: CloudThread[];\n};\n\ntype AssistantCloudThreadsCreateBody = {\n title?: string | undefined;\n last_message_at: Date;\n metadata?: unknown | undefined;\n external_id?: string | undefined;\n};\n\ntype AssistantCloudThreadsCreateResponse = {\n thread_id: string;\n};\n\ntype AssistantCloudThreadsUpdateBody = {\n title?: string | undefined;\n last_message_at?: Date | undefined;\n metadata?: unknown | undefined;\n is_archived?: boolean | undefined;\n};\n\nexport class AssistantCloudThreads {\n public readonly messages: AssistantCloudThreadMessages;\n\n constructor(private cloud: AssistantCloudAPI) {\n this.messages = new AssistantCloudThreadMessages(cloud);\n }\n\n public async list(\n query?: AssistantCloudThreadsListQuery,\n ): Promise<AssistantCloudThreadsListResponse> {\n return this.cloud.makeRequest(\"/threads\", { query });\n }\n\n public async get(threadId: string): Promise<CloudThread> {\n return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`);\n }\n\n public async create(\n body: AssistantCloudThreadsCreateBody,\n ): Promise<AssistantCloudThreadsCreateResponse> {\n return this.cloud.makeRequest(\"/threads\", { method: \"POST\", body });\n }\n\n public async update(\n threadId: string,\n body: AssistantCloudThreadsUpdateBody,\n ): Promise<void> {\n return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`, {\n method: \"PUT\",\n body,\n });\n }\n\n public async delete(threadId: string): Promise<void> {\n return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`, {\n method: \"DELETE\",\n });\n }\n}\n"],"mappings":";;AA4CA,IAAa,wBAAb,MAAmC;CAGb;CAFpB;CAEA,YAAY,OAAkC;EAA1B,KAAA,QAAA;EAClB,KAAK,WAAW,IAAI,6BAA6B,KAAK;CACxD;CAEA,MAAa,KACX,OAC4C;EAC5C,OAAO,KAAK,MAAM,YAAY,YAAY,EAAE,MAAM,CAAC;CACrD;CAEA,MAAa,IAAI,UAAwC;EACvD,OAAO,KAAK,MAAM,YAAY,YAAY,mBAAmB,QAAQ,GAAG;CAC1E;CAEA,MAAa,OACX,MAC8C;EAC9C,OAAO,KAAK,MAAM,YAAY,YAAY;GAAE,QAAQ;GAAQ;EAAK,CAAC;CACpE;CAEA,MAAa,OACX,UACA,MACe;EACf,OAAO,KAAK,MAAM,YAAY,YAAY,mBAAmB,QAAQ,KAAK;GACxE,QAAQ;GACR;EACF,CAAC;CACH;CAEA,MAAa,OAAO,UAAiC;EACnD,OAAO,KAAK,MAAM,YAAY,YAAY,mBAAmB,QAAQ,KAAK,EACxE,QAAQ,SACV,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"AssistantCloudThreads.js","names":[],"sources":["../src/AssistantCloudThreads.ts"],"sourcesContent":["import type { AssistantCloudAPI } from \"./AssistantCloudAPI\";\nimport { AssistantCloudThreadMessages } from \"./AssistantCloudThreadMessages\";\nimport {\n readCloudArray,\n readCloudBoolean,\n readCloudNullableString,\n readCloudRecord,\n readCloudString,\n readCloudTimestamp,\n} from \"./cloudResponse\";\n\ntype AssistantCloudThreadsListQuery = {\n is_archived?: boolean;\n limit?: number;\n after?: string;\n};\n\nexport type CloudThread = {\n title: string;\n last_message_at: Date;\n metadata: unknown;\n external_id: string | null;\n id: string;\n project_id: string;\n created_at: Date;\n updated_at: Date;\n workspace_id: string;\n is_archived: boolean;\n};\n\ntype AssistantCloudThreadsListResponse = {\n threads: CloudThread[];\n};\n\ntype AssistantCloudThreadsCreateBody = {\n title?: string | undefined;\n last_message_at: Date;\n metadata?: unknown | undefined;\n external_id?: string | undefined;\n};\n\ntype AssistantCloudThreadsCreateResponse = {\n thread_id: string;\n};\n\ntype AssistantCloudThreadsUpdateBody = {\n title?: string | undefined;\n last_message_at?: Date | undefined;\n metadata?: unknown | undefined;\n is_archived?: boolean | undefined;\n};\n\nexport const decodeCloudThread = (\n value: unknown,\n field: string,\n): CloudThread => {\n const thread = readCloudRecord(value, field);\n return {\n title: readCloudNullableString(thread.title, `${field}.title`) ?? \"\",\n last_message_at: readCloudTimestamp(\n thread.last_message_at,\n `${field}.last_message_at`,\n ),\n metadata: thread.metadata,\n external_id: readCloudNullableString(\n thread.external_id,\n `${field}.external_id`,\n ),\n id: readCloudString(thread.id, `${field}.id`),\n project_id: readCloudString(thread.project_id, `${field}.project_id`),\n created_at: readCloudTimestamp(thread.created_at, `${field}.created_at`),\n updated_at: readCloudTimestamp(thread.updated_at, `${field}.updated_at`),\n workspace_id: readCloudString(thread.workspace_id, `${field}.workspace_id`),\n is_archived: readCloudBoolean(thread.is_archived, `${field}.is_archived`),\n };\n};\n\nexport class AssistantCloudThreads {\n public readonly messages: AssistantCloudThreadMessages;\n\n private cloud: AssistantCloudAPI;\n\n constructor(cloud: AssistantCloudAPI) {\n this.cloud = cloud;\n this.messages = new AssistantCloudThreadMessages(cloud);\n }\n\n public async list(\n query?: AssistantCloudThreadsListQuery,\n ): Promise<AssistantCloudThreadsListResponse> {\n const response = readCloudRecord(\n await this.cloud.makeRequest(\"/threads\", { query }),\n \"thread list response\",\n );\n const threads = readCloudArray(response.threads, \"threads\");\n\n return {\n threads: threads.map((thread, index) =>\n decodeCloudThread(thread, `threads[${index}]`),\n ),\n };\n }\n\n public async get(threadId: string): Promise<CloudThread> {\n const response = readCloudRecord(\n await this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`),\n \"thread response\",\n );\n\n return decodeCloudThread(response.thread, \"thread\");\n }\n\n public async create(\n body: AssistantCloudThreadsCreateBody,\n ): Promise<AssistantCloudThreadsCreateResponse> {\n return this.cloud.makeRequest(\"/threads\", { method: \"POST\", body });\n }\n\n public async update(\n threadId: string,\n body: AssistantCloudThreadsUpdateBody,\n ): Promise<void> {\n return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`, {\n method: \"PUT\",\n body,\n });\n }\n\n public async delete(threadId: string): Promise<void> {\n return this.cloud.makeRequest(`/threads/${encodeURIComponent(threadId)}`, {\n method: \"DELETE\",\n });\n }\n}\n"],"mappings":";;;AAoDA,MAAa,qBACX,OACA,UACgB;CAChB,MAAM,SAAS,gBAAgB,OAAO,KAAK;CAC3C,OAAO;EACL,OAAO,wBAAwB,OAAO,OAAO,GAAG,MAAM,OAAO,KAAK;EAClE,iBAAiB,mBACf,OAAO,iBACP,GAAG,MAAM,iBACX;EACA,UAAU,OAAO;EACjB,aAAa,wBACX,OAAO,aACP,GAAG,MAAM,aACX;EACA,IAAI,gBAAgB,OAAO,IAAI,GAAG,MAAM,IAAI;EAC5C,YAAY,gBAAgB,OAAO,YAAY,GAAG,MAAM,YAAY;EACpE,YAAY,mBAAmB,OAAO,YAAY,GAAG,MAAM,YAAY;EACvE,YAAY,mBAAmB,OAAO,YAAY,GAAG,MAAM,YAAY;EACvE,cAAc,gBAAgB,OAAO,cAAc,GAAG,MAAM,cAAc;EAC1E,aAAa,iBAAiB,OAAO,aAAa,GAAG,MAAM,aAAa;CAC1E;AACF;AAEA,IAAa,wBAAb,MAAmC;CACjC;CAEA;CAEA,YAAY,OAA0B;EACpC,KAAK,QAAQ;EACb,KAAK,WAAW,IAAI,6BAA6B,KAAK;CACxD;CAEA,MAAa,KACX,OAC4C;EAO5C,OAAO,EACL,SAHc,eAJC,gBACf,MAAM,KAAK,MAAM,YAAY,YAAY,EAAE,MAAM,CAAC,GAClD,sBAEoC,CAAC,CAAC,SAAS,SAGhC,CAAC,CAAC,KAAK,QAAQ,UAC5B,kBAAkB,QAAQ,WAAW,MAAM,EAAE,CAC/C,EACF;CACF;CAEA,MAAa,IAAI,UAAwC;EACvD,MAAM,WAAW,gBACf,MAAM,KAAK,MAAM,YAAY,YAAY,mBAAmB,QAAQ,GAAG,GACvE,iBACF;EAEA,OAAO,kBAAkB,SAAS,QAAQ,QAAQ;CACpD;CAEA,MAAa,OACX,MAC8C;EAC9C,OAAO,KAAK,MAAM,YAAY,YAAY;GAAE,QAAQ;GAAQ;EAAK,CAAC;CACpE;CAEA,MAAa,OACX,UACA,MACe;EACf,OAAO,KAAK,MAAM,YAAY,YAAY,mBAAmB,QAAQ,KAAK;GACxE,QAAQ;GACR;EACF,CAAC;CACH;CAEA,MAAa,OAAO,UAAiC;EACnD,OAAO,KAAK,MAAM,YAAY,YAAY,mBAAmB,QAAQ,KAAK,EACxE,QAAQ,SACV,CAAC;CACH;AACF"}