From 28bc49ad170bb1104a5f5ebb4bf1c740fbe59d5c Mon Sep 17 00:00:00 2001 From: phantomreactor Date: Sun, 22 Jun 2025 16:59:04 +0530 Subject: [PATCH] fix: invisible html tags and compact long delay (#304) --- packages/opencode/src/session/index.ts | 58 ++++++++++++++----- packages/tui/internal/app/app.go | 24 ++++---- .../tui/internal/components/chat/message.go | 3 +- 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 211cbc04..1bb606e3 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -248,7 +248,7 @@ export namespace Session { if ( model.info.limit.context && tokens > - (model.info.limit.context - (model.info.limit.output ?? 0)) * 0.9 + (model.info.limit.context - (model.info.limit.output ?? 0)) * 0.9 ) { await summarize({ sessionID: input.sessionID, @@ -295,7 +295,7 @@ export namespace Session { draft.title = result.text }) }) - .catch(() => {}) + .catch(() => { }) } const msg: Message.Info = { role: "user", @@ -572,7 +572,7 @@ export namespace Session { case "tool-call": { const [match] = next.parts.flatMap((p) => p.type === "tool-invocation" && - p.toolInvocation.toolCallId === value.toolCallId + p.toolInvocation.toolCallId === value.toolCallId ? [p] : [], ) @@ -736,7 +736,9 @@ export namespace Session { }, } await updateMessage(next) - const result = await generateText({ + + let text: Message.TextPart | undefined + const result = streamText({ abortSignal: abort.signal, model: model.language, messages: [ @@ -757,16 +759,46 @@ export namespace Session { ], }, ], + onStepFinish: async (step) => { + const assistant = next.metadata!.assistant! + const usage = getUsage(model.info, step.usage, step.providerMetadata) + assistant.cost += usage.cost + assistant.tokens = usage.tokens + await updateMessage(next) + if (text) { + Bus.publish(Message.Event.PartUpdated, { + part: text, + messageID: next.id, + sessionID: next.metadata.sessionID, + }) + } + text = undefined + }, + async onFinish(input) { + const assistant = next.metadata!.assistant! + const usage = getUsage(model.info, input.usage, input.providerMetadata) + assistant.cost = usage.cost + assistant.tokens = usage.tokens + next.metadata!.time.completed = Date.now() + await updateMessage(next) + }, }) - next.parts.push({ - type: "text", - text: result.text, - }) - const assistant = next.metadata!.assistant! - const usage = getUsage(model.info, result.usage, result.providerMetadata) - assistant.cost = usage.cost - assistant.tokens = usage.tokens - await updateMessage(next) + + for await (const value of result.fullStream) { + switch (value.type) { + case "text-delta": + if (!text) { + text = { + type: "text", + text: value.textDelta, + } + next.parts.push(text) + } else text.text += value.textDelta + + await updateMessage(next) + break + } + } } function lock(sessionID: string) { diff --git a/packages/tui/internal/app/app.go b/packages/tui/internal/app/app.go index 52c589b9..6fb8242a 100644 --- a/packages/tui/internal/app/app.go +++ b/packages/tui/internal/app/app.go @@ -252,17 +252,19 @@ func (a *App) InitializeProject(ctx context.Context) tea.Cmd { } func (a *App) CompactSession(ctx context.Context) tea.Cmd { - response, err := a.Client.PostSessionSummarizeWithResponse(ctx, client.PostSessionSummarizeJSONRequestBody{ - SessionID: a.Session.Id, - ProviderID: a.Provider.Id, - ModelID: a.Model.Id, - }) - if err != nil { - slog.Error("Failed to compact session", "error", err) - } - if response != nil && response.StatusCode() != 200 { - slog.Error("Failed to compact session", "error", response.StatusCode) - } + go func() { + response, err := a.Client.PostSessionSummarizeWithResponse(ctx, client.PostSessionSummarizeJSONRequestBody{ + SessionID: a.Session.Id, + ProviderID: a.Provider.Id, + ModelID: a.Model.Id, + }) + if err != nil { + slog.Error("Failed to compact session", "error", err) + } + if response != nil && response.StatusCode() != 200 { + slog.Error("Failed to compact session", "error", response.StatusCode) + } + }() return nil } diff --git a/packages/tui/internal/components/chat/message.go b/packages/tui/internal/components/chat/message.go index c40ee02d..2142e1bb 100644 --- a/packages/tui/internal/components/chat/message.go +++ b/packages/tui/internal/components/chat/message.go @@ -25,6 +25,8 @@ import ( func toMarkdown(content string, width int, backgroundColor compat.AdaptiveColor) string { r := styles.GetMarkdownRenderer(width, backgroundColor) content = strings.ReplaceAll(content, app.RootPath+"/", "") + content = strings.ReplaceAll(content, "<", "\\<") + content = strings.ReplaceAll(content, ">", "\\>") rendered, _ := r.Render(content) lines := strings.Split(rendered, "\n") @@ -44,7 +46,6 @@ func toMarkdown(content string, width int, backgroundColor compat.AdaptiveColor) } } } - content = strings.Join(lines, "\n") return strings.TrimSuffix(content, "\n") }