Files
openclaw-zero-token/plugin-sdk/inbound-envelope.ts
sjhu 571e14a236 feat: upgrade to upstream v2026.3.28
Major upgrade from e26988a38 to upstream v2026.3.28 (f9b107928).
Key changes:
- Upstream src/, ui/, extensions/ (89 bundled extensions)
- Zero-token web providers preserved in src/zero-token/
- AskOnce plugin restored and registered as CLI command
- Added missing packages: @anthropic-ai/vertex-sdk, @modelcontextprotocol/sdk
- Fixed tsconfig rootDir, skipLibCheck for plugin-sdk DTS build
- Added askonce to bundled plugin metadata and package.json exports
- Fixed AskOnce CLI command registration (missing commands metadata)
- Restored AskOnce adapter imports (correct 5-level relative paths)
- Removed stale migration artifacts from root directory
2026-03-30 17:58:12 +08:00

146 lines
4.7 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;
};
/** Create an envelope formatter bound to one resolved route and session store. */
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 };
};
}
/** Resolve a route first, then return both the route and a formatter for future inbound messages. */
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;
};
};
/** Runtime-driven variant of inbound envelope resolution for plugins that already expose grouped helpers. */
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,
});
}