@vibe-lark/larkpal 0.1.70 → 0.1.71

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 +75 -4
  2. package/package.json +1 -1
package/dist/main.mjs CHANGED
@@ -7215,6 +7215,7 @@ function createStatusRouter(config) {
7215
7215
  const router = express.Router();
7216
7216
  const sessionsDir = getWorkspaceChatsRoot(config?.workspaceRoot ?? resolveWorkspaceRoot("/workspace"));
7217
7217
  const processManager = config?.processManager;
7218
+ const messageStore = config?.messageStore;
7218
7219
  router.get("/sessions", async (req, res) => {
7219
7220
  logger$2.info("list sessions request", {
7220
7221
  method: req.method,
@@ -7315,12 +7316,14 @@ function createStatusRouter(config) {
7315
7316
  try {
7316
7317
  const uptimeSeconds = process.uptime();
7317
7318
  const memory = process.memoryUsage();
7318
- const processes = processManager?.getAllProcessInfo().map((processInfo) => {
7319
- return serializeRuntimeProcess(processInfo, processManager);
7320
- }) ?? [];
7319
+ const { processes, diagnostics } = processManager ? await serializeRuntimeProcesses(processManager, messageStore) : {
7320
+ processes: [],
7321
+ diagnostics: []
7322
+ };
7321
7323
  const statusData = {
7322
7324
  uptime: uptimeSeconds,
7323
7325
  processes,
7326
+ diagnostics,
7324
7327
  memory
7325
7328
  };
7326
7329
  logger$2.info("get status response", {
@@ -7370,6 +7373,48 @@ function createStatusRouter(config) {
7370
7373
  });
7371
7374
  return router;
7372
7375
  }
7376
+ async function serializeRuntimeProcesses(processManager, messageStore) {
7377
+ const processes = [];
7378
+ const diagnostics = [];
7379
+ for (const processInfo of processManager.getAllProcessInfo()) {
7380
+ const busy = processManager.isSessionBusy?.(processInfo.sessionId) ?? processInfo.status === "running";
7381
+ const terminalRunStatus = messageStore ? await getLatestTerminalRunStatus(messageStore, processInfo.sessionId) : null;
7382
+ if (terminalRunStatus && !busy && (processInfo.status === "running" || processInfo.status === "starting")) {
7383
+ try {
7384
+ await processManager.stopProcess(processInfo.sessionId);
7385
+ logger$2.warn("status reconcile cleaned terminal non-busy process", {
7386
+ sessionId: processInfo.sessionId,
7387
+ processStatus: processInfo.status,
7388
+ runStatus: terminalRunStatus.status,
7389
+ finalStatus: terminalRunStatus.finalStatus
7390
+ });
7391
+ } catch (err) {
7392
+ logger$2.error("status reconcile failed to stop terminal non-busy process", {
7393
+ sessionId: processInfo.sessionId,
7394
+ processStatus: processInfo.status,
7395
+ runStatus: terminalRunStatus.status,
7396
+ finalStatus: terminalRunStatus.finalStatus,
7397
+ error: err instanceof Error ? err.message : String(err)
7398
+ });
7399
+ }
7400
+ diagnostics.push({
7401
+ sessionId: processInfo.sessionId,
7402
+ reasonCode: "TERMINAL_RUN_PROCESS_STALE",
7403
+ reason: "Runtime process still appeared running after a persisted terminal chat run-status.",
7404
+ runStatus: terminalRunStatus.status,
7405
+ finalStatus: terminalRunStatus.finalStatus,
7406
+ processStatus: processInfo.status,
7407
+ busy
7408
+ });
7409
+ continue;
7410
+ }
7411
+ processes.push(serializeRuntimeProcess(processInfo, processManager));
7412
+ }
7413
+ return {
7414
+ processes,
7415
+ diagnostics
7416
+ };
7417
+ }
7373
7418
  function serializeRuntimeProcess(processInfo, processManager) {
7374
7419
  return {
7375
7420
  ...processInfo,
@@ -7378,6 +7423,31 @@ function serializeRuntimeProcess(processInfo, processManager) {
7378
7423
  busy: processManager.isSessionBusy?.(processInfo.sessionId) ?? processInfo.status === "running"
7379
7424
  };
7380
7425
  }
7426
+ async function getLatestTerminalRunStatus(messageStore, sessionId) {
7427
+ const history = await messageStore.getMessages(sessionId, { limit: 1e3 });
7428
+ for (const message of [...history.messages].reverse()) {
7429
+ if (message.metadata?.runtimeEventType !== "run-status") continue;
7430
+ const parsed = parseRunStatusContent(message.content);
7431
+ const status = parsed?.status ?? (typeof message.metadata.status === "string" ? message.metadata.status : void 0);
7432
+ const finalStatus = parsed?.finalStatus ?? message.metadata.finalStatus;
7433
+ if (status && status !== "running") return {
7434
+ status,
7435
+ finalStatus: typeof finalStatus === "string" ? finalStatus : void 0
7436
+ };
7437
+ }
7438
+ return null;
7439
+ }
7440
+ function parseRunStatusContent(content) {
7441
+ try {
7442
+ const parsed = JSON.parse(content);
7443
+ return {
7444
+ status: typeof parsed.run?.status === "string" ? parsed.run.status : void 0,
7445
+ finalStatus: typeof parsed.run?.finalStatus === "string" ? parsed.run.finalStatus : void 0
7446
+ };
7447
+ } catch {
7448
+ return null;
7449
+ }
7450
+ }
7381
7451
  //#endregion
7382
7452
  //#region src/gateway/server.ts
7383
7453
  const logger$1 = larkLogger("gateway");
@@ -7443,7 +7513,8 @@ function registerRoutes(app, processManager, scheduledTaskManager, appCredential
7443
7513
  }
7444
7514
  app.use("/api", createStatusRouter({
7445
7515
  workspaceRoot,
7446
- processManager
7516
+ processManager,
7517
+ messageStore
7447
7518
  }));
7448
7519
  app.use("/hooks", createHooksRouter());
7449
7520
  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.71",
4
4
  "description": "LarkPal - Lark/Feishu bot service",
5
5
  "type": "module",
6
6
  "main": "./dist/main.mjs",