Merge pull request #1895 from code-yeongyu/fix/1718-windows-subagent-dir
fix: use correct project directory for Windows subagents (#1718)
This commit is contained in:
@@ -4,44 +4,88 @@ import { resolveOrCreateSessionId } from "./subagent-session-creator"
|
||||
import { _resetForTesting, subagentSessions } from "../../features/claude-code-session-state"
|
||||
|
||||
describe("call-omo-agent resolveOrCreateSessionId", () => {
|
||||
test("tracks newly created child session as subagent session", async () => {
|
||||
// given
|
||||
_resetForTesting()
|
||||
const originalPlatform = process.platform
|
||||
|
||||
function buildInput(options: {
|
||||
parentDirectory?: string
|
||||
contextDirectory: string
|
||||
}): {
|
||||
ctx: Parameters<typeof resolveOrCreateSessionId>[0]
|
||||
args: Parameters<typeof resolveOrCreateSessionId>[1]
|
||||
toolContext: Parameters<typeof resolveOrCreateSessionId>[2]
|
||||
createCalls: Array<{ query?: { directory?: string } }>
|
||||
} {
|
||||
const createCalls: Array<{ query?: { directory?: string } }> = []
|
||||
const { parentDirectory, contextDirectory } = options
|
||||
const parentSessionData = parentDirectory ? { data: { directory: parentDirectory } } : { data: {} }
|
||||
|
||||
const createCalls: Array<unknown> = []
|
||||
const ctx = {
|
||||
directory: "/project",
|
||||
directory: contextDirectory,
|
||||
client: {
|
||||
session: {
|
||||
get: async () => ({ data: { directory: "/parent" } }),
|
||||
create: async (args: unknown) => {
|
||||
createCalls.push(args)
|
||||
get: async () => parentSessionData,
|
||||
create: async (createInput: unknown) => {
|
||||
const payload = createInput as { query?: { directory?: string } }
|
||||
createCalls.push(payload)
|
||||
return { data: { id: "ses_child_sync" } }
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
} as unknown as Parameters<typeof resolveOrCreateSessionId>[0]
|
||||
|
||||
const args = {
|
||||
description: "sync test",
|
||||
prompt: "hello",
|
||||
subagent_type: "explore",
|
||||
run_in_background: false,
|
||||
}
|
||||
} satisfies Parameters<typeof resolveOrCreateSessionId>[1]
|
||||
|
||||
const toolContext = {
|
||||
sessionID: "ses_parent",
|
||||
messageID: "msg_parent",
|
||||
agent: "sisyphus",
|
||||
abort: new AbortController().signal,
|
||||
}
|
||||
} satisfies Parameters<typeof resolveOrCreateSessionId>[2]
|
||||
|
||||
// when
|
||||
const result = await resolveOrCreateSessionId(ctx as any, args as any, toolContext as any)
|
||||
return { ctx, args, toolContext, createCalls }
|
||||
}
|
||||
|
||||
// then
|
||||
test("tracks newly created child session as subagent session", async () => {
|
||||
//#given
|
||||
_resetForTesting()
|
||||
|
||||
const { ctx, args, toolContext, createCalls } = buildInput({
|
||||
parentDirectory: "/parent",
|
||||
contextDirectory: "/project",
|
||||
})
|
||||
|
||||
//#when
|
||||
const result = await resolveOrCreateSessionId(ctx, args, toolContext)
|
||||
|
||||
//#then
|
||||
expect(result).toEqual({ ok: true, sessionID: "ses_child_sync" })
|
||||
expect(createCalls).toHaveLength(1)
|
||||
expect(subagentSessions.has("ses_child_sync")).toBe(true)
|
||||
})
|
||||
|
||||
test("uses current working directory on Windows when parent directory is under AppData", async () => {
|
||||
//#given
|
||||
_resetForTesting()
|
||||
Object.defineProperty(process, "platform", { value: "win32" })
|
||||
try {
|
||||
const { ctx, args, toolContext, createCalls } = buildInput({
|
||||
parentDirectory: "C:\\Users\\test\\AppData\\Local\\ai.opencode.desktop",
|
||||
contextDirectory: "C:\\Users\\test\\AppData\\Roaming\\opencode",
|
||||
})
|
||||
|
||||
//#when
|
||||
await resolveOrCreateSessionId(ctx, args, toolContext)
|
||||
|
||||
//#then
|
||||
expect(createCalls).toHaveLength(1)
|
||||
expect(createCalls[0]?.query?.directory).toBe(process.cwd())
|
||||
} finally {
|
||||
Object.defineProperty(process, "platform", { value: originalPlatform })
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { PluginInput } from "@opencode-ai/plugin"
|
||||
import { log } from "../../shared"
|
||||
import { resolveSessionDirectory } from "../../shared"
|
||||
import { subagentSessions } from "../../features/claude-code-session-state"
|
||||
import type { CallOmoAgentArgs } from "./types"
|
||||
import type { ToolContextWithMetadata } from "./tool-context-with-metadata"
|
||||
@@ -27,11 +28,14 @@ export async function resolveOrCreateSessionId(
|
||||
log(`[call_omo_agent] Creating new session with parent: ${toolContext.sessionID}`)
|
||||
const parentSession = await ctx.client.session
|
||||
.get({ path: { id: toolContext.sessionID } })
|
||||
.catch((err) => {
|
||||
.catch((err: unknown) => {
|
||||
log("[call_omo_agent] Failed to get parent session", { error: String(err) })
|
||||
return null
|
||||
})
|
||||
const parentDirectory = parentSession?.data?.directory ?? ctx.directory
|
||||
const parentDirectory = resolveSessionDirectory({
|
||||
parentDirectory: parentSession?.data?.directory,
|
||||
fallbackDirectory: ctx.directory,
|
||||
})
|
||||
|
||||
const body = {
|
||||
parentID: toolContext.sessionID,
|
||||
|
||||
Reference in New Issue
Block a user