























@@ -1,5 +1,4 @@
11const OPENCLAW_RUNTIME_CONTEXT_CUSTOM_TYPE = "openclaw.runtime-context";
2-const EMPTY_RUNTIME_EVENT_PROMPT = "[OpenClaw runtime event]";
3243type RuntimeContextSession = {
54sendCustomMessage: (
@@ -13,6 +12,13 @@ type RuntimeContextSession = {
1312) => Promise<void>;
1413};
151415+type RuntimeContextPromptParts = {
16+prompt: string;
17+runtimeContext?: string;
18+runtimeOnly?: boolean;
19+runtimeSystemContext?: string;
20+};
21+1622function removeLastPromptOccurrence(text: string, prompt: string): string | null {
1723const index = text.lastIndexOf(prompt);
1824if (index === -1) {
@@ -29,20 +35,48 @@ function removeLastPromptOccurrence(text: string, prompt: string): string | null
2935export function resolveRuntimeContextPromptParts(params: {
3036effectivePrompt: string;
3137transcriptPrompt?: string;
32-}): { prompt: string; runtimeContext?: string } {
38+}): RuntimeContextPromptParts {
3339const transcriptPrompt = params.transcriptPrompt;
3440if (transcriptPrompt === undefined || transcriptPrompt === params.effectivePrompt) {
3541return { prompt: params.effectivePrompt };
3642}
374338-const prompt = transcriptPrompt.trim() || EMPTY_RUNTIME_EVENT_PROMPT;
44+const prompt = transcriptPrompt.trim();
3945const runtimeContext =
4046removeLastPromptOccurrence(params.effectivePrompt, transcriptPrompt)?.trim() ||
4147params.effectivePrompt.trim();
48+if (!prompt) {
49+return runtimeContext
50+ ? {
51+prompt: "",
52+ runtimeContext,
53+runtimeOnly: true,
54+runtimeSystemContext: buildRuntimeEventSystemContext(runtimeContext),
55+}
56+ : { prompt: "" };
57+}
42584359return runtimeContext ? { prompt, runtimeContext } : { prompt };
4460}
456162+function buildRuntimeContextMessageContent(params: {
63+runtimeContext: string;
64+kind: "next-turn" | "runtime-event";
65+}): string {
66+return [
67+params.kind === "runtime-event"
68+ ? "OpenClaw runtime event."
69+ : "OpenClaw runtime context for the immediately preceding user message.",
70+"This context is runtime-generated, not user-authored. Keep internal details private.",
71+"",
72+params.runtimeContext,
73+].join("\n");
74+}
75+76+export function buildRuntimeEventSystemContext(runtimeContext: string): string {
77+return buildRuntimeContextMessageContent({ runtimeContext, kind: "runtime-event" });
78+}
79+4680export async function queueRuntimeContextForNextTurn(params: {
4781session: RuntimeContextSession;
4882runtimeContext?: string;
@@ -54,12 +88,7 @@ export async function queueRuntimeContextForNextTurn(params: {
5488await params.session.sendCustomMessage(
5589{
5690customType: OPENCLAW_RUNTIME_CONTEXT_CUSTOM_TYPE,
57-content: [
58-"OpenClaw runtime context for the immediately preceding user message.",
59-"This context is runtime-generated, not user-authored. Keep internal details private.",
60-"",
61-runtimeContext,
62-].join("\n"),
91+content: buildRuntimeContextMessageContent({ runtimeContext, kind: "next-turn" }),
6392display: false,
6493details: { source: "openclaw-runtime-context" },
6594},
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。