refactor(extensions): dedupe channel config, onboarding, and monitors

This commit is contained in:
Peter Steinberger
2026-03-02 08:53:11 +00:00
parent d358b3ac88
commit ad8d766f65
43 changed files with 677 additions and 776 deletions

View File

@@ -1,10 +1,6 @@
import type {
ChannelAccountSnapshot,
ChannelGatewayContext,
OpenClawConfig,
} from "openclaw/plugin-sdk";
import type { ChannelAccountSnapshot } from "openclaw/plugin-sdk";
import { afterEach, describe, expect, it, vi } from "vitest";
import { createRuntimeEnv } from "../../test-utils/runtime-env.js";
import { createStartAccountContext } from "../../test-utils/start-account-context.js";
import type { ResolvedGoogleChatAccount } from "./accounts.js";
const hoisted = vi.hoisted(() => ({
@@ -21,32 +17,6 @@ vi.mock("./monitor.js", async () => {
import { googlechatPlugin } from "./channel.js";
function createStartAccountCtx(params: {
account: ResolvedGoogleChatAccount;
abortSignal: AbortSignal;
statusPatchSink?: (next: ChannelAccountSnapshot) => void;
}): ChannelGatewayContext<ResolvedGoogleChatAccount> {
const snapshot: ChannelAccountSnapshot = {
accountId: params.account.accountId,
configured: true,
enabled: true,
running: false,
};
return {
accountId: params.account.accountId,
account: params.account,
cfg: {} as OpenClawConfig,
runtime: createRuntimeEnv(),
abortSignal: params.abortSignal,
log: { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() },
getStatus: () => snapshot,
setStatus: (next) => {
Object.assign(snapshot, next);
params.statusPatchSink?.(snapshot);
},
};
}
describe("googlechatPlugin gateway.startAccount", () => {
afterEach(() => {
vi.clearAllMocks();
@@ -72,7 +42,7 @@ describe("googlechatPlugin gateway.startAccount", () => {
const patches: ChannelAccountSnapshot[] = [];
const abort = new AbortController();
const task = googlechatPlugin.gateway!.startAccount!(
createStartAccountCtx({
createStartAccountContext({
account,
abortSignal: abort.signal,
statusPatchSink: (next) => patches.push({ ...next }),

View File

@@ -2,6 +2,7 @@ import type { IncomingMessage, ServerResponse } from "node:http";
import type { OpenClawConfig } from "openclaw/plugin-sdk";
import {
GROUP_POLICY_BLOCKED_LABEL,
createInboundEnvelopeBuilder,
createScopedPairingAccess,
createReplyPrefixOptions,
readJsonBodyWithLimit,
@@ -646,6 +647,15 @@ async function processMessageWithPipeline(params: {
id: spaceId,
},
});
const buildEnvelope = createInboundEnvelopeBuilder({
cfg: config,
route,
sessionStore: config.session?.store,
resolveStorePath: core.channel.session.resolveStorePath,
readSessionUpdatedAt: core.channel.session.readSessionUpdatedAt,
resolveEnvelopeFormatOptions: core.channel.reply.resolveEnvelopeFormatOptions,
formatAgentEnvelope: core.channel.reply.formatAgentEnvelope,
});
let mediaPath: string | undefined;
let mediaType: string | undefined;
@@ -661,20 +671,10 @@ async function processMessageWithPipeline(params: {
const fromLabel = isGroup
? space.displayName || `space:${spaceId}`
: senderName || `user:${senderId}`;
const storePath = core.channel.session.resolveStorePath(config.session?.store, {
agentId: route.agentId,
});
const envelopeOptions = core.channel.reply.resolveEnvelopeFormatOptions(config);
const previousTimestamp = core.channel.session.readSessionUpdatedAt({
storePath,
sessionKey: route.sessionKey,
});
const body = core.channel.reply.formatAgentEnvelope({
const { storePath, body } = buildEnvelope({
channel: "Google Chat",
from: fromLabel,
timestamp: event.eventTime ? Date.parse(event.eventTime) : undefined,
previousTimestamp,
envelope: envelopeOptions,
body: rawBody,
});