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