@vibe-lark/larkpal 0.1.70 → 0.1.72

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.
Files changed (2) hide show
  1. package/dist/main.mjs +82 -5
  2. package/package.json +1 -1
package/dist/main.mjs CHANGED
@@ -3708,6 +3708,7 @@ function findChatRunByRunId(runId) {
3708
3708
  }
3709
3709
  function serializeChatRun(run) {
3710
3710
  const idleSeconds = Math.max(0, Math.floor((Date.now() - run.lastEventAt) / 1e3));
3711
+ const processStatus = getSerializableRunProcessStatus(run);
3711
3712
  return {
3712
3713
  runId: run.runId,
3713
3714
  sessionId: run.sessionId,
@@ -3726,10 +3727,15 @@ function serializeChatRun(run) {
3726
3727
  lastToolName: run.lastToolName,
3727
3728
  idleSeconds,
3728
3729
  adapterBusy: run.status === "running" ? run.adapterBusy : false,
3729
- processStatus: run.processStatus,
3730
+ processStatus,
3730
3731
  staleReason: run.staleReason
3731
3732
  };
3732
3733
  }
3734
+ function getSerializableRunProcessStatus(run) {
3735
+ if (run.status === "running") return run.processStatus;
3736
+ if (run.processStatus === "running" || run.processStatus === "starting") return void 0;
3737
+ return run.processStatus;
3738
+ }
3733
3739
  function serializeRuntimeProcessInfo(processInfo, processManager) {
3734
3740
  return {
3735
3741
  ...processInfo,
@@ -7215,6 +7221,7 @@ function createStatusRouter(config) {
7215
7221
  const router = express.Router();
7216
7222
  const sessionsDir = getWorkspaceChatsRoot(config?.workspaceRoot ?? resolveWorkspaceRoot("/workspace"));
7217
7223
  const processManager = config?.processManager;
7224
+ const messageStore = config?.messageStore;
7218
7225
  router.get("/sessions", async (req, res) => {
7219
7226
  logger$2.info("list sessions request", {
7220
7227
  method: req.method,
@@ -7315,12 +7322,14 @@ function createStatusRouter(config) {
7315
7322
  try {
7316
7323
  const uptimeSeconds = process.uptime();
7317
7324
  const memory = process.memoryUsage();
7318
- const processes = processManager?.getAllProcessInfo().map((processInfo) => {
7319
- return serializeRuntimeProcess(processInfo, processManager);
7320
- }) ?? [];
7325
+ const { processes, diagnostics } = processManager ? await serializeRuntimeProcesses(processManager, messageStore) : {
7326
+ processes: [],
7327
+ diagnostics: []
7328
+ };
7321
7329
  const statusData = {
7322
7330
  uptime: uptimeSeconds,
7323
7331
  processes,
7332
+ diagnostics,
7324
7333
  memory
7325
7334
  };
7326
7335
  logger$2.info("get status response", {
@@ -7370,6 +7379,48 @@ function createStatusRouter(config) {
7370
7379
  });
7371
7380
  return router;
7372
7381
  }
7382
+ async function serializeRuntimeProcesses(processManager, messageStore) {
7383
+ const processes = [];
7384
+ const diagnostics = [];
7385
+ for (const processInfo of processManager.getAllProcessInfo()) {
7386
+ const busy = processManager.isSessionBusy?.(processInfo.sessionId) ?? processInfo.status === "running";
7387
+ const terminalRunStatus = messageStore ? await getLatestTerminalRunStatus(messageStore, processInfo.sessionId) : null;
7388
+ if (terminalRunStatus && !busy && (processInfo.status === "running" || processInfo.status === "starting")) {
7389
+ try {
7390
+ await processManager.stopProcess(processInfo.sessionId);
7391
+ logger$2.warn("status reconcile cleaned terminal non-busy process", {
7392
+ sessionId: processInfo.sessionId,
7393
+ processStatus: processInfo.status,
7394
+ runStatus: terminalRunStatus.status,
7395
+ finalStatus: terminalRunStatus.finalStatus
7396
+ });
7397
+ } catch (err) {
7398
+ logger$2.error("status reconcile failed to stop terminal non-busy process", {
7399
+ sessionId: processInfo.sessionId,
7400
+ processStatus: processInfo.status,
7401
+ runStatus: terminalRunStatus.status,
7402
+ finalStatus: terminalRunStatus.finalStatus,
7403
+ error: err instanceof Error ? err.message : String(err)
7404
+ });
7405
+ }
7406
+ diagnostics.push({
7407
+ sessionId: processInfo.sessionId,
7408
+ reasonCode: "TERMINAL_RUN_PROCESS_STALE",
7409
+ reason: "Runtime process still appeared running after a persisted terminal chat run-status.",
7410
+ runStatus: terminalRunStatus.status,
7411
+ finalStatus: terminalRunStatus.finalStatus,
7412
+ processStatus: processInfo.status,
7413
+ busy
7414
+ });
7415
+ continue;
7416
+ }
7417
+ processes.push(serializeRuntimeProcess(processInfo, processManager));
7418
+ }
7419
+ return {
7420
+ processes,
7421
+ diagnostics
7422
+ };
7423
+ }
7373
7424
  function serializeRuntimeProcess(processInfo, processManager) {
7374
7425
  return {
7375
7426
  ...processInfo,
@@ -7378,6 +7429,31 @@ function serializeRuntimeProcess(processInfo, processManager) {
7378
7429
  busy: processManager.isSessionBusy?.(processInfo.sessionId) ?? processInfo.status === "running"
7379
7430
  };
7380
7431
  }
7432
+ async function getLatestTerminalRunStatus(messageStore, sessionId) {
7433
+ const history = await messageStore.getMessages(sessionId, { limit: 1e3 });
7434
+ for (const message of [...history.messages].reverse()) {
7435
+ if (message.metadata?.runtimeEventType !== "run-status") continue;
7436
+ const parsed = parseRunStatusContent(message.content);
7437
+ const status = parsed?.status ?? (typeof message.metadata.status === "string" ? message.metadata.status : void 0);
7438
+ const finalStatus = parsed?.finalStatus ?? message.metadata.finalStatus;
7439
+ if (status && status !== "running") return {
7440
+ status,
7441
+ finalStatus: typeof finalStatus === "string" ? finalStatus : void 0
7442
+ };
7443
+ }
7444
+ return null;
7445
+ }
7446
+ function parseRunStatusContent(content) {
7447
+ try {
7448
+ const parsed = JSON.parse(content);
7449
+ return {
7450
+ status: typeof parsed.run?.status === "string" ? parsed.run.status : void 0,
7451
+ finalStatus: typeof parsed.run?.finalStatus === "string" ? parsed.run.finalStatus : void 0
7452
+ };
7453
+ } catch {
7454
+ return null;
7455
+ }
7456
+ }
7381
7457
  //#endregion
7382
7458
  //#region src/gateway/server.ts
7383
7459
  const logger$1 = larkLogger("gateway");
@@ -7443,7 +7519,8 @@ function registerRoutes(app, processManager, scheduledTaskManager, appCredential
7443
7519
  }
7444
7520
  app.use("/api", createStatusRouter({
7445
7521
  workspaceRoot,
7446
- processManager
7522
+ processManager,
7523
+ messageStore
7447
7524
  }));
7448
7525
  app.use("/hooks", createHooksRouter());
7449
7526
  app.use("/api/mcp", createMcpCallbackRouter());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-lark/larkpal",
3
- "version": "0.1.70",
3
+ "version": "0.1.72",
4
4
  "description": "LarkPal - Lark/Feishu bot service",
5
5
  "type": "module",
6
6
  "main": "./dist/main.mjs",