This commit is contained in:
1alyx 2026-01-30 02:20:19 +00:00 committed by GitHub
commit 05d04c8f92
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 552 additions and 521 deletions

View File

@ -100,6 +100,7 @@ export type CompactEmbeddedPiSessionParams = {
enqueue?: typeof enqueueCommand;
extraSystemPrompt?: string;
ownerNumbers?: string[];
skipSkillEnvOverrides?: boolean;
};
/**
@ -110,7 +111,6 @@ export async function compactEmbeddedPiSessionDirect(
params: CompactEmbeddedPiSessionParams,
): Promise<EmbeddedPiCompactResult> {
const resolvedWorkspace = resolveUserPath(params.workspaceDir);
const prevCwd = process.cwd();
const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
@ -179,22 +179,24 @@ export async function compactEmbeddedPiSessionDirect(
cwd: effectiveWorkspace,
});
const shouldApplySkillEnvOverrides = !params.skipSkillEnvOverrides;
let restoreSkillEnv: (() => void) | undefined;
process.chdir(effectiveWorkspace);
try {
const shouldLoadSkillEntries = !params.skillsSnapshot || !params.skillsSnapshot.resolvedSkills;
const skillEntries = shouldLoadSkillEntries
? loadWorkspaceSkillEntries(effectiveWorkspace)
: [];
restoreSkillEnv = params.skillsSnapshot
? applySkillEnvOverridesFromSnapshot({
snapshot: params.skillsSnapshot,
config: params.config,
})
: applySkillEnvOverrides({
skills: skillEntries ?? [],
config: params.config,
});
if (shouldApplySkillEnvOverrides) {
restoreSkillEnv = params.skillsSnapshot
? applySkillEnvOverridesFromSnapshot({
snapshot: params.skillsSnapshot,
config: params.config,
})
: applySkillEnvOverrides({
skills: skillEntries ?? [],
config: params.config,
});
}
const skillsPrompt = resolveSkillsPromptForRun({
skillsSnapshot: params.skillsSnapshot,
entries: shouldLoadSkillEntries ? skillEntries : undefined,
@ -318,7 +320,7 @@ export async function compactEmbeddedPiSessionDirect(
const docsPath = await resolveMoltbotDocsPath({
workspaceDir: effectiveWorkspace,
argv1: process.argv[1],
cwd: process.cwd(),
cwd: effectiveWorkspace,
moduleUrl: import.meta.url,
});
const ttsHint = params.config ? buildTtsSystemPromptHint(params.config) : undefined;
@ -466,7 +468,6 @@ export async function compactEmbeddedPiSessionDirect(
};
} finally {
restoreSkillEnv?.();
process.chdir(prevCwd);
}
}

View File

@ -168,6 +168,7 @@ function makeAttemptResult(
didSendViaMessagingTool: false,
messagingToolSentTexts: [],
messagingToolSentTargets: [],
autoCompactionAttempts: 0,
cloudCodeAssistFormatError: false,
...overrides,
};
@ -220,6 +221,20 @@ describe("overflow compaction in run loop", () => {
expect(result.meta.error).toBeUndefined();
});
it("skips manual compaction when auto-compaction already ran", async () => {
const overflowError = new Error("request_too_large: Request size exceeds model context window");
mockedRunEmbeddedAttempt.mockResolvedValueOnce(
makeAttemptResult({ promptError: overflowError, autoCompactionAttempts: 1 }),
);
const result = await runEmbeddedPiAgent(baseParams);
expect(mockedCompactDirect).not.toHaveBeenCalled();
expect(mockedRunEmbeddedAttempt).toHaveBeenCalledTimes(1);
expect(result.meta.error?.kind).toBe("context_overflow");
});
it("returns error if compaction fails", async () => {
const overflowError = new Error("request_too_large: Request size exceeds model context window");

File diff suppressed because it is too large Load Diff

View File

@ -619,6 +619,7 @@ export async function runEmbeddedAttempt(
toolMetas,
unsubscribe,
waitForCompactionRetry,
getCompactionAttempts,
getMessagingToolSentTexts,
getMessagingToolSentTargets,
didSendViaMessagingTool,
@ -865,6 +866,7 @@ export async function runEmbeddedAttempt(
didSendViaMessagingTool: didSendViaMessagingTool(),
messagingToolSentTexts: getMessagingToolSentTexts(),
messagingToolSentTargets: getMessagingToolSentTargets(),
autoCompactionAttempts: getCompactionAttempts(),
cloudCodeAssistFormatError: Boolean(
lastAssistant?.errorMessage && isCloudCodeAssistFormatError(lastAssistant.errorMessage),
),

View File

@ -102,6 +102,7 @@ export type EmbeddedRunAttemptResult = {
didSendViaMessagingTool: boolean;
messagingToolSentTexts: string[];
messagingToolSentTargets: MessagingToolSend[];
autoCompactionAttempts: number;
cloudCodeAssistFormatError: boolean;
/** Client tool call detected (OpenResponses hosted tools). */
clientToolCall?: { name: string; params: Record<string, unknown> };

View File

@ -22,6 +22,7 @@ export function handleAgentStart(ctx: EmbeddedPiSubscribeContext) {
export function handleAutoCompactionStart(ctx: EmbeddedPiSubscribeContext) {
ctx.state.compactionInFlight = true;
ctx.state.compactionAttempts += 1;
ctx.ensureCompactionPromise();
ctx.log.debug(`embedded run compaction start: runId=${ctx.params.runId}`);
emitAgentEvent({

View File

@ -49,6 +49,7 @@ export type EmbeddedPiSubscribeState = {
lastReasoningSent?: string;
compactionInFlight: boolean;
compactionAttempts: number;
pendingCompactionRetry: number;
compactionRetryResolve?: () => void;
compactionRetryPromise: Promise<void> | null;

View File

@ -57,6 +57,7 @@ export function subscribeEmbeddedPiSession(params: SubscribeEmbeddedPiSessionPar
suppressBlockChunks: false, // Avoid late chunk inserts after final text merge.
lastReasoningSent: undefined,
compactionInFlight: false,
compactionAttempts: 0,
pendingCompactionRetry: 0,
compactionRetryResolve: undefined,
compactionRetryPromise: null,
@ -472,6 +473,7 @@ export function subscribeEmbeddedPiSession(params: SubscribeEmbeddedPiSessionPar
toolMetas,
unsubscribe,
isCompacting: () => state.compactionInFlight || state.pendingCompactionRetry > 0,
getCompactionAttempts: () => state.compactionAttempts,
getMessagingToolSentTexts: () => messagingToolSentTexts.slice(),
getMessagingToolSentTargets: () => messagingToolSentTargets.slice(),
// Returns true if any messaging tool successfully sent a message.