mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 13:01:25 +00:00
fix(cron): force fresh isolated session IDs
This commit is contained in:
@@ -41,6 +41,7 @@ Docs: https://docs.openclaw.ai
|
|||||||
- Plugins/Discovery: ignore scanned extension backup/disabled directory patterns (for example `.backup-*`, `.bak`, `.disabled*`) and move updater backup directories under `.openclaw-install-backups`, preventing duplicate plugin-id collisions from archived copies.
|
- Plugins/Discovery: ignore scanned extension backup/disabled directory patterns (for example `.backup-*`, `.bak`, `.disabled*`) and move updater backup directories under `.openclaw-install-backups`, preventing duplicate plugin-id collisions from archived copies.
|
||||||
- Dev tooling: prevent `CLAUDE.md` symlink target regressions by excluding CLAUDE symlink sentinels from `oxfmt` and marking them `-text` in `.gitattributes`, so formatter/EOL normalization cannot reintroduce trailing-newline targets. Thanks @vincentkoc.
|
- Dev tooling: prevent `CLAUDE.md` symlink target regressions by excluding CLAUDE symlink sentinels from `oxfmt` and marking them `-text` in `.gitattributes`, so formatter/EOL normalization cannot reintroduce trailing-newline targets. Thanks @vincentkoc.
|
||||||
- Cron: honor `cron.maxConcurrentRuns` in the timer loop so due jobs can execute up to the configured parallelism instead of always running serially. (#11595) Thanks @Takhoffman.
|
- Cron: honor `cron.maxConcurrentRuns` in the timer loop so due jobs can execute up to the configured parallelism instead of always running serially. (#11595) Thanks @Takhoffman.
|
||||||
|
- Cron/Isolation: force fresh session IDs for isolated cron runs so `sessionTarget="isolated"` executions never reuse prior run context. (#23470) Thanks @echoVic.
|
||||||
- Agents/Compaction: restore embedded compaction safeguard/context-pruning extension loading in production by wiring bundled extension factories into the resource loader instead of runtime file-path resolution. (#22349) Thanks @Glucksberg.
|
- Agents/Compaction: restore embedded compaction safeguard/context-pruning extension loading in production by wiring bundled extension factories into the resource loader instead of runtime file-path resolution. (#22349) Thanks @Glucksberg.
|
||||||
- Feishu/Media: for inbound video messages that include both `file_key` (video) and `image_key` (thumbnail), prefer `file_key` when downloading media so video attachments are saved instead of silently failing on thumbnail keys. (#23633)
|
- Feishu/Media: for inbound video messages that include both `file_key` (video) and `image_key` (thumbnail), prefer `file_key` when downloading media so video attachments are saved instead of silently failing on thumbnail keys. (#23633)
|
||||||
- Hooks/Cron: suppress duplicate main-session events for delivered hook turns and mark `SILENT_REPLY_TOKEN` (`NO_REPLY`) early exits as delivered to prevent hook context pollution. (#20678) Thanks @JonathanWorks.
|
- Hooks/Cron: suppress duplicate main-session events for delivered hook turns and mark `SILENT_REPLY_TOKEN` (`NO_REPLY`) early exits as delivered to prevent hook context pollution. (#20678) Thanks @JonathanWorks.
|
||||||
|
|||||||
@@ -327,6 +327,16 @@ describe("runCronIsolatedAgentTurn — skill filter", () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("forces a fresh session for isolated cron runs", async () => {
|
||||||
|
const result = await runCronIsolatedAgentTurn(makeParams());
|
||||||
|
|
||||||
|
expect(result.status).toBe("ok");
|
||||||
|
expect(resolveCronSessionMock).toHaveBeenCalledOnce();
|
||||||
|
expect(resolveCronSessionMock.mock.calls[0]?.[0]).toMatchObject({
|
||||||
|
forceNew: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it("reuses cached snapshot when version and normalized skillFilter are unchanged", async () => {
|
it("reuses cached snapshot when version and normalized skillFilter are unchanged", async () => {
|
||||||
resolveAgentSkillsFilterMock.mockReturnValue([" weather ", "meme-factory", "weather"]);
|
resolveAgentSkillsFilterMock.mockReturnValue([" weather ", "meme-factory", "weather"]);
|
||||||
resolveCronSessionMock.mockReturnValue({
|
resolveCronSessionMock.mockReturnValue({
|
||||||
|
|||||||
@@ -270,6 +270,8 @@ export async function runCronIsolatedAgentTurn(params: {
|
|||||||
sessionKey: agentSessionKey,
|
sessionKey: agentSessionKey,
|
||||||
agentId,
|
agentId,
|
||||||
nowMs: now,
|
nowMs: now,
|
||||||
|
// Isolated cron runs must not carry prior turn context across executions.
|
||||||
|
forceNew: params.job.sessionTarget === "isolated",
|
||||||
});
|
});
|
||||||
const runSessionId = cronSession.sessionEntry.sessionId;
|
const runSessionId = cronSession.sessionEntry.sessionId;
|
||||||
const runSessionKey = baseSessionKey.startsWith("cron:")
|
const runSessionKey = baseSessionKey.startsWith("cron:")
|
||||||
|
|||||||
Reference in New Issue
Block a user