mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-20 16:57:46 +00:00
82 lines
2.2 KiB
TypeScript
82 lines
2.2 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Qwen Team
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import type { Config } from '@qwen-code/qwen-code-core';
|
|
import type { CLIAssistantMessage, CLIMessage } from '../types.js';
|
|
import {
|
|
BaseJsonOutputAdapter,
|
|
type JsonOutputAdapterInterface,
|
|
type ResultOptions,
|
|
} from './BaseJsonOutputAdapter.js';
|
|
|
|
/**
|
|
* JSON output adapter that collects all messages and emits them
|
|
* as a single JSON array at the end of the turn.
|
|
* Supports both main agent and subagent messages through distinct APIs.
|
|
*/
|
|
export class JsonOutputAdapter
|
|
extends BaseJsonOutputAdapter
|
|
implements JsonOutputAdapterInterface
|
|
{
|
|
private readonly messages: CLIMessage[] = [];
|
|
|
|
constructor(config: Config) {
|
|
super(config);
|
|
}
|
|
|
|
/**
|
|
* Emits message to the messages array (batch mode).
|
|
* Tracks the last assistant message for efficient result text extraction.
|
|
*/
|
|
protected emitMessageImpl(message: CLIMessage): void {
|
|
this.messages.push(message);
|
|
// Track assistant messages for result generation
|
|
if (
|
|
typeof message === 'object' &&
|
|
message !== null &&
|
|
'type' in message &&
|
|
message.type === 'assistant'
|
|
) {
|
|
this.updateLastAssistantMessage(message as CLIAssistantMessage);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* JSON mode does not emit stream events.
|
|
*/
|
|
protected shouldEmitStreamEvents(): boolean {
|
|
return false;
|
|
}
|
|
|
|
finalizeAssistantMessage(): CLIAssistantMessage {
|
|
const message = this.finalizeAssistantMessageInternal(
|
|
this.mainAgentMessageState,
|
|
null,
|
|
);
|
|
this.updateLastAssistantMessage(message);
|
|
return message;
|
|
}
|
|
|
|
emitResult(options: ResultOptions): void {
|
|
const resultMessage = this.buildResultMessage(
|
|
options,
|
|
this.lastAssistantMessage,
|
|
);
|
|
this.messages.push(resultMessage);
|
|
|
|
// Emit the entire messages array as JSON (includes all main agent + subagent messages)
|
|
const json = JSON.stringify(this.messages);
|
|
process.stdout.write(`${json}\n`);
|
|
}
|
|
|
|
emitMessage(message: CLIMessage): void {
|
|
// In JSON mode, messages are collected in the messages array
|
|
// This is called by the base class's finalizeAssistantMessageInternal
|
|
// but can also be called directly for user/tool/system messages
|
|
this.messages.push(message);
|
|
}
|
|
}
|