Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions packages/opencode/src/provider/transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,42 @@ function normalizeMessages(
})
}

// VLLM and other OpenAI-compatible providers strictly require system messages
// at the beginning of the messages array. Reorder if a system message appears
// after any non-system message. When multiple system messages exist, merge them
// into a single message for maximum compatibility with stricter VLLM versions.
if (
model.api.npm === "@ai-sdk/openai-compatible" ||
model.api.npm?.includes("openai-compatible")
) {
const systemMsgs = msgs.filter((msg) => msg.role === "system")
const nonSystemMsgs = msgs.filter((msg) => msg.role !== "system")
if (systemMsgs.length > 0 && nonSystemMsgs.length > 0) {
const firstNonSystemIdx = msgs.findIndex((msg) => msg.role !== "system")
const lastSystemIdx =
msgs.length - 1 - [...msgs].reverse().findIndex((msg) => msg.role === "system")
if (lastSystemIdx > firstNonSystemIdx) {
if (systemMsgs.length > 1) {
const extractText = (msg: ModelMessage) =>
typeof msg.content === "string"
? msg.content
: Array.isArray(msg.content)
? msg.content
.filter((p: any) => p.type === "text")
.map((p: any) => p.text)
.join("\n")
: ""
const merged: ModelMessage = {
role: "system",
content: systemMsgs.map(extractText).join("\n\n"),
}
return [merged, ...nonSystemMsgs]
}
return [...systemMsgs, ...nonSystemMsgs]
}
}
}

return msgs
}

