summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorphantomreactor <[email protected]>2025-06-22 16:59:04 +0530
committerGitHub <[email protected]>2025-06-22 06:29:04 -0500
commit28bc49ad170bb1104a5f5ebb4bf1c740fbe59d5c (patch)
tree24a7d6bd268e0881d1aa49d4a793d6a0552b20d8
parentdc1947838c2403b63f2c9c83f0729b5f7c946f76 (diff)
downloadopencode-28bc49ad170bb1104a5f5ebb4bf1c740fbe59d5c.tar.gz
opencode-28bc49ad170bb1104a5f5ebb4bf1c740fbe59d5c.zip
fix: invisible html tags and compact long delay (#304)
-rw-r--r--packages/opencode/src/session/index.ts58
-rw-r--r--packages/tui/internal/app/app.go24
-rw-r--r--packages/tui/internal/components/chat/message.go3
3 files changed, 60 insertions, 25 deletions
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 211cbc044..1bb606e3e 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 52c589b91..6fb8242a4 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 c40ee02db..2142e1bb1 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")
}