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 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
- return errMsg.includes("ModelNotFound") || errMsg.includes("ProviderModelNotFound");
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 errMsg = props.error?.message ?? String(props.error);
99317
- if (isModelError(errMsg)) {
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
- error: err instanceof Error ? err.message : String(err)
99511
+ sessionId: session.id,
99512
+ sessionKey: sessionKey.replace(/-[^-]+$/, "-***"),
99513
+ chatType,
99514
+ error: thrownError,
99515
+ ...sessionError ? { sessionError } : {}
99453
99516
  });
99454
- const msg = "\u274C " + (err instanceof Error ? err.message : String(err));
99517
+ const msg = "\u274C " + errorMessage;
99455
99518
  await replyOrUpdate(feishuClient, chatId, placeholderId, msg);
99456
99519
  } finally {
99457
99520
  done = true;