refactor(delegate-task): improve session title format and add task_metadata block

- Change session title from 'Task: {desc}' to '{desc} (@{agent} subagent)'
- Move session_id to structured <task_metadata> block for better parsing
- Add category tracking to BackgroundTask type and LaunchInput
- Add tests for new title format and metadata block
This commit is contained in:
YeonGyu-Kim
2026-02-01 19:44:22 +09:00
parent 865e6cc506
commit 6b866e106e
4 changed files with 184 additions and 16 deletions
+158
View File
@@ -2563,4 +2563,162 @@ describe("sisyphus-task", () => {
expect(promptBody.tools.delegate_task).toBe(false)
}, { timeout: 20000 })
})
describe("session title and metadata format (OpenCode compatibility)", () => {
test("sync session title follows OpenCode format: '{description} (@{agent} subagent)'", async () => {
// given
const { createDelegateTask } = require("./tools")
let createBody: any
const mockManager = { launch: async () => ({}) }
const mockClient = {
app: { agents: async () => ({ data: [] }) },
config: { get: async () => ({ data: { model: SYSTEM_DEFAULT_MODEL } }) },
model: { list: async () => [{ id: SYSTEM_DEFAULT_MODEL }] },
session: {
get: async () => ({ data: { directory: "/project" } }),
create: async (input: any) => {
createBody = input.body
return { data: { id: "ses_title_test" } }
},
prompt: async () => ({ data: {} }),
messages: async () => ({
data: [{ info: { role: "assistant" }, parts: [{ type: "text", text: "done" }] }]
}),
status: async () => ({ data: { "ses_title_test": { type: "idle" } } }),
},
}
const tool = createDelegateTask({
manager: mockManager,
client: mockClient,
})
const toolContext = {
sessionID: "parent-session",
messageID: "parent-message",
agent: "sisyphus",
abort: new AbortController().signal,
}
// when - sync task with category
await tool.execute(
{
description: "Implement feature X",
prompt: "Build the feature",
category: "quick",
run_in_background: false,
load_skills: [],
},
toolContext
)
// then - title should follow OpenCode format
expect(createBody.title).toBe("Implement feature X (@sisyphus-junior subagent)")
}, { timeout: 10000 })
test("sync task output includes <task_metadata> block with session_id", async () => {
// given
const { createDelegateTask } = require("./tools")
const mockManager = { launch: async () => ({}) }
const mockClient = {
app: { agents: async () => ({ data: [] }) },
config: { get: async () => ({ data: { model: SYSTEM_DEFAULT_MODEL } }) },
model: { list: async () => [{ id: SYSTEM_DEFAULT_MODEL }] },
session: {
get: async () => ({ data: { directory: "/project" } }),
create: async () => ({ data: { id: "ses_metadata_test" } }),
prompt: async () => ({ data: {} }),
messages: async () => ({
data: [{ info: { role: "assistant" }, parts: [{ type: "text", text: "Task completed" }] }]
}),
status: async () => ({ data: { "ses_metadata_test": { type: "idle" } } }),
},
}
const tool = createDelegateTask({
manager: mockManager,
client: mockClient,
})
const toolContext = {
sessionID: "parent-session",
messageID: "parent-message",
agent: "sisyphus",
abort: new AbortController().signal,
}
// when
const result = await tool.execute(
{
description: "Test metadata format",
prompt: "Do something",
category: "quick",
run_in_background: false,
load_skills: [],
},
toolContext
)
// then - output should contain <task_metadata> block
expect(result).toContain("<task_metadata>")
expect(result).toContain("session_id: ses_metadata_test")
expect(result).toContain("</task_metadata>")
}, { timeout: 10000 })
test("background task output includes <task_metadata> block with session_id", async () => {
// given
const { createDelegateTask } = require("./tools")
const mockManager = {
launch: async () => ({
id: "bg_meta_test",
sessionID: "ses_bg_metadata",
description: "Background metadata test",
agent: "sisyphus-junior",
status: "running",
}),
}
const mockClient = {
app: { agents: async () => ({ data: [] }) },
config: { get: async () => ({ data: { model: SYSTEM_DEFAULT_MODEL } }) },
model: { list: async () => [{ id: SYSTEM_DEFAULT_MODEL }] },
session: {
create: async () => ({ data: { id: "ses_bg_metadata" } }),
prompt: async () => ({ data: {} }),
messages: async () => ({ data: [] }),
},
}
const tool = createDelegateTask({
manager: mockManager,
client: mockClient,
})
const toolContext = {
sessionID: "parent-session",
messageID: "parent-message",
agent: "sisyphus",
abort: new AbortController().signal,
}
// when
const result = await tool.execute(
{
description: "Background metadata test",
prompt: "Do something",
category: "quick",
run_in_background: true,
load_skills: [],
},
toolContext
)
// then - output should contain <task_metadata> block
expect(result).toContain("<task_metadata>")
expect(result).toContain("session_id: ses_bg_metadata")
expect(result).toContain("</task_metadata>")
}, { timeout: 10000 })
})
})