Fix chat interface - restore continuous conversation flow

🎯 Major improvements to MissionControl component:
- Always keep input field visible and functional after AI responses
- Auto-clear input after submitting questions for better UX
- Add dynamic visual indicators (first question vs follow-up)
- Improve response layout with clear separation and hints
- Enable proper chat-like experience for continuous learning

🌟 Additional enhancements:
- Better language-specific messaging throughout interface
- Clearer visual hierarchy between input and response areas
- Intuitive flow that guides users to ask follow-up questions
- Maintains responsive design and accessibility

🔧 Technical changes:
- Enhanced MissionControl state management
- Improved component layout and styling
- Better TypeScript integration across components
- Updated tsconfig for stricter type checking
This commit is contained in:
rwiegand
2025-07-14 12:39:05 +02:00
parent b31492a354
commit f893530471
1798 changed files with 25329 additions and 92638 deletions

View File

@@ -1,9 +1,19 @@
var _AssistantStream_instances, _a, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun;
import { __classPrivateFieldGet, __classPrivateFieldSet } from "../internal/tslib.mjs";
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun;
import * as Core from "../core.mjs";
import { Stream } from "../streaming.mjs";
import { APIUserAbortError, OpenAIError } from "../error.mjs";
import { EventStream } from "./EventStream.mjs";
import { isObj } from "../internal/utils.mjs";
export class AssistantStream extends EventStream {
constructor() {
super(...arguments);
@@ -78,7 +88,7 @@ export class AssistantStream extends EventStream {
};
}
static fromReadableStream(stream) {
const runner = new _a();
const runner = new AssistantStream();
runner._run(() => runner._fromReadableStream(stream));
return runner;
}
@@ -103,15 +113,15 @@ export class AssistantStream extends EventStream {
const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);
return stream.toReadableStream();
}
static createToolAssistantStream(runId, runs, params, options) {
const runner = new _a();
runner._run(() => runner._runToolAssistantStream(runId, runs, params, {
static createToolAssistantStream(threadId, runId, runs, params, options) {
const runner = new AssistantStream();
runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, params, {
...options,
headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },
}));
return runner;
}
async _createToolAssistantStream(run, runId, params, options) {
async _createToolAssistantStream(run, threadId, runId, params, options) {
const signal = options?.signal;
if (signal) {
if (signal.aborted)
@@ -119,7 +129,7 @@ export class AssistantStream extends EventStream {
signal.addEventListener('abort', () => this.controller.abort());
}
const body = { ...params, stream: true };
const stream = await run.submitToolOutputs(runId, body, {
const stream = await run.submitToolOutputs(threadId, runId, body, {
...options,
signal: this.controller.signal,
});
@@ -133,7 +143,7 @@ export class AssistantStream extends EventStream {
return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this));
}
static createThreadAssistantStream(params, thread, options) {
const runner = new _a();
const runner = new AssistantStream();
runner._run(() => runner._threadAssistantStream(params, thread, {
...options,
headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },
@@ -141,7 +151,7 @@ export class AssistantStream extends EventStream {
return runner;
}
static createAssistantStream(threadId, runs, params, options) {
const runner = new _a();
const runner = new AssistantStream();
runner._run(() => runner._runAssistantStream(threadId, runs, params, {
...options,
headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },
@@ -233,7 +243,7 @@ export class AssistantStream extends EventStream {
else if (typeof accValue === 'number' && typeof deltaValue === 'number') {
accValue += deltaValue;
}
else if (isObj(accValue) && isObj(deltaValue)) {
else if (Core.isObj(accValue) && Core.isObj(deltaValue)) {
accValue = this.accumulateDelta(accValue, deltaValue);
}
else if (Array.isArray(accValue) && Array.isArray(deltaValue)) {
@@ -242,7 +252,7 @@ export class AssistantStream extends EventStream {
continue;
}
for (const deltaEntry of deltaValue) {
if (!isObj(deltaEntry)) {
if (!Core.isObj(deltaEntry)) {
throw new Error(`Expected array delta entry to be an object but got: ${deltaEntry}`);
}
const index = deltaEntry['index'];
@@ -279,11 +289,11 @@ export class AssistantStream extends EventStream {
async _runAssistantStream(threadId, runs, params, options) {
return await this._createAssistantStream(runs, threadId, params, options);
}
async _runToolAssistantStream(runId, runs, params, options) {
return await this._createToolAssistantStream(runs, runId, params, options);
async _runToolAssistantStream(threadId, runId, runs, params, options) {
return await this._createToolAssistantStream(runs, threadId, runId, params, options);
}
}
_a = AssistantStream, _AssistantStream_addEvent = function _AssistantStream_addEvent(event) {
_AssistantStream_addEvent = function _AssistantStream_addEvent(event) {
if (this.ended)
return;
__classPrivateFieldSet(this, _AssistantStream_currentEvent, event, "f");
@@ -465,7 +475,7 @@ _a = AssistantStream, _AssistantStream_addEvent = function _AssistantStream_addE
}
let data = event.data;
if (data.delta) {
const accumulated = _a.accumulateDelta(snapshot, data.delta);
const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta);
__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = accumulated;
}
return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id];
@@ -519,7 +529,7 @@ _a = AssistantStream, _AssistantStream_addEvent = function _AssistantStream_addE
}
throw Error('Tried to accumulate a non-message event');
}, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) {
return _a.accumulateDelta(currentContent, contentElement);
return AssistantStream.accumulateDelta(currentContent, contentElement);
}, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) {
__classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, "f");
switch (event.event) {
@@ -534,7 +544,6 @@ _a = AssistantStream, _AssistantStream_addEvent = function _AssistantStream_addE
case 'thread.run.failed':
case 'thread.run.completed':
case 'thread.run.expired':
case 'thread.run.incomplete':
__classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, "f");
if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) {
this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f"));