@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.
- package/dist/main.mjs +75 -4
- 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
|
|
7319
|
-
|
|
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());
|