From 14bd07fd90df87a814e19b5823d8caddf7c8b5e2 Mon Sep 17 00:00:00 2001 From: Yichen Jiang Date: Sun, 9 Aug 2026 21:05:49 +0800 Subject: [PATCH] fix(headless): compose the one-shot agent from the preset roster again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The agent-default-model refactor moved the headless runner off the api-proxy create path onto a direct agents.create, which silently dropped the preset composition the stack had put on every dsh run session: the header lost its agentPreset and the agent ran on the host composition alone. Resolve the default preset up front (optional service — a roster- less composition keeps the pre-preset behavior), record it on the header, and mount it in setup where a broken composition still fails the run. --- packages/bundle/headless/package.json | 2 ++ packages/bundle/headless/src/index.ts | 17 +++++++++++++++-- packages/bundle/headless/tsconfig.json | 5 ++++- pnpm-lock.yaml | 3 +++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index bc461e4c72..4bd58a0451 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -38,6 +38,7 @@ "peerDependencies": { "@deepseek-ai/dsh-agent": "^0.0.1", "@deepseek-ai/dsh-agent-default-model": "^0.0.1", + "@deepseek-ai/dsh-agent-presets": "^0.0.1", "@deepseek-ai/dsh-invariants": "^0.0.1", "@deepseek-ai/dsh-llm": "^0.0.1", "@deepseek-ai/dsh-session": "^0.0.1", @@ -47,6 +48,7 @@ "@cordisjs/plugin-loader": "workspace:^", "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-agent-default-model": "workspace:^", + "@deepseek-ai/dsh-agent-presets": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^", "@deepseek-ai/dsh-session": "workspace:^", diff --git a/packages/bundle/headless/src/index.ts b/packages/bundle/headless/src/index.ts index 2ea68c441b..14b5200339 100644 --- a/packages/bundle/headless/src/index.ts +++ b/packages/bundle/headless/src/index.ts @@ -13,6 +13,8 @@ import z from 'schemastery' import { installModelSelection } from '@deepseek-ai/dsh-agent' import type { ModelSelectionRef } from '@deepseek-ai/dsh-agent' import type {} from '@deepseek-ai/dsh-agent-default-model' +// Empty type import carries the agentPresets Context merge for the optional roster read. +import type {} from '@deepseek-ai/dsh-agent-presets' import { createUserMessage } from '@deepseek-ai/dsh-llm' import { SessionId } from '@deepseek-ai/dsh-session' import type { SessionEvent } from '@deepseek-ai/dsh-session' @@ -106,13 +108,24 @@ async function run(ctx: Context, task: string, io: HeadlessIo): Promise { if (agents === undefined || defaultModel === undefined || sessions === undefined) return const selection = defaultModel.currentSelection() + // A one-shot run composes its agent from the same preset roster `dsh web` + // offers: the default preset both lands on the header (the log states what + // the agent ran) and mounts in setup, where a broken composition still + // fails the creation. A composition with no roster keeps the pre-preset + // behavior — the agent runs on the host composition alone. + const presets = ctx.get('agentPresets') + const presetId = presets === undefined ? undefined : (await presets.resolve()).id const { agent } = await agents.create({ sessionId: SessionId(`session-${randomUUID()}`), - meta: { cwd: process.cwd() }, + meta: { + cwd: process.cwd(), + ...presetId === undefined ? {} : { agentPreset: presetId }, + }, agentOptions: { provider: selection.provider, model: selection.model }, - setup: (agentCtx) => { + setup: async (agentCtx) => { const selected: ModelSelectionRef = { current: selection, assembled: undefined } installModelSelection(agentCtx, selected) + if (presets !== undefined) await presets.mount(agentCtx, presetId) }, }) await agent.whenIdle() diff --git a/packages/bundle/headless/tsconfig.json b/packages/bundle/headless/tsconfig.json index 9ae3212f6b..af59a30336 100644 --- a/packages/bundle/headless/tsconfig.json +++ b/packages/bundle/headless/tsconfig.json @@ -23,11 +23,14 @@ { "path": "../../core/agent-default-model" }, + { + "path": "../../core/session" + }, { "path": "../../llm/llm" }, { - "path": "../../core/session" + "path": "../../preset/agent-presets" }, { "path": "../../support/invariants" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6744c5acd7..b1674b9e4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1342,6 +1342,9 @@ importers: '@deepseek-ai/dsh-agent-default-model': specifier: workspace:^ version: link:../../core/agent-default-model + '@deepseek-ai/dsh-agent-presets': + specifier: workspace:^ + version: link:../../preset/agent-presets '@deepseek-ai/dsh-invariants': specifier: workspace:^ version: link:../../support/invariants