
























@@ -7,35 +7,18 @@ import {
77createMessageReceiptFromOutboundResults,
88defineChannelMessageAdapter,
99} from "openclaw/plugin-sdk/channel-outbound";
10-import { getChatChannelMeta } from "openclaw/plugin-sdk/channel-plugin-common";
11-import {
12-DEFAULT_ACCOUNT_ID,
13-listQaChannelAccountIds,
14-resolveDefaultQaChannelAccountId,
15-resolveQaChannelAccount,
16-} from "./accounts.js";
10+import { DEFAULT_ACCOUNT_ID } from "./accounts.js";
1711import { buildQaTarget, normalizeQaTarget, parseQaTarget } from "./bus-client.js";
1812import { qaChannelMessageActions } from "./channel-actions.js";
19-import { qaChannelPluginConfigSchema } from "./config-schema.js";
13+import { createQaChannelPluginBase, QA_CHANNEL_ID, qaChannelRuntimeMeta } from "./channel-base.js";
2014import { startQaGatewayAccount } from "./gateway.js";
2115import { sendQaChannelText } from "./outbound.js";
2216import type { ChannelPlugin } from "./runtime-api.js";
23-import { applyQaSetup } from "./setup.js";
2417import { qaChannelStatus } from "./status.js";
2518import type { CoreConfig, ResolvedQaChannelAccount } from "./types.js";
261927-const CHANNEL_ID = "qa-channel" as const;
28-const meta = {
29- ...getChatChannelMeta(CHANNEL_ID),
30-id: CHANNEL_ID,
31-label: "QA Channel",
32-selectionLabel: "QA Channel",
33-docsPath: "/channels/qa-channel",
34-blurb: "Synthetic QA channel for OpenClaw QA runs.",
35-};
36-3720const qaChannelMessageAdapter = defineChannelMessageAdapter({
38-id: CHANNEL_ID,
21+id: QA_CHANNEL_ID,
3922durableFinal: {
4023capabilities: {
4124text: true,
@@ -59,7 +42,7 @@ const qaChannelMessageAdapter = defineChannelMessageAdapter({
5942return {
6043messageId: result.messageId,
6144receipt: createMessageReceiptFromOutboundResults({
62-results: [{ channel: CHANNEL_ID, messageId: result.messageId }],
45+results: [{ channel: QA_CHANNEL_ID, messageId: result.messageId }],
6346 threadId,
6447 replyToId,
6548kind: "text",
@@ -71,32 +54,7 @@ const qaChannelMessageAdapter = defineChannelMessageAdapter({
71547255export const qaChannelPlugin: ChannelPlugin<ResolvedQaChannelAccount> = createChatChannelPlugin({
7356base: {
74-id: CHANNEL_ID,
75- meta,
76-capabilities: {
77-chatTypes: ["direct", "group"],
78-},
79-reload: { configPrefixes: ["channels.qa-channel"] },
80-configSchema: qaChannelPluginConfigSchema,
81-setup: {
82-applyAccountConfig: ({ cfg, accountId, input }) =>
83-applyQaSetup({
84- cfg,
85- accountId,
86-input: input as Record<string, unknown>,
87-}),
88-},
89-config: {
90-listAccountIds: (cfg) => listQaChannelAccountIds(cfg as CoreConfig),
91-resolveAccount: (cfg, accountId) =>
92-resolveQaChannelAccount({ cfg: cfg as CoreConfig, accountId }),
93-defaultAccountId: (cfg) => resolveDefaultQaChannelAccountId(cfg as CoreConfig),
94-isConfigured: (account) => account.configured,
95-resolveAllowFrom: ({ cfg, accountId }) =>
96-resolveQaChannelAccount({ cfg: cfg as CoreConfig, accountId }).config.allowFrom,
97-resolveDefaultTo: ({ cfg, accountId }) =>
98-resolveQaChannelAccount({ cfg: cfg as CoreConfig, accountId }).config.defaultTo,
99-},
57+ ...createQaChannelPluginBase(qaChannelRuntimeMeta),
10058messaging: {
10159normalizeTarget: normalizeQaTarget,
10260inferTargetChatType: ({ to }) => parseQaTarget(to).chatType,
@@ -118,7 +76,7 @@ export const qaChannelPlugin: ChannelPlugin<ResolvedQaChannelAccount> = createCh
11876const baseRoute = buildChannelOutboundSessionRoute({
11977 cfg,
12078 agentId,
121-channel: CHANNEL_ID,
79+channel: QA_CHANNEL_ID,
12280 accountId,
12381peer: {
12482kind:
@@ -130,7 +88,7 @@ export const qaChannelPlugin: ChannelPlugin<ResolvedQaChannelAccount> = createCh
13088id: buildQaTarget(parsed),
13189},
13290chatType: parsed.chatType,
133-from: `qa-channel:${accountId ?? DEFAULT_ACCOUNT_ID}`,
91+from: `${QA_CHANNEL_ID}:${accountId ?? DEFAULT_ACCOUNT_ID}`,
13492to: buildQaTarget(parsed),
13593});
13694return buildThreadAwareOutboundSessionRoute({
@@ -158,7 +116,7 @@ export const qaChannelPlugin: ChannelPlugin<ResolvedQaChannelAccount> = createCh
158116status: qaChannelStatus,
159117gateway: {
160118startAccount: async (ctx) => {
161-await startQaGatewayAccount(CHANNEL_ID, meta.label, ctx);
119+await startQaGatewayAccount(QA_CHANNEL_ID, qaChannelRuntimeMeta.label, ctx);
162120},
163121},
164122actions: qaChannelMessageActions,
@@ -169,7 +127,7 @@ export const qaChannelPlugin: ChannelPlugin<ResolvedQaChannelAccount> = createCh
169127deliveryMode: "direct",
170128},
171129attachedResults: {
172-channel: CHANNEL_ID,
130+channel: QA_CHANNEL_ID,
173131sendText: async ({ cfg, to, text, accountId, threadId, replyToId }) =>
174132await sendQaChannelText({
175133cfg: cfg as CoreConfig,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。