mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-10 18:54:58 +00:00
fix(slack): skip monitor startup for disabled accounts [AI-assisted] (openclaw#30592) thanks @liuxiaopai-ai
Verified: - pnpm install --frozen-lockfile - pnpm build - pnpm check - pnpm test:macmini Co-authored-by: liuxiaopai-ai <73659136+liuxiaopai-ai@users.noreply.github.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
This commit is contained in:
@@ -113,6 +113,7 @@ Docs: https://docs.openclaw.ai
|
|||||||
- Android/Onboarding + voice reliability: request per-toggle onboarding permissions, update pairing guidance to `openclaw devices list/approve`, restore assistant speech playback in mic capture flow, cancel superseded in-flight speech (mute + per-reply token rotation), and keep `talk.config` loads retryable after transient failures. (#29796) Thanks @obviyus.
|
- Android/Onboarding + voice reliability: request per-toggle onboarding permissions, update pairing guidance to `openclaw devices list/approve`, restore assistant speech playback in mic capture flow, cancel superseded in-flight speech (mute + per-reply token rotation), and keep `talk.config` loads retryable after transient failures. (#29796) Thanks @obviyus.
|
||||||
- FS/Sandbox workspace boundaries: add a dedicated `outside-workspace` safe-open error code for root-escape checks, and propagate specific outside-workspace messages across edit/browser/media consumers instead of generic not-found/invalid-path fallbacks. (#29715) Thanks @YuzuruS.
|
- FS/Sandbox workspace boundaries: add a dedicated `outside-workspace` safe-open error code for root-escape checks, and propagate specific outside-workspace messages across edit/browser/media consumers instead of generic not-found/invalid-path fallbacks. (#29715) Thanks @YuzuruS.
|
||||||
- Config/Doctor group allowlist diagnostics: align `groupPolicy: "allowlist"` warnings with per-channel runtime semantics by excluding Google Chat sender-list checks and by warning when no-fallback channels (for example iMessage) omit `groupAllowFrom`, with regression coverage. (#28477) Thanks @tonydehnke.
|
- Config/Doctor group allowlist diagnostics: align `groupPolicy: "allowlist"` warnings with per-channel runtime semantics by excluding Google Chat sender-list checks and by warning when no-fallback channels (for example iMessage) omit `groupAllowFrom`, with regression coverage. (#28477) Thanks @tonydehnke.
|
||||||
|
- Slack/Disabled channel startup: skip Slack monitor socket startup entirely when `channels.slack.enabled=false` (including configs that still contain valid tokens), preventing disabled accounts from opening websocket connections. (#30586)
|
||||||
- Onboarding/Custom providers: use Azure OpenAI-specific verification auth/payload shape (`api-key`, deployment-path chat completions payload) when probing Azure endpoints so valid Azure custom-provider setup no longer fails preflight. (#29421) Thanks @kunalk16.
|
- Onboarding/Custom providers: use Azure OpenAI-specific verification auth/payload shape (`api-key`, deployment-path chat completions payload) when probing Azure endpoints so valid Azure custom-provider setup no longer fails preflight. (#29421) Thanks @kunalk16.
|
||||||
- Feishu/Docx editing tools: add `feishu_doc` positional insert, table row/column operations, table-cell merge, and color-text updates; switch markdown write/append/insert to Descendant API insertion with large-document batching; and harden image uploads for data URI/base64/local-path inputs with strict validation and routing-safe upload metadata. (#29411) Thanks @Elarwei001.
|
- Feishu/Docx editing tools: add `feishu_doc` positional insert, table row/column operations, table-cell merge, and color-text updates; switch markdown write/append/insert to Descendant API insertion with large-document batching; and harden image uploads for data URI/base64/local-path inputs with strict validation and routing-safe upload metadata. (#29411) Thanks @Elarwei001.
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ import {
|
|||||||
defaultSlackTestConfig,
|
defaultSlackTestConfig,
|
||||||
getSlackTestState,
|
getSlackTestState,
|
||||||
getSlackClient,
|
getSlackClient,
|
||||||
|
getSlackHandlers,
|
||||||
getSlackHandlerOrThrow,
|
getSlackHandlerOrThrow,
|
||||||
|
flush,
|
||||||
resetSlackTestState,
|
resetSlackTestState,
|
||||||
runSlackMessageOnce,
|
runSlackMessageOnce,
|
||||||
startSlackMonitor,
|
startSlackMonitor,
|
||||||
@@ -119,6 +121,32 @@ describe("monitorSlackProvider tool results", () => {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
it("skips socket startup when Slack channel is disabled", async () => {
|
||||||
|
slackTestState.config = {
|
||||||
|
channels: {
|
||||||
|
slack: {
|
||||||
|
enabled: false,
|
||||||
|
mode: "socket",
|
||||||
|
botToken: "xoxb-config",
|
||||||
|
appToken: "xapp-config",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const client = getSlackClient();
|
||||||
|
if (!client) {
|
||||||
|
throw new Error("Slack client not registered");
|
||||||
|
}
|
||||||
|
client.auth.test.mockClear();
|
||||||
|
|
||||||
|
const { controller, run } = startSlackMonitor(monitorSlackProvider);
|
||||||
|
await flush();
|
||||||
|
controller.abort();
|
||||||
|
await run;
|
||||||
|
|
||||||
|
expect(client.auth.test).not.toHaveBeenCalled();
|
||||||
|
expect(getSlackHandlers()?.size ?? 0).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
it("skips tool summaries with responsePrefix", async () => {
|
it("skips tool summaries with responsePrefix", async () => {
|
||||||
replyMock.mockResolvedValue({ text: "final reply" });
|
replyMock.mockResolvedValue({ text: "final reply" });
|
||||||
|
|
||||||
|
|||||||
@@ -58,12 +58,26 @@ function parseApiAppIdFromAppToken(raw?: string) {
|
|||||||
|
|
||||||
export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) {
|
export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) {
|
||||||
const cfg = opts.config ?? loadConfig();
|
const cfg = opts.config ?? loadConfig();
|
||||||
|
const runtime: RuntimeEnv = opts.runtime ?? createNonExitingRuntime();
|
||||||
|
|
||||||
let account = resolveSlackAccount({
|
let account = resolveSlackAccount({
|
||||||
cfg,
|
cfg,
|
||||||
accountId: opts.accountId,
|
accountId: opts.accountId,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!account.enabled) {
|
||||||
|
runtime.log?.(`[${account.accountId}] slack account disabled; monitor startup skipped`);
|
||||||
|
if (opts.abortSignal?.aborted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await new Promise<void>((resolve) => {
|
||||||
|
opts.abortSignal?.addEventListener("abort", () => resolve(), {
|
||||||
|
once: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const historyLimit = Math.max(
|
const historyLimit = Math.max(
|
||||||
0,
|
0,
|
||||||
account.config.historyLimit ??
|
account.config.historyLimit ??
|
||||||
@@ -93,8 +107,6 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const runtime: RuntimeEnv = opts.runtime ?? createNonExitingRuntime();
|
|
||||||
|
|
||||||
const slackCfg = account.config;
|
const slackCfg = account.config;
|
||||||
const dmConfig = slackCfg.dm;
|
const dmConfig = slackCfg.dm;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user