mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-13 11:00:50 +00:00
143 lines
4.4 KiB
TypeScript
143 lines
4.4 KiB
TypeScript
type RouteLike = {
|
|
agentId: string;
|
|
sessionKey: string;
|
|
};
|
|
|
|
type RoutePeerLike = {
|
|
kind: string;
|
|
id: string | number;
|
|
};
|
|
|
|
type InboundEnvelopeFormatParams<TEnvelope> = {
|
|
channel: string;
|
|
from: string;
|
|
timestamp?: number;
|
|
previousTimestamp?: number;
|
|
envelope: TEnvelope;
|
|
body: string;
|
|
};
|
|
|
|
type InboundRouteResolveParams<TConfig, TPeer extends RoutePeerLike> = {
|
|
cfg: TConfig;
|
|
channel: string;
|
|
accountId: string;
|
|
peer: TPeer;
|
|
};
|
|
|
|
export function createInboundEnvelopeBuilder<TConfig, TEnvelope>(params: {
|
|
cfg: TConfig;
|
|
route: RouteLike;
|
|
sessionStore?: string;
|
|
resolveStorePath: (store: string | undefined, opts: { agentId: string }) => string;
|
|
readSessionUpdatedAt: (params: { storePath: string; sessionKey: string }) => number | undefined;
|
|
resolveEnvelopeFormatOptions: (cfg: TConfig) => TEnvelope;
|
|
formatAgentEnvelope: (params: InboundEnvelopeFormatParams<TEnvelope>) => string;
|
|
}) {
|
|
const storePath = params.resolveStorePath(params.sessionStore, {
|
|
agentId: params.route.agentId,
|
|
});
|
|
const envelopeOptions = params.resolveEnvelopeFormatOptions(params.cfg);
|
|
return (input: { channel: string; from: string; body: string; timestamp?: number }) => {
|
|
const previousTimestamp = params.readSessionUpdatedAt({
|
|
storePath,
|
|
sessionKey: params.route.sessionKey,
|
|
});
|
|
const body = params.formatAgentEnvelope({
|
|
channel: input.channel,
|
|
from: input.from,
|
|
timestamp: input.timestamp,
|
|
previousTimestamp,
|
|
envelope: envelopeOptions,
|
|
body: input.body,
|
|
});
|
|
return { storePath, body };
|
|
};
|
|
}
|
|
|
|
export function resolveInboundRouteEnvelopeBuilder<
|
|
TConfig,
|
|
TEnvelope,
|
|
TRoute extends RouteLike,
|
|
TPeer extends RoutePeerLike,
|
|
>(params: {
|
|
cfg: TConfig;
|
|
channel: string;
|
|
accountId: string;
|
|
peer: TPeer;
|
|
resolveAgentRoute: (params: InboundRouteResolveParams<TConfig, TPeer>) => TRoute;
|
|
sessionStore?: string;
|
|
resolveStorePath: (store: string | undefined, opts: { agentId: string }) => string;
|
|
readSessionUpdatedAt: (params: { storePath: string; sessionKey: string }) => number | undefined;
|
|
resolveEnvelopeFormatOptions: (cfg: TConfig) => TEnvelope;
|
|
formatAgentEnvelope: (params: InboundEnvelopeFormatParams<TEnvelope>) => string;
|
|
}): {
|
|
route: TRoute;
|
|
buildEnvelope: ReturnType<typeof createInboundEnvelopeBuilder<TConfig, TEnvelope>>;
|
|
} {
|
|
const route = params.resolveAgentRoute({
|
|
cfg: params.cfg,
|
|
channel: params.channel,
|
|
accountId: params.accountId,
|
|
peer: params.peer,
|
|
});
|
|
const buildEnvelope = createInboundEnvelopeBuilder({
|
|
cfg: params.cfg,
|
|
route,
|
|
sessionStore: params.sessionStore,
|
|
resolveStorePath: params.resolveStorePath,
|
|
readSessionUpdatedAt: params.readSessionUpdatedAt,
|
|
resolveEnvelopeFormatOptions: params.resolveEnvelopeFormatOptions,
|
|
formatAgentEnvelope: params.formatAgentEnvelope,
|
|
});
|
|
return { route, buildEnvelope };
|
|
}
|
|
|
|
type InboundRouteEnvelopeRuntime<
|
|
TConfig,
|
|
TEnvelope,
|
|
TRoute extends RouteLike,
|
|
TPeer extends RoutePeerLike,
|
|
> = {
|
|
routing: {
|
|
resolveAgentRoute: (params: InboundRouteResolveParams<TConfig, TPeer>) => TRoute;
|
|
};
|
|
session: {
|
|
resolveStorePath: (store: string | undefined, opts: { agentId: string }) => string;
|
|
readSessionUpdatedAt: (params: { storePath: string; sessionKey: string }) => number | undefined;
|
|
};
|
|
reply: {
|
|
resolveEnvelopeFormatOptions: (cfg: TConfig) => TEnvelope;
|
|
formatAgentEnvelope: (params: InboundEnvelopeFormatParams<TEnvelope>) => string;
|
|
};
|
|
};
|
|
|
|
export function resolveInboundRouteEnvelopeBuilderWithRuntime<
|
|
TConfig,
|
|
TEnvelope,
|
|
TRoute extends RouteLike,
|
|
TPeer extends RoutePeerLike,
|
|
>(params: {
|
|
cfg: TConfig;
|
|
channel: string;
|
|
accountId: string;
|
|
peer: TPeer;
|
|
runtime: InboundRouteEnvelopeRuntime<TConfig, TEnvelope, TRoute, TPeer>;
|
|
sessionStore?: string;
|
|
}): {
|
|
route: TRoute;
|
|
buildEnvelope: ReturnType<typeof createInboundEnvelopeBuilder<TConfig, TEnvelope>>;
|
|
} {
|
|
return resolveInboundRouteEnvelopeBuilder({
|
|
cfg: params.cfg,
|
|
channel: params.channel,
|
|
accountId: params.accountId,
|
|
peer: params.peer,
|
|
resolveAgentRoute: (routeParams) => params.runtime.routing.resolveAgentRoute(routeParams),
|
|
sessionStore: params.sessionStore,
|
|
resolveStorePath: params.runtime.session.resolveStorePath,
|
|
readSessionUpdatedAt: params.runtime.session.readSessionUpdatedAt,
|
|
resolveEnvelopeFormatOptions: params.runtime.reply.resolveEnvelopeFormatOptions,
|
|
formatAgentEnvelope: params.runtime.reply.formatAgentEnvelope,
|
|
});
|
|
}
|