All files / kernel-agents/src/strategies/json reader.ts

100% Statements 8/8
100% Branches 0/0
100% Functions 3/3
100% Lines 8/8

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34                1x 4x                 3x 3x 3x 3x               3x 3x      
import type { Logger } from '@metamask/logger';
 
import { AssistantMessage } from './messages.ts';
import type { AssistantMessageJson } from './messages.ts';
import { makeSampleCollector } from './sample-collector.ts';
import { gatherStreamingResponse, ifDefined, withAbort } from '../../utils.ts';
 
export const makeReader =
  ({ logger }: { logger?: Logger }) =>
  async ({
    stream,
    abort,
    prefix,
  }: {
    stream: AsyncIterable<{ response: string }>;
    abort: () => Promise<void>;
    prefix: string;
  }) => {
    const sampleLogger = logger?.subLogger({ tags: ['sample'] });
    const gatherLogger = logger?.subLogger({ tags: ['gather'] });
    return await withAbort(abort, async (): Promise<AssistantMessage> => {
      const json = await gatherStreamingResponse<AssistantMessageJson>({
        stream,
        parse: makeSampleCollector({
          prefix,
          ...ifDefined({ logger: sampleLogger }),
        }),
        ...ifDefined({ logger: gatherLogger }),
      });
      logger?.info('assistant message:', json);
      return new AssistantMessage(json);
    });
  };