linkque-cli-v2 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/linkquejs.js +27 -2212
- package/package.json +4 -1
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/anthropic-messages-B5T6TFD2.js +7172 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/azure-openai-responses-S7HNQOSE.js +229 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-2NGJGNYB.js +1765 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-3S3TOEBZ.js +608 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-46SEH6ER.js +78 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-52BVDZQ2.js +60299 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-6MHDOBWO.js +12 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-6WHNFJT4.js +31278 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-7BQRUS4C.js +671 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-7QWAKKTY.js +7054 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-CT4G24PS.js +8 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-DYEQRE6N.js +343 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-E2P6TIFG.js +31 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-FHNQ6DPF.js +14 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-HTG7JBF2.js +38 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-I64V3ICJ.js +11166 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-IKZ25GJD.js +497 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-MKS245OU.js +3570 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-NKEOCGYU.js +76 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-NQM5ZCTR.js +12015 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-OXGCUIKV.js +33 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-RYONFGPP.js +317 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-UEVQXSKG.js +4765 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-UFVAKOTZ.js +17 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-VS2QQHAK.js +46 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-XMVFOHGJ.js +31 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-XUFLSZM4.js +5319 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-Y6UTJIT4.js +23 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-YDKZZ6EH.js +3584 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/dist-QD3CV4KC.js +1224 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/google-generative-ai-IOXNKFEV.js +412 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/google-vertex-U4ZV5IXZ.js +461 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/mistral-conversations-G3K7SSWR.js +30344 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/multipart-parser-2VJ7LVQD.js +170 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/multipart-parser-AJMV6U6H.js +178 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/multipart-parser-PULXGNYO.js +368 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/openai-codex-responses-4JJLPTCS.js +1308 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/openai-completions-PH4WW6E7.js +977 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/openai-responses-KGWAX6HR.js +264 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/openrouter-images-LMBZZQ76.js +138 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/otel-7GSG7QQO.js +6657 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/pi-messages-ZX3KUWSZ.js +309 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/runtime/handler/chat.js +2354 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/runtime/handler/clientCapability.js +16 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/runtime/protocol.js +17 -0
- package/vendor/linkque-agent-appwrite-integrate/dist/esm/src-NGZW4JXI.js +1396 -0
- package/vendor/linkque-agent-appwrite-integrate/package.json +1 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendAssistantMessageDiagnostic,
|
|
3
|
+
createAssistantMessageDiagnostic
|
|
4
|
+
} from "./chunk-E2P6TIFG.js";
|
|
5
|
+
import {
|
|
6
|
+
headersToRecord,
|
|
7
|
+
providerHeadersToRecord
|
|
8
|
+
} from "./chunk-Y6UTJIT4.js";
|
|
9
|
+
import {
|
|
10
|
+
getProviderEnvValue
|
|
11
|
+
} from "./chunk-OXGCUIKV.js";
|
|
12
|
+
import {
|
|
13
|
+
parseStreamingJson
|
|
14
|
+
} from "./chunk-DYEQRE6N.js";
|
|
15
|
+
import {
|
|
16
|
+
AssistantMessageEventStream
|
|
17
|
+
} from "./chunk-46SEH6ER.js";
|
|
18
|
+
import "./chunk-VS2QQHAK.js";
|
|
19
|
+
|
|
20
|
+
// ../../node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js
|
|
21
|
+
var PiMessagesResponseError = class extends Error {
|
|
22
|
+
code;
|
|
23
|
+
diagnosticDetails;
|
|
24
|
+
constructor(message, code, diagnosticDetails) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = "PiMessagesResponseError";
|
|
27
|
+
this.code = code;
|
|
28
|
+
this.diagnosticDetails = diagnosticDetails;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function parsePiMessagesErrorBody(body) {
|
|
35
|
+
try {
|
|
36
|
+
const parsed = JSON.parse(body);
|
|
37
|
+
return isRecord(parsed) && isRecord(parsed.error) ? parsed : void 0;
|
|
38
|
+
} catch {
|
|
39
|
+
return void 0;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function truncateDiagnosticString(value) {
|
|
43
|
+
const maxLength = 8192;
|
|
44
|
+
return value.length > maxLength ? `${value.slice(0, maxLength)}\u2026` : value;
|
|
45
|
+
}
|
|
46
|
+
function formatPiMessagesResponseError(response, body, errorBody) {
|
|
47
|
+
const message = typeof errorBody?.error?.message === "string" ? errorBody.error.message : void 0;
|
|
48
|
+
const code = typeof errorBody?.error?.code === "string" ? errorBody.error.code : void 0;
|
|
49
|
+
const suffix = message ?? body;
|
|
50
|
+
const codeSuffix = code ? ` (${code})` : "";
|
|
51
|
+
return `${response.status} ${response.statusText}: ${suffix}${codeSuffix}`;
|
|
52
|
+
}
|
|
53
|
+
function createPiMessagesResponseError(model, url, response, body) {
|
|
54
|
+
const errorBody = parsePiMessagesErrorBody(body);
|
|
55
|
+
const code = typeof errorBody?.error?.code === "string" ? errorBody.error.code : void 0;
|
|
56
|
+
return new PiMessagesResponseError(formatPiMessagesResponseError(response, body, errorBody), code, {
|
|
57
|
+
version: 1,
|
|
58
|
+
provider: model.provider,
|
|
59
|
+
model: model.id,
|
|
60
|
+
url: url.toString(),
|
|
61
|
+
status: response.status,
|
|
62
|
+
statusText: response.statusText,
|
|
63
|
+
error: errorBody?.error,
|
|
64
|
+
body: errorBody ? void 0 : truncateDiagnosticString(body),
|
|
65
|
+
timestampMs: Date.now()
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function createEmptyUsage() {
|
|
69
|
+
return {
|
|
70
|
+
input: 0,
|
|
71
|
+
output: 0,
|
|
72
|
+
cacheRead: 0,
|
|
73
|
+
cacheWrite: 0,
|
|
74
|
+
totalTokens: 0,
|
|
75
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function appendRewriteDiagnostic(message, rewrite) {
|
|
79
|
+
if (!rewrite) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
appendAssistantMessageDiagnostic(message, {
|
|
83
|
+
type: "pi_messages_rewrite",
|
|
84
|
+
timestamp: Date.now(),
|
|
85
|
+
details: { ...rewrite }
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function createEventConverter(model) {
|
|
89
|
+
const partial = {
|
|
90
|
+
role: "assistant",
|
|
91
|
+
content: [],
|
|
92
|
+
api: model.api,
|
|
93
|
+
provider: model.provider,
|
|
94
|
+
model: model.id,
|
|
95
|
+
usage: createEmptyUsage(),
|
|
96
|
+
stopReason: "stop",
|
|
97
|
+
timestamp: Date.now()
|
|
98
|
+
};
|
|
99
|
+
const toolJson = /* @__PURE__ */ new Map();
|
|
100
|
+
return (event) => {
|
|
101
|
+
switch (event.type) {
|
|
102
|
+
case "done":
|
|
103
|
+
Object.assign(partial, {
|
|
104
|
+
stopReason: event.reason,
|
|
105
|
+
usage: event.usage,
|
|
106
|
+
responseId: event.responseId
|
|
107
|
+
});
|
|
108
|
+
appendRewriteDiagnostic(partial, event.rewrite);
|
|
109
|
+
return { type: "done", reason: event.reason, message: partial };
|
|
110
|
+
case "error":
|
|
111
|
+
Object.assign(partial, {
|
|
112
|
+
stopReason: event.reason,
|
|
113
|
+
usage: event.usage,
|
|
114
|
+
errorMessage: event.errorMessage,
|
|
115
|
+
responseId: event.responseId
|
|
116
|
+
});
|
|
117
|
+
appendRewriteDiagnostic(partial, event.rewrite);
|
|
118
|
+
return { type: "error", reason: event.reason, error: partial };
|
|
119
|
+
case "start":
|
|
120
|
+
break;
|
|
121
|
+
case "text_start":
|
|
122
|
+
partial.content[event.contentIndex] = { type: "text", text: "" };
|
|
123
|
+
break;
|
|
124
|
+
case "text_delta":
|
|
125
|
+
partial.content[event.contentIndex].text += event.delta;
|
|
126
|
+
break;
|
|
127
|
+
case "text_end":
|
|
128
|
+
Object.assign(partial.content[event.contentIndex], {
|
|
129
|
+
text: event.content,
|
|
130
|
+
textSignature: event.contentSignature
|
|
131
|
+
});
|
|
132
|
+
break;
|
|
133
|
+
case "thinking_start":
|
|
134
|
+
partial.content[event.contentIndex] = { type: "thinking", thinking: "" };
|
|
135
|
+
break;
|
|
136
|
+
case "thinking_delta":
|
|
137
|
+
partial.content[event.contentIndex].thinking += event.delta;
|
|
138
|
+
break;
|
|
139
|
+
case "thinking_end":
|
|
140
|
+
Object.assign(partial.content[event.contentIndex], {
|
|
141
|
+
thinking: event.content,
|
|
142
|
+
thinkingSignature: event.contentSignature,
|
|
143
|
+
redacted: event.redacted
|
|
144
|
+
});
|
|
145
|
+
break;
|
|
146
|
+
case "toolcall_start":
|
|
147
|
+
partial.content[event.contentIndex] = {
|
|
148
|
+
type: "toolCall",
|
|
149
|
+
id: event.id,
|
|
150
|
+
name: event.toolName,
|
|
151
|
+
arguments: {}
|
|
152
|
+
};
|
|
153
|
+
toolJson.set(event.contentIndex, "");
|
|
154
|
+
break;
|
|
155
|
+
case "toolcall_delta": {
|
|
156
|
+
const json = `${toolJson.get(event.contentIndex) ?? ""}${event.delta}`;
|
|
157
|
+
toolJson.set(event.contentIndex, json);
|
|
158
|
+
partial.content[event.contentIndex].arguments = parseStreamingJson(json);
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case "toolcall_end":
|
|
162
|
+
Object.assign(partial.content[event.contentIndex], event.toolCall);
|
|
163
|
+
toolJson.delete(event.contentIndex);
|
|
164
|
+
return {
|
|
165
|
+
type: "toolcall_end",
|
|
166
|
+
contentIndex: event.contentIndex,
|
|
167
|
+
toolCall: partial.content[event.contentIndex],
|
|
168
|
+
partial
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return { ...event, partial };
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
async function* readPiMessagesEvents(stream2) {
|
|
175
|
+
const decoder = new TextDecoder();
|
|
176
|
+
const reader = stream2.getReader();
|
|
177
|
+
let buffer = "";
|
|
178
|
+
try {
|
|
179
|
+
while (true) {
|
|
180
|
+
const { done, value } = await reader.read();
|
|
181
|
+
buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
|
|
182
|
+
buffer = buffer.replace(/\r\n/g, "\n");
|
|
183
|
+
let split = buffer.indexOf("\n\n");
|
|
184
|
+
while (split !== -1) {
|
|
185
|
+
const event = parsePiMessagesEvent(buffer.slice(0, split));
|
|
186
|
+
if (event) {
|
|
187
|
+
yield event;
|
|
188
|
+
}
|
|
189
|
+
buffer = buffer.slice(split + 2);
|
|
190
|
+
split = buffer.indexOf("\n\n");
|
|
191
|
+
}
|
|
192
|
+
if (done) {
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (buffer.trim()) {
|
|
197
|
+
const event = parsePiMessagesEvent(buffer);
|
|
198
|
+
if (event) {
|
|
199
|
+
yield event;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
} finally {
|
|
203
|
+
reader.releaseLock();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function parsePiMessagesEvent(raw) {
|
|
207
|
+
const data = raw.split("\n").find((line) => line.startsWith("data:"))?.slice(5).trim();
|
|
208
|
+
return data && data !== "[DONE]" ? JSON.parse(data) : void 0;
|
|
209
|
+
}
|
|
210
|
+
function createErrorEvent(model, error, aborted) {
|
|
211
|
+
const reason = aborted ? "aborted" : "error";
|
|
212
|
+
const assistantMessage = {
|
|
213
|
+
role: "assistant",
|
|
214
|
+
content: [],
|
|
215
|
+
api: model.api,
|
|
216
|
+
provider: model.provider,
|
|
217
|
+
model: model.id,
|
|
218
|
+
usage: createEmptyUsage(),
|
|
219
|
+
stopReason: reason,
|
|
220
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
221
|
+
timestamp: Date.now()
|
|
222
|
+
};
|
|
223
|
+
if (!aborted && error instanceof PiMessagesResponseError) {
|
|
224
|
+
appendAssistantMessageDiagnostic(assistantMessage, createAssistantMessageDiagnostic("pi_messages_response_failure", error, error.diagnosticDetails));
|
|
225
|
+
}
|
|
226
|
+
return { type: "error", reason, error: assistantMessage };
|
|
227
|
+
}
|
|
228
|
+
function resolveCacheRetention(cacheRetention, env) {
|
|
229
|
+
if (cacheRetention) {
|
|
230
|
+
return cacheRetention;
|
|
231
|
+
}
|
|
232
|
+
return getProviderEnvValue("PI_CACHE_RETENTION", env) === "long" ? "long" : void 0;
|
|
233
|
+
}
|
|
234
|
+
var stream = (model, context, options) => {
|
|
235
|
+
const eventStream = new AssistantMessageEventStream();
|
|
236
|
+
const convertEvent = createEventConverter(model);
|
|
237
|
+
void (async () => {
|
|
238
|
+
try {
|
|
239
|
+
const apiKey = options?.apiKey;
|
|
240
|
+
if (!apiKey) {
|
|
241
|
+
throw new Error(`No API key provided for provider "${model.provider}"`);
|
|
242
|
+
}
|
|
243
|
+
const url = new URL(`${model.baseUrl.replace(/\/+$/u, "")}/messages`);
|
|
244
|
+
if (options?.debug) {
|
|
245
|
+
url.searchParams.set("debug", "1");
|
|
246
|
+
}
|
|
247
|
+
let payload = {
|
|
248
|
+
model: model.id,
|
|
249
|
+
context,
|
|
250
|
+
options: {
|
|
251
|
+
temperature: options?.temperature,
|
|
252
|
+
maxTokens: options?.maxTokens,
|
|
253
|
+
reasoning: options?.reasoning,
|
|
254
|
+
cacheRetention: resolveCacheRetention(options?.cacheRetention, options?.env),
|
|
255
|
+
sessionId: options?.sessionId,
|
|
256
|
+
toolChoice: options?.toolChoice
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
const nextPayload = await options?.onPayload?.(payload, model);
|
|
260
|
+
if (nextPayload !== void 0) {
|
|
261
|
+
payload = nextPayload;
|
|
262
|
+
}
|
|
263
|
+
const response = await fetch(url, {
|
|
264
|
+
method: "POST",
|
|
265
|
+
headers: {
|
|
266
|
+
authorization: `Bearer ${apiKey}`,
|
|
267
|
+
accept: "text/event-stream",
|
|
268
|
+
"content-type": "application/json",
|
|
269
|
+
...providerHeadersToRecord(options?.headers)
|
|
270
|
+
},
|
|
271
|
+
body: JSON.stringify(payload),
|
|
272
|
+
signal: options?.signal
|
|
273
|
+
});
|
|
274
|
+
await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
|
|
275
|
+
if (!response.ok) {
|
|
276
|
+
const body = await response.text();
|
|
277
|
+
throw createPiMessagesResponseError(model, url, response, body);
|
|
278
|
+
}
|
|
279
|
+
if (!response.body) {
|
|
280
|
+
throw new Error(`${model.provider} response has no body`);
|
|
281
|
+
}
|
|
282
|
+
for await (const piEvent of readPiMessagesEvents(response.body)) {
|
|
283
|
+
const event = convertEvent(piEvent);
|
|
284
|
+
eventStream.push(event);
|
|
285
|
+
if (event.type === "done" || event.type === "error") {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
throw new Error(`${model.provider} stream ended without a terminal event`);
|
|
290
|
+
} catch (error) {
|
|
291
|
+
eventStream.push(createErrorEvent(model, error, options?.signal?.aborted ?? false));
|
|
292
|
+
}
|
|
293
|
+
})();
|
|
294
|
+
return eventStream;
|
|
295
|
+
};
|
|
296
|
+
var streamSimple = (model, context, options) => {
|
|
297
|
+
const extra = options;
|
|
298
|
+
return stream(model, context, {
|
|
299
|
+
...options,
|
|
300
|
+
reasoning: options?.reasoning,
|
|
301
|
+
toolChoice: extra?.toolChoice,
|
|
302
|
+
debug: extra?.debug
|
|
303
|
+
});
|
|
304
|
+
};
|
|
305
|
+
export {
|
|
306
|
+
PiMessagesResponseError,
|
|
307
|
+
stream,
|
|
308
|
+
streamSimple
|
|
309
|
+
};
|