惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Martin Fowler
Martin Fowler
Last Week in AI
Last Week in AI
罗磊的独立博客
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
博客园_首页
人人都是产品经理
人人都是产品经理
量子位
美团技术团队
The Cloudflare Blog
小众软件
小众软件
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
博客园 - Franky

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix(acp): fall through to thread-bound resolution when to...
hclsys · 2026-04-30 · via Recent Commits to openclaw:main

@@ -1618,6 +1618,35 @@ describe("/acp command", () => {

16181618

expect(hoisted.runTurnMock).not.toHaveBeenCalled();

16191619

});

162016201621+

it("falls through to thread-bound resolution when explicit session token is unresolvable", async () => {

1622+

// callGateway returns null for sessions.resolve (unresolvable token)

1623+

// but a thread-bound session exists — should use thread-bound, not error out

1624+

hoisted.callGatewayMock.mockImplementation(async (request: { method?: string }) => {

1625+

if (request.method === "sessions.resolve") {

1626+

return null; // token lookup fails

1627+

}

1628+

return { ok: true };

1629+

});

1630+

mockBoundThreadSession();

1631+

hoisted.readAcpSessionEntryMock.mockReturnValue(createAcpSessionEntry());

1632+

hoisted.runTurnMock.mockImplementation(async function* () {

1633+

yield { type: "text_delta", text: "Steered." };

1634+

yield { type: "done" };

1635+

});

1636+1637+

const result = await runThreadAcpCommand(

1638+

`/acp steer --session unresolvable-token-xyz tighten logging`,

1639+

);

1640+1641+

expect(hoisted.runTurnMock).toHaveBeenCalledWith(

1642+

expect.objectContaining({

1643+

mode: "steer",

1644+

sessionKey: defaultAcpSessionKey,

1645+

}),

1646+

);

1647+

expect(result?.reply?.text).toContain("Steered.");

1648+

});

1649+16211650

it("closes an ACP session, unbinds thread targets, and clears metadata", async () => {

16221651

mockBoundThreadSession();

16231652

hoisted.sessionBindingUnbindMock.mockResolvedValue([

@@ -1637,6 +1666,56 @@ describe("/acp command", () => {

16371666

expect(result?.reply?.text).toContain("Removed 1 binding");

16381667

});

163916681669+

it("closes the bound thread ACP session when an explicit session token is unresolvable", async () => {

1670+

hoisted.callGatewayMock.mockImplementation(async (request: { method?: string }) => {

1671+

if (request.method === "sessions.resolve") {

1672+

return null;

1673+

}

1674+

return { ok: true };

1675+

});

1676+

mockBoundThreadSession();

1677+

hoisted.sessionBindingUnbindMock.mockResolvedValue([

1678+

createBoundThreadSession() as SessionBindingRecord,

1679+

]);

1680+1681+

const result = await runThreadAcpCommand("/acp close not-a-session-target");

1682+1683+

expect(hoisted.closeMock).toHaveBeenCalledWith({

1684+

cfg: baseCfg,

1685+

sessionKey: defaultAcpSessionKey,

1686+

reason: "manual-close",

1687+

allowBackendUnavailable: true,

1688+

clearMeta: true,

1689+

});

1690+

expect(hoisted.sessionBindingUnbindMock).toHaveBeenCalledWith(

1691+

expect.objectContaining({

1692+

targetSessionKey: defaultAcpSessionKey,

1693+

reason: "manual",

1694+

}),

1695+

);

1696+

expect(result?.reply?.text).toContain(`Closed ACP session ${defaultAcpSessionKey}`);

1697+

});

1698+1699+

it("reports an explicit bad ACP session token before requester fallback", async () => {

1700+

hoisted.callGatewayMock.mockImplementation(async (request: { method?: string }) => {

1701+

if (request.method === "sessions.resolve") {

1702+

return null;

1703+

}

1704+

return { ok: true };

1705+

});

1706+

const params = createConversationParams("/acp close not-a-session-target", {

1707+

channel: "discord",

1708+

originatingTo: "channel:parent-1",

1709+

sessionKey: "requester-session",

1710+

});

1711+1712+

const result = await handleAcpCommand(params, true);

1713+1714+

expect(result?.reply?.text).toContain("Unable to resolve session target: not-a-session-target");

1715+

expect(hoisted.closeMock).not.toHaveBeenCalled();

1716+

expect(hoisted.readAcpSessionEntryMock).not.toHaveBeenCalled();

1717+

});

1718+16401719

it("handles /acp close in a bound thread when text commands are disabled", async () => {

16411720

mockBoundThreadSession();

16421721

hoisted.sessionBindingUnbindMock.mockResolvedValue([