Initial import: open-design source for helix-mind.ai distribution
Some checks failed
ci / Validate workspace (push) Successful in 12m32s
landing-page-ci / Validate landing page (push) Successful in 9m41s
landing-page-deploy / Deploy landing page (push) Failing after 5m23s
github-metrics / Generate repository metrics SVG (push) Failing after 2m6s
refresh-contributors-wall / Refresh contributors wall cache bust (push) Failing after 12s
Some checks failed
ci / Validate workspace (push) Successful in 12m32s
landing-page-ci / Validate landing page (push) Successful in 9m41s
landing-page-deploy / Deploy landing page (push) Failing after 5m23s
github-metrics / Generate repository metrics SVG (push) Failing after 2m6s
refresh-contributors-wall / Refresh contributors wall cache bust (push) Failing after 12s
This repository contains the open-design daemon CLI source code, built and packaged at https://helix-mind.ai/cli/open-design/latest.tgz for use by the HelixMind /design slash command. Licenses: Apache-2.0 (root) + MIT (skills/*)
This commit is contained in:
227
apps/daemon/tests/qoder-stream.test.ts
Normal file
227
apps/daemon/tests/qoder-stream.test.ts
Normal file
@@ -0,0 +1,227 @@
|
||||
// @ts-nocheck
|
||||
import { test } from 'vitest';
|
||||
import assert from 'node:assert/strict';
|
||||
import { createQoderStreamHandler } from '../src/qoder-stream.js';
|
||||
|
||||
function parseLines(lines) {
|
||||
const events = [];
|
||||
const handler = createQoderStreamHandler((event) => events.push(event));
|
||||
for (const line of lines) {
|
||||
handler.feed(`${line}\n`);
|
||||
}
|
||||
handler.flush();
|
||||
return events;
|
||||
}
|
||||
|
||||
test('qoder stream parser maps system init to status', () => {
|
||||
const events = parseLines([
|
||||
JSON.stringify({
|
||||
type: 'system',
|
||||
subtype: 'init',
|
||||
qodercli_version: '0.2.6',
|
||||
model: 'auto',
|
||||
session_id: 'session-1',
|
||||
}),
|
||||
]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{
|
||||
type: 'status',
|
||||
label: 'initializing',
|
||||
model: 'auto',
|
||||
sessionId: 'session-1',
|
||||
qodercliVersion: '0.2.6',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser maps assistant text content blocks to text deltas', () => {
|
||||
const events = parseLines([
|
||||
JSON.stringify({
|
||||
type: 'assistant',
|
||||
message: {
|
||||
content: [
|
||||
{ type: 'text', text: 'Hello' },
|
||||
{ type: 'text', text: ' world' },
|
||||
],
|
||||
},
|
||||
session_id: 'session-1',
|
||||
}),
|
||||
]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{ type: 'text_delta', delta: 'Hello' },
|
||||
{ type: 'text_delta', delta: ' world' },
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser maps assistant errors without text to error events', () => {
|
||||
const line = JSON.stringify({
|
||||
type: 'assistant',
|
||||
message: { content: [] },
|
||||
error: { message: 'Qoder authentication expired' },
|
||||
});
|
||||
const events = parseLines([line]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{
|
||||
type: 'error',
|
||||
message: 'Qoder authentication expired',
|
||||
raw: line,
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser uses a fallback message for assistant errors without detail', () => {
|
||||
const line = JSON.stringify({
|
||||
type: 'assistant',
|
||||
message: { content: [] },
|
||||
error: { code: 'E_QODER' },
|
||||
});
|
||||
const events = parseLines([line]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{
|
||||
type: 'error',
|
||||
message: 'Unknown Qoder error',
|
||||
raw: line,
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser preserves text from assistant records that also include errors', () => {
|
||||
const events = parseLines([
|
||||
JSON.stringify({
|
||||
type: 'assistant',
|
||||
message: {
|
||||
content: [{ type: 'text', text: 'Partial answer' }],
|
||||
},
|
||||
error: { message: 'Trailing Qoder warning' },
|
||||
}),
|
||||
]);
|
||||
|
||||
assert.deepEqual(events, [{ type: 'text_delta', delta: 'Partial answer' }]);
|
||||
});
|
||||
|
||||
test('qoder stream parser maps thinking content blocks to thinking events', () => {
|
||||
const events = parseLines([
|
||||
JSON.stringify({
|
||||
type: 'assistant',
|
||||
message: {
|
||||
content: [
|
||||
{
|
||||
type: 'thinking',
|
||||
thinking: 'Considering the exact response.',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{ type: 'thinking_start' },
|
||||
{
|
||||
type: 'thinking_delta',
|
||||
delta: 'Considering the exact response.',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser maps result usage and preserves modelUsage', () => {
|
||||
const usage = {
|
||||
input_tokens: 10,
|
||||
output_tokens: 2,
|
||||
service_tier: 'standard',
|
||||
};
|
||||
const modelUsage = {
|
||||
auto: {
|
||||
inputTokens: 10,
|
||||
outputTokens: 2,
|
||||
costUSD: 0,
|
||||
},
|
||||
};
|
||||
const events = parseLines([
|
||||
JSON.stringify({
|
||||
type: 'result',
|
||||
subtype: 'success',
|
||||
duration_ms: 10864,
|
||||
is_error: false,
|
||||
stop_reason: 'end_turn',
|
||||
total_cost_usd: 0,
|
||||
usage,
|
||||
modelUsage,
|
||||
}),
|
||||
]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{
|
||||
type: 'usage',
|
||||
usage,
|
||||
modelUsage,
|
||||
costUsd: 0,
|
||||
durationMs: 10864,
|
||||
stopReason: 'end_turn',
|
||||
isError: false,
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser maps result is_error to a fatal error event', () => {
|
||||
const usage = {
|
||||
input_tokens: 10,
|
||||
output_tokens: 2,
|
||||
};
|
||||
const line = JSON.stringify({
|
||||
type: 'result',
|
||||
subtype: 'error',
|
||||
duration_ms: 10864,
|
||||
is_error: true,
|
||||
stop_reason: 'tool_use_failed',
|
||||
total_cost_usd: 0,
|
||||
usage,
|
||||
});
|
||||
const events = parseLines([line]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{
|
||||
type: 'usage',
|
||||
usage,
|
||||
modelUsage: undefined,
|
||||
costUsd: 0,
|
||||
durationMs: 10864,
|
||||
stopReason: 'tool_use_failed',
|
||||
isError: true,
|
||||
},
|
||||
{
|
||||
type: 'error',
|
||||
message: 'Qoder run failed: tool_use_failed',
|
||||
raw: line,
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser forwards unknown and malformed lines as raw events', () => {
|
||||
const events = parseLines([
|
||||
'{"type":"unknown","value":1}',
|
||||
'not json',
|
||||
]);
|
||||
|
||||
assert.deepEqual(events, [
|
||||
{ type: 'raw', line: '{"type":"unknown","value":1}' },
|
||||
{ type: 'raw', line: 'not json' },
|
||||
]);
|
||||
});
|
||||
|
||||
test('qoder stream parser flushes a trailing line without newline', () => {
|
||||
const events = [];
|
||||
const handler = createQoderStreamHandler((event) => events.push(event));
|
||||
handler.feed(
|
||||
JSON.stringify({
|
||||
type: 'assistant',
|
||||
message: { content: [{ type: 'text', text: 'OK' }] },
|
||||
}),
|
||||
);
|
||||
handler.flush();
|
||||
|
||||
assert.deepEqual(events, [{ type: 'text_delta', delta: 'OK' }]);
|
||||
});
|
||||
Reference in New Issue
Block a user