mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 18:10:45 +00:00
refactor(channels): route inbound turns through kernel
This commit is contained in:
@@ -40,6 +40,26 @@ export function installMSTeamsTestRuntime(options: MSTeamsTestRuntimeOptions = {
|
||||
};
|
||||
},
|
||||
);
|
||||
const run = vi.fn(async (params: Parameters<PluginRuntime["channel"]["turn"]["run"]>[0]) => {
|
||||
const input = await params.adapter.ingest(params.raw);
|
||||
if (!input) {
|
||||
return { admission: { kind: "drop" as const, reason: "ingest-null" }, dispatched: false };
|
||||
}
|
||||
const eventClass = (await params.adapter.classify?.(input)) ?? {
|
||||
kind: "message" as const,
|
||||
canStartAgentTurn: true,
|
||||
};
|
||||
const preflightResult = await params.adapter.preflight?.(input, eventClass);
|
||||
const preflight =
|
||||
preflightResult && "kind" in preflightResult
|
||||
? { admission: preflightResult }
|
||||
: (preflightResult ?? {});
|
||||
const turn = await params.adapter.resolveTurn(input, eventClass, preflight);
|
||||
if ("runDispatch" in turn) {
|
||||
return await runPrepared(turn);
|
||||
}
|
||||
throw new Error("msteams test runtime only supports prepared turn dispatch");
|
||||
});
|
||||
setMSTeamsRuntime({
|
||||
logging: { shouldLogVerbose: () => false },
|
||||
system: { enqueueSystemEvent: options.enqueueSystemEvent ?? vi.fn() },
|
||||
@@ -90,6 +110,7 @@ export function installMSTeamsTestRuntime(options: MSTeamsTestRuntimeOptions = {
|
||||
...(options.resolveStorePath ? { resolveStorePath: options.resolveStorePath } : {}),
|
||||
},
|
||||
turn: {
|
||||
run: run as unknown as PluginRuntime["channel"]["turn"]["run"],
|
||||
runPrepared: runPrepared as unknown as PluginRuntime["channel"]["turn"]["runPrepared"],
|
||||
},
|
||||
},
|
||||
|
||||
@@ -18,7 +18,6 @@ import {
|
||||
} from "openclaw/plugin-sdk/inbound-reply-dispatch";
|
||||
import {
|
||||
buildPendingHistoryContextFromMap,
|
||||
clearHistoryEntriesIfEnabled,
|
||||
DEFAULT_GROUP_HISTORY_LIMIT,
|
||||
recordPendingHistoryEntryIfEnabled,
|
||||
type HistoryEntry,
|
||||
@@ -840,33 +839,57 @@ export function createMSTeamsMessageHandler(deps: MSTeamsMessageHandlerDeps) {
|
||||
|
||||
log.info("dispatching to agent", { sessionKey: route.sessionKey });
|
||||
try {
|
||||
const { dispatchResult } = await core.channel.turn.runPrepared({
|
||||
const turnResult = await core.channel.turn.run({
|
||||
channel: "msteams",
|
||||
accountId: route.accountId,
|
||||
routeSessionKey: route.sessionKey,
|
||||
storePath,
|
||||
ctxPayload,
|
||||
recordInboundSession: core.channel.session.recordInboundSession,
|
||||
record: {
|
||||
onRecordError: (err) => {
|
||||
logVerboseMessage(`msteams: failed updating session meta: ${formatUnknownError(err)}`);
|
||||
},
|
||||
},
|
||||
onPreDispatchFailure: () =>
|
||||
core.channel.reply.settleReplyDispatcher({
|
||||
dispatcher,
|
||||
onSettled: () => markDispatchIdle(),
|
||||
raw: context,
|
||||
adapter: {
|
||||
ingest: () => ({
|
||||
id: activity.id ?? `${teamsFrom}:${Date.now()}`,
|
||||
timestamp: timestamp?.getTime(),
|
||||
rawText: rawBody,
|
||||
textForAgent: bodyForAgent,
|
||||
textForCommands: commandBody,
|
||||
raw: activity,
|
||||
}),
|
||||
runDispatch: () =>
|
||||
dispatchReplyFromConfigWithSettledDispatcher({
|
||||
cfg,
|
||||
resolveTurn: () => ({
|
||||
channel: "msteams",
|
||||
accountId: route.accountId,
|
||||
routeSessionKey: route.sessionKey,
|
||||
storePath,
|
||||
ctxPayload,
|
||||
dispatcher,
|
||||
onSettled: () => markDispatchIdle(),
|
||||
replyOptions,
|
||||
configOverride,
|
||||
recordInboundSession: core.channel.session.recordInboundSession,
|
||||
record: {
|
||||
onRecordError: (err) => {
|
||||
logVerboseMessage(
|
||||
`msteams: failed updating session meta: ${formatUnknownError(err)}`,
|
||||
);
|
||||
},
|
||||
},
|
||||
history: {
|
||||
isGroup: isRoomish,
|
||||
historyKey,
|
||||
historyMap: conversationHistories,
|
||||
limit: historyLimit,
|
||||
},
|
||||
onPreDispatchFailure: () =>
|
||||
core.channel.reply.settleReplyDispatcher({
|
||||
dispatcher,
|
||||
onSettled: () => markDispatchIdle(),
|
||||
}),
|
||||
runDispatch: () =>
|
||||
dispatchReplyFromConfigWithSettledDispatcher({
|
||||
cfg,
|
||||
ctxPayload,
|
||||
dispatcher,
|
||||
onSettled: () => markDispatchIdle(),
|
||||
replyOptions,
|
||||
configOverride,
|
||||
}),
|
||||
}),
|
||||
},
|
||||
});
|
||||
const dispatchResult = turnResult.dispatched ? turnResult.dispatchResult : undefined;
|
||||
const queuedFinal = dispatchResult?.queuedFinal ?? false;
|
||||
const counts = resolveInboundReplyDispatchCounts(dispatchResult);
|
||||
const hasFinalResponse = hasFinalInboundReplyDispatch(dispatchResult);
|
||||
@@ -874,26 +897,12 @@ export function createMSTeamsMessageHandler(deps: MSTeamsMessageHandlerDeps) {
|
||||
log.info("dispatch complete", { queuedFinal, counts });
|
||||
|
||||
if (!hasFinalResponse) {
|
||||
if (isRoomish && historyKey) {
|
||||
clearHistoryEntriesIfEnabled({
|
||||
historyMap: conversationHistories,
|
||||
historyKey,
|
||||
limit: historyLimit,
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
const finalCount = counts.final;
|
||||
logVerboseMessage(
|
||||
`msteams: delivered ${finalCount} reply${finalCount === 1 ? "" : "ies"} to ${teamsTo}`,
|
||||
);
|
||||
if (isRoomish && historyKey) {
|
||||
clearHistoryEntriesIfEnabled({
|
||||
historyMap: conversationHistories,
|
||||
historyKey,
|
||||
limit: historyLimit,
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
log.error("dispatch failed", { error: formatUnknownError(err) });
|
||||
runtime.error?.(`msteams dispatch failed: ${formatUnknownError(err)}`);
|
||||
|
||||
Reference in New Issue
Block a user