feat: add model-aware DSH image input

DeepSeek Harness previously treated every selected model as text-only. It now carries the model profile's image capability through Main, the Utility Host, ACP, and Pi-AI, rejects unsupported images before model invocation, and validates supported JPEG/PNG data in a bounded process-local attachment store.

The Composer keeps universal controls on its first row, places OpenCode and Continue controls on a dedicated responsive row, and anchors context compaction without shifting the footer. Runtime supervision ownership for future Subagents and Jobs is documented for the right sidebar.

Release note: DeepSeek Harness 现可按所选模型连接的能力安全接收 JPEG/PNG 图片;Composer 同时将 Runtime 专属选择器移到独立一行,并固定上下文压缩入口。
This commit is contained in:
mesalogo
2026-08-16 23:30:54 +08:00
parent 18263a6b23
commit b751c70d75
30 changed files with 1589 additions and 187 deletions
+9 -7
View File
@@ -17,8 +17,9 @@ const {
const { app, utilityProcess } = require('electron/main')
const protocol = 'goodbuddy.deepseek-harness.control'
const version = 1
const controlVersion = 2
const byteProtocol = 'goodbuddy.deepseek-harness.byte-stream'
const byteProtocolVersion = 1
const configuredHostPath =
process.env.GOODBUDDY_HARNESS_SMOKE_HOST
const hostPath = configuredHostPath
@@ -132,12 +133,12 @@ async function run() {
child.on('message', (message) => {
if (
message?.protocol === protocol &&
message.version === version &&
message.version === controlVersion &&
message.type === 'ready'
) {
child.postMessage({
protocol: byteProtocol,
version,
version: byteProtocolVersion,
type: 'data',
stream: 'stdin',
seq: 0,
@@ -147,7 +148,7 @@ async function run() {
}
if (
message?.protocol === byteProtocol &&
message.version === version &&
message.version === byteProtocolVersion &&
message.type === 'ack' &&
message.stream === 'stdin' &&
message.seq === 0
@@ -158,7 +159,7 @@ async function run() {
}
if (
message?.protocol === protocol &&
message.version === version &&
message.version === controlVersion &&
message.type === 'fatal'
) {
finish('fatal', String(message.code))
@@ -172,7 +173,7 @@ async function run() {
})
child.postMessage({
protocol,
version,
version: controlVersion,
type: 'start',
config: {
workspace,
@@ -181,11 +182,12 @@ async function run() {
api: 'openai-completions',
provider: 'goodbuddy',
model: 'qwen-plus',
supportsImageInput: false,
harnessVersion: '0.1.0-rc.6',
credentialRefs: ['GOODBUDDY_HARNESS_MODEL_API_KEY'],
skillPackages: [],
extensionPackages: [],
maxFrameBytes: 1024 * 1024
maxFrameBytes: 8 * 1024 * 1024
}
})