Expand Down
3 changes: 2 additions & 1 deletion packages/opencode/src/tool/lsp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import path from "path"
import { LSP } from "../lsp"
import DESCRIPTION from "./lsp.txt"
import { Instance } from "../project/instance"
import { SessionCwd } from "./session-cwd"
import { pathToFileURL } from "url"
import { assertExternalDirectoryEffect } from "./external-directory"
import { AppFileSystem } from "@mimo-ai/shared/filesystem"
Expand Down Expand Up @@ -40,7 +41,7 @@ export const LspTool = Tool.define(
ctx: Tool.Context,
) =>
Effect.gen(function* () {
const file = path.isAbsolute(args.filePath) ? args.filePath : path.join(Instance.directory, args.filePath)
const file = path.isAbsolute(args.filePath) ? args.filePath : path.join(SessionCwd.get(ctx.sessionID), args.filePath)
yield* assertExternalDirectoryEffect(ctx, file)
yield* ctx.ask({ permission: "lsp", patterns: ["*"], always: ["*"], metadata: {} })

Expand Down
2 changes: 1 addition & 1 deletion packages/opencode/src/tool/multiedit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export const MultiEditTool = Tool.define(
for (const [, entry] of params.edits.entries()) {
const result = yield* edit.execute(
{
filePath: params.filePath,
filePath: entry.filePath || params.filePath,
oldString: entry.oldString,
newString: entry.newString,
replaceAll: entry.replaceAll,
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/ar.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "تغييرات الجلسة",
"ui.sessionReview.title.git": "تغييرات Git",
"ui.sessionReview.title.branch": "تغييرات الفرع",
"ui.sessionReview.title.lastTurn": "تغييرات آخر دور",
"ui.sessionReview.diffStyle.unified": "موحد",
"ui.sessionReview.diffStyle.split": "منقسم",
Expand Down Expand Up @@ -38,6 +40,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "استجابة",
"ui.sessionTurn.diff.showMore": "إظهار المزيد من التغييرات ({{count}})",

"ui.sessionTurn.diffs.changed": "تغيّر",
"ui.sessionTurn.diffs.showAll": "عرض الكل",
"ui.sessionTurn.diffs.showLess": "عرض أقل",
"ui.sessionTurn.diffs.more": "+{{count}} ملفات أخرى",

"ui.sessionTurn.retry.retrying": "إعادة المحاولة",
"ui.sessionTurn.retry.inSeconds": "خلال {{seconds}} ثواني",
"ui.sessionTurn.retry.attempt": "المحاولة رقم {{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/br.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "Alterações da sessão",
"ui.sessionReview.title.git": "Alterações no Git",
"ui.sessionReview.title.branch": "Alterações na branch",
"ui.sessionReview.title.lastTurn": "Alterações do último turno",
"ui.sessionReview.diffStyle.unified": "Unificado",
"ui.sessionReview.diffStyle.split": "Dividido",
Expand Down Expand Up @@ -38,6 +40,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Resposta",
"ui.sessionTurn.diff.showMore": "Mostrar mais alterações ({{count}})",

"ui.sessionTurn.diffs.changed": "Alterado",
"ui.sessionTurn.diffs.showAll": "Mostrar tudo",
"ui.sessionTurn.diffs.showLess": "Mostrar menos",
"ui.sessionTurn.diffs.more": "+{{count}} arquivos a mais",

"ui.sessionTurn.retry.retrying": "tentando novamente",
"ui.sessionTurn.retry.inSeconds": "em {{seconds}}s",
"ui.sessionTurn.retry.attempt": "tentativa #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/bs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ type Keys = keyof typeof en

export const dict = {
"ui.sessionReview.title": "Promjene sesije",
"ui.sessionReview.title.git": "Git promjene",
"ui.sessionReview.title.branch": "Promjene grane",
"ui.sessionReview.title.lastTurn": "Promjene u posljednjem potezu",
"ui.sessionReview.diffStyle.unified": "Ujedinjeno",
"ui.sessionReview.diffStyle.split": "Podijeljeno",
Expand Down Expand Up @@ -42,6 +44,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Odgovor",
"ui.sessionTurn.diff.showMore": "Prikaži još izmjena ({{count}})",

"ui.sessionTurn.diffs.changed": "Promijenjeno",
"ui.sessionTurn.diffs.showAll": "Prikaži sve",
"ui.sessionTurn.diffs.showLess": "Sakrij",
"ui.sessionTurn.diffs.more": "+{{count}} datoteka više",

"ui.sessionTurn.retry.retrying": "ponovni pokušaj",
"ui.sessionTurn.retry.inSeconds": "za {{seconds}}s",
"ui.sessionTurn.retry.attempt": "pokušaj #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/da.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "Sessionsændringer",
"ui.sessionReview.title.git": "Git-ændringer",
"ui.sessionReview.title.branch": "Branch-ændringer",
"ui.sessionReview.title.lastTurn": "Ændringer fra sidste tur",
"ui.sessionReview.diffStyle.unified": "Samlet",
"ui.sessionReview.diffStyle.split": "Opdelt",
Expand Down Expand Up @@ -37,6 +39,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Svar",
"ui.sessionTurn.diff.showMore": "Vis flere ændringer ({{count}})",

"ui.sessionTurn.diffs.changed": "Ændret",
"ui.sessionTurn.diffs.showAll": "Vis alle",
"ui.sessionTurn.diffs.showLess": "Vis færre",
"ui.sessionTurn.diffs.more": "+{{count}} flere filer",

"ui.sessionTurn.retry.retrying": "prøver igen",
"ui.sessionTurn.retry.inSeconds": "om {{seconds}}s",
"ui.sessionTurn.retry.attempt": "forsøg #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ type Keys = keyof typeof en

export const dict = {
"ui.sessionReview.title": "Sitzungsänderungen",
"ui.sessionReview.title.git": "Git-Änderungen",
"ui.sessionReview.title.branch": "Branch-Änderungen",
"ui.sessionReview.title.lastTurn": "Änderungen der letzten Runde",
"ui.sessionReview.diffStyle.unified": "Vereinheitlicht",
"ui.sessionReview.diffStyle.split": "Geteilt",
Expand Down Expand Up @@ -43,6 +45,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Antwort",
"ui.sessionTurn.diff.showMore": "Weitere Änderungen anzeigen ({{count}})",

"ui.sessionTurn.diffs.changed": "Geändert",
"ui.sessionTurn.diffs.showAll": "Alle anzeigen",
"ui.sessionTurn.diffs.showLess": "Weniger anzeigen",
"ui.sessionTurn.diffs.more": "+{{count}} weitere Dateien",

"ui.sessionTurn.retry.retrying": "erneuter Versuch",
"ui.sessionTurn.retry.inSeconds": "in {{seconds}}s",
"ui.sessionTurn.retry.attempt": "Versuch #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/es.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "Cambios de la sesión",
"ui.sessionReview.title.git": "Cambios de Git",
"ui.sessionReview.title.branch": "Cambios de rama",
"ui.sessionReview.title.lastTurn": "Cambios del último turno",
"ui.sessionReview.diffStyle.unified": "Unificado",
"ui.sessionReview.diffStyle.split": "Dividido",
Expand Down Expand Up @@ -38,6 +40,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Respuesta",
"ui.sessionTurn.diff.showMore": "Mostrar más cambios ({{count}})",

"ui.sessionTurn.diffs.changed": "Cambiado",
"ui.sessionTurn.diffs.showAll": "Mostrar todo",
"ui.sessionTurn.diffs.showLess": "Mostrar menos",
"ui.sessionTurn.diffs.more": "+{{count}} archivos más",

"ui.sessionTurn.retry.retrying": "reintentando",
"ui.sessionTurn.retry.inSeconds": "en {{seconds}}s",
"ui.sessionTurn.retry.attempt": "intento #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/fr.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "Modifications de la session",
"ui.sessionReview.title.git": "Modifications Git",
"ui.sessionReview.title.branch": "Modifications de branche",
"ui.sessionReview.title.lastTurn": "Modifications du dernier tour",
"ui.sessionReview.diffStyle.unified": "Unifié",
"ui.sessionReview.diffStyle.split": "Divisé",
Expand Down Expand Up @@ -38,6 +40,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Réponse",
"ui.sessionTurn.diff.showMore": "Afficher plus de modifications ({{count}})",

"ui.sessionTurn.diffs.changed": "Modifié",
"ui.sessionTurn.diffs.showAll": "Tout afficher",
"ui.sessionTurn.diffs.showLess": "Réduire",
"ui.sessionTurn.diffs.more": "+{{count}} fichiers supplémentaires",

"ui.sessionTurn.retry.retrying": "nouvelle tentative",
"ui.sessionTurn.retry.inSeconds": "dans {{seconds}}s",
"ui.sessionTurn.retry.attempt": "tentative n°{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/ja.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "セッションの変更",
"ui.sessionReview.title.git": "Git の変更",
"ui.sessionReview.title.branch": "ブランチの変更",
"ui.sessionReview.title.lastTurn": "前回ターンの変更",
"ui.sessionReview.diffStyle.unified": "Unified",
"ui.sessionReview.diffStyle.split": "Split",
Expand Down Expand Up @@ -37,6 +39,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "応答",
"ui.sessionTurn.diff.showMore": "さらに変更を表示 ({{count}})",

"ui.sessionTurn.diffs.changed": "変更済み",
"ui.sessionTurn.diffs.showAll": "すべて表示",
"ui.sessionTurn.diffs.showLess": "表示を減らす",
"ui.sessionTurn.diffs.more": "+{{count}} 件のファイル",

"ui.sessionTurn.retry.retrying": "再試行中",
"ui.sessionTurn.retry.inSeconds": "{{seconds}}秒後",
"ui.sessionTurn.retry.attempt": "{{attempt}}回目",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/ko.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "세션 변경 사항",
"ui.sessionReview.title.git": "Git 변경",
"ui.sessionReview.title.branch": "브랜치 변경",
"ui.sessionReview.title.lastTurn": "마지막 턴 변경 사항",
"ui.sessionReview.diffStyle.unified": "통합 보기",
"ui.sessionReview.diffStyle.split": "분할 보기",
Expand Down Expand Up @@ -38,6 +40,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "응답",
"ui.sessionTurn.diff.showMore": "변경 사항 더 보기 ({{count}})",

"ui.sessionTurn.diffs.changed": "변경됨",
"ui.sessionTurn.diffs.showAll": "모두 표시",
"ui.sessionTurn.diffs.showLess": "접기",
"ui.sessionTurn.diffs.more": "+{{count}}개 파일 더 보기",

"ui.sessionTurn.retry.retrying": "재시도 중",
"ui.sessionTurn.retry.inSeconds": "{{seconds}}초 후",
"ui.sessionTurn.retry.attempt": "{{attempt}}번째",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/no.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ type Keys = keyof typeof en

export const dict: Record<Keys, string> = {
"ui.sessionReview.title": "Sesjonsendringer",
"ui.sessionReview.title.git": "Git-endringer",
"ui.sessionReview.title.branch": "Grenseendringer",
"ui.sessionReview.title.lastTurn": "Endringer i siste tur",
"ui.sessionReview.diffStyle.unified": "Samlet",
"ui.sessionReview.diffStyle.split": "Delt",
Expand Down Expand Up @@ -41,6 +43,11 @@ export const dict: Record<Keys, string> = {
"ui.sessionTurn.summary.response": "Svar",
"ui.sessionTurn.diff.showMore": "Vis flere endringer ({{count}})",

"ui.sessionTurn.diffs.changed": "Endret",
"ui.sessionTurn.diffs.showAll": "Vis alle",
"ui.sessionTurn.diffs.showLess": "Vis færre",
"ui.sessionTurn.diffs.more": "+{{count}} flere filer",

"ui.sessionTurn.retry.retrying": "Prøver igjen",
"ui.sessionTurn.retry.inSeconds": "om {{seconds}}s",
"ui.sessionTurn.retry.attempt": "forsøk #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/pl.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "Zmiany w sesji",
"ui.sessionReview.title.git": "Zmiany Git",
"ui.sessionReview.title.branch": "Zmiany gałęzi",
"ui.sessionReview.title.lastTurn": "Zmiany z ostatniej tury",
"ui.sessionReview.diffStyle.unified": "Ujednolicony",
"ui.sessionReview.diffStyle.split": "Podzielony",
Expand Down Expand Up @@ -37,6 +39,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Odpowiedź",
"ui.sessionTurn.diff.showMore": "Pokaż więcej zmian ({{count}})",

"ui.sessionTurn.diffs.changed": "Zmienione",
"ui.sessionTurn.diffs.showAll": "Pokaż wszystko",
"ui.sessionTurn.diffs.showLess": "Pokaż mniej",
"ui.sessionTurn.diffs.more": "+{{count}} więcej plików",

"ui.sessionTurn.retry.retrying": "ponawianie",
"ui.sessionTurn.retry.inSeconds": "za {{seconds}}s",
"ui.sessionTurn.retry.attempt": "próba #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/ru.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "Изменения сессии",
"ui.sessionReview.title.git": "Изменения Git",
"ui.sessionReview.title.branch": "Изменения ветки",
"ui.sessionReview.title.lastTurn": "Изменения последнего хода",
"ui.sessionReview.diffStyle.unified": "Объединённый",
"ui.sessionReview.diffStyle.split": "Разделённый",
Expand Down Expand Up @@ -37,6 +39,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "Ответ",
"ui.sessionTurn.diff.showMore": "Показать ещё изменений ({{count}})",

"ui.sessionTurn.diffs.changed": "Изменено",
"ui.sessionTurn.diffs.showAll": "Показать все",
"ui.sessionTurn.diffs.showLess": "Свернуть",
"ui.sessionTurn.diffs.more": "+{{count}} файлов ещё",

"ui.sessionTurn.retry.retrying": "повтор",
"ui.sessionTurn.retry.inSeconds": "через {{seconds}}с",
"ui.sessionTurn.retry.attempt": "попытка №{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/th.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export const dict = {
"ui.sessionReview.title": "การเปลี่ยนแปลงเซสชัน",
"ui.sessionReview.title.git": "การเปลี่ยนแปลง Git",
"ui.sessionReview.title.branch": "การเปลี่ยนแปลงสาขา",
"ui.sessionReview.title.lastTurn": "การเปลี่ยนแปลงของเทิร์นล่าสุด",
"ui.sessionReview.diffStyle.unified": "แบบรวม",
"ui.sessionReview.diffStyle.split": "แบบแยก",
Expand Down Expand Up @@ -39,6 +41,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "การตอบสนอง",
"ui.sessionTurn.diff.showMore": "แสดงการเปลี่ยนแปลงเพิ่มเติม ({{count}})",

"ui.sessionTurn.diffs.changed": "เปลี่ยนแปลงแล้ว",
"ui.sessionTurn.diffs.showAll": "แสดงทั้งหมด",
"ui.sessionTurn.diffs.showLess": "แสดงน้อยลง",
"ui.sessionTurn.diffs.more": "+{{count}} ไฟล์เพิ่มเติม",

"ui.sessionTurn.retry.retrying": "กำลังลองใหม่",
"ui.sessionTurn.retry.inSeconds": "ใน {{seconds}}วิ",
"ui.sessionTurn.retry.attempt": "ครั้งที่ {{attempt}}",
Expand Down
6 changes: 6 additions & 0 deletions packages/ui/src/i18n/tr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ type Keys = keyof typeof en

export const dict = {
"ui.sessionReview.title": "Oturum değişiklikleri",
"ui.sessionReview.title.git": "Git değişiklikleri",
"ui.sessionReview.title.branch": "Dal değişiklikleri",
"ui.sessionReview.title.lastTurn": "Son tur değişiklikleri",
"ui.sessionReview.diffStyle.unified": "Birleşik",
"ui.sessionReview.diffStyle.split": "Bölünmüş",
Expand Down Expand Up @@ -44,6 +46,10 @@ export const dict = {
"ui.sessionTurn.summary.response": "Yanıt",
"ui.sessionTurn.diff.showMore": "Daha fazla değişiklik göster ({{count}})",

"ui.sessionTurn.diffs.changed": "Değiştirildi",
"ui.sessionTurn.diffs.showAll": "Tümünü göster",
"ui.sessionTurn.diffs.showLess": "Daha az göster",
"ui.sessionTurn.diffs.more": "+{{count}} dosya daha",
"ui.sessionTurn.retry.retrying": "yeniden deneniyor",
"ui.sessionTurn.retry.inSeconds": "{{seconds}}sn içinde",
"ui.sessionTurn.retry.attempt": "deneme #{{attempt}}",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ type Keys = keyof typeof en

export const dict = {
"ui.sessionReview.title": "会话变更",
"ui.sessionReview.title.git": "Git 变更",
"ui.sessionReview.title.branch": "分支变更",
"ui.sessionReview.title.lastTurn": "上一轮变更",
"ui.sessionReview.diffStyle.unified": "统一",
"ui.sessionReview.diffStyle.split": "拆分",
Expand Down Expand Up @@ -42,6 +44,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "回复",
"ui.sessionTurn.diff.showMore": "显示更多更改({{count}})",

"ui.sessionTurn.diffs.changed": "已变更",
"ui.sessionTurn.diffs.showAll": "显示全部",
"ui.sessionTurn.diffs.showLess": "收起",
"ui.sessionTurn.diffs.more": "+{{count}} 个更多文件",

"ui.sessionTurn.retry.retrying": "重试中",
"ui.sessionTurn.retry.inSeconds": "{{seconds}} 秒后",
"ui.sessionTurn.retry.attempt": "第 {{attempt}} 次",
Expand Down
7 changes: 7 additions & 0 deletions packages/ui/src/i18n/zht.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ type Keys = keyof typeof en

export const dict = {
"ui.sessionReview.title": "工作階段變更",
"ui.sessionReview.title.git": "Git 變更",
"ui.sessionReview.title.branch": "分支變更",
"ui.sessionReview.title.lastTurn": "上一輪變更",
"ui.sessionReview.diffStyle.unified": "整合",
"ui.sessionReview.diffStyle.split": "拆分",
Expand Down Expand Up @@ -42,6 +44,11 @@ export const dict = {
"ui.sessionTurn.summary.response": "回覆",
"ui.sessionTurn.diff.showMore": "顯示更多變更 ({{count}})",

"ui.sessionTurn.diffs.changed": "已變更",
"ui.sessionTurn.diffs.showAll": "顯示全部",
"ui.sessionTurn.diffs.showLess": "收合",
"ui.sessionTurn.diffs.more": "+{{count}} 個更多檔案",

"ui.sessionTurn.retry.retrying": "重試中",
"ui.sessionTurn.retry.inSeconds": "{{seconds}} 秒後",
"ui.sessionTurn.retry.attempt": "第 {{attempt}} 次",
Expand Down
Loading