assistant-cloud 0.1.36 → 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 (31) hide show
  1. package/dist/AssistantCloudAPI.d.ts.map +1 -1
  2. package/dist/AssistantCloudAPI.js.map +1 -1
  3. package/dist/AssistantCloudAuthTokens.d.ts.map +1 -1
  4. package/dist/AssistantCloudAuthTokens.js.map +1 -1
  5. package/dist/AssistantCloudFiles.d.ts.map +1 -1
  6. package/dist/AssistantCloudFiles.js.map +1 -1
  7. package/dist/AssistantCloudProjectThreadMessages.d.ts.map +1 -1
  8. package/dist/AssistantCloudProjectThreadMessages.js.map +1 -1
  9. package/dist/AssistantCloudProjectThreads.d.ts +1 -1
  10. package/dist/AssistantCloudProjectThreads.d.ts.map +1 -1
  11. package/dist/AssistantCloudProjectThreads.js +1 -1
  12. package/dist/AssistantCloudProjectThreads.js.map +1 -1
  13. package/dist/AssistantCloudRuns.d.ts.map +1 -1
  14. package/dist/AssistantCloudRuns.js.map +1 -1
  15. package/dist/AssistantCloudThreadMessages.d.ts.map +1 -1
  16. package/dist/AssistantCloudThreadMessages.js.map +1 -1
  17. package/dist/AssistantCloudThreads.d.ts +1 -1
  18. package/dist/AssistantCloudThreads.d.ts.map +1 -1
  19. package/dist/AssistantCloudThreads.js +1 -1
  20. package/dist/AssistantCloudThreads.js.map +1 -1
  21. package/package.json +3 -3
  22. package/src/AssistantCloudAPI.ts +4 -4
  23. package/src/AssistantCloudAuthTokens.ts +5 -1
  24. package/src/AssistantCloudFiles.ts +5 -1
  25. package/src/AssistantCloudProjectThreadMessages.ts +5 -1
  26. package/src/AssistantCloudProjectThreads.ts +4 -1
  27. package/src/AssistantCloudRuns.ts +5 -1
  28. package/src/AssistantCloudThreadMessages.ts +5 -1
  29. package/src/AssistantCloudThreads.ts +4 -1
  30. package/src/tests/AssistantCloudAPI.test.ts +0 -84
  31. package/src/tests/AssistantCloudFiles.test.ts +0 -562
@@ -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;EADhB,YAAA,iBACgB;;KAOf;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"}
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"}
@@ -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\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;CAGrB;CAFlB,YACE,SACA,QACA;EACA,MAAM,OAAO;EAFG,KAAA,SAAA;EAGhB,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudAuthTokens.d.ts","names":[],"sources":["../src/AssistantCloudAuthTokens.ts"],"mappings":";;KAEK;EACH;;cAGW;UACS;EAAA,YAAA,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;EAAA,YAAA,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudProjectThreadMessages.d.ts","names":[],"sources":["../src/AssistantCloudProjectThreadMessages.ts"],"mappings":";;;KAOK;EACH;EACA;EACA;;KAGG;EACH,UAAU;;cAGC;UACS;EAAA,YAAA,OAAO;EAEd,KACX,kBACA,QAAQ,8CACP,QAAQ"}
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"}
@@ -1 +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 constructor(private cloud: AssistantCloudAPI) {}\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;CAC3B;CAApB,YAAY,OAAkC;EAA1B,KAAA,QAAA;CAA2B;CAE/C,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"}
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"}
@@ -11,8 +11,8 @@ type AssistantCloudProjectThreadsListResponse = {
11
11
  threads: CloudThread[];
12
12
  };
