@copilotz/chat-adapter 0.7.8 → 0.8.0

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.d.ts CHANGED
@@ -21,8 +21,8 @@ type RunErrorInterceptor = (error: unknown) => SpecialChatState | null | undefin
21
21
 
22
22
  declare const apiUrl: (path: string) => string;
23
23
  declare const apiUrlObject: (path: string) => URL;
24
- type RequestHeadersProvider = () => Record<string, string> | Promise<Record<string, string>>;
25
- declare const withAuthHeaders: (headers?: Record<string, string>, getRequestHeaders?: RequestHeadersProvider) => Promise<Record<string, string>>;
24
+ type RequestHeadersProvider$1 = () => Record<string, string> | Promise<Record<string, string>>;
25
+ declare const withAuthHeaders: (headers?: Record<string, string>, getRequestHeaders?: RequestHeadersProvider$1) => Promise<Record<string, string>>;
26
26
  type RestThread = {
27
27
  id: string;
28
28
  name?: string | null;
@@ -83,7 +83,7 @@ type RunOptions = {
83
83
  participants?: string[] | null;
84
84
  /** Explicit target agent for this message (who should respond). Maps to MessagePayload.target. */
85
85
  targetAgent?: string | null;
86
- getRequestHeaders?: RequestHeadersProvider;
86
+ getRequestHeaders?: RequestHeadersProvider$1;
87
87
  } & StreamCallbacks;
88
88
  type CopilotzStreamResult = {
89
89
  text: string;
@@ -101,11 +101,11 @@ declare class CopilotzRequestError extends Error {
101
101
  });
102
102
  }
103
103
  declare function runCopilotzStream(options: RunOptions): Promise<CopilotzStreamResult>;
104
- declare function fetchThreads(userId: string, getRequestHeaders?: RequestHeadersProvider): Promise<RestThread[]>;
105
- declare function fetchAgents(getRequestHeaders?: RequestHeadersProvider): Promise<AgentOption[]>;
106
- declare function fetchThreadMessages(threadId: string, getRequestHeaders?: RequestHeadersProvider): Promise<RestMessage[]>;
107
- declare function updateThread(threadId: string, updates: Partial<RestThread>, getRequestHeaders?: RequestHeadersProvider): Promise<any>;
108
- declare function deleteThread(threadId: string, getRequestHeaders?: RequestHeadersProvider): Promise<boolean>;
104
+ declare function fetchThreads(userId: string, getRequestHeaders?: RequestHeadersProvider$1): Promise<RestThread[]>;
105
+ declare function fetchAgents(getRequestHeaders?: RequestHeadersProvider$1): Promise<AgentOption[]>;
106
+ declare function fetchThreadMessages(threadId: string, getRequestHeaders?: RequestHeadersProvider$1): Promise<RestMessage[]>;
107
+ declare function updateThread(threadId: string, updates: Partial<RestThread>, getRequestHeaders?: RequestHeadersProvider$1): Promise<any>;
108
+ declare function deleteThread(threadId: string, getRequestHeaders?: RequestHeadersProvider$1): Promise<boolean>;
109
109
 
