mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Machine-produced by `pnpm run rescope-vendor --apply` plus the regeneration it prints: `pnpm install` for the lockfile, `pnpm run gen-third-party-notices`, `verify-translation-pairing --write` for the touched bilingual pairs, `gen-doc-graphs`, and one typert snapshot whose ids embed character offsets. `pnpm run rescope-vendor --check` verifies the result. Renames nine vendored packages (cordis, cosmokit, schemastery and the six @cordisjs plugins) and every reference that resolves them: manifest names and dependency keys, module specifiers including declare-module merges, cordis.yml plugin names, tsconfig paths, every Markdown fence, and `docs/` prose. Directory names, upstream versions, and dependency ranges are unchanged, so vendor/README.md still reads as an upstream snapshot; its manifest table gains an upstream-name column so THIRD_PARTY_NOTICES keeps MIT attribution pointed at each fork's origin. The tutorial tier follows the rename end to end: its yaml fences named plugins the Loader can no longer resolve, its `ts ignore-check` fences disagreed with the compiled fences beside them, and its prose quoted both. The contracts that told readers to keep upstream names — the root convention and the vendoring cookbook's tree comment and manifest invariant — now say to rescope instead. Two rules read `@deepseek-ai/` as "another workspace plugin": the client bundle purity gate now names the vendored libraries a browser bundle inlines, and the files where a bare `cordis` is an agent-preset id keep that product data.
71 lines
2.6 KiB
TypeScript
71 lines
2.6 KiB
TypeScript
import type { Context } from '@deepseek-ai/cordis'
|
|
import {
|
|
CallId,
|
|
LlmAdapter,
|
|
ReasoningEffortId,
|
|
type GenerateOptions,
|
|
type LlmResolvedModelInfo,
|
|
type StreamChunk,
|
|
} from '@deepseek-ai/dsh-llm'
|
|
|
|
const HIGH = ReasoningEffortId('high')
|
|
const OFF = ReasoningEffortId('off')
|
|
|
|
/** Keyless headless-agent adapter: one real bash call followed by a final answer. */
|
|
class CliMockAdapter extends LlmAdapter {
|
|
override async resolveModel(provider: string, model: string): Promise<LlmResolvedModelInfo> {
|
|
return {
|
|
provider,
|
|
id: model,
|
|
name: model,
|
|
reasoning: {
|
|
efforts: [
|
|
{ id: OFF, name: 'Off' },
|
|
{ id: HIGH, name: 'High' },
|
|
],
|
|
defaultEffort: HIGH,
|
|
},
|
|
}
|
|
}
|
|
|
|
async * stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
|
|
if (process.env.DSH_CLI_MOCK_FAILURE === '1') {
|
|
yield { type: 'finish', reason: { kind: 'error', failure: { code: 'SERVER', message: 'CLI mock provider failed' } } }
|
|
return
|
|
}
|
|
const toolResult = options.messages.at(-1)?.content.find(block => block.type === 'tool-result')
|
|
if (toolResult === undefined) {
|
|
const args = JSON.stringify({ command: 'printf CLI_TOOL_ROUND_TRIP', description: 'Prove the CLI tool round trip.' })
|
|
yield { type: 'block-start', index: 0, blockType: 'tool-call' }
|
|
yield { type: 'tool-call-delta', index: 0, id: CallId('cli-smoke-call'), name: 'bash', argumentsDelta: args }
|
|
yield { type: 'block-end', index: 0, block: { type: 'tool-call', id: CallId('cli-smoke-call'), name: 'bash', arguments: args } }
|
|
yield { type: 'usage', usage: { inputTokens: 11, outputTokens: 3, cacheReadTokens: 2 } }
|
|
yield { type: 'finish', reason: { kind: 'tool-calls' } }
|
|
return
|
|
}
|
|
|
|
const toolText = toolResult.content
|
|
.filter(block => block.type === 'text')
|
|
.map(block => block.text)
|
|
.join('')
|
|
const reply = `CLI tool round trip complete: ${toolText.trim()}`
|
|
yield { type: 'block-start', index: 0, blockType: 'text' }
|
|
yield { type: 'text-delta', index: 0, text: reply }
|
|
yield { type: 'block-end', index: 0, block: { type: 'text', text: reply } }
|
|
yield { type: 'usage', usage: { inputTokens: 7, outputTokens: 5, reasoningTokens: 1 } }
|
|
yield { type: 'finish', reason: { kind: 'stop' } }
|
|
}
|
|
}
|
|
|
|
export const name = 'cli-mock-llm'
|
|
export const inject = ['llm']
|
|
|
|
/** Register the keyless `cli-mock` adapter. */
|
|
export function apply(ctx: Context): void {
|
|
ctx.llm.registerAdapter(['cli-mock'], new CliMockAdapter())
|
|
ctx.on('agent/request', async ({ step }, next) => {
|
|
const config = await next()
|
|
return step === 2 ? { ...config, reasoningEffort: OFF } : config
|
|
})
|
|
}
|