13
13
  declare class AssistantCloudProjectThreads {
14
- private cloud;
15
14
  readonly messages: AssistantCloudProjectThreadMessages;
15
+ private cloud;
16
16
  constructor(cloud: AssistantCloudAPI);
17
17
  list(query?: AssistantCloudProjectThreadsListQuery): Promise<AssistantCloudProjectThreadsListResponse>;
18
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantCloudProjectThreads.d.ts","names":[],"sources":["../src/AssistantCloudProjectThreads.ts"],"mappings":";;;;KAKK;EACH;EACA;EACA;;KAGG;EACH,SAAS;;cAGE;UAGS;WAFJ,UAAU;EAEN,YAAA,OAAO;EAId,KACX,QAAQ,wCACP,QAAQ"}
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"}
@@ -3,8 +3,8 @@ import { AssistantCloudProjectThreadMessages } from "./AssistantCloudProjectThre
3
3
  import { decodeCloudThread } from "./AssistantCloudThreads.js";
4
4
  //#region src/AssistantCloudProjectThreads.ts
5
5
  var AssistantCloudProjectThreads = class {
6
- cloud;
7
6
  messages;
7
+ cloud;
8
8
  constructor(cloud) {
9
9
  this.cloud = cloud;
10
10
  this.messages = new AssistantCloudProjectThreadMessages(cloud);
@@ -1 +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 constructor(private cloud: AssistantCloudAPI) {\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;CAGpB;CAFpB;CAEA,YAAY,OAAkC;EAA1B,KAAA,QAAA;EAClB,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"}
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"}
@@ -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;EAAA,YAAA,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"}
@@ -1 +1 @@
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;UACS;EAAA,YAAA,OAAO;EAEd,KACX,kBACA,QAAQ,uCACP,QAAQ;EAiBE,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 +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\";\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 constructor(private cloud: AssistantCloudAPI) {}\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;CACpB;CAApB,YAAY,OAAkC;EAA1B,KAAA,QAAA;CAA2B;CAE/C,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"}
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"}
@@ -38,8 +38,8 @@ type AssistantCloudThreadsUpdateBody = {
38
38
  };
39
39
  declare const decodeCloudThread: (value: unknown, field: string) => CloudThread;
40
40
  declare class AssistantCloudThreads {
41
- private cloud;
42
41
  readonly messages: AssistantCloudThreadMessages;
42
+ private cloud;
43
43
  constructor(cloud: AssistantCloudAPI);
44
44
  list(query?: AssistantCloudThreadsListQuery): Promise<AssistantCloudThreadsListResponse>;
45
45
  get(threadId: string): Promise<CloudThread>;
@@ -1 +1 @@
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;UAGS;WAFJ,UAAU;EAEN,YAAA,OAAO;EAId,KACX,QAAQ,iCACP,QAAQ;EAcE,IAAI,mBAAmB,QAAQ;EAS/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"}
@@ -17,8 +17,8 @@ const decodeCloudThread = (value, field) => {
17
17
  };
18
18
  };
19
19
  var AssistantCloudThreads = class {
20
- cloud;
21
20
  messages;
21
+ cloud;
22
22
  constructor(cloud) {
23
23
  this.cloud = cloud;
24
24
  this.messages = new AssistantCloudThreadMessages(cloud);
@@ -1 +1 @@
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 constructor(private cloud: AssistantCloudAPI) {\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;CAGb;CAFpB;CAEA,YAAY,OAAkC;EAA1B,KAAA,QAAA;EAClB,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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "assistant-cloud",
3
- "version": "0.1.36",
3
+ "version": "0.1.37",
4
4
  "description": "Cloud integration for assistant-ui",
5
5
  "keywords": [
6
6
  "assistant",
@@ -27,12 +27,12 @@
27
27
  ],
28
28
  "sideEffects": false,
29
29
  "dependencies": {
30
- "assistant-stream": "^0.3.27"
30
+ "assistant-stream": "^0.3.28"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^26.1.1",
34
34
  "vitest": "^4.1.10",
35
- "@assistant-ui/x-buildutils": "0.0.19"
35
+ "@assistant-ui/x-buildutils": "0.0.20"
36
36
  },
37
37
  "publishConfig": {
38
38
  "access": "public",
@@ -49,11 +49,11 @@ export type AssistantCloudConfig = (
49
49
  };
50
50
 
51
51
  export class CloudAPIError extends Error {
52
- constructor(
53
- message: string,
54
- public readonly status: number,
55
- ) {
52
+ public readonly status: number;
53
+
54
+ constructor(message: string, status: number) {
56
55
  super(message);
56
+ this.status = status;
57
57
  this.name = "CloudAPIError";
58
58
  }
59
59
  }
@@ -5,7 +5,11 @@ type AssistantCloudAuthTokensCreateResponse = {
5
5
  };
6
6
 
7
7
  export class AssistantCloudAuthTokens {
8
- constructor(private cloud: AssistantCloudAPI) {}
8
+ private cloud: AssistantCloudAPI;
9
+
10
+ constructor(cloud: AssistantCloudAPI) {
11
+ this.cloud = cloud;
12
+ }
9
13
 
10
14
  public async create(): Promise<AssistantCloudAuthTokensCreateResponse> {
11
15
  return this.cloud.makeRequest("/auth/tokens", { method: "POST" });
@@ -23,7 +23,11 @@ type GeneratePresignedUploadUrlResponse = {
23
23
  };
24
24
 
25
25
  export class AssistantCloudFiles {
26
- constructor(private cloud: AssistantCloudAPI) {}
26
+ private cloud: AssistantCloudAPI;
27
+
28
+ constructor(cloud: AssistantCloudAPI) {
29
+ this.cloud = cloud;
30
+ }
27
31
 
28
32
  public async pdfToImages(
29
33
  body: PdfToImagesRequestBody,
@@ -16,7 +16,11 @@ type AssistantCloudProjectThreadMessageListResponse = {
16
16
  };
17
17
 
18
18
  export class AssistantCloudProjectThreadMessages {
19
- constructor(private cloud: AssistantCloudAPI) {}
19
+ private cloud: AssistantCloudAPI;
20
+
21
+ constructor(cloud: AssistantCloudAPI) {
22
+ this.cloud = cloud;
23
+ }
20
24
 
21
25
  public async list(
22
26
  threadId: string,
@@ -16,7 +16,10 @@ type AssistantCloudProjectThreadsListResponse = {
16
16
  export class AssistantCloudProjectThreads {
17
17
  public readonly messages: AssistantCloudProjectThreadMessages;
18
18
 
19
- constructor(private cloud: AssistantCloudAPI) {
19
+ private cloud: AssistantCloudAPI;
20
+
21
+ constructor(cloud: AssistantCloudAPI) {
22
+ this.cloud = cloud;
20
23
  this.messages = new AssistantCloudProjectThreadMessages(cloud);
21
24
  }
22
25
 
@@ -48,7 +48,11 @@ export type AssistantCloudRunReport = {
48
48
  };
49
49
 
50
50
  export class AssistantCloudRuns {
51
- constructor(private cloud: AssistantCloudAPI) {}
51
+ private cloud: AssistantCloudAPI;
52
+
53
+ constructor(cloud: AssistantCloudAPI) {
54
+ this.cloud = cloud;
55
+ }
52
56
 
53
57
  public __internal_getAssistantOptions(assistantId: string) {
54
58
  return {
@@ -59,7 +59,11 @@ export const decodeCloudMessage = (
59
59
  };
60
60
 
61
61
  export class AssistantCloudThreadMessages {
62
- constructor(private cloud: AssistantCloudAPI) {}
62
+ private cloud: AssistantCloudAPI;
63
+
64
+ constructor(cloud: AssistantCloudAPI) {
65
+ this.cloud = cloud;
66
+ }
63
67
 
64
68
  public async list(
65
69
  threadId: string,
@@ -78,7 +78,10 @@ export const decodeCloudThread = (
78
78
  export class AssistantCloudThreads {
79
79
  public readonly messages: AssistantCloudThreadMessages;
80
80
 
81
- constructor(private cloud: AssistantCloudAPI) {
81
+ private cloud: AssistantCloudAPI;
82
+
83
+ constructor(cloud: AssistantCloudAPI) {
84
+ this.cloud = cloud;
82
85
  this.messages = new AssistantCloudThreadMessages(cloud);
83
86
  }
84
87
 
@@ -1,13 +1,6 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
2
  import { AssistantCloudAPI, CloudAPIError } from "../AssistantCloudAPI";
3
3
 
4
- const createJwt = () => {
5
- const payload = Buffer.from(JSON.stringify({ exp: 4_102_444_800 })).toString(
6
- "base64url",
7
- );
8
- return `header.${payload}.signature`;
9
- };
10
-
11
4
  describe("AssistantCloudAPI", () => {
12
5
  beforeEach(() => {
13
6
  vi.restoreAllMocks();
@@ -101,65 +94,6 @@ describe("AssistantCloudAPI", () => {
101
94
  expect(url.toString()).toBe("https://custom.example.com/v1/threads");
102
95
  });
103
96
 
104
- it("strips a trailing slash from a JWT baseUrl", async () => {
105
- const fetchMock = vi.fn().mockResolvedValue({
106
- ok: true,
107
- headers: new Headers(),
108
- });
109
- vi.stubGlobal("fetch", fetchMock);
110
-
111
- const api = new AssistantCloudAPI({
112
- baseUrl: "https://custom.example.com/",
113
- authToken: async () => createJwt(),
114
- });
115
-
116
- await api.makeRawRequest("/threads");
117
-
118
- const [url] = fetchMock.mock.calls[0]!;
119
- expect(url.toString()).toBe("https://custom.example.com/v1/threads");
120
- });
121
-
122
- it("strips a trailing slash from anonymous auth URLs", async () => {
123
- const storage = {
124
- getItem: vi.fn().mockReturnValue(null),
125
- setItem: vi.fn(),
126
- removeItem: vi.fn(),
127
- };
128
- vi.stubGlobal("localStorage", storage);
129
-
130
- const fetchMock = vi
131
- .fn()
132
- .mockResolvedValueOnce({
133
- ok: true,
134
- json: vi.fn().mockResolvedValue({
135
- access_token: createJwt(),
136
- refresh_token: {
137
- token: "refresh-token",
138
- expires_at: "2100-01-01T00:00:00.000Z",
139
- },
140
- }),
141
- })
142
- .mockResolvedValueOnce({
143
- ok: true,
144
- headers: new Headers(),
145
- });
146
- vi.stubGlobal("fetch", fetchMock);
147
-
148
- const api = new AssistantCloudAPI({
149
- baseUrl: "https://custom.example.com/",
150
- anonymous: true,
151
- });
152
-
153
- await api.makeRawRequest("/threads");
154
-
155
- expect(fetchMock.mock.calls[0]![0]).toBe(
156
- "https://custom.example.com/v1/auth/tokens/anonymous",
157
- );
158
- expect(fetchMock.mock.calls[1]![0].toString()).toBe(
159
- "https://custom.example.com/v1/threads",
160
- );
161
- });
162
-
163
97
  it("rejects before fetch when auth token callback returns null", async () => {
164
98
  const fetchMock = vi.fn();
165
99
  vi.stubGlobal("fetch", fetchMock);
@@ -289,22 +223,4 @@ describe("AssistantCloudAPI", () => {
289
223
  await expect(api.makeRequest("/threads/t-1")).resolves.toBeUndefined();
290
224
  expect(text).not.toHaveBeenCalled();
291
225
  });
292
-
293
- it("makeRequest returns undefined from a whitespace-only success body", async () => {
294
- const fetchMock = vi.fn().mockResolvedValue({
295
- ok: true,
296
- status: 200,
297
- headers: new Headers(),
298
- text: vi.fn().mockResolvedValue(" "),
299
- });
300
- vi.stubGlobal("fetch", fetchMock);
301
-
302
- const api = new AssistantCloudAPI({
303
- apiKey: "test-key",
304
- userId: "u-1",
305
- workspaceId: "w-1",
306
- });
307
-
308
- await expect(api.makeRequest("/threads/t-1")).resolves.toBeUndefined();
309
- });
310
226
  });
@@ -1,562 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi, afterEach } from "vitest";
2
- import { AssistantCloudFiles } from "../AssistantCloudFiles";
3
- import type { AssistantCloudAPI } from "../AssistantCloudAPI";
4
-
5
- // Mock the AssistantCloudAPI to avoid making real HTTP requests (except for integration tests)
6
- vi.mock("../AssistantCloudAPI");
7
-
8
- describe("AssistantCloudFiles", () => {
9
- let cloudFiles: AssistantCloudFiles;
10
- let mockApi: AssistantCloudAPI;
11
-
12
- beforeEach(() => {
13
- // Create a mock API instance
14
- mockApi = {
15
- makeRequest: vi.fn(),
16
- makeRawRequest: vi.fn(),
17
- _auth: { getAuthHeaders: vi.fn() },
18
- _baseUrl: "https://backend.assistant-api.com",
19
- } as unknown as AssistantCloudAPI;
20
-
21
- // Create the AssistantCloudFiles instance with the mock API
22
- cloudFiles = new AssistantCloudFiles(mockApi);
23
- });
24
-
25
- afterEach(() => {
26
- vi.clearAllMocks();
27
- });
28
-
29
- describe("pdfToImages", () => {
30
- /**
31
- * Tests successful PDF to images conversion with file_url
32
- * This matches the curl request structure provided
33
- */
34
- it("should successfully convert PDF to images using file_url", async () => {
35
- const mockResponse = {
36
- success: true,
37
- urls: [
38
- "https://aui-pdf-processing.5c52327048f352f85fb041947c406ab4.r2.cloudflarestorage.com/images/8eb81c61-dc76-48fd-ab66-25cd84a28c97/page-1.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8698a7e98d990c6edd11fee3a9d0f3f0%2F20250606%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250606T035428Z&X-Amz-Expires=3600&X-Amz-Signature=ea26cdd5ff7dc85eba12970137606484b9a8ab2c520f31ddba9cbe5941b20793&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",
39
- "https://aui-pdf-processing.5c52327048f352f85fb041947c406ab4.r2.cloudflarestorage.com/images/8eb81c61-dc76-48fd-ab66-25cd84a28c97/page-2.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8698a7e98d990c6edd11fee3a9d0f3f0%2F20250606%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250606T035428Z&X-Amz-Expires=3600&X-Amz-Signature=3499237770cc4402a60e6cc9b8ce8bd460faade9adf456d2773009f7d07af9cb&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",
40
- "https://aui-pdf-processing.5c52327048f352f85fb041947c406ab4.r2.cloudflarestorage.com/images/8eb81c61-dc76-48fd-ab66-25cd84a28c97/page-3.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8698a7e98d990c6edd11fee3a9d0f3f0%2F20250606%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250606T035429Z&X-Amz-Expires=3600&X-Amz-Signature=663ee073972f1b7b82cede9039ed4bc0a6c08118533a9586e871807baf032bc2&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject",
41
- ],
42
- message: "PDF successfully converted to images",
43
- };
44
-
45
- // Mock the API call to return our expected response
46
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
47
-
48
- const requestBody = {
49
- file_url: "https://files.testfile.org/PDF/10MB-TESTFILE.ORG.pdf",
50
- };
51
-
52
- const result = await cloudFiles.pdfToImages(requestBody);
53
-
54
- // Verify the API was called correctly
55
- expect(mockApi.makeRequest).toHaveBeenCalledWith("/files/pdf-to-images", {
56
- method: "POST",
57
- body: requestBody,
58
- });
59
-
60
- // Verify the response structure
61
- expect(result).toEqual(mockResponse);
62
- expect(result.success).toBe(true);
63
- expect(result.urls).toHaveLength(3);
64
- expect(result.message).toBe("PDF successfully converted to images");
65
- expect(result.urls[0]).toContain("page-1.png");
66
- expect(result.urls[1]).toContain("page-2.png");
67
- expect(result.urls[2]).toContain("page-3.png");
68
- });
69
-
70
- /**
71
- * Tests successful PDF to images conversion with file_blob
72
- */
73
- it("should successfully convert PDF to images using file_blob", async () => {
74
- const mockResponse = {
75
- success: true,
76
- urls: [
77
- "https://example.com/converted-image-1.png",
78
- "https://example.com/converted-image-2.png",
79
- ],
80
- message: "PDF successfully converted to images",
81
- };
82
-
83
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
84
-
85
- const requestBody = {
86
- file_blob:
87
- "data:application/pdf;base64,JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMiAwIFIKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFszIDAgUl0KL0NvdW50IDEKL01lZGlhQm94IFswIDAgNTk1IDg0Ml0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCAyIDAgUgovTWVkaWFCb3ggWzAgMCA1OTUgODQyXQovQ29udGVudHMgNCAwIFIKPj4KZW5kb2JqCjQgMCBvYmoKPDwKL0xlbmd0aCA0NAo+PgpzdHJlYW0KQlQKL0YxIDEyIFRmCjEwMCA3MDAgVGQKKFRlc3QgUERGKSBUagoKRVQKZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9CYXNlRm9udCAvSGVsdmV0aWNhCi9TdWJ0eXBlIC9UeXBlMQo+PgplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9IZWx2ZXRpY2EKPj4KZW5kb2J4cmVmCjAgNwowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMDkgMDAwMDAgbiAKMDAwMDAwMDA3NCAwMDAwMCBuIAowMDAwMDAwMTMzIDAwMDAwIG4gCjAwMDAwMDAyMDQgMDAwMDAgbiAKMDAwMDAwMDI5OSAwMDAwMCBuIAowMDAwMDAwMzc2IDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgNwovUm9vdCAxIDAgUgo+PgpzdGFydHhyZWYKNDM0CiUlRU9GCg==",
88
- };
89
-
90
- const result = await cloudFiles.pdfToImages(requestBody);
91
-
92
- expect(mockApi.makeRequest).toHaveBeenCalledWith("/files/pdf-to-images", {
93
- method: "POST",
94
- body: requestBody,
95
- });
96
-
97
- expect(result).toEqual(mockResponse);
98
- expect(result.success).toBe(true);
99
- expect(result.urls).toHaveLength(2);
100
- });
101
-
102
- /**
103
- * Tests API error handling
104
- */
105
- it("should handle API errors gracefully", async () => {
106
- const errorMessage = "Invalid PDF file";
107
- vi.mocked(mockApi.makeRequest).mockRejectedValue(new Error(errorMessage));
108
-
109
- const requestBody = {
110
- file_url: "https://invalid-url.com/not-a-pdf.txt",
111
- };
112
-
113
- await expect(cloudFiles.pdfToImages(requestBody)).rejects.toThrow(
114
- errorMessage,
115
- );
116
-
117
- expect(mockApi.makeRequest).toHaveBeenCalledWith("/files/pdf-to-images", {
118
- method: "POST",
119
- body: requestBody,
120
- });
121
- });
122
-
123
- /**
124
- * Tests handling of failed conversion response
125
- */
126
- it("should handle failed conversion response", async () => {
127
- const mockResponse = {
128
- success: false,
129
- urls: [],
130
- message: "Failed to convert PDF: File too large",
131
- };
132
-
133
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
134
-
135
- const requestBody = {
136
- file_url: "https://example.com/huge-file.pdf",
137
- };
138
-
139
- const result = await cloudFiles.pdfToImages(requestBody);
140
-
141
- expect(result.success).toBe(false);
142
- expect(result.urls).toHaveLength(0);
143
- expect(result.message).toBe("Failed to convert PDF: File too large");
144
- });
145
-
146
- /**
147
- * Tests that the method works with both file_url and file_blob undefined (edge case)
148
- */
149
- it("should handle empty request body", async () => {
150
- const mockResponse = {
151
- success: false,
152
- urls: [],
153
- message: "No file provided",
154
- };
155
-
156
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
157
-
158
- const requestBody = {};
159
-
160
- const result = await cloudFiles.pdfToImages(requestBody);
161
-
162
- expect(mockApi.makeRequest).toHaveBeenCalledWith("/files/pdf-to-images", {
163
- method: "POST",
164
- body: requestBody,
165
- });
166
-
167
- expect(result.success).toBe(false);
168
- expect(result.urls).toHaveLength(0);
169
- });
170
-
171
- /**
172
- * Tests that the method sends the correct request headers and structure
173
- * This ensures compatibility with the API key authentication shown in the curl example
174
- */
175
- it("should make request to correct endpoint with proper structure", async () => {
176
- const mockResponse = {
177
- success: true,
178
- urls: ["https://example.com/image.png"],
179
- message: "Success",
180
- };
181
-
182
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
183
-
184
- const requestBody = {
185
- file_url: "https://files.testfile.org/PDF/10MB-TESTFILE.ORG.pdf",
186
- };
187
-
188
- await cloudFiles.pdfToImages(requestBody);
189
-
190
- // Verify the endpoint and method are correct
191
- expect(mockApi.makeRequest).toHaveBeenCalledWith("/files/pdf-to-images", {
192
- method: "POST",
193
- body: requestBody,
194
- });
195
-
196
- // Verify it was called exactly once
197
- expect(mockApi.makeRequest).toHaveBeenCalledTimes(1);
198
- });
199
-
200
- /**
201
- * Tests that both file_url and file_blob can be provided simultaneously
202
- */
203
- it("should handle request with both file_url and file_blob", async () => {
204
- const mockResponse = {
205
- success: true,
206
- urls: ["https://example.com/image.png"],
207
- message: "Success",
208
- };
209
-
210
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
211
-
212
- const requestBody = {
213
- file_url: "https://example.com/file.pdf",
214
- file_blob: "base64data...",
215
- };
216
-
217
- const result = await cloudFiles.pdfToImages(requestBody);
218
-
219
- expect(mockApi.makeRequest).toHaveBeenCalledWith("/files/pdf-to-images", {
220
- method: "POST",
221
- body: requestBody,
222
- });
223
-
224
- expect(result).toEqual(mockResponse);
225
- });
226
- });
227
-
228
- describe("generatePresignedUploadUrl", () => {
229
- /**
230
- * Tests successful generation of presigned upload URL
231
- * This matches the curl request structure provided
232
- */
233
- it("should successfully generate presigned upload URL", async () => {
234
- const mockResponse = {
235
- success: true,
236
- signedUrl:
237
- "https://aui-cloud-attachments.5c52327048f352f85fb041947c406ab4.r2.cloudflarestorage.com/attachments/0204c5a7-cd09-470c-9488-96cf0be9db92.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=8698a7e98d990c6edd11fee3a9d0f3f0%2F20250606%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250606T051813Z&X-Amz-Expires=900&X-Amz-Signature=b0d27e7bee6200eb1964ad1d7f4a8ad76db15a3d99bd4fb47ff4b0b08fee5ca5&X-Amz-SignedHeaders=content-length%3Bhost&x-amz-checksum-crc32=AAAAAA%3D%3D&x-amz-meta-original-filename=hello.pdf&x-amz-meta-project-id=proj_09369w56dnge&x-amz-meta-user-id=676767&x-amz-sdk-checksum-algorithm=CRC32&x-id=PutObject",
238
- expiresAt: "2025-06-06T05:33:13.322Z",
239
- publicUrl:
240
- "https://storage.assistant-api.com/attachments/0204c5a7-cd09-470c-9488-96cf0be9db92.pdf",
241
- };
242
-
243
- // Mock the API call to return our expected response
244
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
245
-
246
- const requestBody = {
247
- filename: "hello.pdf",
248
- };
249
-
250
- const result = await cloudFiles.generatePresignedUploadUrl(requestBody);
251
-
252
- // Verify the API was called correctly
253
- expect(mockApi.makeRequest).toHaveBeenCalledWith(
254
- "/files/attachments/generate-presigned-upload-url",
255
- {
256
- method: "POST",
257
- body: requestBody,
258
- },
259
- );
260
-
261
- // Verify the response structure
262
- expect(result).toEqual(mockResponse);
263
- expect(result.success).toBe(true);
264
- expect(result.signedUrl).toContain("aui-cloud-attachments");
265
- expect(result.signedUrl).toContain("X-Amz-Algorithm=AWS4-HMAC-SHA256");
266
- expect(result.expiresAt).toBe("2025-06-06T05:33:13.322Z");
267
- expect(result.publicUrl).toBe(
268
- "https://storage.assistant-api.com/attachments/0204c5a7-cd09-470c-9488-96cf0be9db92.pdf",
269
- );
270
- });
271
-
272
- /**
273
- * Tests generation with different file types
274
- */
275
- it("should successfully generate presigned upload URL for different file types", async () => {
276
- const mockResponse = {
277
- success: true,
278
- signedUrl:
279
- "https://aui-cloud-attachments.5c52327048f352f85fb041947c406ab4.r2.cloudflarestorage.com/attachments/test-image.png",
280
- expiresAt: "2025-06-06T05:33:13.322Z",
281
- publicUrl:
282
- "https://storage.assistant-api.com/attachments/test-image.png",
283
- };
284
-
285
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
286
-
287
- const requestBody = {
288
- filename: "test-image.png",
289
- };
290
-
291
- const result = await cloudFiles.generatePresignedUploadUrl(requestBody);
292
-
293
- expect(mockApi.makeRequest).toHaveBeenCalledWith(
294
- "/files/attachments/generate-presigned-upload-url",
295
- {
296
- method: "POST",
297
- body: requestBody,
298
- },
299
- );
300
-
301
- expect(result).toEqual(mockResponse);
302
- expect(result.success).toBe(true);
303
- expect(result.publicUrl).toContain("test-image.png");
304
- });
305
-
306
- /**
307
- * Tests API error handling
308
- */
309
- it("should handle API errors gracefully", async () => {
310
- const errorMessage = "Invalid filename";
311
- vi.mocked(mockApi.makeRequest).mockRejectedValue(new Error(errorMessage));
312
-
313
- const requestBody = {
314
- filename: "",
315
- };
316
-
317
- await expect(
318
- cloudFiles.generatePresignedUploadUrl(requestBody),
319
- ).rejects.toThrow(errorMessage);
320
-
321
- expect(mockApi.makeRequest).toHaveBeenCalledWith(
322
- "/files/attachments/generate-presigned-upload-url",
323
- {
324
- method: "POST",
325
- body: requestBody,
326
- },
327
- );
328
- });
329
-
330
- /**
331
- * Tests handling of failed response
332
- */
333
- it("should handle failed upload URL generation response", async () => {
334
- const mockResponse = {
335
- success: false,
336
- signedUrl: "",
337
- expiresAt: "",
338
- publicUrl: "",
339
- };
340
-
341
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
342
-
343
- const requestBody = {
344
- filename: "invalid-file-type.exe",
345
- };
346
-
347
- const result = await cloudFiles.generatePresignedUploadUrl(requestBody);
348
-
349
- expect(result.success).toBe(false);
350
- expect(result.signedUrl).toBe("");
351
- expect(result.publicUrl).toBe("");
352
- });
353
-
354
- /**
355
- * Tests that the method sends the correct request headers and structure
356
- */
357
- it("should make request to correct endpoint with proper structure", async () => {
358
- const mockResponse = {
359
- success: true,
360
- signedUrl: "https://example.com/signed-url",
361
- expiresAt: "2025-06-06T05:33:13.322Z",
362
- publicUrl: "https://example.com/public-url",
363
- };
364
-
365
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
366
-
367
- const requestBody = {
368
- filename: "document.pdf",
369
- };
370
-
371
- await cloudFiles.generatePresignedUploadUrl(requestBody);
372
-
373
- // Verify the endpoint and method are correct
374
- expect(mockApi.makeRequest).toHaveBeenCalledWith(
375
- "/files/attachments/generate-presigned-upload-url",
376
- {
377
- method: "POST",
378
- body: requestBody,
379
- },
380
- );
381
-
382
- // Verify it was called exactly once
383
- expect(mockApi.makeRequest).toHaveBeenCalledTimes(1);
384
- });
385
-
386
- /**
387
- * Tests filename validation scenarios
388
- */
389
- it("should handle various filename formats", async () => {
390
- const mockResponse = {
391
- success: true,
392
- signedUrl: "https://example.com/signed-url",
393
- expiresAt: "2025-06-06T05:33:13.322Z",
394
- publicUrl: "https://example.com/public-url",
395
- };
396
-
397
- vi.mocked(mockApi.makeRequest).mockResolvedValue(mockResponse);
398
-
399
- // Test with filename containing spaces and special characters
400
- const requestBody = {
401
- filename: "my document (final version).pdf",
402
- };
403
-
404
- const result = await cloudFiles.generatePresignedUploadUrl(requestBody);
405
-
406
- expect(mockApi.makeRequest).toHaveBeenCalledWith(
407
- "/files/attachments/generate-presigned-upload-url",
408
- {
409
- method: "POST",
410
- body: requestBody,
411
- },
412
- );
413
-
414
- expect(result).toEqual(mockResponse);
415
- });
416
- });
417
-
418
- // Integration test that actually calls the real API
419
- describe("Integration Tests", () => {
420
- /**
421
- * Integration test that actually calls the real API endpoint
422
- * This test requires real API credentials to be set in environment variables:
423
- * - AUI_API_KEY: Your API key (e.g., sk_aui_proj_...)
424
- * - AUI_USER_ID: Your user ID
425
- * - AUI_WORKSPACE_ID: Your workspace ID
426
- */
427
- it.skipIf(
428
- !process.env.AUI_API_KEY ||
429
- !process.env.AUI_USER_ID ||
430
- !process.env.AUI_WORKSPACE_ID,
431
- )(
432
- "should actually convert PDF to images using real API",
433
- async () => {
434
- // Unmock all modules for this test to use real implementations
435
- vi.doUnmock("../AssistantCloudAPI");
436
- vi.doUnmock("../AssistantCloudFiles");
437
- vi.doUnmock("../AssistantCloud");
438
-
439
- // Clear all mocks and reload modules
440
- vi.resetModules();
441
-
442
- // Import real modules
443
- const { AssistantCloud: RealAssistantCloud } =
444
- await import("../AssistantCloud");
445
-
446
- const realCloud = new RealAssistantCloud({
447
- apiKey: process.env.AUI_API_KEY!,
448
- userId: process.env.AUI_USER_ID!,
449
- workspaceId: process.env.AUI_WORKSPACE_ID!,
450
- });
451
-
452
- const requestBody = {
453
- file_url: "https://files.testfile.org/PDF/10MB-TESTFILE.ORG.pdf",
454
- };
455
-
456
- console.log("Making API call to convert PDF...");
457
- const result = await realCloud.files.pdfToImages(requestBody);
458
- console.log("API call result:", result);
459
-
460
- // Verify the response structure
461
- expect(result).toHaveProperty("success");
462
- expect(result).toHaveProperty("urls");
463
- expect(result).toHaveProperty("message");
464
-
465
- if (result.success) {
466
- expect(Array.isArray(result.urls)).toBe(true);
467
- expect(result.urls.length).toBeGreaterThan(0);
468
- expect(typeof result.message).toBe("string");
469
-
470
- // Verify URLs are valid image URLs
471
- result.urls.forEach((url) => {
472
- expect(url).toMatch(/^https:\/\/.+\.(png|jpg|jpeg)(\?.*)?$/i);
473
- });
474
- } else {
475
- // If it fails, at least verify the error message is a string
476
- expect(typeof result.message).toBe("string");
477
- console.log("API call failed:", result.message);
478
- }
479
-
480
- // Restore mocks after the test
481
- vi.doMock("../AssistantCloudAPI");
482
- },
483
- 60000, // 60 second timeout for real API calls
484
- );
485
-
486
- /**
487
- * Integration test for generatePresignedUploadUrl that actually calls the real API endpoint
488
- * This test requires real API credentials to be set in environment variables:
489
- * - AUI_API_KEY: Your API key (e.g., sk_aui_proj_...)
490
- * - AUI_USER_ID: Your user ID
491
- * - AUI_WORKSPACE_ID: Your workspace ID
492
- */
493
- it.skipIf(
494
- !process.env.AUI_API_KEY ||
495
- !process.env.AUI_USER_ID ||
496
- !process.env.AUI_WORKSPACE_ID,
497
- )(
498
- "should actually generate presigned upload URL using real API",
499
- async () => {
500
- // Unmock all modules for this test to use real implementations
501
- vi.doUnmock("../AssistantCloudAPI");
502
- vi.doUnmock("../AssistantCloudFiles");
503
- vi.doUnmock("../AssistantCloud");
504
-
505
- // Clear all mocks and reload modules
506
- vi.resetModules();
507
-
508
- // Import real modules
509
- const { AssistantCloud: RealAssistantCloud } =
510
- await import("../AssistantCloud");
511
-
512
- const realCloud = new RealAssistantCloud({
513
- apiKey: process.env.AUI_API_KEY!,
514
- userId: process.env.AUI_USER_ID!,
515
- workspaceId: process.env.AUI_WORKSPACE_ID!,
516
- });
517
-
518
- const requestBody = {
519
- filename: "test-upload.pdf",
520
- };
521
-
522
- console.log("Making API call to generate presigned upload URL...");
523
- const result =
524
- await realCloud.files.generatePresignedUploadUrl(requestBody);
525
- console.log("API call result:", result);
526
-
527
- // Verify the response structure
528
- expect(result).toHaveProperty("success");
529
- expect(result).toHaveProperty("signedUrl");
530
- expect(result).toHaveProperty("expiresAt");
531
- expect(result).toHaveProperty("publicUrl");
532
-
533
- if (result.success) {
534
- expect(typeof result.signedUrl).toBe("string");
535
- expect(typeof result.expiresAt).toBe("string");
536
- expect(typeof result.publicUrl).toBe("string");
537
- expect(result.signedUrl.length).toBeGreaterThan(0);
538
- expect(result.publicUrl.length).toBeGreaterThan(0);
539
-
540
- // Verify URLs are valid HTTPS URLs
541
- expect(result.signedUrl).toMatch(/^https:\/\/.+/);
542
- expect(result.publicUrl).toMatch(/^https:\/\/.+/);
543
-
544
- // Verify the signed URL contains expected AWS signature parameters
545
- expect(result.signedUrl).toContain("X-Amz-Algorithm");
546
- expect(result.signedUrl).toContain("X-Amz-Signature");
547
-
548
- // Verify expiresAt is a valid ISO date string
549
- expect(() => new Date(result.expiresAt)).not.toThrow();
550
- } else {
551
- console.log(
552
- "API call failed - this may be expected for some test cases",
553
- );
554
- }
555
-
556
- // Restore mocks after the test
557
- vi.doMock("../AssistantCloudAPI");
558
- },
559
- 30000, // 30 second timeout for real API calls
560
- );
561
- });
562
- });