@amaster.ai/client 1.1.52-beta.0 → 1.1.52-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -14,7 +14,7 @@ var httpClient = require('@amaster.ai/http-client');
14
14
  // src/client.ts
15
15
 
16
16
  // src/knowledge.ts
17
- var WORKFLOW_CONSOLE_BASE = "/api/workflow-console/v2";
17
+ var KNOWLEDGE_OPENAPI_BASE = "/api/knowledge/v1";
18
18
  var DEFAULT_WAIT_INTERVAL_MS = 2500;
19
19
  var DEFAULT_WAIT_TIMEOUT_MS = 12e4;
20
20
  var TERMINAL_INDEXING_STATUSES = /* @__PURE__ */ new Set(["completed", "error", "paused", "stopped"]);
@@ -33,6 +33,27 @@ function normalizeAppHeaderValue(value) {
33
33
  const normalized = value?.trim();
34
34
  return normalized || void 0;
35
35
  }
36
+ function normalizeOptionalString(value) {
37
+ const normalized = value?.trim();
38
+ return normalized || void 0;
39
+ }
40
+ function getWorkspaceIdFromOptions(options) {
41
+ return normalizeOptionalString(options.workspaceId) || normalizeOptionalString(options.tenantId);
42
+ }
43
+ function getWorkspaceIdFromDatasetResponse(response) {
44
+ return normalizeOptionalString(response?.workspace_id) || normalizeOptionalString(response?.tenant_id);
45
+ }
46
+ function normalizeDatasetIdResponse(response) {
47
+ const datasetId = normalizeOptionalString(response?.dataset_id);
48
+ if (!datasetId) {
49
+ return null;
50
+ }
51
+ const workspaceId = getWorkspaceIdFromDatasetResponse(response);
52
+ return {
53
+ dataset_id: datasetId,
54
+ ...workspaceId ? { tenant_id: workspaceId, workspace_id: workspaceId } : {}
55
+ };
56
+ }
36
57
  function normalizeRolesHeaderValue(roles) {
37
58
  if (!roles) {
38
59
  return void 0;
@@ -47,12 +68,16 @@ function buildKnowledgeHeaders(options) {
47
68
  const headers = {};
48
69
  const appCode = normalizeAppHeaderValue(options.appCode);
49
70
  const roles = normalizeRolesHeaderValue(options.roles);
71
+ const workspaceId = normalizeOptionalString(options.workspaceId);
50
72
  if (appCode) {
51
73
  headers["X-App-Code"] = appCode;
52
74
  }
53
75
  if (roles) {
54
76
  headers["X-App-User-Roles"] = roles;
55
77
  }
78
+ if (workspaceId) {
79
+ headers["X-WORKSPACE-ID"] = workspaceId;
80
+ }
56
81
  return Object.keys(headers).length > 0 ? headers : void 0;
57
82
  }
58
83
  function resolveUploadFilename(file, fileName) {
@@ -90,32 +115,63 @@ function createKnowledgeClient(http) {
90
115
  if (!orgCode) {
91
116
  return createErrorResult("orgCode is required to resolve datasetId", 400);
92
117
  }
93
- const cachedDatasetId = datasetIdCache.get(orgCode);
94
- if (cachedDatasetId && !options.refresh) {
118
+ const cachedDataset = datasetIdCache.get(orgCode);
119
+ if (cachedDataset && !options.refresh) {
95
120
  return {
96
- data: { dataset_id: cachedDatasetId },
121
+ data: cachedDataset,
97
122
  error: null,
98
123
  status: 200
99
124
  };
100
125
  }
101
126
  const result = await http.request({
102
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/current-id`,
127
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/current-id`,
103
128
  method: "get",
104
129
  params: {
105
130
  org_code: orgCode
106
131
  }
107
132
  });
108
- if (result.data?.dataset_id) {
109
- datasetIdCache.set(orgCode, result.data.dataset_id);
133
+ const normalizedData = normalizeDatasetIdResponse(result.data);
134
+ if (normalizedData) {
135
+ datasetIdCache.set(orgCode, normalizedData);
136
+ result.data = normalizedData;
110
137
  } else {
111
138
  datasetIdCache.delete(orgCode);
112
139
  }
113
140
  return result;
114
141
  }
115
- async function resolveDatasetId(options) {
142
+ async function resolveDataset(options) {
143
+ const workspaceId = getWorkspaceIdFromOptions(options);
116
144
  if (options.datasetId?.trim()) {
145
+ if (!workspaceId && options.orgCode?.trim()) {
146
+ const result2 = await getDatasetId({
147
+ orgCode: options.orgCode,
148
+ refresh: options.refresh
149
+ });
150
+ if (!result2.data?.dataset_id) {
151
+ return {
152
+ data: null,
153
+ error: result2.error || {
154
+ message: "Failed to resolve dataset workspace",
155
+ status: result2.status
156
+ },
157
+ status: result2.status
158
+ };
159
+ }
160
+ return {
161
+ data: {
162
+ datasetId: options.datasetId.trim(),
163
+ workspaceId: getWorkspaceIdFromDatasetResponse(result2.data)
164
+ },
165
+ error: null,
166
+ status: result2.status,
167
+ headers: result2.headers
168
+ };
169
+ }
117
170
  return {
118
- data: options.datasetId.trim(),
171
+ data: {
172
+ datasetId: options.datasetId.trim(),
173
+ workspaceId
174
+ },
119
175
  error: null,
120
176
  status: 200
121
177
  };
@@ -138,54 +194,61 @@ function createKnowledgeClient(http) {
138
194
  };
139
195
  }
140
196
  return {
141
- data: result.data.dataset_id,
197
+ data: {
198
+ datasetId: result.data.dataset_id,
199
+ workspaceId: getWorkspaceIdFromDatasetResponse(result.data)
200
+ },
142
201
  error: null,
143
202
  status: result.status,
144
203
  headers: result.headers
145
204
  };
146
205
  }
147
- function invalidateCacheOnNotFound(options, status) {
148
- if (status !== 404 || options.datasetId || !options.orgCode?.trim()) {
206
+ function invalidateCacheOnDatasetAccessError(options, status) {
207
+ if (status !== 403 && status !== 404 || options.datasetId || !options.orgCode?.trim()) {
149
208
  return;
150
209
  }
151
210
  datasetIdCache.delete(options.orgCode.trim());
152
211
  }
153
212
  async function getIndexingStatus(options) {
154
- const datasetId = await resolveDatasetId(options);
155
- if (!datasetId.data) {
213
+ const resolvedDataset = await resolveDataset(options);
214
+ if (!resolvedDataset.data) {
156
215
  return createErrorResult(
157
- datasetId.error?.message || "Failed to resolve datasetId",
158
- datasetId.status,
159
- datasetId.error?.details
216
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
217
+ resolvedDataset.status,
218
+ resolvedDataset.error?.details
160
219
  );
161
220
  }
162
221
  const result = await http.request({
163
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(
164
- datasetId.data
222
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(
223
+ resolvedDataset.data.datasetId
165
224
  )}/batch/${encodeURIComponent(options.batch)}/indexing-status`,
166
- method: "get"
225
+ method: "get",
226
+ headers: buildKnowledgeHeaders({
227
+ workspaceId: resolvedDataset.data.workspaceId
228
+ })
167
229
  });
168
- invalidateCacheOnNotFound(options, result.status);
230
+ invalidateCacheOnDatasetAccessError(options, result.status);
169
231
  return result;
170
232
  }
171
233
  return {
172
234
  getDatasetId,
173
235
  async listDocuments(options) {
174
- const datasetId = await resolveDatasetId(options);
175
- if (!datasetId.data) {
236
+ const resolvedDataset = await resolveDataset(options);
237
+ if (!resolvedDataset.data) {
176
238
  return createErrorResult(
177
- datasetId.error?.message || "Failed to resolve datasetId",
178
- datasetId.status,
179
- datasetId.error?.details
239
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
240
+ resolvedDataset.status,
241
+ resolvedDataset.error?.details
180
242
  );
181
243
  }
182
244
  const useMetadataFilter = !!(options.appCode || options.roles);
183
245
  const result = await http.request({
184
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents${useMetadataFilter ? "/v2" : ""}`,
246
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents${useMetadataFilter ? "/v2" : ""}`,
185
247
  method: "get",
186
248
  headers: buildKnowledgeHeaders({
187
249
  appCode: options.appCode,
188
- roles: options.roles
250
+ roles: options.roles,
251
+ workspaceId: resolvedDataset.data.workspaceId
189
252
  }),
190
253
  params: {
191
254
  page: options.page,
@@ -196,16 +259,16 @@ function createKnowledgeClient(http) {
196
259
  fetch: options.fetch === void 0 ? void 0 : String(options.fetch)
197
260
  }
198
261
  });
199
- invalidateCacheOnNotFound(options, result.status);
262
+ invalidateCacheOnDatasetAccessError(options, result.status);
200
263
  return result;
201
264
  },
202
265
  async uploadDocument(options) {
203
- const datasetId = await resolveDatasetId(options);
204
- if (!datasetId.data) {
266
+ const resolvedDataset = await resolveDataset(options);
267
+ if (!resolvedDataset.data) {
205
268
  return createErrorResult(
206
- datasetId.error?.message || "Failed to resolve datasetId",
207
- datasetId.status,
208
- datasetId.error?.details
269
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
270
+ resolvedDataset.status,
271
+ resolvedDataset.error?.details
209
272
  );
210
273
  }
211
274
  const formData = new FormData();
@@ -214,14 +277,15 @@ function createKnowledgeClient(http) {
214
277
  formData.append("data", JSON.stringify(options.config));
215
278
  }
216
279
  const result = await http.request({
217
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/upload`,
280
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/upload`,
218
281
  method: "post",
219
282
  headers: buildKnowledgeHeaders({
220
- appCode: options.appCode
283
+ appCode: options.appCode,
284
+ workspaceId: resolvedDataset.data.workspaceId
221
285
  }),
222
286
  data: formData
223
287
  });
224
- invalidateCacheOnNotFound(options, result.status);
288
+ invalidateCacheOnDatasetAccessError(options, result.status);
225
289
  return result;
226
290
  },
227
291
  getIndexingStatus,
@@ -247,46 +311,48 @@ function createKnowledgeClient(http) {
247
311
  );
248
312
  },
249
313
  async deleteDocument(options) {
250
- const datasetId = await resolveDatasetId(options);
251
- if (!datasetId.data) {
314
+ const resolvedDataset = await resolveDataset(options);
315
+ if (!resolvedDataset.data) {
252
316
  return createErrorResult(
253
- datasetId.error?.message || "Failed to resolve datasetId",
254
- datasetId.status,
255
- datasetId.error?.details
317
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
318
+ resolvedDataset.status,
319
+ resolvedDataset.error?.details
256
320
  );
257
321
  }
258
322
  const result = await http.request({
259
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(
260
- datasetId.data
323
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(
324
+ resolvedDataset.data.datasetId
261
325
  )}/documents/${encodeURIComponent(options.documentId)}`,
262
326
  method: "delete",
263
327
  headers: buildKnowledgeHeaders({
264
- appCode: options.appCode
328
+ appCode: options.appCode,
329
+ workspaceId: resolvedDataset.data.workspaceId
265
330
  })
266
331
  });
267
- invalidateCacheOnNotFound(options, result.status);
332
+ invalidateCacheOnDatasetAccessError(options, result.status);
268
333
  return result;
269
334
  },
270
335
  async updateDocumentsMetadata(options) {
271
- const datasetId = await resolveDatasetId(options);
272
- if (!datasetId.data) {
336
+ const resolvedDataset = await resolveDataset(options);
337
+ if (!resolvedDataset.data) {
273
338
  return createErrorResult(
274
- datasetId.error?.message || "Failed to resolve datasetId",
275
- datasetId.status,
276
- datasetId.error?.details
339
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
340
+ resolvedDataset.status,
341
+ resolvedDataset.error?.details
277
342
  );
278
343
  }
279
344
  const result = await http.request({
280
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/metadata`,
345
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/metadata`,
281
346
  method: "post",
282
347
  headers: {
283
- "Content-Type": "application/json"
348
+ "Content-Type": "application/json",
349
+ ...resolvedDataset.data.workspaceId ? { "X-WORKSPACE-ID": resolvedDataset.data.workspaceId } : {}
284
350
  },
285
351
  data: {
286
352
  operation_data: options.operation_data
287
353
  }
288
354
  });
289
- invalidateCacheOnNotFound(options, result.status);
355
+ invalidateCacheOnDatasetAccessError(options, result.status);
290
356
  return result;
291
357
  }
292
358
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/knowledge.ts","../src/client.ts"],"names":["createHttpClient","createAuthClient","createEntityClient","createBpmClient","createWorkflowClient","functionClient","createFunctionClient","createCopilotClient","createS3Client","createASRClient","createASRHttpClient","createTTSClient"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClientResult, type HttpClient } from \"@amaster.ai/http-client\";\n\nconst WORKFLOW_CONSOLE_BASE = \"/api/workflow-console/v2\";\nconst DEFAULT_WAIT_INTERVAL_MS = 2500;\nconst DEFAULT_WAIT_TIMEOUT_MS = 120000;\nconst TERMINAL_INDEXING_STATUSES = new Set([\"completed\", \"error\", \"paused\", \"stopped\"]);\n\nexport type KnowledgeDocumentStatus = \"completed\" | \"indexing\" | \"error\" | \"paused\";\nexport type KnowledgeDocumentListStatus = KnowledgeDocumentStatus | \"all\";\nexport type KnowledgeRoles = string | string[];\n\nexport type KnowledgeDatasetIdResponse = {\n dataset_id: string;\n};\n\nexport type KnowledgeDocument = {\n id: string;\n name: string;\n data_source_type?: string;\n doc_type?: string | null;\n doc_form?: string | null;\n indexing_status?: string;\n display_status?: string;\n enabled?: boolean;\n archived?: boolean;\n word_count?: number;\n hit_count?: number;\n position?: number;\n created_at?: number;\n updated_at?: number;\n completed_segments?: number;\n total_segments?: number;\n [key: string]: unknown;\n};\n\nexport type KnowledgeDocumentListResponse = {\n data: KnowledgeDocument[];\n total: number;\n page: number;\n limit: number;\n has_more: boolean;\n};\n\nexport type KnowledgeIndexingStatus = {\n id: string;\n name?: string;\n indexing_status?: string;\n processing_started_at?: number | null;\n parsing_completed_at?: number | null;\n cleaning_completed_at?: number | null;\n splitting_completed_at?: number | null;\n completed_at?: number | null;\n paused_at?: number | null;\n stopped_at?: number | null;\n completed_segments?: number;\n total_segments?: number;\n error?: string | null;\n [key: string]: unknown;\n};\n\nexport type KnowledgeIndexingStatusResponse = {\n data: KnowledgeIndexingStatus[];\n};\n\nexport type KnowledgeUploadResponse = {\n document: KnowledgeDocument;\n batch: string;\n};\n\nexport type KnowledgeMetadataField = {\n id: string;\n name: string;\n type?: \"string\" | \"number\" | \"time\" | string;\n value: unknown;\n};\n\nexport type KnowledgeMetadataOperation = {\n document_id: string;\n metadata_list: KnowledgeMetadataField[];\n partial_update?: boolean;\n};\n\nexport type KnowledgeMetadataUpdateRequest = {\n operation_data: KnowledgeMetadataOperation[];\n};\n\nexport type KnowledgeResolveOptions =\n | {\n datasetId: string;\n orgCode?: string;\n refresh?: boolean;\n }\n | {\n datasetId?: string;\n orgCode: string;\n refresh?: boolean;\n };\n\nexport type KnowledgeGetDatasetIdOptions = {\n orgCode: string;\n refresh?: boolean;\n};\n\nexport type KnowledgeListDocumentsOptions = KnowledgeResolveOptions & {\n page?: number;\n limit?: number;\n keyword?: string;\n status?: KnowledgeDocumentListStatus;\n sort?: string;\n fetch?: boolean | string;\n appCode?: string;\n roles?: KnowledgeRoles;\n};\n\nexport type KnowledgeUploadDocumentOptions = KnowledgeResolveOptions & {\n file: File | Blob;\n fileName?: string;\n appCode?: string;\n config?: Record<string, unknown>;\n};\n\nexport type KnowledgeIndexingStatusOptions = KnowledgeResolveOptions & {\n batch: string;\n};\n\nexport type KnowledgeWaitForIndexingOptions = KnowledgeIndexingStatusOptions & {\n intervalMs?: number;\n timeoutMs?: number;\n};\n\nexport type KnowledgeDeleteDocumentOptions = KnowledgeResolveOptions & {\n documentId: string;\n appCode?: string;\n};\n\nexport type KnowledgeUpdateDocumentsMetadataOptions = KnowledgeResolveOptions &\n KnowledgeMetadataUpdateRequest;\n\nexport type KnowledgeClient = {\n getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>>;\n listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>>;\n uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>>;\n getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>>;\n updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>>;\n};\n\nfunction createErrorResult<T>(\n message: string,\n status: number,\n details?: unknown\n): ClientResult<T> {\n return {\n data: null,\n error: {\n message,\n status,\n details,\n },\n status,\n };\n}\n\nfunction normalizeAppHeaderValue(value?: string): string | undefined {\n const normalized = value?.trim();\n return normalized || undefined;\n}\n\nfunction normalizeRolesHeaderValue(roles?: KnowledgeRoles): string | undefined {\n if (!roles) {\n return undefined;\n }\n if (Array.isArray(roles)) {\n return JSON.stringify(roles);\n }\n const normalized = roles.trim();\n return normalized || undefined;\n}\n\nfunction buildKnowledgeHeaders(options: {\n appCode?: string;\n roles?: KnowledgeRoles;\n}): Record<string, string> | undefined {\n const headers: Record<string, string> = {};\n const appCode = normalizeAppHeaderValue(options.appCode);\n const roles = normalizeRolesHeaderValue(options.roles);\n\n if (appCode) {\n headers[\"X-App-Code\"] = appCode;\n }\n if (roles) {\n headers[\"X-App-User-Roles\"] = roles;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveUploadFilename(file: File | Blob, fileName?: string): string | undefined {\n const normalized = fileName?.trim();\n if (normalized) {\n return normalized;\n }\n if (\"name\" in file && typeof file.name === \"string\" && file.name.trim()) {\n return file.name.trim();\n }\n return undefined;\n}\n\nfunction appendUploadFile(formData: FormData, file: File | Blob, fileName?: string): void {\n const resolvedFileName = resolveUploadFilename(file, fileName);\n if (resolvedFileName) {\n formData.append(\"file\", file, resolvedFileName);\n return;\n }\n formData.append(\"file\", file);\n}\n\nfunction isTerminalIndexingStatus(status?: string): boolean {\n return TERMINAL_INDEXING_STATUSES.has(String(status || \"\").toLowerCase());\n}\n\nfunction isIndexingStatusDone(response: KnowledgeIndexingStatusResponse | null): boolean {\n const statuses = response?.data || [];\n return statuses.length > 0 && statuses.every((item) => isTerminalIndexingStatus(item.indexing_status));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createKnowledgeClient(http: HttpClient): KnowledgeClient {\n const datasetIdCache = new Map<string, string>();\n\n async function getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>> {\n const orgCode = options.orgCode?.trim();\n if (!orgCode) {\n return createErrorResult(\"orgCode is required to resolve datasetId\", 400);\n }\n\n const cachedDatasetId = datasetIdCache.get(orgCode);\n if (cachedDatasetId && !options.refresh) {\n return {\n data: { dataset_id: cachedDatasetId },\n error: null,\n status: 200,\n };\n }\n\n const result = await http.request<KnowledgeDatasetIdResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/current-id`,\n method: \"get\",\n params: {\n org_code: orgCode,\n },\n });\n\n if (result.data?.dataset_id) {\n datasetIdCache.set(orgCode, result.data.dataset_id);\n } else {\n datasetIdCache.delete(orgCode);\n }\n\n return result;\n }\n\n async function resolveDatasetId(\n options: KnowledgeResolveOptions\n ): Promise<ClientResult<string>> {\n if (options.datasetId?.trim()) {\n return {\n data: options.datasetId.trim(),\n error: null,\n status: 200,\n };\n }\n\n if (!options.orgCode?.trim()) {\n return createErrorResult(\"Either datasetId or orgCode is required\", 400);\n }\n\n const result = await getDatasetId({\n orgCode: options.orgCode,\n refresh: options.refresh,\n });\n\n if (!result.data?.dataset_id) {\n return {\n data: null,\n error:\n result.error ||\n {\n message: \"Failed to resolve datasetId\",\n status: result.status,\n },\n status: result.status,\n };\n }\n\n return {\n data: result.data.dataset_id,\n error: null,\n status: result.status,\n headers: result.headers,\n };\n }\n\n function invalidateCacheOnNotFound(options: KnowledgeResolveOptions, status: number): void {\n if (status !== 404 || options.datasetId || !options.orgCode?.trim()) {\n return;\n }\n datasetIdCache.delete(options.orgCode.trim());\n }\n\n async function getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const result = await http.request<KnowledgeIndexingStatusResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(\n datasetId.data\n )}/batch/${encodeURIComponent(options.batch)}/indexing-status`,\n method: \"get\",\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n }\n\n return {\n getDatasetId,\n\n async listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const useMetadataFilter = !!(options.appCode || options.roles);\n const result = await http.request<KnowledgeDocumentListResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents${\n useMetadataFilter ? \"/v2\" : \"\"\n }`,\n method: \"get\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n roles: options.roles,\n }),\n params: {\n page: options.page,\n limit: options.limit,\n keyword: options.keyword,\n status: options.status === \"all\" ? undefined : options.status,\n sort: options.sort,\n fetch: options.fetch === undefined ? undefined : String(options.fetch),\n },\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n\n async uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const formData = new FormData();\n appendUploadFile(formData, options.file, options.fileName);\n\n if (options.config !== undefined) {\n formData.append(\"data\", JSON.stringify(options.config));\n }\n\n const result = await http.request<KnowledgeUploadResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/upload`,\n method: \"post\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n }),\n data: formData,\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n\n getIndexingStatus,\n\n async waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const startedAt = Date.now();\n const intervalMs = Math.max(1, options.intervalMs ?? DEFAULT_WAIT_INTERVAL_MS);\n const timeoutMs = Math.max(intervalMs, options.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS);\n let lastResult: ClientResult<KnowledgeIndexingStatusResponse> | null = null;\n\n while (Date.now() - startedAt <= timeoutMs) {\n lastResult = await getIndexingStatus(options);\n\n if (lastResult.error) {\n return lastResult;\n }\n\n if (isIndexingStatusDone(lastResult.data)) {\n return lastResult;\n }\n\n await sleep(intervalMs);\n }\n\n return createErrorResult(\n \"Timed out waiting for document indexing to finish\",\n 408,\n lastResult?.data\n );\n },\n\n async deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const result = await http.request<null>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(\n datasetId.data\n )}/documents/${encodeURIComponent(options.documentId)}`,\n method: \"delete\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n }),\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n\n async updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const result = await http.request<{ result: string }>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/metadata`,\n method: \"post\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n data: {\n operation_data: options.operation_data,\n },\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n };\n}\n","/**\n * ============================================================================\n * @amaster.ai/client - Unified Amaster Client\n * ============================================================================\n *\n * Supabase-inspired unified API client for the Amaster platform\n *\n * Features:\n * - Single client instance for all services (auth, entity, bpm, workflow)\n * - Automatic token management and refresh\n * - Auto-attach authentication to all requests\n * - Centralized error handling\n *\n * @example\n * ```typescript\n * const client = createClient({\n * onUnauthorized: () => window.location.href = '/login'\n * });\n *\n * // Login\n * await client.auth.login({ email, password });\n *\n * // All subsequent requests automatically include auth token\n * await client.entity.list('default', 'users');\n * await client.bpm.startProcess('approval', { amount: 1000 });\n * await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\n\nimport { createAuthClient, type AuthClient } from \"@amaster.ai/auth-client\";\nimport { createEntityClient, type EntityClient } from \"@amaster.ai/entity-client\";\nimport { createBpmClient, type BpmClient } from \"@amaster.ai/bpm-client\";\nimport { createWorkflowClient, type WorkflowClient } from \"@amaster.ai/workflow-client\";\nimport {\n createASRClient,\n createASRHttpClient,\n type ASRClientConfig,\n type ASRClient,\n type ASRHttpClientConfig,\n type ASRHttpClient,\n} from \"@amaster.ai/asr-client\";\nimport { createCopilotClient, type CopilotClient } from \"@amaster.ai/copilot-client\";\nimport { createFunctionClient, type FunctionClient } from \"@amaster.ai/function-client\";\nimport { createTTSClient, TTSClientConfig, type TTSClient } from \"@amaster.ai/tts-client\";\nimport { createS3Client, type S3Client } from \"@amaster.ai/s3-client\";\nimport {\n createHttpClient,\n type HttpClient,\n type RequestConfig,\n type ClientResult,\n} from \"@amaster.ai/http-client\";\nimport { createKnowledgeClient, type KnowledgeClient } from \"./knowledge\";\nimport type { AmasterClient, AmasterClientOptions } from \"./types\";\n\n/**\n * Create a unified Amaster client instance\n *\n * This function creates a single client that provides access to all Amaster services:\n * - Authentication (login, register, logout)\n * - Entity CRUD operations\n * - BPM (Business Process Management)\n * - Workflow execution\n *\n * All sub-clients automatically share the same HTTP client and authentication state,\n * ensuring that tokens are consistently attached to all requests.\n *\n * @param options - Client configuration options\n * @returns A unified Amaster client instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const client = createClient();\n *\n * // With authentication callbacks\n * const client = createClient({\n * onUnauthorized: () => {\n * // Redirect to login or show auth modal\n * window.location.href = '/login';\n * },\n * onTokenExpired: () => {\n * console.log('Token expired, refreshing...');\n * }\n * });\n *\n * // Login\n * await client.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Now all requests automatically include the auth token\n * const users = await client.entity.list('default', 'users');\n * const tasks = await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\nexport function createClient(options: AmasterClientOptions = {}): AmasterClient {\n const {\n baseURL,\n env = \"dev\",\n headers = {},\n onUnauthorized,\n onTokenExpired,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n } = options;\n\n // Create the base HTTP client\n const baseHttpClient = createHttpClient({\n baseURL,\n headers,\n runtime,\n });\n\n // Create the auth client first using the same base HTTP implementation so\n // mini-program request handling stays consistent across all modules.\n const auth: AuthClient = createAuthClient({\n baseURL,\n headers,\n onTokenExpired,\n onUnauthorized,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n });\n\n // Create a wrapper HTTP client that automatically adds the auth token\n const createAuthenticatedHttpClient = (): HttpClient => {\n // Track if we're currently refreshing to avoid multiple simultaneous refreshes\n let isRefreshing = false;\n let refreshPromise: Promise<boolean> | null = null;\n\n /**\n * Check if 401 error is due to token expiration\n * Traefik JWT plugin returns plain text like \"Jwt is expired\" or \"Token is expired\"\n */\n function isTokenExpired(result: ClientResult<unknown>): boolean {\n if (result.status !== 401) return false;\n\n // Check error message (could be from backend JSON response)\n if (result.error?.message && /expired/i.test(result.error.message)) {\n return true;\n }\n\n // Check error details (traefik returns plain text in details)\n if (result.error?.details) {\n const details = result.error.details;\n if (typeof details === \"string\" && /expired/i.test(details)) {\n return true;\n }\n // Also check if details is an object with message field\n if (typeof details === \"object\" && details !== null) {\n const detailsObj = details as Record<string, unknown>;\n if (typeof detailsObj.message === \"string\" && /expired/i.test(detailsObj.message)) {\n return true;\n }\n }\n }\n\n // Check raw data (could be plain text from traefik)\n if (typeof result.data === \"string\" && /expired/i.test(result.data)) {\n return true;\n }\n\n // If we have a token but got 401, assume it might be expired\n return !!auth.getAccessToken();\n }\n\n return {\n async request<T>(config: RequestConfig): Promise<ClientResult<T>> {\n // Get the current token from auth client\n const token = auth.getAccessToken();\n\n // Merge Authorization header with existing headers\n const authHeaders = token ? { Authorization: `Bearer ${token}` } : {};\n const mergedConfig: RequestConfig = {\n ...config,\n headers: {\n ...config.headers,\n ...authHeaders,\n },\n };\n\n // Make the request with the updated config\n let result = await baseHttpClient.request<T>(mergedConfig);\n\n // Handle 401 errors with automatic token refresh\n if (result.status === 401 && isTokenExpired(result)) {\n // Attempt to refresh token\n if (!isRefreshing) {\n isRefreshing = true;\n refreshPromise = (async () => {\n try {\n const refreshResult = await auth.refreshToken();\n return !!refreshResult.data;\n } finally {\n isRefreshing = false;\n refreshPromise = null;\n }\n })();\n }\n\n const refreshed = await refreshPromise;\n\n if (refreshed) {\n // Retry with new token\n const newToken = auth.getAccessToken();\n result = await baseHttpClient.request<T>({\n ...config,\n headers: {\n ...config.headers,\n ...(newToken ? { Authorization: `Bearer ${newToken}` } : {}),\n },\n });\n }\n }\n\n // Trigger unauthorized if still 401\n if (result.status === 401 && onUnauthorized) {\n onUnauthorized();\n }\n\n return result;\n },\n };\n };\n\n const authenticatedHttpClient = createAuthenticatedHttpClient();\n\n let cachedUserUid: string | null = null;\n\n auth.on(\"login\", (user: { uid?: string }) => {\n cachedUserUid = user?.uid ?? null;\n });\n auth.on(\"logout\", () => {\n cachedUserUid = null;\n });\n\n if (auth.isAuthenticated()) {\n auth\n .getMe()\n .then((result) => {\n if (result.data?.uid) {\n cachedUserUid = result.data.uid;\n }\n })\n .catch(() => {});\n }\n\n // Create other clients using the authenticated HTTP client\n const entity: EntityClient = createEntityClient(authenticatedHttpClient);\n const bpm: BpmClient = createBpmClient(authenticatedHttpClient);\n const workflow: WorkflowClient = createWorkflowClient(authenticatedHttpClient, {\n env,\n });\n const functionClient: FunctionClient = createFunctionClient(authenticatedHttpClient);\n const knowledge: KnowledgeClient = createKnowledgeClient(authenticatedHttpClient);\n const copilot: CopilotClient = createCopilotClient(\n authenticatedHttpClient,\n baseURL,\n () => auth.getAccessToken(),\n () => cachedUserUid\n );\n const s3: S3Client = createS3Client(authenticatedHttpClient);\n\n // ASR and TTS clients use WebSocket, pass token getter for authentication\n // Token can be appended to WebSocket URL as query parameter\n const asr: (config: ASRClientConfig) => ASRClient = createASRClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n const asrHttp: (config: ASRHttpClientConfig) => ASRHttpClient = createASRHttpClient({\n getAccessToken: () => auth.getAccessToken(),\n http: authenticatedHttpClient,\n });\n const tts: (config: TTSClientConfig) => TTSClient = createTTSClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n\n // Return unified client interface\n const client: AmasterClient = {\n auth,\n entity,\n bpm,\n workflow,\n asr,\n asrHttp,\n copilot,\n function: functionClient,\n knowledge,\n tts,\n s3,\n http: authenticatedHttpClient,\n\n // Expose token management methods from auth client\n isAuthenticated: () => auth.isAuthenticated(),\n getAccessToken: () => auth.getAccessToken(),\n setAccessToken: (token: string) => auth.setAccessToken(token),\n clearAuth: () => auth.clearAuth(),\n };\n\n return client;\n}\n"]}
1
+ {"version":3,"sources":["../src/knowledge.ts","../src/client.ts"],"names":["result","createHttpClient","createAuthClient","createEntityClient","createBpmClient","createWorkflowClient","functionClient","createFunctionClient","createCopilotClient","createS3Client","createASRClient","createASRHttpClient","createTTSClient"],"mappings":";;;;;;;;;;;;;;;;AAEA,IAAM,sBAAA,GAAyB,mBAAA;AAC/B,IAAM,wBAAA,GAA2B,IAAA;AACjC,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,0BAAA,uBAAiC,GAAA,CAAI,CAAC,aAAa,OAAA,EAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AAiKtF,SAAS,iBAAA,CACP,OAAA,EACA,MAAA,EACA,OAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,wBAAwB,KAAA,EAAoC;AACnE,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,EAAK;AAC/B,EAAA,OAAO,UAAA,IAAc,MAAA;AACvB;AAEA,SAAS,wBAAwB,KAAA,EAAoC;AACnE,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,EAAK;AAC/B,EAAA,OAAO,UAAA,IAAc,MAAA;AACvB;AAEA,SAAS,0BAA0B,OAAA,EAGZ;AACrB,EAAA,OAAO,wBAAwB,OAAA,CAAQ,WAAW,CAAA,IAAK,uBAAA,CAAwB,QAAQ,QAAQ,CAAA;AACjG;AAEA,SAAS,kCACP,QAAA,EACoB;AACpB,EAAA,OAAO,wBAAwB,QAAA,EAAU,YAAY,CAAA,IAAK,uBAAA,CAAwB,UAAU,SAAS,CAAA;AACvG;AAEA,SAAS,2BACP,QAAA,EACmC;AACnC,EAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,QAAA,EAAU,UAAU,CAAA;AAC9D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,kCAAkC,QAAQ,CAAA;AAC9D,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,SAAA;AAAA,IACZ,GAAI,cAAc,EAAE,SAAA,EAAW,aAAa,YAAA,EAAc,WAAA,KAAgB;AAAC,GAC7E;AACF;AAEA,SAAS,0BAA0B,KAAA,EAA4C;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,OAAO,UAAA,IAAc,MAAA;AACvB;AAEA,SAAS,sBAAsB,OAAA,EAIQ;AACrC,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,OAAA,CAAQ,OAAO,CAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,yBAAA,CAA0B,OAAA,CAAQ,KAAK,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,OAAA,CAAQ,WAAW,CAAA;AAE/D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,OAAA;AAAA,EAC1B;AACA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,KAAA;AAAA,EAChC;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,gBAAgB,CAAA,GAAI,WAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AACrD;AAEA,SAAS,qBAAA,CAAsB,MAAmB,QAAA,EAAuC;AACvF,EAAA,MAAM,UAAA,GAAa,UAAU,IAAA,EAAK;AAClC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,IAAU,QAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,EAAG;AACvE,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,EAAK;AAAA,EACxB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,QAAA,EAAoB,IAAA,EAAmB,QAAA,EAAyB;AACxF,EAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,IAAA,EAAM,QAAQ,CAAA;AAC7D,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,gBAAgB,CAAA;AAC9C,IAAA;AAAA,EACF;AACA,EAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC9B;AAEA,SAAS,yBAAyB,MAAA,EAA0B;AAC1D,EAAA,OAAO,2BAA2B,GAAA,CAAI,MAAA,CAAO,UAAU,EAAE,CAAA,CAAE,aAAa,CAAA;AAC1E;AAEA,SAAS,qBAAqB,QAAA,EAA2D;AACvF,EAAA,MAAM,QAAA,GAAW,QAAA,EAAU,IAAA,IAAQ,EAAC;AACpC,EAAA,OAAO,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,KAAS,wBAAA,CAAyB,IAAA,CAAK,eAAe,CAAC,CAAA;AACvG;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEO,SAAS,sBAAsB,IAAA,EAAmC;AACvE,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAwC;AAEnE,EAAA,eAAe,aACb,OAAA,EACmD;AACnD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,iBAAA,CAAkB,4CAA4C,GAAG,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAChD,IAAA,IAAI,aAAA,IAAiB,CAAC,OAAA,CAAQ,OAAA,EAAS;AACrC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAoC;AAAA,MAC5D,GAAA,EAAK,GAAG,sBAAsB,CAAA,oBAAA,CAAA;AAAA,MAC9B,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,0BAAA,CAA2B,MAAA,CAAO,IAAI,CAAA;AAC7D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,cAAA,CAAe,GAAA,CAAI,SAAS,cAAc,CAAA;AAC1C,MAAA,MAAA,CAAO,IAAA,GAAO,cAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,eAAe,eACb,OAAA,EACoE;AACpE,IAAA,MAAM,WAAA,GAAc,0BAA0B,OAAO,CAAA;AACrD,IAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,IAAA,EAAK,EAAG;AAC7B,MAAA,IAAI,CAAC,WAAA,IAAe,OAAA,CAAQ,OAAA,EAAS,MAAK,EAAG;AAC3C,QAAA,MAAMA,OAAAA,GAAS,MAAM,YAAA,CAAa;AAAA,UAChC,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,SAAS,OAAA,CAAQ;AAAA,SAClB,CAAA;AACD,QAAA,IAAI,CAACA,OAAAA,CAAO,IAAA,EAAM,UAAA,EAAY;AAC5B,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,IAAA;AAAA,YACN,KAAA,EACEA,QAAO,KAAA,IACP;AAAA,cACE,OAAA,EAAS,qCAAA;AAAA,cACT,QAAQA,OAAAA,CAAO;AAAA,aACjB;AAAA,YACF,QAAQA,OAAAA,CAAO;AAAA,WACjB;AAAA,QACF;AACA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAK;AAAA,YAClC,WAAA,EAAa,iCAAA,CAAkCA,OAAAA,CAAO,IAAI;AAAA,WAC5D;AAAA,UACA,KAAA,EAAO,IAAA;AAAA,UACP,QAAQA,OAAAA,CAAO,MAAA;AAAA,UACf,SAASA,OAAAA,CAAO;AAAA,SAClB;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM;AAAA,UACJ,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAK;AAAA,UAClC;AAAA,SACF;AAAA,QACA,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK,EAAG;AAC5B,MAAA,OAAO,iBAAA,CAAkB,2CAA2C,GAAG,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,MAChC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY;AAC5B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EACE,OAAO,KAAA,IACP;AAAA,UACE,OAAA,EAAS,6BAAA;AAAA,UACT,QAAQ,MAAA,CAAO;AAAA,SACjB;AAAA,QACF,QAAQ,MAAA,CAAO;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,OAAO,IAAA,CAAK,UAAA;AAAA,QACvB,WAAA,EAAa,iCAAA,CAAkC,MAAA,CAAO,IAAI;AAAA,OAC5D;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,MAAA,CAAO;AAAA,KAClB;AAAA,EACF;AAEA,EAAA,SAAS,mCAAA,CAAoC,SAAkC,MAAA,EAAsB;AACnG,IAAA,IAAK,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAQ,OAAA,CAAQ,aAAa,CAAC,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK,EAAG;AACvF,MAAA;AAAA,IACF;AACA,IAAA,cAAA,CAAe,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,eAAe,kBACb,OAAA,EACwD;AACxD,IAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,IAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,MAAA,OAAO,iBAAA;AAAA,QACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,QAClC,eAAA,CAAgB,MAAA;AAAA,QAChB,gBAAgB,KAAA,EAAO;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAyC;AAAA,MACjE,GAAA,EAAK,CAAA,EAAG,sBAAsB,CAAA,UAAA,EAAa,kBAAA;AAAA,QACzC,gBAAgB,IAAA,CAAK;AAAA,OACtB,CAAA,OAAA,EAAU,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAC,CAAA,gBAAA,CAAA;AAAA,MAC5C,MAAA,EAAQ,KAAA;AAAA,MACR,SAAS,qBAAA,CAAsB;AAAA,QAC7B,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,OACnC;AAAA,KACF,CAAA;AAED,IAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IAEA,MAAM,cACJ,OAAA,EACsD;AACtD,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,iBAAA,GAAoB,CAAC,EAAE,OAAA,CAAQ,WAAW,OAAA,CAAQ,KAAA,CAAA;AACxD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAuC;AAAA,QAC/D,GAAA,EAAK,CAAA,EAAG,sBAAsB,CAAA,UAAA,EAAa,kBAAA,CAAmB,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAC,CAAA,UAAA,EAC3F,iBAAA,GAAoB,KAAA,GAAQ,EAC9B,CAAA,CAAA;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,qBAAA,CAAsB;AAAA,UAC7B,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,SACnC,CAAA;AAAA,QACD,MAAA,EAAQ;AAAA,UACN,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,MAAA,EAAQ,OAAA,CAAQ,MAAA,KAAW,KAAA,GAAQ,SAAY,OAAA,CAAQ,MAAA;AAAA,UACvD,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,OAAO,OAAA,CAAQ,KAAA,KAAU,SAAY,MAAA,GAAY,MAAA,CAAO,QAAQ,KAAK;AAAA;AACvE,OACD,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,eACJ,OAAA,EACgD;AAChD,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,MAAA,gBAAA,CAAiB,QAAA,EAAU,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAEzD,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,QAAA,QAAA,CAAS,OAAO,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MACxD;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAiC;AAAA,QACzD,GAAA,EAAK,GAAG,sBAAsB,CAAA,UAAA,EAAa,mBAAmB,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAC,CAAA,iBAAA,CAAA;AAAA,QAC7F,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,qBAAA,CAAsB;AAAA,UAC7B,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,SACnC,CAAA;AAAA,QACD,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,iBAAA;AAAA,IAEA,MAAM,gBACJ,OAAA,EACwD;AACxD,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,cAAc,wBAAwB,CAAA;AAC7E,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,aAAa,uBAAuB,CAAA;AACnF,MAAA,IAAI,UAAA,GAAmE,IAAA;AAEvE,MAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,IAAa,SAAA,EAAW;AAC1C,QAAA,UAAA,GAAa,MAAM,kBAAkB,OAAO,CAAA;AAE5C,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,IAAI,oBAAA,CAAqB,UAAA,CAAW,IAAI,CAAA,EAAG;AACzC,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,MAAM,MAAM,UAAU,CAAA;AAAA,MACxB;AAEA,MAAA,OAAO,iBAAA;AAAA,QACL,mDAAA;AAAA,QACA,GAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,eAAe,OAAA,EAAsE;AACzF,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAc;AAAA,QACtC,GAAA,EAAK,CAAA,EAAG,sBAAsB,CAAA,UAAA,EAAa,kBAAA;AAAA,UACzC,gBAAgB,IAAA,CAAK;AAAA,SACtB,CAAA,WAAA,EAAc,kBAAA,CAAmB,OAAA,CAAQ,UAAU,CAAC,CAAA,CAAA;AAAA,QACrD,MAAA,EAAQ,QAAA;AAAA,QACR,SAAS,qBAAA,CAAsB;AAAA,UAC7B,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,SACnC;AAAA,OACF,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,wBACJ,OAAA,EAC2C;AAC3C,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAA4B;AAAA,QACpD,GAAA,EAAK,GAAG,sBAAsB,CAAA,UAAA,EAAa,mBAAmB,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAC,CAAA,mBAAA,CAAA;AAAA,QAC7F,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAI,eAAA,CAAgB,IAAA,CAAK,WAAA,GAAc,EAAE,kBAAkB,eAAA,CAAgB,IAAA,CAAK,WAAA,EAAY,GAAI;AAAC,SACnG;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,gBAAgB,OAAA,CAAQ;AAAA;AAC1B,OACD,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AACF;;;AChfO,SAAS,YAAA,CAAa,OAAA,GAAgC,EAAC,EAAkB;AAC9E,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,GAAA,GAAM,KAAA;AAAA,IACN,UAAU,EAAC;AAAA,IACX,cAAA;AAAA,IACA,cAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,iBAAiBC,2BAAA,CAAiB;AAAA,IACtC,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAID,EAAA,MAAM,OAAmBC,2BAAA,CAAiB;AAAA,IACxC,OAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,gCAAgC,MAAkB;AAEtD,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,IAAI,cAAA,GAA0C,IAAA;AAM9C,IAAA,SAAS,eAAe,MAAA,EAAwC;AAC9D,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,GAAA,EAAK,OAAO,KAAA;AAGlC,MAAA,IAAI,MAAA,CAAO,OAAO,OAAA,IAAW,UAAA,CAAW,KAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAClE,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAA,CAAO,OAAO,OAAA,EAAS;AACzB,QAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,OAAA;AAC7B,QAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3D,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,UAAA,MAAM,UAAA,GAAa,OAAA;AACnB,UAAA,IAAI,OAAO,WAAW,OAAA,KAAY,QAAA,IAAY,WAAW,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AACjF,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,WAAW,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AACnE,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,OAAO,CAAC,CAAC,IAAA,CAAK,cAAA,EAAe;AAAA,IAC/B;AAEA,IAAA,OAAO;AAAA,MACL,MAAM,QAAW,MAAA,EAAiD;AAEhE,QAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAGlC,QAAA,MAAM,WAAA,GAAc,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO,EAAC;AACpE,QAAA,MAAM,YAAA,GAA8B;AAAA,UAClC,GAAG,MAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACP,GAAG,MAAA,CAAO,OAAA;AAAA,YACV,GAAG;AAAA;AACL,SACF;AAGA,QAAA,IAAI,MAAA,GAAS,MAAM,cAAA,CAAe,OAAA,CAAW,YAAY,CAAA;AAGzD,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,GAAA,IAAO,cAAA,CAAe,MAAM,CAAA,EAAG;AAEnD,UAAA,IAAI,CAAC,YAAA,EAAc;AACjB,YAAA,YAAA,GAAe,IAAA;AACf,YAAA,cAAA,GAAA,CAAkB,YAAY;AAC5B,cAAA,IAAI;AACF,gBAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,YAAA,EAAa;AAC9C,gBAAA,OAAO,CAAC,CAAC,aAAA,CAAc,IAAA;AAAA,cACzB,CAAA,SAAE;AACA,gBAAA,YAAA,GAAe,KAAA;AACf,gBAAA,cAAA,GAAiB,IAAA;AAAA,cACnB;AAAA,YACF,CAAA,GAAG;AAAA,UACL;AAEA,UAAA,MAAM,YAAY,MAAM,cAAA;AAExB,UAAA,IAAI,SAAA,EAAW;AAEb,YAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,YAAA,MAAA,GAAS,MAAM,eAAe,OAAA,CAAW;AAAA,cACvC,GAAG,MAAA;AAAA,cACH,OAAA,EAAS;AAAA,gBACP,GAAG,MAAA,CAAO,OAAA;AAAA,gBACV,GAAI,WAAW,EAAE,aAAA,EAAe,UAAU,QAAQ,CAAA,CAAA,KAAO;AAAC;AAC5D,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,GAAA,IAAO,cAAA,EAAgB;AAC3C,UAAA,cAAA,EAAe;AAAA,QACjB;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,0BAA0B,6BAAA,EAA8B;AAE9D,EAAA,IAAI,aAAA,GAA+B,IAAA;AAEnC,EAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAA2B;AAC3C,IAAA,aAAA,GAAgB,MAAM,GAAA,IAAO,IAAA;AAAA,EAC/B,CAAC,CAAA;AACD,EAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,IAAA,aAAA,GAAgB,IAAA;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,IAAI,IAAA,CAAK,iBAAgB,EAAG;AAC1B,IAAA,IAAA,CACG,KAAA,EAAM,CACN,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,MAAA,CAAO,MAAM,GAAA,EAAK;AACpB,QAAA,aAAA,GAAgB,OAAO,IAAA,CAAK,GAAA;AAAA,MAC9B;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,MAAA,GAAuBC,gCAAmB,uBAAuB,CAAA;AACvE,EAAA,MAAM,GAAA,GAAiBC,0BAAgB,uBAAuB,CAAA;AAC9D,EAAA,MAAM,QAAA,GAA2BC,oCAAqB,uBAAA,EAAyB;AAAA,IAC7E;AAAA,GACD,CAAA;AACD,EAAA,MAAMC,gBAAA,GAAiCC,oCAAqB,uBAAuB,CAAA;AACnF,EAAA,MAAM,SAAA,GAA6B,sBAAsB,uBAAuB,CAAA;AAChF,EAAA,MAAM,OAAA,GAAyBC,iCAAA;AAAA,IAC7B,uBAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC1B,MAAM;AAAA,GACR;AACA,EAAA,MAAM,EAAA,GAAeC,wBAAe,uBAAuB,CAAA;AAI3D,EAAA,MAAM,MAA8CC,yBAAA,CAAgB;AAAA,IAClE,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA;AAAe,GAC3C,CAAA;AACD,EAAA,MAAM,UAA0DC,6BAAA,CAAoB;AAAA,IAClF,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA,EAAe;AAAA,IAC1C,IAAA,EAAM;AAAA,GACP,CAAA;AACD,EAAA,MAAM,MAA8CC,yBAAA,CAAgB;AAAA,IAClE,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA;AAAe,GAC3C,CAAA;AAGD,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,IAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAUN,gBAAA;AAAA,IACV,SAAA;AAAA,IACA,GAAA;AAAA,IACA,EAAA;AAAA,IACA,IAAA,EAAM,uBAAA;AAAA;AAAA,IAGN,eAAA,EAAiB,MAAM,IAAA,CAAK,eAAA,EAAgB;AAAA,IAC5C,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA,EAAe;AAAA,IAC1C,cAAA,EAAgB,CAAC,KAAA,KAAkB,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,IAC5D,SAAA,EAAW,MAAM,IAAA,CAAK,SAAA;AAAU,GAClC;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["import { type ClientResult, type HttpClient } from \"@amaster.ai/http-client\";\n\nconst KNOWLEDGE_OPENAPI_BASE = \"/api/knowledge/v1\";\nconst DEFAULT_WAIT_INTERVAL_MS = 2500;\nconst DEFAULT_WAIT_TIMEOUT_MS = 120000;\nconst TERMINAL_INDEXING_STATUSES = new Set([\"completed\", \"error\", \"paused\", \"stopped\"]);\n\nexport type KnowledgeDocumentStatus = \"completed\" | \"indexing\" | \"error\" | \"paused\";\nexport type KnowledgeDocumentListStatus = KnowledgeDocumentStatus | \"all\";\nexport type KnowledgeRoles = string | string[];\n\nexport type KnowledgeDatasetIdResponse = {\n dataset_id: string;\n tenant_id?: string;\n workspace_id?: string;\n};\n\nexport type KnowledgeDocument = {\n id: string;\n name: string;\n data_source_type?: string;\n doc_type?: string | null;\n doc_form?: string | null;\n indexing_status?: string;\n display_status?: string;\n enabled?: boolean;\n archived?: boolean;\n word_count?: number;\n hit_count?: number;\n position?: number;\n created_at?: number;\n updated_at?: number;\n completed_segments?: number;\n total_segments?: number;\n [key: string]: unknown;\n};\n\nexport type KnowledgeDocumentListResponse = {\n data: KnowledgeDocument[];\n total: number;\n page: number;\n limit: number;\n has_more: boolean;\n};\n\nexport type KnowledgeIndexingStatus = {\n id: string;\n name?: string;\n indexing_status?: string;\n processing_started_at?: number | null;\n parsing_completed_at?: number | null;\n cleaning_completed_at?: number | null;\n splitting_completed_at?: number | null;\n completed_at?: number | null;\n paused_at?: number | null;\n stopped_at?: number | null;\n completed_segments?: number;\n total_segments?: number;\n error?: string | null;\n [key: string]: unknown;\n};\n\nexport type KnowledgeIndexingStatusResponse = {\n data: KnowledgeIndexingStatus[];\n};\n\nexport type KnowledgeUploadResponse = {\n document: KnowledgeDocument;\n batch: string;\n};\n\nexport type KnowledgeMetadataField = {\n id: string;\n name: string;\n type?: \"string\" | \"number\" | \"time\" | string;\n value: unknown;\n};\n\nexport type KnowledgeMetadataOperation = {\n document_id: string;\n metadata_list: KnowledgeMetadataField[];\n partial_update?: boolean;\n};\n\nexport type KnowledgeMetadataUpdateRequest = {\n operation_data: KnowledgeMetadataOperation[];\n};\n\nexport type KnowledgeResolveOptions =\n | {\n datasetId: string;\n orgCode?: string;\n refresh?: boolean;\n workspaceId?: string;\n tenantId?: string;\n }\n | {\n datasetId?: string;\n orgCode: string;\n refresh?: boolean;\n workspaceId?: string;\n tenantId?: string;\n };\n\nexport type KnowledgeGetDatasetIdOptions = {\n orgCode: string;\n refresh?: boolean;\n};\n\nexport type KnowledgeListDocumentsOptions = KnowledgeResolveOptions & {\n page?: number;\n limit?: number;\n keyword?: string;\n status?: KnowledgeDocumentListStatus;\n sort?: string;\n fetch?: boolean | string;\n appCode?: string;\n roles?: KnowledgeRoles;\n};\n\nexport type KnowledgeUploadDocumentOptions = KnowledgeResolveOptions & {\n file: File | Blob;\n fileName?: string;\n appCode?: string;\n config?: Record<string, unknown>;\n};\n\nexport type KnowledgeIndexingStatusOptions = KnowledgeResolveOptions & {\n batch: string;\n};\n\nexport type KnowledgeWaitForIndexingOptions = KnowledgeIndexingStatusOptions & {\n intervalMs?: number;\n timeoutMs?: number;\n};\n\nexport type KnowledgeDeleteDocumentOptions = KnowledgeResolveOptions & {\n documentId: string;\n appCode?: string;\n};\n\nexport type KnowledgeUpdateDocumentsMetadataOptions = KnowledgeResolveOptions &\n KnowledgeMetadataUpdateRequest;\n\nexport type KnowledgeClient = {\n getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>>;\n listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>>;\n uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>>;\n getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>>;\n updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>>;\n};\n\nfunction createErrorResult<T>(\n message: string,\n status: number,\n details?: unknown\n): ClientResult<T> {\n return {\n data: null,\n error: {\n message,\n status,\n details,\n },\n status,\n };\n}\n\nfunction normalizeAppHeaderValue(value?: string): string | undefined {\n const normalized = value?.trim();\n return normalized || undefined;\n}\n\nfunction normalizeOptionalString(value?: string): string | undefined {\n const normalized = value?.trim();\n return normalized || undefined;\n}\n\nfunction getWorkspaceIdFromOptions(options: {\n workspaceId?: string;\n tenantId?: string;\n}): string | undefined {\n return normalizeOptionalString(options.workspaceId) || normalizeOptionalString(options.tenantId);\n}\n\nfunction getWorkspaceIdFromDatasetResponse(\n response?: KnowledgeDatasetIdResponse | null\n): string | undefined {\n return normalizeOptionalString(response?.workspace_id) || normalizeOptionalString(response?.tenant_id);\n}\n\nfunction normalizeDatasetIdResponse(\n response?: KnowledgeDatasetIdResponse | null\n): KnowledgeDatasetIdResponse | null {\n const datasetId = normalizeOptionalString(response?.dataset_id);\n if (!datasetId) {\n return null;\n }\n\n const workspaceId = getWorkspaceIdFromDatasetResponse(response);\n return {\n dataset_id: datasetId,\n ...(workspaceId ? { tenant_id: workspaceId, workspace_id: workspaceId } : {}),\n };\n}\n\nfunction normalizeRolesHeaderValue(roles?: KnowledgeRoles): string | undefined {\n if (!roles) {\n return undefined;\n }\n if (Array.isArray(roles)) {\n return JSON.stringify(roles);\n }\n const normalized = roles.trim();\n return normalized || undefined;\n}\n\nfunction buildKnowledgeHeaders(options: {\n appCode?: string;\n roles?: KnowledgeRoles;\n workspaceId?: string;\n}): Record<string, string> | undefined {\n const headers: Record<string, string> = {};\n const appCode = normalizeAppHeaderValue(options.appCode);\n const roles = normalizeRolesHeaderValue(options.roles);\n const workspaceId = normalizeOptionalString(options.workspaceId);\n\n if (appCode) {\n headers[\"X-App-Code\"] = appCode;\n }\n if (roles) {\n headers[\"X-App-User-Roles\"] = roles;\n }\n if (workspaceId) {\n headers[\"X-WORKSPACE-ID\"] = workspaceId;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveUploadFilename(file: File | Blob, fileName?: string): string | undefined {\n const normalized = fileName?.trim();\n if (normalized) {\n return normalized;\n }\n if (\"name\" in file && typeof file.name === \"string\" && file.name.trim()) {\n return file.name.trim();\n }\n return undefined;\n}\n\nfunction appendUploadFile(formData: FormData, file: File | Blob, fileName?: string): void {\n const resolvedFileName = resolveUploadFilename(file, fileName);\n if (resolvedFileName) {\n formData.append(\"file\", file, resolvedFileName);\n return;\n }\n formData.append(\"file\", file);\n}\n\nfunction isTerminalIndexingStatus(status?: string): boolean {\n return TERMINAL_INDEXING_STATUSES.has(String(status || \"\").toLowerCase());\n}\n\nfunction isIndexingStatusDone(response: KnowledgeIndexingStatusResponse | null): boolean {\n const statuses = response?.data || [];\n return statuses.length > 0 && statuses.every((item) => isTerminalIndexingStatus(item.indexing_status));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createKnowledgeClient(http: HttpClient): KnowledgeClient {\n const datasetIdCache = new Map<string, KnowledgeDatasetIdResponse>();\n\n async function getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>> {\n const orgCode = options.orgCode?.trim();\n if (!orgCode) {\n return createErrorResult(\"orgCode is required to resolve datasetId\", 400);\n }\n\n const cachedDataset = datasetIdCache.get(orgCode);\n if (cachedDataset && !options.refresh) {\n return {\n data: cachedDataset,\n error: null,\n status: 200,\n };\n }\n\n const result = await http.request<KnowledgeDatasetIdResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/current-id`,\n method: \"get\",\n params: {\n org_code: orgCode,\n },\n });\n\n const normalizedData = normalizeDatasetIdResponse(result.data);\n if (normalizedData) {\n datasetIdCache.set(orgCode, normalizedData);\n result.data = normalizedData;\n } else {\n datasetIdCache.delete(orgCode);\n }\n\n return result;\n }\n\n async function resolveDataset(\n options: KnowledgeResolveOptions\n ): Promise<ClientResult<{ datasetId: string; workspaceId?: string }>> {\n const workspaceId = getWorkspaceIdFromOptions(options);\n if (options.datasetId?.trim()) {\n if (!workspaceId && options.orgCode?.trim()) {\n const result = await getDatasetId({\n orgCode: options.orgCode,\n refresh: options.refresh,\n });\n if (!result.data?.dataset_id) {\n return {\n data: null,\n error:\n result.error ||\n {\n message: \"Failed to resolve dataset workspace\",\n status: result.status,\n },\n status: result.status,\n };\n }\n return {\n data: {\n datasetId: options.datasetId.trim(),\n workspaceId: getWorkspaceIdFromDatasetResponse(result.data),\n },\n error: null,\n status: result.status,\n headers: result.headers,\n };\n }\n\n return {\n data: {\n datasetId: options.datasetId.trim(),\n workspaceId,\n },\n error: null,\n status: 200,\n };\n }\n\n if (!options.orgCode?.trim()) {\n return createErrorResult(\"Either datasetId or orgCode is required\", 400);\n }\n\n const result = await getDatasetId({\n orgCode: options.orgCode,\n refresh: options.refresh,\n });\n\n if (!result.data?.dataset_id) {\n return {\n data: null,\n error:\n result.error ||\n {\n message: \"Failed to resolve datasetId\",\n status: result.status,\n },\n status: result.status,\n };\n }\n\n return {\n data: {\n datasetId: result.data.dataset_id,\n workspaceId: getWorkspaceIdFromDatasetResponse(result.data),\n },\n error: null,\n status: result.status,\n headers: result.headers,\n };\n }\n\n function invalidateCacheOnDatasetAccessError(options: KnowledgeResolveOptions, status: number): void {\n if ((status !== 403 && status !== 404) || options.datasetId || !options.orgCode?.trim()) {\n return;\n }\n datasetIdCache.delete(options.orgCode.trim());\n }\n\n async function getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const result = await http.request<KnowledgeIndexingStatusResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(\n resolvedDataset.data.datasetId\n )}/batch/${encodeURIComponent(options.batch)}/indexing-status`,\n method: \"get\",\n headers: buildKnowledgeHeaders({\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n }\n\n return {\n getDatasetId,\n\n async listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const useMetadataFilter = !!(options.appCode || options.roles);\n const result = await http.request<KnowledgeDocumentListResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents${\n useMetadataFilter ? \"/v2\" : \"\"\n }`,\n method: \"get\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n roles: options.roles,\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n params: {\n page: options.page,\n limit: options.limit,\n keyword: options.keyword,\n status: options.status === \"all\" ? undefined : options.status,\n sort: options.sort,\n fetch: options.fetch === undefined ? undefined : String(options.fetch),\n },\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n\n async uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const formData = new FormData();\n appendUploadFile(formData, options.file, options.fileName);\n\n if (options.config !== undefined) {\n formData.append(\"data\", JSON.stringify(options.config));\n }\n\n const result = await http.request<KnowledgeUploadResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/upload`,\n method: \"post\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n data: formData,\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n\n getIndexingStatus,\n\n async waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const startedAt = Date.now();\n const intervalMs = Math.max(1, options.intervalMs ?? DEFAULT_WAIT_INTERVAL_MS);\n const timeoutMs = Math.max(intervalMs, options.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS);\n let lastResult: ClientResult<KnowledgeIndexingStatusResponse> | null = null;\n\n while (Date.now() - startedAt <= timeoutMs) {\n lastResult = await getIndexingStatus(options);\n\n if (lastResult.error) {\n return lastResult;\n }\n\n if (isIndexingStatusDone(lastResult.data)) {\n return lastResult;\n }\n\n await sleep(intervalMs);\n }\n\n return createErrorResult(\n \"Timed out waiting for document indexing to finish\",\n 408,\n lastResult?.data\n );\n },\n\n async deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const result = await http.request<null>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(\n resolvedDataset.data.datasetId\n )}/documents/${encodeURIComponent(options.documentId)}`,\n method: \"delete\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n\n async updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const result = await http.request<{ result: string }>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/metadata`,\n method: \"post\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(resolvedDataset.data.workspaceId ? { \"X-WORKSPACE-ID\": resolvedDataset.data.workspaceId } : {}),\n },\n data: {\n operation_data: options.operation_data,\n },\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n };\n}\n","/**\n * ============================================================================\n * @amaster.ai/client - Unified Amaster Client\n * ============================================================================\n *\n * Supabase-inspired unified API client for the Amaster platform\n *\n * Features:\n * - Single client instance for all services (auth, entity, bpm, workflow)\n * - Automatic token management and refresh\n * - Auto-attach authentication to all requests\n * - Centralized error handling\n *\n * @example\n * ```typescript\n * const client = createClient({\n * onUnauthorized: () => window.location.href = '/login'\n * });\n *\n * // Login\n * await client.auth.login({ email, password });\n *\n * // All subsequent requests automatically include auth token\n * await client.entity.list('default', 'users');\n * await client.bpm.startProcess('approval', { amount: 1000 });\n * await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\n\nimport { createAuthClient, type AuthClient } from \"@amaster.ai/auth-client\";\nimport { createEntityClient, type EntityClient } from \"@amaster.ai/entity-client\";\nimport { createBpmClient, type BpmClient } from \"@amaster.ai/bpm-client\";\nimport { createWorkflowClient, type WorkflowClient } from \"@amaster.ai/workflow-client\";\nimport {\n createASRClient,\n createASRHttpClient,\n type ASRClientConfig,\n type ASRClient,\n type ASRHttpClientConfig,\n type ASRHttpClient,\n} from \"@amaster.ai/asr-client\";\nimport { createCopilotClient, type CopilotClient } from \"@amaster.ai/copilot-client\";\nimport { createFunctionClient, type FunctionClient } from \"@amaster.ai/function-client\";\nimport { createTTSClient, TTSClientConfig, type TTSClient } from \"@amaster.ai/tts-client\";\nimport { createS3Client, type S3Client } from \"@amaster.ai/s3-client\";\nimport {\n createHttpClient,\n type HttpClient,\n type RequestConfig,\n type ClientResult,\n} from \"@amaster.ai/http-client\";\nimport { createKnowledgeClient, type KnowledgeClient } from \"./knowledge\";\nimport type { AmasterClient, AmasterClientOptions } from \"./types\";\n\n/**\n * Create a unified Amaster client instance\n *\n * This function creates a single client that provides access to all Amaster services:\n * - Authentication (login, register, logout)\n * - Entity CRUD operations\n * - BPM (Business Process Management)\n * - Workflow execution\n *\n * All sub-clients automatically share the same HTTP client and authentication state,\n * ensuring that tokens are consistently attached to all requests.\n *\n * @param options - Client configuration options\n * @returns A unified Amaster client instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const client = createClient();\n *\n * // With authentication callbacks\n * const client = createClient({\n * onUnauthorized: () => {\n * // Redirect to login or show auth modal\n * window.location.href = '/login';\n * },\n * onTokenExpired: () => {\n * console.log('Token expired, refreshing...');\n * }\n * });\n *\n * // Login\n * await client.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Now all requests automatically include the auth token\n * const users = await client.entity.list('default', 'users');\n * const tasks = await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\nexport function createClient(options: AmasterClientOptions = {}): AmasterClient {\n const {\n baseURL,\n env = \"dev\",\n headers = {},\n onUnauthorized,\n onTokenExpired,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n } = options;\n\n // Create the base HTTP client\n const baseHttpClient = createHttpClient({\n baseURL,\n headers,\n runtime,\n });\n\n // Create the auth client first using the same base HTTP implementation so\n // mini-program request handling stays consistent across all modules.\n const auth: AuthClient = createAuthClient({\n baseURL,\n headers,\n onTokenExpired,\n onUnauthorized,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n });\n\n // Create a wrapper HTTP client that automatically adds the auth token\n const createAuthenticatedHttpClient = (): HttpClient => {\n // Track if we're currently refreshing to avoid multiple simultaneous refreshes\n let isRefreshing = false;\n let refreshPromise: Promise<boolean> | null = null;\n\n /**\n * Check if 401 error is due to token expiration\n * Traefik JWT plugin returns plain text like \"Jwt is expired\" or \"Token is expired\"\n */\n function isTokenExpired(result: ClientResult<unknown>): boolean {\n if (result.status !== 401) return false;\n\n // Check error message (could be from backend JSON response)\n if (result.error?.message && /expired/i.test(result.error.message)) {\n return true;\n }\n\n // Check error details (traefik returns plain text in details)\n if (result.error?.details) {\n const details = result.error.details;\n if (typeof details === \"string\" && /expired/i.test(details)) {\n return true;\n }\n // Also check if details is an object with message field\n if (typeof details === \"object\" && details !== null) {\n const detailsObj = details as Record<string, unknown>;\n if (typeof detailsObj.message === \"string\" && /expired/i.test(detailsObj.message)) {\n return true;\n }\n }\n }\n\n // Check raw data (could be plain text from traefik)\n if (typeof result.data === \"string\" && /expired/i.test(result.data)) {\n return true;\n }\n\n // If we have a token but got 401, assume it might be expired\n return !!auth.getAccessToken();\n }\n\n return {\n async request<T>(config: RequestConfig): Promise<ClientResult<T>> {\n // Get the current token from auth client\n const token = auth.getAccessToken();\n\n // Merge Authorization header with existing headers\n const authHeaders = token ? { Authorization: `Bearer ${token}` } : {};\n const mergedConfig: RequestConfig = {\n ...config,\n headers: {\n ...config.headers,\n ...authHeaders,\n },\n };\n\n // Make the request with the updated config\n let result = await baseHttpClient.request<T>(mergedConfig);\n\n // Handle 401 errors with automatic token refresh\n if (result.status === 401 && isTokenExpired(result)) {\n // Attempt to refresh token\n if (!isRefreshing) {\n isRefreshing = true;\n refreshPromise = (async () => {\n try {\n const refreshResult = await auth.refreshToken();\n return !!refreshResult.data;\n } finally {\n isRefreshing = false;\n refreshPromise = null;\n }\n })();\n }\n\n const refreshed = await refreshPromise;\n\n if (refreshed) {\n // Retry with new token\n const newToken = auth.getAccessToken();\n result = await baseHttpClient.request<T>({\n ...config,\n headers: {\n ...config.headers,\n ...(newToken ? { Authorization: `Bearer ${newToken}` } : {}),\n },\n });\n }\n }\n\n // Trigger unauthorized if still 401\n if (result.status === 401 && onUnauthorized) {\n onUnauthorized();\n }\n\n return result;\n },\n };\n };\n\n const authenticatedHttpClient = createAuthenticatedHttpClient();\n\n let cachedUserUid: string | null = null;\n\n auth.on(\"login\", (user: { uid?: string }) => {\n cachedUserUid = user?.uid ?? null;\n });\n auth.on(\"logout\", () => {\n cachedUserUid = null;\n });\n\n if (auth.isAuthenticated()) {\n auth\n .getMe()\n .then((result) => {\n if (result.data?.uid) {\n cachedUserUid = result.data.uid;\n }\n })\n .catch(() => {});\n }\n\n // Create other clients using the authenticated HTTP client\n const entity: EntityClient = createEntityClient(authenticatedHttpClient);\n const bpm: BpmClient = createBpmClient(authenticatedHttpClient);\n const workflow: WorkflowClient = createWorkflowClient(authenticatedHttpClient, {\n env,\n });\n const functionClient: FunctionClient = createFunctionClient(authenticatedHttpClient);\n const knowledge: KnowledgeClient = createKnowledgeClient(authenticatedHttpClient);\n const copilot: CopilotClient = createCopilotClient(\n authenticatedHttpClient,\n baseURL,\n () => auth.getAccessToken(),\n () => cachedUserUid\n );\n const s3: S3Client = createS3Client(authenticatedHttpClient);\n\n // ASR and TTS clients use WebSocket, pass token getter for authentication\n // Token can be appended to WebSocket URL as query parameter\n const asr: (config: ASRClientConfig) => ASRClient = createASRClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n const asrHttp: (config: ASRHttpClientConfig) => ASRHttpClient = createASRHttpClient({\n getAccessToken: () => auth.getAccessToken(),\n http: authenticatedHttpClient,\n });\n const tts: (config: TTSClientConfig) => TTSClient = createTTSClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n\n // Return unified client interface\n const client: AmasterClient = {\n auth,\n entity,\n bpm,\n workflow,\n asr,\n asrHttp,\n copilot,\n function: functionClient,\n knowledge,\n tts,\n s3,\n http: authenticatedHttpClient,\n\n // Expose token management methods from auth client\n isAuthenticated: () => auth.isAuthenticated(),\n getAccessToken: () => auth.getAccessToken(),\n setAccessToken: (token: string) => auth.setAccessToken(token),\n clearAuth: () => auth.clearAuth(),\n };\n\n return client;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -24,6 +24,8 @@ type KnowledgeDocumentListStatus = KnowledgeDocumentStatus | "all";
24
24
  type KnowledgeRoles = string | string[];
25
25
  type KnowledgeDatasetIdResponse = {
26
26
  dataset_id: string;
27
+ tenant_id?: string;
28
+ workspace_id?: string;
27
29
  };
28
30
  type KnowledgeDocument = {
29
31
  id: string;
@@ -92,10 +94,14 @@ type KnowledgeResolveOptions = {
92
94
  datasetId: string;
93
95
  orgCode?: string;
94
96
  refresh?: boolean;
97
+ workspaceId?: string;
98
+ tenantId?: string;
95
99
  } | {
96
100
  datasetId?: string;
97
101
  orgCode: string;
98
102
  refresh?: boolean;
103
+ workspaceId?: string;
104
+ tenantId?: string;
99
105
  };
100
106
  type KnowledgeGetDatasetIdOptions = {
101
107
  orgCode: string;
package/dist/index.d.ts CHANGED
@@ -24,6 +24,8 @@ type KnowledgeDocumentListStatus = KnowledgeDocumentStatus | "all";
24
24
  type KnowledgeRoles = string | string[];
25
25
  type KnowledgeDatasetIdResponse = {
26
26
  dataset_id: string;
27
+ tenant_id?: string;
28
+ workspace_id?: string;
27
29
  };
28
30
  type KnowledgeDocument = {
29
31
  id: string;
@@ -92,10 +94,14 @@ type KnowledgeResolveOptions = {
92
94
  datasetId: string;
93
95
  orgCode?: string;
94
96
  refresh?: boolean;
97
+ workspaceId?: string;
98
+ tenantId?: string;
95
99
  } | {
96
100
  datasetId?: string;
97
101
  orgCode: string;
98
102
  refresh?: boolean;
103
+ workspaceId?: string;
104
+ tenantId?: string;
99
105
  };
100
106
  type KnowledgeGetDatasetIdOptions = {
101
107
  orgCode: string;
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import { createHttpClient } from '@amaster.ai/http-client';
14
14
  // src/client.ts
15
15
 
16
16
  // src/knowledge.ts
17
- var WORKFLOW_CONSOLE_BASE = "/api/workflow-console/v2";
17
+ var KNOWLEDGE_OPENAPI_BASE = "/api/knowledge/v1";
18
18
  var DEFAULT_WAIT_INTERVAL_MS = 2500;
19
19
  var DEFAULT_WAIT_TIMEOUT_MS = 12e4;
20
20
  var TERMINAL_INDEXING_STATUSES = /* @__PURE__ */ new Set(["completed", "error", "paused", "stopped"]);
@@ -33,6 +33,27 @@ function normalizeAppHeaderValue(value) {
33
33
  const normalized = value?.trim();
34
34
  return normalized || void 0;
35
35
  }
36
+ function normalizeOptionalString(value) {
37
+ const normalized = value?.trim();
38
+ return normalized || void 0;
39
+ }
40
+ function getWorkspaceIdFromOptions(options) {
41
+ return normalizeOptionalString(options.workspaceId) || normalizeOptionalString(options.tenantId);
42
+ }
43
+ function getWorkspaceIdFromDatasetResponse(response) {
44
+ return normalizeOptionalString(response?.workspace_id) || normalizeOptionalString(response?.tenant_id);
45
+ }
46
+ function normalizeDatasetIdResponse(response) {
47
+ const datasetId = normalizeOptionalString(response?.dataset_id);
48
+ if (!datasetId) {
49
+ return null;
50
+ }
51
+ const workspaceId = getWorkspaceIdFromDatasetResponse(response);
52
+ return {
53
+ dataset_id: datasetId,
54
+ ...workspaceId ? { tenant_id: workspaceId, workspace_id: workspaceId } : {}
55
+ };
56
+ }
36
57
  function normalizeRolesHeaderValue(roles) {
37
58
  if (!roles) {
38
59
  return void 0;
@@ -47,12 +68,16 @@ function buildKnowledgeHeaders(options) {
47
68
  const headers = {};
48
69
  const appCode = normalizeAppHeaderValue(options.appCode);
49
70
  const roles = normalizeRolesHeaderValue(options.roles);
71
+ const workspaceId = normalizeOptionalString(options.workspaceId);
50
72
  if (appCode) {
51
73
  headers["X-App-Code"] = appCode;
52
74
  }
53
75
  if (roles) {
54
76
  headers["X-App-User-Roles"] = roles;
55
77
  }
78
+ if (workspaceId) {
79
+ headers["X-WORKSPACE-ID"] = workspaceId;
80
+ }
56
81
  return Object.keys(headers).length > 0 ? headers : void 0;
57
82
  }
58
83
  function resolveUploadFilename(file, fileName) {
@@ -90,32 +115,63 @@ function createKnowledgeClient(http) {
90
115
  if (!orgCode) {
91
116
  return createErrorResult("orgCode is required to resolve datasetId", 400);
92
117
  }
93
- const cachedDatasetId = datasetIdCache.get(orgCode);
94
- if (cachedDatasetId && !options.refresh) {
118
+ const cachedDataset = datasetIdCache.get(orgCode);
119
+ if (cachedDataset && !options.refresh) {
95
120
  return {
96
- data: { dataset_id: cachedDatasetId },
121
+ data: cachedDataset,
97
122
  error: null,
98
123
  status: 200
99
124
  };
100
125
  }
101
126
  const result = await http.request({
102
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/current-id`,
127
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/current-id`,
103
128
  method: "get",
104
129
  params: {
105
130
  org_code: orgCode
106
131
  }
107
132
  });
108
- if (result.data?.dataset_id) {
109
- datasetIdCache.set(orgCode, result.data.dataset_id);
133
+ const normalizedData = normalizeDatasetIdResponse(result.data);
134
+ if (normalizedData) {
135
+ datasetIdCache.set(orgCode, normalizedData);
136
+ result.data = normalizedData;
110
137
  } else {
111
138
  datasetIdCache.delete(orgCode);
112
139
  }
113
140
  return result;
114
141
  }
115
- async function resolveDatasetId(options) {
142
+ async function resolveDataset(options) {
143
+ const workspaceId = getWorkspaceIdFromOptions(options);
116
144
  if (options.datasetId?.trim()) {
145
+ if (!workspaceId && options.orgCode?.trim()) {
146
+ const result2 = await getDatasetId({
147
+ orgCode: options.orgCode,
148
+ refresh: options.refresh
149
+ });
150
+ if (!result2.data?.dataset_id) {
151
+ return {
152
+ data: null,
153
+ error: result2.error || {
154
+ message: "Failed to resolve dataset workspace",
155
+ status: result2.status
156
+ },
157
+ status: result2.status
158
+ };
159
+ }
160
+ return {
161
+ data: {
162
+ datasetId: options.datasetId.trim(),
163
+ workspaceId: getWorkspaceIdFromDatasetResponse(result2.data)
164
+ },
165
+ error: null,
166
+ status: result2.status,
167
+ headers: result2.headers
168
+ };
169
+ }
117
170
  return {
118
- data: options.datasetId.trim(),
171
+ data: {
172
+ datasetId: options.datasetId.trim(),
173
+ workspaceId
174
+ },
119
175
  error: null,
120
176
  status: 200
121
177
  };
@@ -138,54 +194,61 @@ function createKnowledgeClient(http) {
138
194
  };
139
195
  }
140
196
  return {
141
- data: result.data.dataset_id,
197
+ data: {
198
+ datasetId: result.data.dataset_id,
199
+ workspaceId: getWorkspaceIdFromDatasetResponse(result.data)
200
+ },
142
201
  error: null,
143
202
  status: result.status,
144
203
  headers: result.headers
145
204
  };
146
205
  }
147
- function invalidateCacheOnNotFound(options, status) {
148
- if (status !== 404 || options.datasetId || !options.orgCode?.trim()) {
206
+ function invalidateCacheOnDatasetAccessError(options, status) {
207
+ if (status !== 403 && status !== 404 || options.datasetId || !options.orgCode?.trim()) {
149
208
  return;
150
209
  }
151
210
  datasetIdCache.delete(options.orgCode.trim());
152
211
  }
153
212
  async function getIndexingStatus(options) {
154
- const datasetId = await resolveDatasetId(options);
155
- if (!datasetId.data) {
213
+ const resolvedDataset = await resolveDataset(options);
214
+ if (!resolvedDataset.data) {
156
215
  return createErrorResult(
157
- datasetId.error?.message || "Failed to resolve datasetId",
158
- datasetId.status,
159
- datasetId.error?.details
216
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
217
+ resolvedDataset.status,
218
+ resolvedDataset.error?.details
160
219
  );
161
220
  }
162
221
  const result = await http.request({
163
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(
164
- datasetId.data
222
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(
223
+ resolvedDataset.data.datasetId
165
224
  )}/batch/${encodeURIComponent(options.batch)}/indexing-status`,
166
- method: "get"
225
+ method: "get",
226
+ headers: buildKnowledgeHeaders({
227
+ workspaceId: resolvedDataset.data.workspaceId
228
+ })
167
229
  });
168
- invalidateCacheOnNotFound(options, result.status);
230
+ invalidateCacheOnDatasetAccessError(options, result.status);
169
231
  return result;
170
232
  }
171
233
  return {
172
234
  getDatasetId,
173
235
  async listDocuments(options) {
174
- const datasetId = await resolveDatasetId(options);
175
- if (!datasetId.data) {
236
+ const resolvedDataset = await resolveDataset(options);
237
+ if (!resolvedDataset.data) {
176
238
  return createErrorResult(
177
- datasetId.error?.message || "Failed to resolve datasetId",
178
- datasetId.status,
179
- datasetId.error?.details
239
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
240
+ resolvedDataset.status,
241
+ resolvedDataset.error?.details
180
242
  );
181
243
  }
182
244
  const useMetadataFilter = !!(options.appCode || options.roles);
183
245
  const result = await http.request({
184
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents${useMetadataFilter ? "/v2" : ""}`,
246
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents${useMetadataFilter ? "/v2" : ""}`,
185
247
  method: "get",
186
248
  headers: buildKnowledgeHeaders({
187
249
  appCode: options.appCode,
188
- roles: options.roles
250
+ roles: options.roles,
251
+ workspaceId: resolvedDataset.data.workspaceId
189
252
  }),
190
253
  params: {
191
254
  page: options.page,
@@ -196,16 +259,16 @@ function createKnowledgeClient(http) {
196
259
  fetch: options.fetch === void 0 ? void 0 : String(options.fetch)
197
260
  }
198
261
  });
199
- invalidateCacheOnNotFound(options, result.status);
262
+ invalidateCacheOnDatasetAccessError(options, result.status);
200
263
  return result;
201
264
  },
202
265
  async uploadDocument(options) {
203
- const datasetId = await resolveDatasetId(options);
204
- if (!datasetId.data) {
266
+ const resolvedDataset = await resolveDataset(options);
267
+ if (!resolvedDataset.data) {
205
268
  return createErrorResult(
206
- datasetId.error?.message || "Failed to resolve datasetId",
207
- datasetId.status,
208
- datasetId.error?.details
269
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
270
+ resolvedDataset.status,
271
+ resolvedDataset.error?.details
209
272
  );
210
273
  }
211
274
  const formData = new FormData();
@@ -214,14 +277,15 @@ function createKnowledgeClient(http) {
214
277
  formData.append("data", JSON.stringify(options.config));
215
278
  }
216
279
  const result = await http.request({
217
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/upload`,
280
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/upload`,
218
281
  method: "post",
219
282
  headers: buildKnowledgeHeaders({
220
- appCode: options.appCode
283
+ appCode: options.appCode,
284
+ workspaceId: resolvedDataset.data.workspaceId
221
285
  }),
222
286
  data: formData
223
287
  });
224
- invalidateCacheOnNotFound(options, result.status);
288
+ invalidateCacheOnDatasetAccessError(options, result.status);
225
289
  return result;
226
290
  },
227
291
  getIndexingStatus,
@@ -247,46 +311,48 @@ function createKnowledgeClient(http) {
247
311
  );
248
312
  },
249
313
  async deleteDocument(options) {
250
- const datasetId = await resolveDatasetId(options);
251
- if (!datasetId.data) {
314
+ const resolvedDataset = await resolveDataset(options);
315
+ if (!resolvedDataset.data) {
252
316
  return createErrorResult(
253
- datasetId.error?.message || "Failed to resolve datasetId",
254
- datasetId.status,
255
- datasetId.error?.details
317
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
318
+ resolvedDataset.status,
319
+ resolvedDataset.error?.details
256
320
  );
257
321
  }
258
322
  const result = await http.request({
259
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(
260
- datasetId.data
323
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(
324
+ resolvedDataset.data.datasetId
261
325
  )}/documents/${encodeURIComponent(options.documentId)}`,
262
326
  method: "delete",
263
327
  headers: buildKnowledgeHeaders({
264
- appCode: options.appCode
328
+ appCode: options.appCode,
329
+ workspaceId: resolvedDataset.data.workspaceId
265
330
  })
266
331
  });
267
- invalidateCacheOnNotFound(options, result.status);
332
+ invalidateCacheOnDatasetAccessError(options, result.status);
268
333
  return result;
269
334
  },
270
335
  async updateDocumentsMetadata(options) {
271
- const datasetId = await resolveDatasetId(options);
272
- if (!datasetId.data) {
336
+ const resolvedDataset = await resolveDataset(options);
337
+ if (!resolvedDataset.data) {
273
338
  return createErrorResult(
274
- datasetId.error?.message || "Failed to resolve datasetId",
275
- datasetId.status,
276
- datasetId.error?.details
339
+ resolvedDataset.error?.message || "Failed to resolve datasetId",
340
+ resolvedDataset.status,
341
+ resolvedDataset.error?.details
277
342
  );
278
343
  }
279
344
  const result = await http.request({
280
- url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/metadata`,
345
+ url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/metadata`,
281
346
  method: "post",
282
347
  headers: {
283
- "Content-Type": "application/json"
348
+ "Content-Type": "application/json",
349
+ ...resolvedDataset.data.workspaceId ? { "X-WORKSPACE-ID": resolvedDataset.data.workspaceId } : {}
284
350
  },
285
351
  data: {
286
352
  operation_data: options.operation_data
287
353
  }
288
354
  });
289
- invalidateCacheOnNotFound(options, result.status);
355
+ invalidateCacheOnDatasetAccessError(options, result.status);
290
356
  return result;
291
357
  }
292
358
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/knowledge.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { type ClientResult, type HttpClient } from \"@amaster.ai/http-client\";\n\nconst WORKFLOW_CONSOLE_BASE = \"/api/workflow-console/v2\";\nconst DEFAULT_WAIT_INTERVAL_MS = 2500;\nconst DEFAULT_WAIT_TIMEOUT_MS = 120000;\nconst TERMINAL_INDEXING_STATUSES = new Set([\"completed\", \"error\", \"paused\", \"stopped\"]);\n\nexport type KnowledgeDocumentStatus = \"completed\" | \"indexing\" | \"error\" | \"paused\";\nexport type KnowledgeDocumentListStatus = KnowledgeDocumentStatus | \"all\";\nexport type KnowledgeRoles = string | string[];\n\nexport type KnowledgeDatasetIdResponse = {\n dataset_id: string;\n};\n\nexport type KnowledgeDocument = {\n id: string;\n name: string;\n data_source_type?: string;\n doc_type?: string | null;\n doc_form?: string | null;\n indexing_status?: string;\n display_status?: string;\n enabled?: boolean;\n archived?: boolean;\n word_count?: number;\n hit_count?: number;\n position?: number;\n created_at?: number;\n updated_at?: number;\n completed_segments?: number;\n total_segments?: number;\n [key: string]: unknown;\n};\n\nexport type KnowledgeDocumentListResponse = {\n data: KnowledgeDocument[];\n total: number;\n page: number;\n limit: number;\n has_more: boolean;\n};\n\nexport type KnowledgeIndexingStatus = {\n id: string;\n name?: string;\n indexing_status?: string;\n processing_started_at?: number | null;\n parsing_completed_at?: number | null;\n cleaning_completed_at?: number | null;\n splitting_completed_at?: number | null;\n completed_at?: number | null;\n paused_at?: number | null;\n stopped_at?: number | null;\n completed_segments?: number;\n total_segments?: number;\n error?: string | null;\n [key: string]: unknown;\n};\n\nexport type KnowledgeIndexingStatusResponse = {\n data: KnowledgeIndexingStatus[];\n};\n\nexport type KnowledgeUploadResponse = {\n document: KnowledgeDocument;\n batch: string;\n};\n\nexport type KnowledgeMetadataField = {\n id: string;\n name: string;\n type?: \"string\" | \"number\" | \"time\" | string;\n value: unknown;\n};\n\nexport type KnowledgeMetadataOperation = {\n document_id: string;\n metadata_list: KnowledgeMetadataField[];\n partial_update?: boolean;\n};\n\nexport type KnowledgeMetadataUpdateRequest = {\n operation_data: KnowledgeMetadataOperation[];\n};\n\nexport type KnowledgeResolveOptions =\n | {\n datasetId: string;\n orgCode?: string;\n refresh?: boolean;\n }\n | {\n datasetId?: string;\n orgCode: string;\n refresh?: boolean;\n };\n\nexport type KnowledgeGetDatasetIdOptions = {\n orgCode: string;\n refresh?: boolean;\n};\n\nexport type KnowledgeListDocumentsOptions = KnowledgeResolveOptions & {\n page?: number;\n limit?: number;\n keyword?: string;\n status?: KnowledgeDocumentListStatus;\n sort?: string;\n fetch?: boolean | string;\n appCode?: string;\n roles?: KnowledgeRoles;\n};\n\nexport type KnowledgeUploadDocumentOptions = KnowledgeResolveOptions & {\n file: File | Blob;\n fileName?: string;\n appCode?: string;\n config?: Record<string, unknown>;\n};\n\nexport type KnowledgeIndexingStatusOptions = KnowledgeResolveOptions & {\n batch: string;\n};\n\nexport type KnowledgeWaitForIndexingOptions = KnowledgeIndexingStatusOptions & {\n intervalMs?: number;\n timeoutMs?: number;\n};\n\nexport type KnowledgeDeleteDocumentOptions = KnowledgeResolveOptions & {\n documentId: string;\n appCode?: string;\n};\n\nexport type KnowledgeUpdateDocumentsMetadataOptions = KnowledgeResolveOptions &\n KnowledgeMetadataUpdateRequest;\n\nexport type KnowledgeClient = {\n getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>>;\n listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>>;\n uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>>;\n getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>>;\n updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>>;\n};\n\nfunction createErrorResult<T>(\n message: string,\n status: number,\n details?: unknown\n): ClientResult<T> {\n return {\n data: null,\n error: {\n message,\n status,\n details,\n },\n status,\n };\n}\n\nfunction normalizeAppHeaderValue(value?: string): string | undefined {\n const normalized = value?.trim();\n return normalized || undefined;\n}\n\nfunction normalizeRolesHeaderValue(roles?: KnowledgeRoles): string | undefined {\n if (!roles) {\n return undefined;\n }\n if (Array.isArray(roles)) {\n return JSON.stringify(roles);\n }\n const normalized = roles.trim();\n return normalized || undefined;\n}\n\nfunction buildKnowledgeHeaders(options: {\n appCode?: string;\n roles?: KnowledgeRoles;\n}): Record<string, string> | undefined {\n const headers: Record<string, string> = {};\n const appCode = normalizeAppHeaderValue(options.appCode);\n const roles = normalizeRolesHeaderValue(options.roles);\n\n if (appCode) {\n headers[\"X-App-Code\"] = appCode;\n }\n if (roles) {\n headers[\"X-App-User-Roles\"] = roles;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveUploadFilename(file: File | Blob, fileName?: string): string | undefined {\n const normalized = fileName?.trim();\n if (normalized) {\n return normalized;\n }\n if (\"name\" in file && typeof file.name === \"string\" && file.name.trim()) {\n return file.name.trim();\n }\n return undefined;\n}\n\nfunction appendUploadFile(formData: FormData, file: File | Blob, fileName?: string): void {\n const resolvedFileName = resolveUploadFilename(file, fileName);\n if (resolvedFileName) {\n formData.append(\"file\", file, resolvedFileName);\n return;\n }\n formData.append(\"file\", file);\n}\n\nfunction isTerminalIndexingStatus(status?: string): boolean {\n return TERMINAL_INDEXING_STATUSES.has(String(status || \"\").toLowerCase());\n}\n\nfunction isIndexingStatusDone(response: KnowledgeIndexingStatusResponse | null): boolean {\n const statuses = response?.data || [];\n return statuses.length > 0 && statuses.every((item) => isTerminalIndexingStatus(item.indexing_status));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createKnowledgeClient(http: HttpClient): KnowledgeClient {\n const datasetIdCache = new Map<string, string>();\n\n async function getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>> {\n const orgCode = options.orgCode?.trim();\n if (!orgCode) {\n return createErrorResult(\"orgCode is required to resolve datasetId\", 400);\n }\n\n const cachedDatasetId = datasetIdCache.get(orgCode);\n if (cachedDatasetId && !options.refresh) {\n return {\n data: { dataset_id: cachedDatasetId },\n error: null,\n status: 200,\n };\n }\n\n const result = await http.request<KnowledgeDatasetIdResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/current-id`,\n method: \"get\",\n params: {\n org_code: orgCode,\n },\n });\n\n if (result.data?.dataset_id) {\n datasetIdCache.set(orgCode, result.data.dataset_id);\n } else {\n datasetIdCache.delete(orgCode);\n }\n\n return result;\n }\n\n async function resolveDatasetId(\n options: KnowledgeResolveOptions\n ): Promise<ClientResult<string>> {\n if (options.datasetId?.trim()) {\n return {\n data: options.datasetId.trim(),\n error: null,\n status: 200,\n };\n }\n\n if (!options.orgCode?.trim()) {\n return createErrorResult(\"Either datasetId or orgCode is required\", 400);\n }\n\n const result = await getDatasetId({\n orgCode: options.orgCode,\n refresh: options.refresh,\n });\n\n if (!result.data?.dataset_id) {\n return {\n data: null,\n error:\n result.error ||\n {\n message: \"Failed to resolve datasetId\",\n status: result.status,\n },\n status: result.status,\n };\n }\n\n return {\n data: result.data.dataset_id,\n error: null,\n status: result.status,\n headers: result.headers,\n };\n }\n\n function invalidateCacheOnNotFound(options: KnowledgeResolveOptions, status: number): void {\n if (status !== 404 || options.datasetId || !options.orgCode?.trim()) {\n return;\n }\n datasetIdCache.delete(options.orgCode.trim());\n }\n\n async function getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const result = await http.request<KnowledgeIndexingStatusResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(\n datasetId.data\n )}/batch/${encodeURIComponent(options.batch)}/indexing-status`,\n method: \"get\",\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n }\n\n return {\n getDatasetId,\n\n async listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const useMetadataFilter = !!(options.appCode || options.roles);\n const result = await http.request<KnowledgeDocumentListResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents${\n useMetadataFilter ? \"/v2\" : \"\"\n }`,\n method: \"get\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n roles: options.roles,\n }),\n params: {\n page: options.page,\n limit: options.limit,\n keyword: options.keyword,\n status: options.status === \"all\" ? undefined : options.status,\n sort: options.sort,\n fetch: options.fetch === undefined ? undefined : String(options.fetch),\n },\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n\n async uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const formData = new FormData();\n appendUploadFile(formData, options.file, options.fileName);\n\n if (options.config !== undefined) {\n formData.append(\"data\", JSON.stringify(options.config));\n }\n\n const result = await http.request<KnowledgeUploadResponse>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/upload`,\n method: \"post\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n }),\n data: formData,\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n\n getIndexingStatus,\n\n async waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const startedAt = Date.now();\n const intervalMs = Math.max(1, options.intervalMs ?? DEFAULT_WAIT_INTERVAL_MS);\n const timeoutMs = Math.max(intervalMs, options.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS);\n let lastResult: ClientResult<KnowledgeIndexingStatusResponse> | null = null;\n\n while (Date.now() - startedAt <= timeoutMs) {\n lastResult = await getIndexingStatus(options);\n\n if (lastResult.error) {\n return lastResult;\n }\n\n if (isIndexingStatusDone(lastResult.data)) {\n return lastResult;\n }\n\n await sleep(intervalMs);\n }\n\n return createErrorResult(\n \"Timed out waiting for document indexing to finish\",\n 408,\n lastResult?.data\n );\n },\n\n async deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const result = await http.request<null>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(\n datasetId.data\n )}/documents/${encodeURIComponent(options.documentId)}`,\n method: \"delete\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n }),\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n\n async updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>> {\n const datasetId = await resolveDatasetId(options);\n if (!datasetId.data) {\n return createErrorResult(\n datasetId.error?.message || \"Failed to resolve datasetId\",\n datasetId.status,\n datasetId.error?.details\n );\n }\n\n const result = await http.request<{ result: string }>({\n url: `${WORKFLOW_CONSOLE_BASE}/datasets/${encodeURIComponent(datasetId.data)}/documents/metadata`,\n method: \"post\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n data: {\n operation_data: options.operation_data,\n },\n });\n\n invalidateCacheOnNotFound(options, result.status);\n return result;\n },\n };\n}\n","/**\n * ============================================================================\n * @amaster.ai/client - Unified Amaster Client\n * ============================================================================\n *\n * Supabase-inspired unified API client for the Amaster platform\n *\n * Features:\n * - Single client instance for all services (auth, entity, bpm, workflow)\n * - Automatic token management and refresh\n * - Auto-attach authentication to all requests\n * - Centralized error handling\n *\n * @example\n * ```typescript\n * const client = createClient({\n * onUnauthorized: () => window.location.href = '/login'\n * });\n *\n * // Login\n * await client.auth.login({ email, password });\n *\n * // All subsequent requests automatically include auth token\n * await client.entity.list('default', 'users');\n * await client.bpm.startProcess('approval', { amount: 1000 });\n * await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\n\nimport { createAuthClient, type AuthClient } from \"@amaster.ai/auth-client\";\nimport { createEntityClient, type EntityClient } from \"@amaster.ai/entity-client\";\nimport { createBpmClient, type BpmClient } from \"@amaster.ai/bpm-client\";\nimport { createWorkflowClient, type WorkflowClient } from \"@amaster.ai/workflow-client\";\nimport {\n createASRClient,\n createASRHttpClient,\n type ASRClientConfig,\n type ASRClient,\n type ASRHttpClientConfig,\n type ASRHttpClient,\n} from \"@amaster.ai/asr-client\";\nimport { createCopilotClient, type CopilotClient } from \"@amaster.ai/copilot-client\";\nimport { createFunctionClient, type FunctionClient } from \"@amaster.ai/function-client\";\nimport { createTTSClient, TTSClientConfig, type TTSClient } from \"@amaster.ai/tts-client\";\nimport { createS3Client, type S3Client } from \"@amaster.ai/s3-client\";\nimport {\n createHttpClient,\n type HttpClient,\n type RequestConfig,\n type ClientResult,\n} from \"@amaster.ai/http-client\";\nimport { createKnowledgeClient, type KnowledgeClient } from \"./knowledge\";\nimport type { AmasterClient, AmasterClientOptions } from \"./types\";\n\n/**\n * Create a unified Amaster client instance\n *\n * This function creates a single client that provides access to all Amaster services:\n * - Authentication (login, register, logout)\n * - Entity CRUD operations\n * - BPM (Business Process Management)\n * - Workflow execution\n *\n * All sub-clients automatically share the same HTTP client and authentication state,\n * ensuring that tokens are consistently attached to all requests.\n *\n * @param options - Client configuration options\n * @returns A unified Amaster client instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const client = createClient();\n *\n * // With authentication callbacks\n * const client = createClient({\n * onUnauthorized: () => {\n * // Redirect to login or show auth modal\n * window.location.href = '/login';\n * },\n * onTokenExpired: () => {\n * console.log('Token expired, refreshing...');\n * }\n * });\n *\n * // Login\n * await client.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Now all requests automatically include the auth token\n * const users = await client.entity.list('default', 'users');\n * const tasks = await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\nexport function createClient(options: AmasterClientOptions = {}): AmasterClient {\n const {\n baseURL,\n env = \"dev\",\n headers = {},\n onUnauthorized,\n onTokenExpired,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n } = options;\n\n // Create the base HTTP client\n const baseHttpClient = createHttpClient({\n baseURL,\n headers,\n runtime,\n });\n\n // Create the auth client first using the same base HTTP implementation so\n // mini-program request handling stays consistent across all modules.\n const auth: AuthClient = createAuthClient({\n baseURL,\n headers,\n onTokenExpired,\n onUnauthorized,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n });\n\n // Create a wrapper HTTP client that automatically adds the auth token\n const createAuthenticatedHttpClient = (): HttpClient => {\n // Track if we're currently refreshing to avoid multiple simultaneous refreshes\n let isRefreshing = false;\n let refreshPromise: Promise<boolean> | null = null;\n\n /**\n * Check if 401 error is due to token expiration\n * Traefik JWT plugin returns plain text like \"Jwt is expired\" or \"Token is expired\"\n */\n function isTokenExpired(result: ClientResult<unknown>): boolean {\n if (result.status !== 401) return false;\n\n // Check error message (could be from backend JSON response)\n if (result.error?.message && /expired/i.test(result.error.message)) {\n return true;\n }\n\n // Check error details (traefik returns plain text in details)\n if (result.error?.details) {\n const details = result.error.details;\n if (typeof details === \"string\" && /expired/i.test(details)) {\n return true;\n }\n // Also check if details is an object with message field\n if (typeof details === \"object\" && details !== null) {\n const detailsObj = details as Record<string, unknown>;\n if (typeof detailsObj.message === \"string\" && /expired/i.test(detailsObj.message)) {\n return true;\n }\n }\n }\n\n // Check raw data (could be plain text from traefik)\n if (typeof result.data === \"string\" && /expired/i.test(result.data)) {\n return true;\n }\n\n // If we have a token but got 401, assume it might be expired\n return !!auth.getAccessToken();\n }\n\n return {\n async request<T>(config: RequestConfig): Promise<ClientResult<T>> {\n // Get the current token from auth client\n const token = auth.getAccessToken();\n\n // Merge Authorization header with existing headers\n const authHeaders = token ? { Authorization: `Bearer ${token}` } : {};\n const mergedConfig: RequestConfig = {\n ...config,\n headers: {\n ...config.headers,\n ...authHeaders,\n },\n };\n\n // Make the request with the updated config\n let result = await baseHttpClient.request<T>(mergedConfig);\n\n // Handle 401 errors with automatic token refresh\n if (result.status === 401 && isTokenExpired(result)) {\n // Attempt to refresh token\n if (!isRefreshing) {\n isRefreshing = true;\n refreshPromise = (async () => {\n try {\n const refreshResult = await auth.refreshToken();\n return !!refreshResult.data;\n } finally {\n isRefreshing = false;\n refreshPromise = null;\n }\n })();\n }\n\n const refreshed = await refreshPromise;\n\n if (refreshed) {\n // Retry with new token\n const newToken = auth.getAccessToken();\n result = await baseHttpClient.request<T>({\n ...config,\n headers: {\n ...config.headers,\n ...(newToken ? { Authorization: `Bearer ${newToken}` } : {}),\n },\n });\n }\n }\n\n // Trigger unauthorized if still 401\n if (result.status === 401 && onUnauthorized) {\n onUnauthorized();\n }\n\n return result;\n },\n };\n };\n\n const authenticatedHttpClient = createAuthenticatedHttpClient();\n\n let cachedUserUid: string | null = null;\n\n auth.on(\"login\", (user: { uid?: string }) => {\n cachedUserUid = user?.uid ?? null;\n });\n auth.on(\"logout\", () => {\n cachedUserUid = null;\n });\n\n if (auth.isAuthenticated()) {\n auth\n .getMe()\n .then((result) => {\n if (result.data?.uid) {\n cachedUserUid = result.data.uid;\n }\n })\n .catch(() => {});\n }\n\n // Create other clients using the authenticated HTTP client\n const entity: EntityClient = createEntityClient(authenticatedHttpClient);\n const bpm: BpmClient = createBpmClient(authenticatedHttpClient);\n const workflow: WorkflowClient = createWorkflowClient(authenticatedHttpClient, {\n env,\n });\n const functionClient: FunctionClient = createFunctionClient(authenticatedHttpClient);\n const knowledge: KnowledgeClient = createKnowledgeClient(authenticatedHttpClient);\n const copilot: CopilotClient = createCopilotClient(\n authenticatedHttpClient,\n baseURL,\n () => auth.getAccessToken(),\n () => cachedUserUid\n );\n const s3: S3Client = createS3Client(authenticatedHttpClient);\n\n // ASR and TTS clients use WebSocket, pass token getter for authentication\n // Token can be appended to WebSocket URL as query parameter\n const asr: (config: ASRClientConfig) => ASRClient = createASRClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n const asrHttp: (config: ASRHttpClientConfig) => ASRHttpClient = createASRHttpClient({\n getAccessToken: () => auth.getAccessToken(),\n http: authenticatedHttpClient,\n });\n const tts: (config: TTSClientConfig) => TTSClient = createTTSClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n\n // Return unified client interface\n const client: AmasterClient = {\n auth,\n entity,\n bpm,\n workflow,\n asr,\n asrHttp,\n copilot,\n function: functionClient,\n knowledge,\n tts,\n s3,\n http: authenticatedHttpClient,\n\n // Expose token management methods from auth client\n isAuthenticated: () => auth.isAuthenticated(),\n getAccessToken: () => auth.getAccessToken(),\n setAccessToken: (token: string) => auth.setAccessToken(token),\n clearAuth: () => auth.clearAuth(),\n };\n\n return client;\n}\n"]}
1
+ {"version":3,"sources":["../src/knowledge.ts","../src/client.ts"],"names":["result"],"mappings":";;;;;;;;;;;;;;;;AAEA,IAAM,sBAAA,GAAyB,mBAAA;AAC/B,IAAM,wBAAA,GAA2B,IAAA;AACjC,IAAM,uBAAA,GAA0B,IAAA;AAChC,IAAM,0BAAA,uBAAiC,GAAA,CAAI,CAAC,aAAa,OAAA,EAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AAiKtF,SAAS,iBAAA,CACP,OAAA,EACA,MAAA,EACA,OAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,wBAAwB,KAAA,EAAoC;AACnE,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,EAAK;AAC/B,EAAA,OAAO,UAAA,IAAc,MAAA;AACvB;AAEA,SAAS,wBAAwB,KAAA,EAAoC;AACnE,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,EAAK;AAC/B,EAAA,OAAO,UAAA,IAAc,MAAA;AACvB;AAEA,SAAS,0BAA0B,OAAA,EAGZ;AACrB,EAAA,OAAO,wBAAwB,OAAA,CAAQ,WAAW,CAAA,IAAK,uBAAA,CAAwB,QAAQ,QAAQ,CAAA;AACjG;AAEA,SAAS,kCACP,QAAA,EACoB;AACpB,EAAA,OAAO,wBAAwB,QAAA,EAAU,YAAY,CAAA,IAAK,uBAAA,CAAwB,UAAU,SAAS,CAAA;AACvG;AAEA,SAAS,2BACP,QAAA,EACmC;AACnC,EAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,QAAA,EAAU,UAAU,CAAA;AAC9D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,kCAAkC,QAAQ,CAAA;AAC9D,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,SAAA;AAAA,IACZ,GAAI,cAAc,EAAE,SAAA,EAAW,aAAa,YAAA,EAAc,WAAA,KAAgB;AAAC,GAC7E;AACF;AAEA,SAAS,0BAA0B,KAAA,EAA4C;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,OAAO,UAAA,IAAc,MAAA;AACvB;AAEA,SAAS,sBAAsB,OAAA,EAIQ;AACrC,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,OAAA,CAAQ,OAAO,CAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,yBAAA,CAA0B,OAAA,CAAQ,KAAK,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,OAAA,CAAQ,WAAW,CAAA;AAE/D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,OAAA;AAAA,EAC1B;AACA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,KAAA;AAAA,EAChC;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,gBAAgB,CAAA,GAAI,WAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AACrD;AAEA,SAAS,qBAAA,CAAsB,MAAmB,QAAA,EAAuC;AACvF,EAAA,MAAM,UAAA,GAAa,UAAU,IAAA,EAAK;AAClC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,IAAU,QAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,EAAG;AACvE,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,EAAK;AAAA,EACxB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,QAAA,EAAoB,IAAA,EAAmB,QAAA,EAAyB;AACxF,EAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,IAAA,EAAM,QAAQ,CAAA;AAC7D,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,gBAAgB,CAAA;AAC9C,IAAA;AAAA,EACF;AACA,EAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC9B;AAEA,SAAS,yBAAyB,MAAA,EAA0B;AAC1D,EAAA,OAAO,2BAA2B,GAAA,CAAI,MAAA,CAAO,UAAU,EAAE,CAAA,CAAE,aAAa,CAAA;AAC1E;AAEA,SAAS,qBAAqB,QAAA,EAA2D;AACvF,EAAA,MAAM,QAAA,GAAW,QAAA,EAAU,IAAA,IAAQ,EAAC;AACpC,EAAA,OAAO,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,KAAS,wBAAA,CAAyB,IAAA,CAAK,eAAe,CAAC,CAAA;AACvG;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEO,SAAS,sBAAsB,IAAA,EAAmC;AACvE,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAwC;AAEnE,EAAA,eAAe,aACb,OAAA,EACmD;AACnD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,iBAAA,CAAkB,4CAA4C,GAAG,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAChD,IAAA,IAAI,aAAA,IAAiB,CAAC,OAAA,CAAQ,OAAA,EAAS;AACrC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAoC;AAAA,MAC5D,GAAA,EAAK,GAAG,sBAAsB,CAAA,oBAAA,CAAA;AAAA,MAC9B,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,0BAAA,CAA2B,MAAA,CAAO,IAAI,CAAA;AAC7D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,cAAA,CAAe,GAAA,CAAI,SAAS,cAAc,CAAA;AAC1C,MAAA,MAAA,CAAO,IAAA,GAAO,cAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,eAAe,eACb,OAAA,EACoE;AACpE,IAAA,MAAM,WAAA,GAAc,0BAA0B,OAAO,CAAA;AACrD,IAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,IAAA,EAAK,EAAG;AAC7B,MAAA,IAAI,CAAC,WAAA,IAAe,OAAA,CAAQ,OAAA,EAAS,MAAK,EAAG;AAC3C,QAAA,MAAMA,OAAAA,GAAS,MAAM,YAAA,CAAa;AAAA,UAChC,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,SAAS,OAAA,CAAQ;AAAA,SAClB,CAAA;AACD,QAAA,IAAI,CAACA,OAAAA,CAAO,IAAA,EAAM,UAAA,EAAY;AAC5B,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,IAAA;AAAA,YACN,KAAA,EACEA,QAAO,KAAA,IACP;AAAA,cACE,OAAA,EAAS,qCAAA;AAAA,cACT,QAAQA,OAAAA,CAAO;AAAA,aACjB;AAAA,YACF,QAAQA,OAAAA,CAAO;AAAA,WACjB;AAAA,QACF;AACA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAK;AAAA,YAClC,WAAA,EAAa,iCAAA,CAAkCA,OAAAA,CAAO,IAAI;AAAA,WAC5D;AAAA,UACA,KAAA,EAAO,IAAA;AAAA,UACP,QAAQA,OAAAA,CAAO,MAAA;AAAA,UACf,SAASA,OAAAA,CAAO;AAAA,SAClB;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM;AAAA,UACJ,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAK;AAAA,UAClC;AAAA,SACF;AAAA,QACA,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK,EAAG;AAC5B,MAAA,OAAO,iBAAA,CAAkB,2CAA2C,GAAG,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,MAChC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY;AAC5B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EACE,OAAO,KAAA,IACP;AAAA,UACE,OAAA,EAAS,6BAAA;AAAA,UACT,QAAQ,MAAA,CAAO;AAAA,SACjB;AAAA,QACF,QAAQ,MAAA,CAAO;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,OAAO,IAAA,CAAK,UAAA;AAAA,QACvB,WAAA,EAAa,iCAAA,CAAkC,MAAA,CAAO,IAAI;AAAA,OAC5D;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,MAAA,CAAO;AAAA,KAClB;AAAA,EACF;AAEA,EAAA,SAAS,mCAAA,CAAoC,SAAkC,MAAA,EAAsB;AACnG,IAAA,IAAK,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAQ,OAAA,CAAQ,aAAa,CAAC,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAK,EAAG;AACvF,MAAA;AAAA,IACF;AACA,IAAA,cAAA,CAAe,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,eAAe,kBACb,OAAA,EACwD;AACxD,IAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,IAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,MAAA,OAAO,iBAAA;AAAA,QACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,QAClC,eAAA,CAAgB,MAAA;AAAA,QAChB,gBAAgB,KAAA,EAAO;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAyC;AAAA,MACjE,GAAA,EAAK,CAAA,EAAG,sBAAsB,CAAA,UAAA,EAAa,kBAAA;AAAA,QACzC,gBAAgB,IAAA,CAAK;AAAA,OACtB,CAAA,OAAA,EAAU,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAC,CAAA,gBAAA,CAAA;AAAA,MAC5C,MAAA,EAAQ,KAAA;AAAA,MACR,SAAS,qBAAA,CAAsB;AAAA,QAC7B,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,OACnC;AAAA,KACF,CAAA;AAED,IAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IAEA,MAAM,cACJ,OAAA,EACsD;AACtD,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,iBAAA,GAAoB,CAAC,EAAE,OAAA,CAAQ,WAAW,OAAA,CAAQ,KAAA,CAAA;AACxD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAuC;AAAA,QAC/D,GAAA,EAAK,CAAA,EAAG,sBAAsB,CAAA,UAAA,EAAa,kBAAA,CAAmB,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAC,CAAA,UAAA,EAC3F,iBAAA,GAAoB,KAAA,GAAQ,EAC9B,CAAA,CAAA;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,qBAAA,CAAsB;AAAA,UAC7B,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,SACnC,CAAA;AAAA,QACD,MAAA,EAAQ;AAAA,UACN,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,MAAA,EAAQ,OAAA,CAAQ,MAAA,KAAW,KAAA,GAAQ,SAAY,OAAA,CAAQ,MAAA;AAAA,UACvD,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,OAAO,OAAA,CAAQ,KAAA,KAAU,SAAY,MAAA,GAAY,MAAA,CAAO,QAAQ,KAAK;AAAA;AACvE,OACD,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,eACJ,OAAA,EACgD;AAChD,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,MAAA,gBAAA,CAAiB,QAAA,EAAU,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAEzD,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,QAAA,QAAA,CAAS,OAAO,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MACxD;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAiC;AAAA,QACzD,GAAA,EAAK,GAAG,sBAAsB,CAAA,UAAA,EAAa,mBAAmB,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAC,CAAA,iBAAA,CAAA;AAAA,QAC7F,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,qBAAA,CAAsB;AAAA,UAC7B,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,SACnC,CAAA;AAAA,QACD,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,iBAAA;AAAA,IAEA,MAAM,gBACJ,OAAA,EACwD;AACxD,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,cAAc,wBAAwB,CAAA;AAC7E,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,aAAa,uBAAuB,CAAA;AACnF,MAAA,IAAI,UAAA,GAAmE,IAAA;AAEvE,MAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,IAAa,SAAA,EAAW;AAC1C,QAAA,UAAA,GAAa,MAAM,kBAAkB,OAAO,CAAA;AAE5C,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,IAAI,oBAAA,CAAqB,UAAA,CAAW,IAAI,CAAA,EAAG;AACzC,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,MAAM,MAAM,UAAU,CAAA;AAAA,MACxB;AAEA,MAAA,OAAO,iBAAA;AAAA,QACL,mDAAA;AAAA,QACA,GAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,eAAe,OAAA,EAAsE;AACzF,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAc;AAAA,QACtC,GAAA,EAAK,CAAA,EAAG,sBAAsB,CAAA,UAAA,EAAa,kBAAA;AAAA,UACzC,gBAAgB,IAAA,CAAK;AAAA,SACtB,CAAA,WAAA,EAAc,kBAAA,CAAmB,OAAA,CAAQ,UAAU,CAAC,CAAA,CAAA;AAAA,QACrD,MAAA,EAAQ,QAAA;AAAA,QACR,SAAS,qBAAA,CAAsB;AAAA,UAC7B,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,WAAA,EAAa,gBAAgB,IAAA,CAAK;AAAA,SACnC;AAAA,OACF,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,wBACJ,OAAA,EAC2C;AAC3C,MAAA,MAAM,eAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,gBAAgB,IAAA,EAAM;AACzB,QAAA,OAAO,iBAAA;AAAA,UACL,eAAA,CAAgB,OAAO,OAAA,IAAW,6BAAA;AAAA,UAClC,eAAA,CAAgB,MAAA;AAAA,UAChB,gBAAgB,KAAA,EAAO;AAAA,SACzB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAA4B;AAAA,QACpD,GAAA,EAAK,GAAG,sBAAsB,CAAA,UAAA,EAAa,mBAAmB,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAC,CAAA,mBAAA,CAAA;AAAA,QAC7F,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAI,eAAA,CAAgB,IAAA,CAAK,WAAA,GAAc,EAAE,kBAAkB,eAAA,CAAgB,IAAA,CAAK,WAAA,EAAY,GAAI;AAAC,SACnG;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,gBAAgB,OAAA,CAAQ;AAAA;AAC1B,OACD,CAAA;AAED,MAAA,mCAAA,CAAoC,OAAA,EAAS,OAAO,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AACF;;;AChfO,SAAS,YAAA,CAAa,OAAA,GAAgC,EAAC,EAAkB;AAC9E,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,GAAA,GAAM,KAAA;AAAA,IACN,UAAU,EAAC;AAAA,IACX,cAAA;AAAA,IACA,cAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,iBAAiB,gBAAA,CAAiB;AAAA,IACtC,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAID,EAAA,MAAM,OAAmB,gBAAA,CAAiB;AAAA,IACxC,OAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,gCAAgC,MAAkB;AAEtD,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,IAAI,cAAA,GAA0C,IAAA;AAM9C,IAAA,SAAS,eAAe,MAAA,EAAwC;AAC9D,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,GAAA,EAAK,OAAO,KAAA;AAGlC,MAAA,IAAI,MAAA,CAAO,OAAO,OAAA,IAAW,UAAA,CAAW,KAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAClE,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAA,CAAO,OAAO,OAAA,EAAS;AACzB,QAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,OAAA;AAC7B,QAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3D,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,UAAA,MAAM,UAAA,GAAa,OAAA;AACnB,UAAA,IAAI,OAAO,WAAW,OAAA,KAAY,QAAA,IAAY,WAAW,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AACjF,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,WAAW,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AACnE,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,OAAO,CAAC,CAAC,IAAA,CAAK,cAAA,EAAe;AAAA,IAC/B;AAEA,IAAA,OAAO;AAAA,MACL,MAAM,QAAW,MAAA,EAAiD;AAEhE,QAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,EAAe;AAGlC,QAAA,MAAM,WAAA,GAAc,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO,EAAC;AACpE,QAAA,MAAM,YAAA,GAA8B;AAAA,UAClC,GAAG,MAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACP,GAAG,MAAA,CAAO,OAAA;AAAA,YACV,GAAG;AAAA;AACL,SACF;AAGA,QAAA,IAAI,MAAA,GAAS,MAAM,cAAA,CAAe,OAAA,CAAW,YAAY,CAAA;AAGzD,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,GAAA,IAAO,cAAA,CAAe,MAAM,CAAA,EAAG;AAEnD,UAAA,IAAI,CAAC,YAAA,EAAc;AACjB,YAAA,YAAA,GAAe,IAAA;AACf,YAAA,cAAA,GAAA,CAAkB,YAAY;AAC5B,cAAA,IAAI;AACF,gBAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,YAAA,EAAa;AAC9C,gBAAA,OAAO,CAAC,CAAC,aAAA,CAAc,IAAA;AAAA,cACzB,CAAA,SAAE;AACA,gBAAA,YAAA,GAAe,KAAA;AACf,gBAAA,cAAA,GAAiB,IAAA;AAAA,cACnB;AAAA,YACF,CAAA,GAAG;AAAA,UACL;AAEA,UAAA,MAAM,YAAY,MAAM,cAAA;AAExB,UAAA,IAAI,SAAA,EAAW;AAEb,YAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,YAAA,MAAA,GAAS,MAAM,eAAe,OAAA,CAAW;AAAA,cACvC,GAAG,MAAA;AAAA,cACH,OAAA,EAAS;AAAA,gBACP,GAAG,MAAA,CAAO,OAAA;AAAA,gBACV,GAAI,WAAW,EAAE,aAAA,EAAe,UAAU,QAAQ,CAAA,CAAA,KAAO;AAAC;AAC5D,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,GAAA,IAAO,cAAA,EAAgB;AAC3C,UAAA,cAAA,EAAe;AAAA,QACjB;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,0BAA0B,6BAAA,EAA8B;AAE9D,EAAA,IAAI,aAAA,GAA+B,IAAA;AAEnC,EAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAA2B;AAC3C,IAAA,aAAA,GAAgB,MAAM,GAAA,IAAO,IAAA;AAAA,EAC/B,CAAC,CAAA;AACD,EAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,IAAA,aAAA,GAAgB,IAAA;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,IAAI,IAAA,CAAK,iBAAgB,EAAG;AAC1B,IAAA,IAAA,CACG,KAAA,EAAM,CACN,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,MAAA,CAAO,MAAM,GAAA,EAAK;AACpB,QAAA,aAAA,GAAgB,OAAO,IAAA,CAAK,GAAA;AAAA,MAC9B;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,MAAA,GAAuB,mBAAmB,uBAAuB,CAAA;AACvE,EAAA,MAAM,GAAA,GAAiB,gBAAgB,uBAAuB,CAAA;AAC9D,EAAA,MAAM,QAAA,GAA2B,qBAAqB,uBAAA,EAAyB;AAAA,IAC7E;AAAA,GACD,CAAA;AACD,EAAA,MAAM,cAAA,GAAiC,qBAAqB,uBAAuB,CAAA;AACnF,EAAA,MAAM,SAAA,GAA6B,sBAAsB,uBAAuB,CAAA;AAChF,EAAA,MAAM,OAAA,GAAyB,mBAAA;AAAA,IAC7B,uBAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC1B,MAAM;AAAA,GACR;AACA,EAAA,MAAM,EAAA,GAAe,eAAe,uBAAuB,CAAA;AAI3D,EAAA,MAAM,MAA8C,eAAA,CAAgB;AAAA,IAClE,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA;AAAe,GAC3C,CAAA;AACD,EAAA,MAAM,UAA0D,mBAAA,CAAoB;AAAA,IAClF,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA,EAAe;AAAA,IAC1C,IAAA,EAAM;AAAA,GACP,CAAA;AACD,EAAA,MAAM,MAA8C,eAAA,CAAgB;AAAA,IAClE,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA;AAAe,GAC3C,CAAA;AAGD,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,IAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU,cAAA;AAAA,IACV,SAAA;AAAA,IACA,GAAA;AAAA,IACA,EAAA;AAAA,IACA,IAAA,EAAM,uBAAA;AAAA;AAAA,IAGN,eAAA,EAAiB,MAAM,IAAA,CAAK,eAAA,EAAgB;AAAA,IAC5C,cAAA,EAAgB,MAAM,IAAA,CAAK,cAAA,EAAe;AAAA,IAC1C,cAAA,EAAgB,CAAC,KAAA,KAAkB,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,IAC5D,SAAA,EAAW,MAAM,IAAA,CAAK,SAAA;AAAU,GAClC;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import { type ClientResult, type HttpClient } from \"@amaster.ai/http-client\";\n\nconst KNOWLEDGE_OPENAPI_BASE = \"/api/knowledge/v1\";\nconst DEFAULT_WAIT_INTERVAL_MS = 2500;\nconst DEFAULT_WAIT_TIMEOUT_MS = 120000;\nconst TERMINAL_INDEXING_STATUSES = new Set([\"completed\", \"error\", \"paused\", \"stopped\"]);\n\nexport type KnowledgeDocumentStatus = \"completed\" | \"indexing\" | \"error\" | \"paused\";\nexport type KnowledgeDocumentListStatus = KnowledgeDocumentStatus | \"all\";\nexport type KnowledgeRoles = string | string[];\n\nexport type KnowledgeDatasetIdResponse = {\n dataset_id: string;\n tenant_id?: string;\n workspace_id?: string;\n};\n\nexport type KnowledgeDocument = {\n id: string;\n name: string;\n data_source_type?: string;\n doc_type?: string | null;\n doc_form?: string | null;\n indexing_status?: string;\n display_status?: string;\n enabled?: boolean;\n archived?: boolean;\n word_count?: number;\n hit_count?: number;\n position?: number;\n created_at?: number;\n updated_at?: number;\n completed_segments?: number;\n total_segments?: number;\n [key: string]: unknown;\n};\n\nexport type KnowledgeDocumentListResponse = {\n data: KnowledgeDocument[];\n total: number;\n page: number;\n limit: number;\n has_more: boolean;\n};\n\nexport type KnowledgeIndexingStatus = {\n id: string;\n name?: string;\n indexing_status?: string;\n processing_started_at?: number | null;\n parsing_completed_at?: number | null;\n cleaning_completed_at?: number | null;\n splitting_completed_at?: number | null;\n completed_at?: number | null;\n paused_at?: number | null;\n stopped_at?: number | null;\n completed_segments?: number;\n total_segments?: number;\n error?: string | null;\n [key: string]: unknown;\n};\n\nexport type KnowledgeIndexingStatusResponse = {\n data: KnowledgeIndexingStatus[];\n};\n\nexport type KnowledgeUploadResponse = {\n document: KnowledgeDocument;\n batch: string;\n};\n\nexport type KnowledgeMetadataField = {\n id: string;\n name: string;\n type?: \"string\" | \"number\" | \"time\" | string;\n value: unknown;\n};\n\nexport type KnowledgeMetadataOperation = {\n document_id: string;\n metadata_list: KnowledgeMetadataField[];\n partial_update?: boolean;\n};\n\nexport type KnowledgeMetadataUpdateRequest = {\n operation_data: KnowledgeMetadataOperation[];\n};\n\nexport type KnowledgeResolveOptions =\n | {\n datasetId: string;\n orgCode?: string;\n refresh?: boolean;\n workspaceId?: string;\n tenantId?: string;\n }\n | {\n datasetId?: string;\n orgCode: string;\n refresh?: boolean;\n workspaceId?: string;\n tenantId?: string;\n };\n\nexport type KnowledgeGetDatasetIdOptions = {\n orgCode: string;\n refresh?: boolean;\n};\n\nexport type KnowledgeListDocumentsOptions = KnowledgeResolveOptions & {\n page?: number;\n limit?: number;\n keyword?: string;\n status?: KnowledgeDocumentListStatus;\n sort?: string;\n fetch?: boolean | string;\n appCode?: string;\n roles?: KnowledgeRoles;\n};\n\nexport type KnowledgeUploadDocumentOptions = KnowledgeResolveOptions & {\n file: File | Blob;\n fileName?: string;\n appCode?: string;\n config?: Record<string, unknown>;\n};\n\nexport type KnowledgeIndexingStatusOptions = KnowledgeResolveOptions & {\n batch: string;\n};\n\nexport type KnowledgeWaitForIndexingOptions = KnowledgeIndexingStatusOptions & {\n intervalMs?: number;\n timeoutMs?: number;\n};\n\nexport type KnowledgeDeleteDocumentOptions = KnowledgeResolveOptions & {\n documentId: string;\n appCode?: string;\n};\n\nexport type KnowledgeUpdateDocumentsMetadataOptions = KnowledgeResolveOptions &\n KnowledgeMetadataUpdateRequest;\n\nexport type KnowledgeClient = {\n getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>>;\n listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>>;\n uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>>;\n getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>>;\n deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>>;\n updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>>;\n};\n\nfunction createErrorResult<T>(\n message: string,\n status: number,\n details?: unknown\n): ClientResult<T> {\n return {\n data: null,\n error: {\n message,\n status,\n details,\n },\n status,\n };\n}\n\nfunction normalizeAppHeaderValue(value?: string): string | undefined {\n const normalized = value?.trim();\n return normalized || undefined;\n}\n\nfunction normalizeOptionalString(value?: string): string | undefined {\n const normalized = value?.trim();\n return normalized || undefined;\n}\n\nfunction getWorkspaceIdFromOptions(options: {\n workspaceId?: string;\n tenantId?: string;\n}): string | undefined {\n return normalizeOptionalString(options.workspaceId) || normalizeOptionalString(options.tenantId);\n}\n\nfunction getWorkspaceIdFromDatasetResponse(\n response?: KnowledgeDatasetIdResponse | null\n): string | undefined {\n return normalizeOptionalString(response?.workspace_id) || normalizeOptionalString(response?.tenant_id);\n}\n\nfunction normalizeDatasetIdResponse(\n response?: KnowledgeDatasetIdResponse | null\n): KnowledgeDatasetIdResponse | null {\n const datasetId = normalizeOptionalString(response?.dataset_id);\n if (!datasetId) {\n return null;\n }\n\n const workspaceId = getWorkspaceIdFromDatasetResponse(response);\n return {\n dataset_id: datasetId,\n ...(workspaceId ? { tenant_id: workspaceId, workspace_id: workspaceId } : {}),\n };\n}\n\nfunction normalizeRolesHeaderValue(roles?: KnowledgeRoles): string | undefined {\n if (!roles) {\n return undefined;\n }\n if (Array.isArray(roles)) {\n return JSON.stringify(roles);\n }\n const normalized = roles.trim();\n return normalized || undefined;\n}\n\nfunction buildKnowledgeHeaders(options: {\n appCode?: string;\n roles?: KnowledgeRoles;\n workspaceId?: string;\n}): Record<string, string> | undefined {\n const headers: Record<string, string> = {};\n const appCode = normalizeAppHeaderValue(options.appCode);\n const roles = normalizeRolesHeaderValue(options.roles);\n const workspaceId = normalizeOptionalString(options.workspaceId);\n\n if (appCode) {\n headers[\"X-App-Code\"] = appCode;\n }\n if (roles) {\n headers[\"X-App-User-Roles\"] = roles;\n }\n if (workspaceId) {\n headers[\"X-WORKSPACE-ID\"] = workspaceId;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveUploadFilename(file: File | Blob, fileName?: string): string | undefined {\n const normalized = fileName?.trim();\n if (normalized) {\n return normalized;\n }\n if (\"name\" in file && typeof file.name === \"string\" && file.name.trim()) {\n return file.name.trim();\n }\n return undefined;\n}\n\nfunction appendUploadFile(formData: FormData, file: File | Blob, fileName?: string): void {\n const resolvedFileName = resolveUploadFilename(file, fileName);\n if (resolvedFileName) {\n formData.append(\"file\", file, resolvedFileName);\n return;\n }\n formData.append(\"file\", file);\n}\n\nfunction isTerminalIndexingStatus(status?: string): boolean {\n return TERMINAL_INDEXING_STATUSES.has(String(status || \"\").toLowerCase());\n}\n\nfunction isIndexingStatusDone(response: KnowledgeIndexingStatusResponse | null): boolean {\n const statuses = response?.data || [];\n return statuses.length > 0 && statuses.every((item) => isTerminalIndexingStatus(item.indexing_status));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createKnowledgeClient(http: HttpClient): KnowledgeClient {\n const datasetIdCache = new Map<string, KnowledgeDatasetIdResponse>();\n\n async function getDatasetId(\n options: KnowledgeGetDatasetIdOptions\n ): Promise<ClientResult<KnowledgeDatasetIdResponse>> {\n const orgCode = options.orgCode?.trim();\n if (!orgCode) {\n return createErrorResult(\"orgCode is required to resolve datasetId\", 400);\n }\n\n const cachedDataset = datasetIdCache.get(orgCode);\n if (cachedDataset && !options.refresh) {\n return {\n data: cachedDataset,\n error: null,\n status: 200,\n };\n }\n\n const result = await http.request<KnowledgeDatasetIdResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/current-id`,\n method: \"get\",\n params: {\n org_code: orgCode,\n },\n });\n\n const normalizedData = normalizeDatasetIdResponse(result.data);\n if (normalizedData) {\n datasetIdCache.set(orgCode, normalizedData);\n result.data = normalizedData;\n } else {\n datasetIdCache.delete(orgCode);\n }\n\n return result;\n }\n\n async function resolveDataset(\n options: KnowledgeResolveOptions\n ): Promise<ClientResult<{ datasetId: string; workspaceId?: string }>> {\n const workspaceId = getWorkspaceIdFromOptions(options);\n if (options.datasetId?.trim()) {\n if (!workspaceId && options.orgCode?.trim()) {\n const result = await getDatasetId({\n orgCode: options.orgCode,\n refresh: options.refresh,\n });\n if (!result.data?.dataset_id) {\n return {\n data: null,\n error:\n result.error ||\n {\n message: \"Failed to resolve dataset workspace\",\n status: result.status,\n },\n status: result.status,\n };\n }\n return {\n data: {\n datasetId: options.datasetId.trim(),\n workspaceId: getWorkspaceIdFromDatasetResponse(result.data),\n },\n error: null,\n status: result.status,\n headers: result.headers,\n };\n }\n\n return {\n data: {\n datasetId: options.datasetId.trim(),\n workspaceId,\n },\n error: null,\n status: 200,\n };\n }\n\n if (!options.orgCode?.trim()) {\n return createErrorResult(\"Either datasetId or orgCode is required\", 400);\n }\n\n const result = await getDatasetId({\n orgCode: options.orgCode,\n refresh: options.refresh,\n });\n\n if (!result.data?.dataset_id) {\n return {\n data: null,\n error:\n result.error ||\n {\n message: \"Failed to resolve datasetId\",\n status: result.status,\n },\n status: result.status,\n };\n }\n\n return {\n data: {\n datasetId: result.data.dataset_id,\n workspaceId: getWorkspaceIdFromDatasetResponse(result.data),\n },\n error: null,\n status: result.status,\n headers: result.headers,\n };\n }\n\n function invalidateCacheOnDatasetAccessError(options: KnowledgeResolveOptions, status: number): void {\n if ((status !== 403 && status !== 404) || options.datasetId || !options.orgCode?.trim()) {\n return;\n }\n datasetIdCache.delete(options.orgCode.trim());\n }\n\n async function getIndexingStatus(\n options: KnowledgeIndexingStatusOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const result = await http.request<KnowledgeIndexingStatusResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(\n resolvedDataset.data.datasetId\n )}/batch/${encodeURIComponent(options.batch)}/indexing-status`,\n method: \"get\",\n headers: buildKnowledgeHeaders({\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n }\n\n return {\n getDatasetId,\n\n async listDocuments(\n options: KnowledgeListDocumentsOptions\n ): Promise<ClientResult<KnowledgeDocumentListResponse>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const useMetadataFilter = !!(options.appCode || options.roles);\n const result = await http.request<KnowledgeDocumentListResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents${\n useMetadataFilter ? \"/v2\" : \"\"\n }`,\n method: \"get\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n roles: options.roles,\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n params: {\n page: options.page,\n limit: options.limit,\n keyword: options.keyword,\n status: options.status === \"all\" ? undefined : options.status,\n sort: options.sort,\n fetch: options.fetch === undefined ? undefined : String(options.fetch),\n },\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n\n async uploadDocument(\n options: KnowledgeUploadDocumentOptions\n ): Promise<ClientResult<KnowledgeUploadResponse>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const formData = new FormData();\n appendUploadFile(formData, options.file, options.fileName);\n\n if (options.config !== undefined) {\n formData.append(\"data\", JSON.stringify(options.config));\n }\n\n const result = await http.request<KnowledgeUploadResponse>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/upload`,\n method: \"post\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n data: formData,\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n\n getIndexingStatus,\n\n async waitForIndexing(\n options: KnowledgeWaitForIndexingOptions\n ): Promise<ClientResult<KnowledgeIndexingStatusResponse>> {\n const startedAt = Date.now();\n const intervalMs = Math.max(1, options.intervalMs ?? DEFAULT_WAIT_INTERVAL_MS);\n const timeoutMs = Math.max(intervalMs, options.timeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS);\n let lastResult: ClientResult<KnowledgeIndexingStatusResponse> | null = null;\n\n while (Date.now() - startedAt <= timeoutMs) {\n lastResult = await getIndexingStatus(options);\n\n if (lastResult.error) {\n return lastResult;\n }\n\n if (isIndexingStatusDone(lastResult.data)) {\n return lastResult;\n }\n\n await sleep(intervalMs);\n }\n\n return createErrorResult(\n \"Timed out waiting for document indexing to finish\",\n 408,\n lastResult?.data\n );\n },\n\n async deleteDocument(options: KnowledgeDeleteDocumentOptions): Promise<ClientResult<null>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const result = await http.request<null>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(\n resolvedDataset.data.datasetId\n )}/documents/${encodeURIComponent(options.documentId)}`,\n method: \"delete\",\n headers: buildKnowledgeHeaders({\n appCode: options.appCode,\n workspaceId: resolvedDataset.data.workspaceId,\n }),\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n\n async updateDocumentsMetadata(\n options: KnowledgeUpdateDocumentsMetadataOptions\n ): Promise<ClientResult<{ result: string }>> {\n const resolvedDataset = await resolveDataset(options);\n if (!resolvedDataset.data) {\n return createErrorResult(\n resolvedDataset.error?.message || \"Failed to resolve datasetId\",\n resolvedDataset.status,\n resolvedDataset.error?.details\n );\n }\n\n const result = await http.request<{ result: string }>({\n url: `${KNOWLEDGE_OPENAPI_BASE}/datasets/${encodeURIComponent(resolvedDataset.data.datasetId)}/documents/metadata`,\n method: \"post\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(resolvedDataset.data.workspaceId ? { \"X-WORKSPACE-ID\": resolvedDataset.data.workspaceId } : {}),\n },\n data: {\n operation_data: options.operation_data,\n },\n });\n\n invalidateCacheOnDatasetAccessError(options, result.status);\n return result;\n },\n };\n}\n","/**\n * ============================================================================\n * @amaster.ai/client - Unified Amaster Client\n * ============================================================================\n *\n * Supabase-inspired unified API client for the Amaster platform\n *\n * Features:\n * - Single client instance for all services (auth, entity, bpm, workflow)\n * - Automatic token management and refresh\n * - Auto-attach authentication to all requests\n * - Centralized error handling\n *\n * @example\n * ```typescript\n * const client = createClient({\n * onUnauthorized: () => window.location.href = '/login'\n * });\n *\n * // Login\n * await client.auth.login({ email, password });\n *\n * // All subsequent requests automatically include auth token\n * await client.entity.list('default', 'users');\n * await client.bpm.startProcess('approval', { amount: 1000 });\n * await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\n\nimport { createAuthClient, type AuthClient } from \"@amaster.ai/auth-client\";\nimport { createEntityClient, type EntityClient } from \"@amaster.ai/entity-client\";\nimport { createBpmClient, type BpmClient } from \"@amaster.ai/bpm-client\";\nimport { createWorkflowClient, type WorkflowClient } from \"@amaster.ai/workflow-client\";\nimport {\n createASRClient,\n createASRHttpClient,\n type ASRClientConfig,\n type ASRClient,\n type ASRHttpClientConfig,\n type ASRHttpClient,\n} from \"@amaster.ai/asr-client\";\nimport { createCopilotClient, type CopilotClient } from \"@amaster.ai/copilot-client\";\nimport { createFunctionClient, type FunctionClient } from \"@amaster.ai/function-client\";\nimport { createTTSClient, TTSClientConfig, type TTSClient } from \"@amaster.ai/tts-client\";\nimport { createS3Client, type S3Client } from \"@amaster.ai/s3-client\";\nimport {\n createHttpClient,\n type HttpClient,\n type RequestConfig,\n type ClientResult,\n} from \"@amaster.ai/http-client\";\nimport { createKnowledgeClient, type KnowledgeClient } from \"./knowledge\";\nimport type { AmasterClient, AmasterClientOptions } from \"./types\";\n\n/**\n * Create a unified Amaster client instance\n *\n * This function creates a single client that provides access to all Amaster services:\n * - Authentication (login, register, logout)\n * - Entity CRUD operations\n * - BPM (Business Process Management)\n * - Workflow execution\n *\n * All sub-clients automatically share the same HTTP client and authentication state,\n * ensuring that tokens are consistently attached to all requests.\n *\n * @param options - Client configuration options\n * @returns A unified Amaster client instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const client = createClient();\n *\n * // With authentication callbacks\n * const client = createClient({\n * onUnauthorized: () => {\n * // Redirect to login or show auth modal\n * window.location.href = '/login';\n * },\n * onTokenExpired: () => {\n * console.log('Token expired, refreshing...');\n * }\n * });\n *\n * // Login\n * await client.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Now all requests automatically include the auth token\n * const users = await client.entity.list('default', 'users');\n * const tasks = await client.bpm.getTasks({ assignee: 'currentUserId' });\n * ```\n */\nexport function createClient(options: AmasterClientOptions = {}): AmasterClient {\n const {\n baseURL,\n env = \"dev\",\n headers = {},\n onUnauthorized,\n onTokenExpired,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n } = options;\n\n // Create the base HTTP client\n const baseHttpClient = createHttpClient({\n baseURL,\n headers,\n runtime,\n });\n\n // Create the auth client first using the same base HTTP implementation so\n // mini-program request handling stays consistent across all modules.\n const auth: AuthClient = createAuthClient({\n baseURL,\n headers,\n onTokenExpired,\n onUnauthorized,\n autoHandleOAuthCallback,\n autoRedirectAfterLogin,\n runtime,\n });\n\n // Create a wrapper HTTP client that automatically adds the auth token\n const createAuthenticatedHttpClient = (): HttpClient => {\n // Track if we're currently refreshing to avoid multiple simultaneous refreshes\n let isRefreshing = false;\n let refreshPromise: Promise<boolean> | null = null;\n\n /**\n * Check if 401 error is due to token expiration\n * Traefik JWT plugin returns plain text like \"Jwt is expired\" or \"Token is expired\"\n */\n function isTokenExpired(result: ClientResult<unknown>): boolean {\n if (result.status !== 401) return false;\n\n // Check error message (could be from backend JSON response)\n if (result.error?.message && /expired/i.test(result.error.message)) {\n return true;\n }\n\n // Check error details (traefik returns plain text in details)\n if (result.error?.details) {\n const details = result.error.details;\n if (typeof details === \"string\" && /expired/i.test(details)) {\n return true;\n }\n // Also check if details is an object with message field\n if (typeof details === \"object\" && details !== null) {\n const detailsObj = details as Record<string, unknown>;\n if (typeof detailsObj.message === \"string\" && /expired/i.test(detailsObj.message)) {\n return true;\n }\n }\n }\n\n // Check raw data (could be plain text from traefik)\n if (typeof result.data === \"string\" && /expired/i.test(result.data)) {\n return true;\n }\n\n // If we have a token but got 401, assume it might be expired\n return !!auth.getAccessToken();\n }\n\n return {\n async request<T>(config: RequestConfig): Promise<ClientResult<T>> {\n // Get the current token from auth client\n const token = auth.getAccessToken();\n\n // Merge Authorization header with existing headers\n const authHeaders = token ? { Authorization: `Bearer ${token}` } : {};\n const mergedConfig: RequestConfig = {\n ...config,\n headers: {\n ...config.headers,\n ...authHeaders,\n },\n };\n\n // Make the request with the updated config\n let result = await baseHttpClient.request<T>(mergedConfig);\n\n // Handle 401 errors with automatic token refresh\n if (result.status === 401 && isTokenExpired(result)) {\n // Attempt to refresh token\n if (!isRefreshing) {\n isRefreshing = true;\n refreshPromise = (async () => {\n try {\n const refreshResult = await auth.refreshToken();\n return !!refreshResult.data;\n } finally {\n isRefreshing = false;\n refreshPromise = null;\n }\n })();\n }\n\n const refreshed = await refreshPromise;\n\n if (refreshed) {\n // Retry with new token\n const newToken = auth.getAccessToken();\n result = await baseHttpClient.request<T>({\n ...config,\n headers: {\n ...config.headers,\n ...(newToken ? { Authorization: `Bearer ${newToken}` } : {}),\n },\n });\n }\n }\n\n // Trigger unauthorized if still 401\n if (result.status === 401 && onUnauthorized) {\n onUnauthorized();\n }\n\n return result;\n },\n };\n };\n\n const authenticatedHttpClient = createAuthenticatedHttpClient();\n\n let cachedUserUid: string | null = null;\n\n auth.on(\"login\", (user: { uid?: string }) => {\n cachedUserUid = user?.uid ?? null;\n });\n auth.on(\"logout\", () => {\n cachedUserUid = null;\n });\n\n if (auth.isAuthenticated()) {\n auth\n .getMe()\n .then((result) => {\n if (result.data?.uid) {\n cachedUserUid = result.data.uid;\n }\n })\n .catch(() => {});\n }\n\n // Create other clients using the authenticated HTTP client\n const entity: EntityClient = createEntityClient(authenticatedHttpClient);\n const bpm: BpmClient = createBpmClient(authenticatedHttpClient);\n const workflow: WorkflowClient = createWorkflowClient(authenticatedHttpClient, {\n env,\n });\n const functionClient: FunctionClient = createFunctionClient(authenticatedHttpClient);\n const knowledge: KnowledgeClient = createKnowledgeClient(authenticatedHttpClient);\n const copilot: CopilotClient = createCopilotClient(\n authenticatedHttpClient,\n baseURL,\n () => auth.getAccessToken(),\n () => cachedUserUid\n );\n const s3: S3Client = createS3Client(authenticatedHttpClient);\n\n // ASR and TTS clients use WebSocket, pass token getter for authentication\n // Token can be appended to WebSocket URL as query parameter\n const asr: (config: ASRClientConfig) => ASRClient = createASRClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n const asrHttp: (config: ASRHttpClientConfig) => ASRHttpClient = createASRHttpClient({\n getAccessToken: () => auth.getAccessToken(),\n http: authenticatedHttpClient,\n });\n const tts: (config: TTSClientConfig) => TTSClient = createTTSClient({\n getAccessToken: () => auth.getAccessToken(),\n });\n\n // Return unified client interface\n const client: AmasterClient = {\n auth,\n entity,\n bpm,\n workflow,\n asr,\n asrHttp,\n copilot,\n function: functionClient,\n knowledge,\n tts,\n s3,\n http: authenticatedHttpClient,\n\n // Expose token management methods from auth client\n isAuthenticated: () => auth.isAuthenticated(),\n getAccessToken: () => auth.getAccessToken(),\n setAccessToken: (token: string) => auth.setAccessToken(token),\n clearAuth: () => auth.clearAuth(),\n };\n\n return client;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/client",
3
- "version": "1.1.52-beta.0",
3
+ "version": "1.1.52-beta.2",
4
4
  "description": "Unified API client for Amaster platform - All services in one package",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -75,16 +75,16 @@
75
75
  "registry": "https://registry.npmjs.org/"
76
76
  },
77
77
  "dependencies": {
78
- "@amaster.ai/auth-client": "1.1.52-beta.0",
79
- "@amaster.ai/asr-client": "1.1.52-beta.0",
80
- "@amaster.ai/copilot-client": "1.1.52-beta.0",
81
- "@amaster.ai/bpm-client": "1.1.52-beta.0",
82
- "@amaster.ai/function-client": "1.1.52-beta.0",
83
- "@amaster.ai/entity-client": "1.1.52-beta.0",
84
- "@amaster.ai/s3-client": "1.1.52-beta.0",
85
- "@amaster.ai/http-client": "1.1.52-beta.0",
86
- "@amaster.ai/workflow-client": "1.1.52-beta.0",
87
- "@amaster.ai/tts-client": "1.1.52-beta.0"
78
+ "@amaster.ai/bpm-client": "1.1.52-beta.2",
79
+ "@amaster.ai/function-client": "1.1.52-beta.2",
80
+ "@amaster.ai/s3-client": "1.1.52-beta.2",
81
+ "@amaster.ai/http-client": "1.1.52-beta.2",
82
+ "@amaster.ai/asr-client": "1.1.52-beta.2",
83
+ "@amaster.ai/workflow-client": "1.1.52-beta.2",
84
+ "@amaster.ai/entity-client": "1.1.52-beta.2",
85
+ "@amaster.ai/auth-client": "1.1.52-beta.2",
86
+ "@amaster.ai/tts-client": "1.1.52-beta.2",
87
+ "@amaster.ai/copilot-client": "1.1.52-beta.2"
88
88
  },
89
89
  "peerDependencies": {
90
90
  "axios": "^1.11.0"
@@ -12,6 +12,8 @@ export type KnowledgeRoles = string | string[];
12
12
 
13
13
  export interface KnowledgeDatasetIdResponse {
14
14
  dataset_id: string;
15
+ tenant_id?: string;
16
+ workspace_id?: string;
15
17
  }
16
18
 
17
19
  export interface KnowledgeDocument {
@@ -90,11 +92,15 @@ export type KnowledgeResolveOptions =
90
92
  datasetId: string;
91
93
  orgCode?: string;
92
94
  refresh?: boolean;
95
+ workspaceId?: string;
96
+ tenantId?: string;
93
97
  }
94
98
  | {
95
99
  datasetId?: string;
96
100
  orgCode: string;
97
101
  refresh?: boolean;
102
+ workspaceId?: string;
103
+ tenantId?: string;
98
104
  };
99
105
 
100
106
  export interface KnowledgeGetDatasetIdOptions {