110
110
  interface CopilotzChatProps {
111
111
  userId: string;
@@ -167,7 +167,7 @@ interface CopilotzChatProps {
167
167
  /** Multi-agent: ID of the agent this message is directed at */
168
168
  targetAgentId?: string | null;
169
169
  onTargetAgentChange?: (agentId: string | null) => void;
170
- getRequestHeaders?: RequestHeadersProvider;
170
+ getRequestHeaders?: RequestHeadersProvider$1;
171
171
  className?: string;
172
172
  eventInterceptor?: EventInterceptor;
173
173
  runErrorInterceptor?: RunErrorInterceptor;
@@ -196,7 +196,7 @@ interface UseCopilotzOptions {
196
196
  participants?: string[] | null;
197
197
  /** Explicit target agent for each message. When set, maps to MessagePayload.target. */
198
198
  targetAgentName?: string | null;
199
- getRequestHeaders?: RequestHeadersProvider;
199
+ getRequestHeaders?: RequestHeadersProvider$1;
200
200
  eventInterceptor?: EventInterceptor;
201
201
  runErrorInterceptor?: RunErrorInterceptor;
202
202
  }
@@ -224,7 +224,8 @@ declare function useCopilotz({ userId, userName, userAvatar, assistantName, agen
224
224
  reset: () => void;
225
225
  };
226
226
 
227
- declare function getAssetDataUrl(refOrId: string): Promise<{
227
+ type RequestHeadersProvider = () => Record<string, string> | Promise<Record<string, string>>;
228
+ declare function getAssetDataUrl(refOrId: string, getRequestHeaders?: RequestHeadersProvider): Promise<{
228
229
  dataUrl: string;
229
230
  mime?: string;
230
231
  assetId: string;
@@ -232,6 +233,6 @@ declare function getAssetDataUrl(refOrId: string): Promise<{
232
233
  type WithMetadata = {
233
234
  metadata?: Record<string, unknown> | null;
234
235
  };
235
- declare function resolveAssetsInMessages<T extends WithMetadata>(messages: T[]): Promise<T[]>;
236
+ declare function resolveAssetsInMessages<T extends WithMetadata>(messages: T[], getRequestHeaders?: RequestHeadersProvider): Promise<T[]>;
236
237
 
237
- export { CopilotzChat, CopilotzRequestError, type EventInterceptor, type EventInterceptorResult, type RenderSpecialState, type RequestHeadersProvider, type RunErrorInterceptor, type SpecialChatState, type SpecialStateControls, apiUrl, apiUrlObject, deleteThread, fetchAgents, fetchThreadMessages, fetchThreads, getAssetDataUrl, resolveAssetsInMessages, runCopilotzStream, updateThread, useCopilotz, withAuthHeaders };
238
+ export { CopilotzChat, CopilotzRequestError, type EventInterceptor, type EventInterceptorResult, type RenderSpecialState, type RequestHeadersProvider$1 as RequestHeadersProvider, type RunErrorInterceptor, type SpecialChatState, type SpecialStateControls, apiUrl, apiUrlObject, deleteThread, fetchAgents, fetchThreadMessages, fetchThreads, getAssetDataUrl, resolveAssetsInMessages, runCopilotzStream, updateThread, useCopilotz, withAuthHeaders };
package/dist/index.js CHANGED
@@ -1104,12 +1104,35 @@ var rawBase2 = typeof rawBaseValue2 === "string" && rawBaseValue2.length > 0 ? r
1104
1104
  var normalizedBase2 = rawBase2.replace(/\/$/, "");
1105
1105
  var API_BASE2 = normalizedBase2.startsWith("http") || normalizedBase2.startsWith("/") ? normalizedBase2 : `/${normalizedBase2}`;
1106
1106
  var apiUrl2 = (path) => `${API_BASE2}${path}`;
1107
+ var runtimeProcess2 = typeof process !== "undefined" ? process : void 0;
1108
+ var API_KEY2 = (() => {
1109
+ const env = import.meta.env ?? {};
1110
+ const candidates = [
1111
+ env.VITE_API_KEY,
1112
+ env.VITE_COPILOTZ_API_KEY,
1113
+ runtimeProcess2?.env?.COPILOTZ_API_KEY,
1114
+ runtimeProcess2?.env?.API_KEY
1115
+ ];
1116
+ return candidates.find(
1117
+ (value) => typeof value === "string" && value.length > 0
1118
+ );
1119
+ })();
1120
+ var withAssetAuthHeaders = async (headers = {}, getRequestHeaders) => {
1121
+ const providedHeaders = getRequestHeaders ? await getRequestHeaders() : void 0;
1122
+ if (providedHeaders && Object.keys(providedHeaders).length > 0) {
1123
+ return { ...headers, ...providedHeaders };
1124
+ }
1125
+ if (API_KEY2) {
1126
+ return { ...headers, Authorization: `Bearer ${API_KEY2}` };
1127
+ }
1128
+ return headers;
1129
+ };
1107
1130
  var extractAssetId = (refOrId) => refOrId.startsWith("asset://") ? refOrId.slice("asset://".length) : refOrId;
1108
- async function getAssetDataUrl(refOrId) {
1131
+ async function getAssetDataUrl(refOrId, getRequestHeaders) {
1109
1132
  const id = extractAssetId(refOrId);
1110
1133
  const res = await fetch(apiUrl2(`/v1/assets/${encodeURIComponent(id)}?format=dataUrl`), {
1111
1134
  method: "GET",
1112
- headers: { Accept: "application/json" }
1135
+ headers: await withAssetAuthHeaders({ Accept: "application/json" }, getRequestHeaders)
1113
1136
  });
1114
1137
  if (!res.ok) {
1115
1138
  const text = await res.text().catch(() => res.statusText);
@@ -1130,11 +1153,11 @@ async function getAssetDataUrl(refOrId) {
1130
1153
  assetId: expectString2(data.assetId, "asset response.data.assetId")
1131
1154
  };
1132
1155
  }
1133
- async function resolveAssetsInMessages(messages) {
1156
+ async function resolveAssetsInMessages(messages, getRequestHeaders) {
1134
1157
  const inFlightByRef = /* @__PURE__ */ new Map();
1135
1158
  const resolveAssetRef = (assetRef) => {
1136
1159
  if (!inFlightByRef.has(assetRef)) {
1137
- inFlightByRef.set(assetRef, getAssetDataUrl(assetRef));
1160
+ inFlightByRef.set(assetRef, getAssetDataUrl(assetRef, getRequestHeaders));
1138
1161
  }
1139
1162
  return inFlightByRef.get(assetRef);
1140
1163
  };
@@ -1151,15 +1174,23 @@ async function resolveAssetsInMessages(messages) {
1151
1174
  const newAttachments = await Promise.all(attachments.map(async (att, index) => {
1152
1175
  const assetRef = typeof att.assetRef === "string" ? att.assetRef : void 0;
1153
1176
  if (!assetRef) return att;
1154
- const { dataUrl, mime } = await resolveAssetRef(assetRef);
1155
- const mimeType = typeof att.mimeType === "string" ? att.mimeType : mime || getMimeTypeFromDataUrl(dataUrl) || "application/octet-stream";
1156
- const inferredKind = getAttachmentKindFromMimeType(mimeType);
1157
- return {
1158
- ...att,
1159
- kind: inferredKind,
1160
- dataUrl,
1161
- mimeType
1162
- };
1177
+ try {
1178
+ const { dataUrl, mime } = await resolveAssetRef(assetRef);
1179
+ const mimeType = typeof att.mimeType === "string" ? att.mimeType : mime || getMimeTypeFromDataUrl(dataUrl) || "application/octet-stream";
1180
+ const inferredKind = getAttachmentKindFromMimeType(mimeType);
1181
+ return {
1182
+ ...att,
1183
+ kind: inferredKind,
1184
+ dataUrl,
1185
+ mimeType
1186
+ };
1187
+ } catch (error) {
1188
+ return {
1189
+ ...att,
1190
+ assetUnavailable: true,
1191
+ assetError: error instanceof Error ? error.message : String(error)
1192
+ };
1193
+ }
1163
1194
  }));
1164
1195
  const newMeta = { ...meta, attachments: newAttachments };
1165
1196
  return { ...msg, metadata: newMeta };
@@ -1472,7 +1503,10 @@ var convertServerMessage = (msg, options = {}) => {
1472
1503
  };
1473
1504
  var prepareHydratedMessages = async (rawMessages, options = {}) => {
1474
1505
  rawMessages.forEach(assertRestMessageContract);
1475
- const resolvedMessages = await resolveAssetsInMessages(rawMessages);
1506
+ const resolvedMessages = await resolveAssetsInMessages(
1507
+ rawMessages,
1508
+ options.getRequestHeaders
1509
+ );
1476
1510
  resolvedMessages.forEach((msg) => {
1477
1511
  if (msg.senderType === "tool") {
1478
1512
  const metadata = msg.metadata ?? void 0;
@@ -1503,6 +1537,14 @@ var createEmptyMessagePageInfo = () => ({
1503
1537
  oldestMessageId: null,
1504
1538
  newestMessageId: null
1505
1539
  });
1540
+ var createPendingAssistantActivity = () => ({
1541
+ items: [{
1542
+ id: "thinking",
1543
+ kind: "thinking",
1544
+ status: "active",
1545
+ startedAt: nowTs()
1546
+ }]
1547
+ });
1506
1548
  function useCopilotz({
1507
1549
  userId,
1508
1550
  userName,
@@ -1717,9 +1759,10 @@ function useCopilotz({
1717
1759
  senderOptions: senderOptionsRef.current,
1718
1760
  createId: generateId,
1719
1761
  now: nowTs,
1720
- onToolOutput: processToolOutput
1762
+ onToolOutput: processToolOutput,
1763
+ getRequestHeaders
1721
1764
  });
1722
- }, [processToolOutput]);
1765
+ }, [getRequestHeaders, processToolOutput]);
1723
1766
  const loadThreadMessages = useCallback2(async (threadId) => {
1724
1767
  const requestId = messagesRequestRef.current + 1;
1725
1768
  messagesRequestRef.current = requestId;
@@ -2293,7 +2336,8 @@ function useCopilotz({
2293
2336
  timestamp: timestamp + 1,
2294
2337
  isStreaming: true,
2295
2338
  isComplete: false,
2296
- sender: assistantSender
2339
+ sender: assistantSender,
2340
+ activity: createPendingAssistantActivity()
2297
2341
  };
2298
2342
  setMessages((prev) => [...prev, userMessage, assistantPlaceholder]);
2299
2343
  setSpecialState(null);
@@ -2375,7 +2419,21 @@ function useCopilotz({
2375
2419
  setCurrentThreadExternalId(bootstrapThreadExternalId);
2376
2420
  setThreadExternalIdMap((prev) => ({ ...prev, [bootstrapThreadExternalId]: bootstrapThreadExternalId }));
2377
2421
  setThreadMetadataMap((prev) => ({ ...prev, [bootstrapThreadExternalId]: {} }));
2378
- setMessages([]);
2422
+ const assistantSender = preferredAgentRef.current ? resolveAgentSender(
2423
+ { id: preferredAgentRef.current, name: preferredAgentRef.current },
2424
+ senderOptionsRef.current
2425
+ ) : resolveAssistantFallbackSender(senderOptionsRef.current);
2426
+ const assistantMessageId = generateId();
2427
+ setMessages([{
2428
+ id: assistantMessageId,
2429
+ role: "assistant",
2430
+ content: "",
2431
+ timestamp: nowTs(),
2432
+ isStreaming: true,
2433
+ isComplete: false,
2434
+ sender: assistantSender,
2435
+ activity: createPendingAssistantActivity()
2436
+ }]);
2379
2437
  setMessagePageInfo(createEmptyMessagePageInfo());
2380
2438
  persistedToolUpdatesRef.current = [];
2381
2439
  setSpecialState(null);
@@ -2386,6 +2444,8 @@ function useCopilotz({
2386
2444
  toolCalls: bootstrap.initialToolCalls,
2387
2445
  userId: uid,
2388
2446
  agentName: preferredAgentRef.current,
2447
+ assistantMessageId,
2448
+ assistantSender,
2389
2449
  threadMetadata: {
2390
2450
  name: defaultThreadName || "Main Thread"
2391
2451
  }