Forward AO_AGENT_GH_TRACE to session runtimes

This commit is contained in:
adil 2026-04-20 21:09:37 +05:30
parent 25ae6013db
commit 6fc64f4f3a
3 changed files with 85 additions and 0 deletions

View File

@ -86,6 +86,39 @@ describe("restore", () => {
expect(meta!["createdAt"]).toBe("2025-01-01T00:00:00.000Z");
});
it("forwards AO_AGENT_GH_TRACE into restored agent runtime env when configured", async () => {
const wsPath = join(tmpDir, "ws-app-1-trace");
mkdirSync(wsPath, { recursive: true });
writeMetadata(sessionsDir, "app-1", {
worktree: wsPath,
branch: "feat/TEST-1",
status: "killed",
project: "my-app",
runtimeHandle: JSON.stringify(makeHandle("rt-old")),
});
const previousTrace = process.env["AO_AGENT_GH_TRACE"];
process.env["AO_AGENT_GH_TRACE"] = "/tmp/restored-agent-gh-trace-test.jsonl";
try {
const sm = createSessionManager({ config, registry: mockRegistry });
await sm.restore("app-1");
expect(mockRuntime.create).toHaveBeenCalledWith(
expect.objectContaining({
environment: expect.objectContaining({
AO_AGENT_GH_TRACE: "/tmp/restored-agent-gh-trace-test.jsonl",
AO_CALLER_TYPE: "agent",
}),
}),
);
} finally {
if (previousTrace === undefined) delete process.env["AO_AGENT_GH_TRACE"];
else process.env["AO_AGENT_GH_TRACE"] = previousTrace;
}
});
it("continues restore even if old runtime destroy fails", async () => {
const wsPath = join(tmpDir, "ws-app-1");
mkdirSync(wsPath, { recursive: true });

View File

@ -72,6 +72,27 @@ describe("spawn", () => {
expect(mockRuntime.create).toHaveBeenCalled();
});
it("forwards AO_AGENT_GH_TRACE into spawned agent runtime env when configured", async () => {
const previousTrace = process.env["AO_AGENT_GH_TRACE"];
process.env["AO_AGENT_GH_TRACE"] = "/tmp/agent-gh-trace-test.jsonl";
try {
const sm = createSessionManager({ config, registry: mockRegistry });
await sm.spawn({ projectId: "my-app" });
expect(mockRuntime.create).toHaveBeenCalledWith(
expect.objectContaining({
environment: expect.objectContaining({
AO_AGENT_GH_TRACE: "/tmp/agent-gh-trace-test.jsonl",
}),
}),
);
} finally {
if (previousTrace === undefined) delete process.env["AO_AGENT_GH_TRACE"];
else process.env["AO_AGENT_GH_TRACE"] = previousTrace;
}
});
it("uses issue ID to derive branch name", async () => {
const sm = createSessionManager({ config, registry: mockRegistry });
@ -1547,6 +1568,28 @@ describe("spawn", () => {
);
});
it("forwards AO_AGENT_GH_TRACE into orchestrator runtime env when configured", async () => {
const previousTrace = process.env["AO_AGENT_GH_TRACE"];
process.env["AO_AGENT_GH_TRACE"] = "/tmp/orchestrator-gh-trace-test.jsonl";
try {
const sm = createSessionManager({ config, registry: mockRegistry });
await sm.spawnOrchestrator({ projectId: "my-app" });
expect(mockRuntime.create).toHaveBeenCalledWith(
expect.objectContaining({
environment: expect.objectContaining({
AO_AGENT_GH_TRACE: "/tmp/orchestrator-gh-trace-test.jsonl",
AO_CALLER_TYPE: "orchestrator",
}),
}),
);
} finally {
if (previousTrace === undefined) delete process.env["AO_AGENT_GH_TRACE"];
else process.env["AO_AGENT_GH_TRACE"] = previousTrace;
}
});
it("does not persist orchestratorSessionReused metadata on newly created sessions", async () => {
const sm = createSessionManager({ config, registry: mockRegistry });

View File

@ -1263,6 +1263,9 @@ export function createSessionManager(deps: SessionManagerDeps): OpenCodeSessionM
...environment,
PATH: buildAgentPath(environment["PATH"] ?? process.env["PATH"]),
GH_PATH: PREFERRED_GH_PATH,
...(process.env["AO_AGENT_GH_TRACE"] && {
AO_AGENT_GH_TRACE: process.env["AO_AGENT_GH_TRACE"],
}),
AO_SESSION: sessionId,
AO_DATA_DIR: sessionsDir, // Pass sessions directory (not root dataDir)
AO_SESSION_NAME: sessionId, // User-facing session name
@ -1618,6 +1621,9 @@ export function createSessionManager(deps: SessionManagerDeps): OpenCodeSessionM
...environment,
PATH: buildAgentPath(environment["PATH"] ?? process.env["PATH"]),
GH_PATH: PREFERRED_GH_PATH,
...(process.env["AO_AGENT_GH_TRACE"] && {
AO_AGENT_GH_TRACE: process.env["AO_AGENT_GH_TRACE"],
}),
AO_SESSION: sessionId,
AO_DATA_DIR: sessionsDir,
AO_SESSION_NAME: sessionId,
@ -2709,6 +2715,9 @@ export function createSessionManager(deps: SessionManagerDeps): OpenCodeSessionM
...environment,
PATH: buildAgentPath(environment["PATH"] ?? process.env["PATH"]),
GH_PATH: PREFERRED_GH_PATH,
...(process.env["AO_AGENT_GH_TRACE"] && {
AO_AGENT_GH_TRACE: process.env["AO_AGENT_GH_TRACE"],
}),
AO_SESSION: sessionId,
AO_DATA_DIR: sessionsDir,
AO_SESSION_NAME: sessionId,