opencode-feishu 0.7.1 → 0.7.3
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.js +75 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -99269,6 +99269,32 @@ async function forkSession(client, oldSessionId, sessionKey, directory) {
|
|
|
99269
99269
|
|
|
99270
99270
|
// src/handler/event.ts
|
|
99271
99271
|
var pendingBySession = /* @__PURE__ */ new Map();
|
|
99272
|
+
var sessionErrors = /* @__PURE__ */ new Map();
|
|
99273
|
+
var sessionErrorTimeouts = /* @__PURE__ */ new Map();
|
|
99274
|
+
var SESSION_ERROR_TTL_MS = 3e4;
|
|
99275
|
+
function getSessionError(sessionId) {
|
|
99276
|
+
return sessionErrors.get(sessionId);
|
|
99277
|
+
}
|
|
99278
|
+
function clearSessionError(sessionId) {
|
|
99279
|
+
const timer = sessionErrorTimeouts.get(sessionId);
|
|
99280
|
+
if (timer) {
|
|
99281
|
+
clearTimeout(timer);
|
|
99282
|
+
sessionErrorTimeouts.delete(sessionId);
|
|
99283
|
+
}
|
|
99284
|
+
sessionErrors.delete(sessionId);
|
|
99285
|
+
}
|
|
99286
|
+
function setSessionError(sessionId, errMsg) {
|
|
99287
|
+
const existing = sessionErrorTimeouts.get(sessionId);
|
|
99288
|
+
if (existing) {
|
|
99289
|
+
clearTimeout(existing);
|
|
99290
|
+
}
|
|
99291
|
+
sessionErrors.set(sessionId, errMsg);
|
|
99292
|
+
const timeoutId = setTimeout(() => {
|
|
99293
|
+
sessionErrors.delete(sessionId);
|
|
99294
|
+
sessionErrorTimeouts.delete(sessionId);
|
|
99295
|
+
}, SESSION_ERROR_TTL_MS);
|
|
99296
|
+
sessionErrorTimeouts.set(sessionId, timeoutId);
|
|
99297
|
+
}
|
|
99272
99298
|
function registerPending(sessionId, payload) {
|
|
99273
99299
|
pendingBySession.set(sessionId, { ...payload, textBuffer: "" });
|
|
99274
99300
|
}
|
|
@@ -99282,8 +99308,16 @@ function migratePending(oldSessionId, newSessionId) {
|
|
|
99282
99308
|
pendingBySession.set(newSessionId, payload);
|
|
99283
99309
|
}
|
|
99284
99310
|
}
|
|
99285
|
-
function isModelError(errMsg) {
|
|
99286
|
-
|
|
99311
|
+
function isModelError(errMsg, rawError) {
|
|
99312
|
+
if (errMsg.includes("ModelNotFound") || errMsg.includes("ProviderModelNotFound")) {
|
|
99313
|
+
return true;
|
|
99314
|
+
}
|
|
99315
|
+
if (rawError && typeof rawError === "object") {
|
|
99316
|
+
const e = rawError;
|
|
99317
|
+
const fields = [e.type, e.name, e.message].filter(Boolean).map(String);
|
|
99318
|
+
return fields.some((f) => f.includes("ModelNotFound") || f.includes("ProviderModelNotFound"));
|
|
99319
|
+
}
|
|
99320
|
+
return false;
|
|
99287
99321
|
}
|
|
99288
99322
|
async function handleEvent(event, deps) {
|
|
99289
99323
|
switch (event.type) {
|
|
@@ -99313,8 +99347,24 @@ async function handleEvent(event, deps) {
|
|
|
99313
99347
|
const props = event.properties;
|
|
99314
99348
|
const sessionId = props.sessionID;
|
|
99315
99349
|
if (!sessionId) break;
|
|
99316
|
-
const
|
|
99317
|
-
|
|
99350
|
+
const error = props.error;
|
|
99351
|
+
let errMsg;
|
|
99352
|
+
if (typeof error === "string") {
|
|
99353
|
+
errMsg = error;
|
|
99354
|
+
} else if (error && typeof error === "object") {
|
|
99355
|
+
const e = error;
|
|
99356
|
+
errMsg = String(e.message ?? e.type ?? e.name ?? "An unexpected error occurred");
|
|
99357
|
+
} else {
|
|
99358
|
+
errMsg = String(error);
|
|
99359
|
+
}
|
|
99360
|
+
const safeErrorFields = error && typeof error === "object" ? { type: error.type, name: error.name } : { raw: String(error) };
|
|
99361
|
+
deps.log("warn", "\u6536\u5230 session.error \u4E8B\u4EF6", {
|
|
99362
|
+
sessionId,
|
|
99363
|
+
error: safeErrorFields,
|
|
99364
|
+
extractedMsg: errMsg
|
|
99365
|
+
});
|
|
99366
|
+
setSessionError(sessionId, errMsg);
|
|
99367
|
+
if (isModelError(errMsg, props.error)) {
|
|
99318
99368
|
const sessionKey = invalidateCachedSession(sessionId);
|
|
99319
99369
|
if (sessionKey) {
|
|
99320
99370
|
try {
|
|
@@ -99335,12 +99385,6 @@ async function handleEvent(event, deps) {
|
|
|
99335
99385
|
}
|
|
99336
99386
|
}
|
|
99337
99387
|
}
|
|
99338
|
-
const payload = pendingBySession.get(sessionId);
|
|
99339
|
-
if (!payload) break;
|
|
99340
|
-
const updateRes = await updateMessage(payload.feishuClient, payload.placeholderId, `\u274C \u4F1A\u8BDD\u9519\u8BEF: ${errMsg}`);
|
|
99341
|
-
if (!updateRes.ok) {
|
|
99342
|
-
await sendTextMessage(payload.feishuClient, payload.chatId, `\u274C \u4F1A\u8BDD\u9519\u8BEF: ${errMsg}`);
|
|
99343
|
-
}
|
|
99344
99388
|
break;
|
|
99345
99389
|
}
|
|
99346
99390
|
}
|
|
@@ -99354,6 +99398,7 @@ function extractPartText(part) {
|
|
|
99354
99398
|
}
|
|
99355
99399
|
|
|
99356
99400
|
// src/handler/chat.ts
|
|
99401
|
+
var SSE_RACE_WAIT_MS = 100;
|
|
99357
99402
|
var activeAutoPrompts = /* @__PURE__ */ new Map();
|
|
99358
99403
|
async function handleChat(ctx, deps) {
|
|
99359
99404
|
const { content, chatId, chatType, senderId, shouldReply, messageType, rawContent, messageId } = ctx;
|
|
@@ -99370,6 +99415,15 @@ async function handleChat(ctx, deps) {
|
|
|
99370
99415
|
const session = await getOrCreateSession(client, sessionKey, directory);
|
|
99371
99416
|
const parts = await buildPromptParts(feishuClient, messageId, messageType, rawContent, content, chatType, senderId, log);
|
|
99372
99417
|
if (!parts.length) return;
|
|
99418
|
+
log("info", "\u6536\u5230\u7528\u6237\u6D88\u606F", {
|
|
99419
|
+
sessionKey,
|
|
99420
|
+
sessionId: session.id,
|
|
99421
|
+
chatType,
|
|
99422
|
+
senderId,
|
|
99423
|
+
messageType,
|
|
99424
|
+
shouldReply,
|
|
99425
|
+
parts
|
|
99426
|
+
});
|
|
99373
99427
|
if (!shouldReply) {
|
|
99374
99428
|
try {
|
|
99375
99429
|
await client.session.prompt({
|
|
@@ -99448,10 +99502,19 @@ async function handleChat(ctx, deps) {
|
|
|
99448
99502
|
}
|
|
99449
99503
|
}
|
|
99450
99504
|
} catch (err) {
|
|
99505
|
+
await new Promise((r) => setTimeout(r, SSE_RACE_WAIT_MS));
|
|
99506
|
+
const sessionError = getSessionError(session.id);
|
|
99507
|
+
clearSessionError(session.id);
|
|
99508
|
+
const thrownError = err instanceof Error ? err.message : String(err);
|
|
99509
|
+
const errorMessage = sessionError || thrownError;
|
|
99451
99510
|
log("error", "\u5BF9\u8BDD\u5904\u7406\u5931\u8D25", {
|
|
99452
|
-
|
|
99511
|
+
sessionId: session.id,
|
|
99512
|
+
sessionKey: sessionKey.replace(/-[^-]+$/, "-***"),
|
|
99513
|
+
chatType,
|
|
99514
|
+
error: thrownError,
|
|
99515
|
+
...sessionError ? { sessionError } : {}
|
|
99453
99516
|
});
|
|
99454
|
-
const msg = "\u274C " +
|
|
99517
|
+
const msg = "\u274C " + errorMessage;
|
|
99455
99518
|
await replyOrUpdate(feishuClient, chatId, placeholderId, msg);
|
|
99456
99519
|
} finally {
|
|
99457
99520
|
done = true;
|