From 66568d5c2b15581349d121e43d70f0c64c70a787 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Thu, 29 Jun 2023 20:45:03 -0400 Subject: [PATCH] refactor: move functionality to class from module --- packages/core/src/agentic.ts | 4 +- packages/core/src/events/tracker.ts | 74 ++++++++++++++--------------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/packages/core/src/agentic.ts b/packages/core/src/agentic.ts index cbae5be..110e378 100644 --- a/packages/core/src/agentic.ts +++ b/packages/core/src/agentic.ts @@ -4,7 +4,7 @@ import { SetOptional } from 'type-fest' import * as types from './types' import { DEFAULT_OPENAI_MODEL } from './constants' -import { TerminalTaskTracker, defaultTaskTracker } from './events' +import { TerminalTaskTracker } from './events' import { HumanFeedbackOptions, HumanFeedbackType } from './human-feedback' import { HumanFeedbackMechanismCLI } from './human-feedback/cli' import { OpenAIChatCompletion } from './llms/openai' @@ -53,7 +53,7 @@ export class Agentic { this._ky = opts.ky ?? defaultKy this._logger = opts.logger ?? defaultLogger - this._taskTracker = opts.taskTracker ?? defaultTaskTracker + this._taskTracker = opts.taskTracker ?? new TerminalTaskTracker() this._eventEmitter = new EventEmitter() this._openaiModelDefaults = { diff --git a/packages/core/src/events/tracker.ts b/packages/core/src/events/tracker.ts index 67fbf69..1d8f8c1 100644 --- a/packages/core/src/events/tracker.ts +++ b/packages/core/src/events/tracker.ts @@ -10,31 +10,7 @@ import { SYMBOLS } from './symbols' const MAGIC_STRING = '__INSIDE_TRACKER__' // Define a unique "magic" string -const stdoutBuffer: any[] = [] -const stderrBuffer: any[] = [] - -const originalStdoutWrite = process.stdout.write -process.stdout.write = function (str: any) { - stdoutBuffer.push(str) - return originalStdoutWrite.call(process.stdout, str) -} - -const originalStderrWrite = process.stderr.write -process.stderr.write = function (str: any) { - if (str.startsWith(MAGIC_STRING)) { - // This write is from inside the tracker, remove the magic string and write to stderr: - return originalStderrWrite.call( - process.stderr, - str.replace(MAGIC_STRING, '') - ) - } else { - // This write is from outside the tracker, add it to stderrBuffer and write to stderr: - stderrBuffer.push(str) - return originalStderrWrite.call(process.stderr, str) - } -} - -const SPINNER_INTERVAL = 100 +const SPINNER_INTERVAL = 1000 const INACTIVITY_THRESHOLD = 2000 // 2 seconds function getSpinnerSymbol() { @@ -44,12 +20,17 @@ function getSpinnerSymbol() { } export class TerminalTaskTracker { - private events: Record = { root: [] } - private interval: NodeJS.Timeout | null = null - private inactivityTimeout: NodeJS.Timeout | null = null - private truncateOutput = false - private renderTasks = true - private outputs: Array = [] + protected events: Record = { root: [] } + protected interval: NodeJS.Timeout | null = null + protected inactivityTimeout: NodeJS.Timeout | null = null + protected truncateOutput = false + protected renderTasks = true + protected outputs: Array = [] + + private stdoutBuffer: any[] = [] + private stderrBuffer: any[] = [] + private originalStdoutWrite = process.stdout.write + private originalStderrWrite = process.stderr.write constructor() { if (!process.stderr.isTTY) { @@ -57,6 +38,25 @@ export class TerminalTaskTracker { return } + process.stdout.write = (str: any) => { + this.stdoutBuffer.push(str) + return this.originalStdoutWrite.call(process.stdout, str) + } + + process.stderr.write = (str: any) => { + if (str.startsWith(MAGIC_STRING)) { + // This write is from inside the tracker, remove the magic string and write to stderr: + return this.originalStderrWrite.call( + process.stderr, + str.replace(MAGIC_STRING, '') + ) + } else { + // This write is from outside the tracker, add it to stderrBuffer and write to stderr: + this.stderrBuffer.push(str) + return this.originalStderrWrite.call(process.stderr, str) + } + } + this.start() } @@ -114,20 +114,20 @@ export class TerminalTaskTracker { '', 'stdout:', '', - stdoutBuffer.join(''), + this.stdoutBuffer.join(''), '', '', 'stderr:', '', - stderrBuffer.join(''), + this.stderrBuffer.join(''), '', '' ] this.writeWithMagicString(finalLines) // Restore the original `process.stdout.write()` and `process.stderr.write()` functions: - process.stdout.write = originalStdoutWrite - process.stderr.write = originalStderrWrite + process.stdout.write = this.originalStdoutWrite + process.stderr.write = this.originalStderrWrite // Pause the reading of stdin so that the Node.js process will exit once done: process.stdin.pause() @@ -292,9 +292,7 @@ export class TerminalTaskTracker { this.writeWithMagicString(lines) } else { this.clearPreviousRender(lines.length + 1) - this.writeWithMagicString(stdoutBuffer) + this.writeWithMagicString(this.stdoutBuffer) } } } - -export const defaultTaskTracker = new TerminalTaskTracker()