Merge branch 'main' into jl-fix-preview-doc

This commit is contained in:
Joshua Lambert
2026-02-25 16:31:11 -05:00
committed by GitHub
39 changed files with 201 additions and 92 deletions
+14 -14
View File
@@ -25,7 +25,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@kilocode/kilo-i18n": "workspace:*",
"@kilocode/kilo-ui": "workspace:*",
@@ -77,7 +77,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -110,7 +110,7 @@
},
"packages/kilo-docs": {
"name": "@kilocode/kilo-docs",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@docsearch/css": "^4",
"@docsearch/js": "^4",
@@ -138,7 +138,7 @@
},
"packages/kilo-gateway": {
"name": "@kilocode/kilo-gateway",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@clack/prompts": "1.0.0-alpha.1",
"@kilocode/plugin": "workspace:*",
@@ -170,7 +170,7 @@
},
"packages/kilo-i18n": {
"name": "@kilocode/kilo-i18n",
"version": "7.0.29",
"version": "7.0.30",
"devDependencies": {
"@tsconfig/node22": "catalog:",
"@types/bun": "catalog:",
@@ -180,7 +180,7 @@
},
"packages/kilo-telemetry": {
"name": "@kilocode/kilo-telemetry",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@kilocode/kilo-gateway": "workspace:*",
"@opentelemetry/api": "1.9.0",
@@ -200,7 +200,7 @@
},
"packages/kilo-ui": {
"name": "@kilocode/kilo-ui",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@kobalte/core": "0.13.11",
},
@@ -223,7 +223,7 @@
},
"packages/kilo-vscode": {
"name": "kilo-code",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@anthropic-ai/sdk": "^0.39.0",
"@kilocode/kilo-i18n": "workspace:*",
@@ -267,7 +267,7 @@
},
"packages/opencode": {
"name": "@kilocode/cli",
"version": "7.0.29",
"version": "7.0.30",
"bin": {
"opencode": "./bin/opencode",
},
@@ -384,7 +384,7 @@
},
"packages/plugin": {
"name": "@kilocode/plugin",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@kilocode/sdk": "workspace:*",
"zod": "catalog:",
@@ -398,14 +398,14 @@
},
"packages/script": {
"name": "@opencode-ai/script",
"version": "7.0.29",
"version": "7.0.30",
"devDependencies": {
"@types/bun": "catalog:",
},
},
"packages/sdk/js": {
"name": "@kilocode/sdk",
"version": "7.0.29",
"version": "7.0.30",
"devDependencies": {
"@hey-api/openapi-ts": "0.90.10",
"@tsconfig/node22": "catalog:",
@@ -416,7 +416,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"@kilocode/sdk": "workspace:*",
"@kobalte/core": "catalog:",
@@ -458,7 +458,7 @@
},
"packages/util": {
"name": "@opencode-ai/util",
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {
"zod": "catalog:",
},
+1 -1
View File
@@ -107,6 +107,6 @@
"@openrouter/ai-sdk-provider@1.5.4": "patches/@openrouter%2Fai-sdk-provider@1.5.4.patch",
"ghostty-web@0.3.0": "patches/ghostty-web@0.3.0.patch"
},
"version": "7.0.29",
"version": "7.0.30",
"peerDependencies": {}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "7.0.29",
"version": "7.0.30",
"description": "",
"type": "module",
"exports": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop",
"private": true,
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"scripts": {
+6 -6
View File
@@ -1,7 +1,7 @@
id = "kilo"
name = "Kilo"
description = "The open source coding agent."
version = "7.0.29"
version = "7.0.30"
schema_version = 1
authors = ["Anomaly"]
repository = "https://github.com/Kilo-Org/kilocode"
@@ -11,26 +11,26 @@ name = "Kilo"
icon = "./icons/opencode.svg"
[agent_servers.opencode.targets.darwin-aarch64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.29/opencode-darwin-arm64.zip"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.30/opencode-darwin-arm64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.darwin-x86_64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.29/opencode-darwin-x64.zip"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.30/opencode-darwin-x64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-aarch64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.29/opencode-linux-arm64.tar.gz"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.30/opencode-linux-arm64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-x86_64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.29/opencode-linux-x64.tar.gz"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.30/opencode-linux-x64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.windows-x86_64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.29/opencode-windows-x64.zip"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.30/opencode-windows-x64.zip"
cmd = "./opencode.exe"
args = ["acp"]
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@kilocode/kilo-docs",
"version": "7.0.29",
"version": "7.0.30",
"private": true,
"scripts": {
"dev": "next dev --webpack --port 3002",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-gateway",
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-i18n",
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"description": "Kilo-specific i18n translations and overrides",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-telemetry",
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"description": "Telemetry for Kilo CLI - PostHog analytics integration",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@kilocode/kilo-ui",
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"exports": {
+30 -2
View File
@@ -2,8 +2,12 @@
"name": "kilo-code",
"displayName": "Kilo Code: AI Coding Agent, Copilot, and Autocomplete",
"description": "Open Source AI coding agent that generates code from natural language, automates tasks, and runs terminal commands. Features inline autocomplete, browser automation, automated refactoring, and custom modes for planning, coding, and debugging. Supports 500+ AI models including Claude (Anthropic), Gemini, Grok, GPT, Codex and GLM.",
"version": "7.0.29",
"version": "7.0.30",
"icon": "assets/icons/logo-outline-black.png",
"galleryBanner": {
"color": "#FFFFFF",
"theme": "light"
},
"publisher": "kilocode",
"repository": {
"type": "git",
@@ -13,8 +17,32 @@
"engines": {
"vscode": "^1.108.0"
},
"author": {
"name": "Kilo Code"
},
"categories": [
"Other"
"AI",
"Chat",
"Programming Languages",
"Education",
"Snippets",
"Testing"
],
"keywords": [
"kilo",
"claude",
"dev",
"mcp",
"openrouter",
"coding",
"agent",
"autonomous",
"chatgpt",
"sonnet",
"ai",
"llama",
"Kilo Code",
"kilocode"
],
"activationEvents": [],
"main": "./dist/extension.js",
+3 -3
View File
@@ -29,9 +29,9 @@ console.log(`\nFound ${vsixFiles.length} VSIX files`)
for (const target of targets) {
const vsixPath = join(outDir, `kilo-vscode-${target}.vsix`)
// console.log(`\n🚀 Publishing ${target} to VS Code Marketplace...`)
// await $`vsce publish --pre-release --packagePath ${vsixPath}`
// console.log(` ✅ Published ${target} to VS Code Marketplace`)
console.log(`\n🚀 Publishing ${target} to VS Code Marketplace...`)
await $`vsce publish --pre-release --packagePath ${vsixPath}`
console.log(` ✅ Published ${target} to VS Code Marketplace`)
// Note: Open VSX publishing is commented out as it doesn't support prereleases
// console.log(`\n📤 Publishing ${target} to Open VSX...`)
@@ -1274,23 +1274,49 @@ export class AgentManagerProvider implements vscode.Disposable {
/** Resolve worktree path + parentBranch for a session, or undefined if not applicable. */
private resolveDiffTarget(sessionId: string): { directory: string; baseBranch: string } | undefined {
const state = this.getStateManager()
if (!state) return undefined
if (!state) {
this.log(`resolveDiffTarget: no state manager for session ${sessionId}`)
return undefined
}
const session = state.getSession(sessionId)
if (!session?.worktreeId) return undefined
if (!session) {
this.log(
`resolveDiffTarget: session ${sessionId} not found in state (${state.getSessions().length} total sessions)`,
)
return undefined
}
if (!session.worktreeId) {
this.log(`resolveDiffTarget: session ${sessionId} has no worktreeId (local session)`)
return undefined
}
const worktree = state.getWorktree(session.worktreeId)
if (!worktree) return undefined
if (!worktree) {
this.log(`resolveDiffTarget: worktree ${session.worktreeId} not found for session ${sessionId}`)
return undefined
}
return { directory: worktree.path, baseBranch: worktree.parentBranch }
}
/** One-shot diff fetch with loading indicators. Used by requestWorktreeDiff. */
private async onRequestWorktreeDiff(sessionId: string): Promise<void> {
// Ensure state is loaded before resolving diff target — avoids race where
// startDiffWatch arrives before initializeState() finishes loading state from disk.
// The .catch() is required: this method is called via `void` (fire-and-forget),
// so an uncaught rejection would become an unhandled promise rejection. On failure
// we log and fall through to resolveDiffTarget which logs the specific reason.
if (this.stateReady) {
await this.stateReady.catch((err) => this.log("stateReady rejected, continuing diff resolve:", err))
}
const target = this.resolveDiffTarget(sessionId)
if (!target) return
this.postToWebview({ type: "agentManager.worktreeDiffLoading", sessionId, loading: true })
try {
const client = this.connectionService.getHttpClient()
this.log(`Fetching worktree diff for session ${sessionId}: dir=${target.directory}, base=${target.baseBranch}`)
const diffs = await client.getWorktreeDiff(target.directory, target.baseBranch)
this.log(`Worktree diff returned ${diffs.length} file(s) for session ${sessionId}`)
const hash = diffs.map((d) => `${d.file}:${d.status}:${d.additions}:${d.deletions}:${d.after.length}`).join("|")
this.lastDiffHash = hash
@@ -1328,6 +1354,7 @@ export class AgentManagerProvider implements vscode.Disposable {
this.stopDiffPolling()
this.diffSessionId = sessionId
this.lastDiffHash = undefined
this.log(`Starting diff polling for session ${sessionId}`)
// Initial fetch with loading state
void this.onRequestWorktreeDiff(sessionId)
@@ -65,6 +65,34 @@ export const DiffPanel: Component<DiffPanelProps> = (props) => {
// so pierre's annotation cache doesn't invalidate and destroy the textarea
let draftMeta: AnnotationMeta | null = null
// Ref to the scrollable container — used to preserve scroll position when
// annotation changes cause pierre to fully re-render diffs
let scroller: HTMLDivElement | undefined
// Run a callback while preserving the scroll position of the diff container.
// Pierre destroys and rebuilds the DOM on annotation changes (via innerHTML = ""),
// which resets scrollTop. We capture it before the update and restore it across
// two animation frames to account for the async shadow-DOM render of <diffs-container>.
const preserveScroll = (fn: () => void) => {
const el = scroller
if (!el) return fn()
const top = el.scrollTop
fn()
requestAnimationFrame(() => {
el.scrollTop = top
requestAnimationFrame(() => {
el.scrollTop = top
})
})
}
const cancelDraft = () => {
preserveScroll(() => {
setDraft(null)
draftMeta = null
})
}
// Auto-open files when diffs arrive
createEffect(
on(
@@ -78,20 +106,26 @@ export const DiffPanel: Component<DiffPanelProps> = (props) => {
// --- CRUD ---
const addComment = (file: string, side: AnnotationSide, line: number, text: string, selectedText: string) => {
const id = `c-${++nextId}-${Date.now()}`
setComments((prev) => [...prev, { id, file, side, line, comment: text, selectedText }])
setDraft(null)
draftMeta = null
preserveScroll(() => {
const id = `c-${++nextId}-${Date.now()}`
setComments((prev) => [...prev, { id, file, side, line, comment: text, selectedText }])
setDraft(null)
draftMeta = null
})
}
const updateComment = (id: string, text: string) => {
setComments((prev) => prev.map((c) => (c.id === id ? { ...c, comment: text } : c)))
setEditing(null)
preserveScroll(() => {
setComments((prev) => prev.map((c) => (c.id === id ? { ...c, comment: text } : c)))
setEditing(null)
})
}
const deleteComment = (id: string) => {
setComments((prev) => prev.filter((c) => c.id !== id))
if (editing() === id) setEditing(null)
preserveScroll(() => {
setComments((prev) => prev.filter((c) => c.id !== id))
if (editing() === id) setEditing(null)
})
}
// --- Per-file memoized annotations ---
@@ -192,8 +226,7 @@ export const DiffPanel: Component<DiffPanelProps> = (props) => {
}
cancelBtn.addEventListener("click", (e) => {
e.stopPropagation()
setDraft(null)
draftMeta = null
cancelDraft()
})
submitBtn.addEventListener("click", (e) => {
e.stopPropagation()
@@ -202,8 +235,7 @@ export const DiffPanel: Component<DiffPanelProps> = (props) => {
textarea.addEventListener("keydown", (e) => {
if (e.key === "Escape") {
e.preventDefault()
setDraft(null)
draftMeta = null
cancelDraft()
}
if (e.key === "Enter" && !e.shiftKey) {
e.preventDefault()
@@ -347,7 +379,7 @@ export const DiffPanel: Component<DiffPanelProps> = (props) => {
}
const text = lines.join("\n")
window.dispatchEvent(new MessageEvent("message", { data: { type: "appendChatBoxMessage", text } }))
setComments([])
preserveScroll(() => setComments([]))
}
return (
@@ -371,7 +403,7 @@ export const DiffPanel: Component<DiffPanelProps> = (props) => {
</Show>
<Show when={props.diffs.length > 0}>
<div class="am-diff-content" data-component="session-review">
<div class="am-diff-content" data-component="session-review" ref={scroller}>
<Accordion multiple value={open()} onChange={setOpen}>
<For each={props.diffs}>
{(diff) => {
@@ -987,7 +987,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "؟ سيؤدي هذا إلى إزالة Worktree من القرص وفصل جميع الجلسات.",
"agentManager.dialog.deleteWorktree.cancel": "إلغاء",
"agentManager.dialog.deleteWorktree.confirm": "حذف",
"agentManager.dialog.openWorktree": "فتح شجرة العمل",
"agentManager.dialog.openWorktree": "شجرة عمل جديدة",
"agentManager.dialog.tab.new": "جديد",
"agentManager.dialog.tab.import": "استيراد",
"agentManager.dialog.namePlaceholder": "اسم Worktree (اختياري)",
@@ -1005,7 +1005,7 @@ export const dict = {
"agentManager.dialog.compareModels": "مقارنة النماذج",
"agentManager.dialog.compareModels.searchModels": "البحث عن النماذج...",
"agentManager.dialog.creating": "جارٍ الإنشاء...",
"agentManager.dialog.createWorkspace": "إنشاء مساحة عمل",
"agentManager.dialog.createWorkspace": "إنشاء شجرة العمل",
"agentManager.dialog.removeImage": "إزالة الصورة",
"agentManager.dialog.advanced": "متقدم...",
@@ -1001,7 +1001,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "? Isso remove o Worktree do disco e desassocia todas as sessões.",
"agentManager.dialog.deleteWorktree.cancel": "Cancelar",
"agentManager.dialog.deleteWorktree.confirm": "Excluir",
"agentManager.dialog.openWorktree": "Abrir Worktree",
"agentManager.dialog.openWorktree": "Novo Worktree",
"agentManager.dialog.tab.new": "Novo",
"agentManager.dialog.tab.import": "Importar",
"agentManager.dialog.namePlaceholder": "Nome do Worktree (opcional)",
@@ -1019,7 +1019,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Comparar Modelos",
"agentManager.dialog.compareModels.searchModels": "Pesquisar modelos...",
"agentManager.dialog.creating": "Criando...",
"agentManager.dialog.createWorkspace": "Criar Workspace",
"agentManager.dialog.createWorkspace": "Criar Worktree",
"agentManager.dialog.removeImage": "Remover imagem",
"agentManager.dialog.advanced": "Avançado...",
@@ -1023,7 +1023,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "? Ovo uklanja Worktree sa diska i odvezuje sve sesije.",
"agentManager.dialog.deleteWorktree.cancel": "Otkaži",
"agentManager.dialog.deleteWorktree.confirm": "Obriši",
"agentManager.dialog.openWorktree": "Otvori worktree",
"agentManager.dialog.openWorktree": "Novi worktree",
"agentManager.dialog.tab.new": "Novo",
"agentManager.dialog.tab.import": "Uvezi",
"agentManager.dialog.namePlaceholder": "Naziv Worktree-a (opcionalno)",
@@ -1041,7 +1041,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Uporedi modele",
"agentManager.dialog.compareModels.searchModels": "Pretraži modele...",
"agentManager.dialog.creating": "Kreiranje...",
"agentManager.dialog.createWorkspace": "Kreiraj radni prostor",
"agentManager.dialog.createWorkspace": "Kreiraj worktree",
"agentManager.dialog.removeImage": "Ukloni sliku",
"agentManager.dialog.advanced": "Napredno...",
@@ -996,7 +996,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "? Dette fjerner Worktree fra disken og afkobler alle sessioner.",
"agentManager.dialog.deleteWorktree.cancel": "Annuller",
"agentManager.dialog.deleteWorktree.confirm": "Slet",
"agentManager.dialog.openWorktree": "Åbn Worktree",
"agentManager.dialog.openWorktree": "Ny Worktree",
"agentManager.dialog.tab.new": "Ny",
"agentManager.dialog.tab.import": "Importér",
"agentManager.dialog.namePlaceholder": "Worktree-navn (valgfrit)",
@@ -1014,7 +1014,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Sammenlign modeller",
"agentManager.dialog.compareModels.searchModels": "Søg modeller...",
"agentManager.dialog.creating": "Opretter...",
"agentManager.dialog.createWorkspace": "Opret Workspace",
"agentManager.dialog.createWorkspace": "Opret Worktree",
"agentManager.dialog.removeImage": "Fjern billede",
"agentManager.dialog.advanced": "Avanceret...",
@@ -1010,7 +1010,7 @@ export const dict = {
"? Dies entfernt den Worktree von der Festplatte und trennt alle Sitzungen.",
"agentManager.dialog.deleteWorktree.cancel": "Abbrechen",
"agentManager.dialog.deleteWorktree.confirm": "Löschen",
"agentManager.dialog.openWorktree": "Worktree öffnen",
"agentManager.dialog.openWorktree": "Neuer Worktree",
"agentManager.dialog.tab.new": "Neu",
"agentManager.dialog.tab.import": "Importieren",
"agentManager.dialog.namePlaceholder": "Worktree-Name (optional)",
@@ -1028,7 +1028,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Modelle vergleichen",
"agentManager.dialog.compareModels.searchModels": "Modelle suchen...",
"agentManager.dialog.creating": "Wird erstellt...",
"agentManager.dialog.createWorkspace": "Arbeitsbereich erstellen",
"agentManager.dialog.createWorkspace": "Worktree erstellen",
"agentManager.dialog.removeImage": "Bild entfernen",
"agentManager.dialog.advanced": "Erweitert...",
@@ -1052,7 +1052,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.cancel": "Cancel",
"agentManager.dialog.deleteWorktree.confirm": "Delete",
"agentManager.dialog.openWorktree": "Open Worktree",
"agentManager.dialog.openWorktree": "New Worktree",
"agentManager.dialog.tab.new": "New",
"agentManager.dialog.tab.import": "Import",
"agentManager.dialog.namePlaceholder": "Worktree name (optional)",
@@ -1070,7 +1070,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Compare Models",
"agentManager.dialog.compareModels.searchModels": "Search models...",
"agentManager.dialog.creating": "Creating...",
"agentManager.dialog.createWorkspace": "Create Workspace",
"agentManager.dialog.createWorkspace": "Create Worktree",
"agentManager.dialog.removeImage": "Remove image",
"agentManager.dialog.advanced": "Advanced...",
@@ -1004,7 +1004,7 @@ export const dict = {
"? Esto elimina el Worktree del disco y desasocia todas las sesiones.",
"agentManager.dialog.deleteWorktree.cancel": "Cancelar",
"agentManager.dialog.deleteWorktree.confirm": "Eliminar",
"agentManager.dialog.openWorktree": "Abrir Worktree",
"agentManager.dialog.openWorktree": "Nuevo Worktree",
"agentManager.dialog.tab.new": "Nuevo",
"agentManager.dialog.tab.import": "Importar",
"agentManager.dialog.namePlaceholder": "Nombre del Worktree (opcional)",
@@ -1022,7 +1022,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Comparar modelos",
"agentManager.dialog.compareModels.searchModels": "Buscar modelos...",
"agentManager.dialog.creating": "Creando...",
"agentManager.dialog.createWorkspace": "Crear Workspace",
"agentManager.dialog.createWorkspace": "Crear Worktree",
"agentManager.dialog.removeImage": "Eliminar imagen",
"agentManager.dialog.advanced": "Avanzado...",
@@ -1012,7 +1012,7 @@ export const dict = {
" ? Cela supprime le Worktree du disque et dissocie toutes les sessions.",
"agentManager.dialog.deleteWorktree.cancel": "Annuler",
"agentManager.dialog.deleteWorktree.confirm": "Supprimer",
"agentManager.dialog.openWorktree": "Ouvrir le worktree",
"agentManager.dialog.openWorktree": "Nouveau worktree",
"agentManager.dialog.tab.new": "Nouveau",
"agentManager.dialog.tab.import": "Importer",
"agentManager.dialog.namePlaceholder": "Nom du Worktree (optionnel)",
@@ -1030,7 +1030,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Comparer les modèles",
"agentManager.dialog.compareModels.searchModels": "Rechercher des modèles...",
"agentManager.dialog.creating": "Création...",
"agentManager.dialog.createWorkspace": "Créer un espace de travail",
"agentManager.dialog.createWorkspace": "Créer un worktree",
"agentManager.dialog.removeImage": "Supprimer l'image",
"agentManager.dialog.advanced": "Avancé...",
@@ -992,7 +992,7 @@ export const dict = {
" ディスクからWorktreeを削除し、すべてのセッションの関連付けを解除します。",
"agentManager.dialog.deleteWorktree.cancel": "キャンセル",
"agentManager.dialog.deleteWorktree.confirm": "削除",
"agentManager.dialog.openWorktree": "ワークツリーを開く",
"agentManager.dialog.openWorktree": "新規ワークツリー",
"agentManager.dialog.tab.new": "新規",
"agentManager.dialog.tab.import": "インポート",
"agentManager.dialog.namePlaceholder": "Worktree名(任意)",
@@ -1010,7 +1010,7 @@ export const dict = {
"agentManager.dialog.compareModels": "モデルを比較",
"agentManager.dialog.compareModels.searchModels": "モデルを検索...",
"agentManager.dialog.creating": "作成中...",
"agentManager.dialog.createWorkspace": "ワークスペースを作成",
"agentManager.dialog.createWorkspace": "ワークツリーを作成",
"agentManager.dialog.removeImage": "画像を削除",
"agentManager.dialog.advanced": "詳細...",
@@ -992,7 +992,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "? 디스크에서 Worktree를 제거하고 모든 세션의 연결을 해제합니다.",
"agentManager.dialog.deleteWorktree.cancel": "취소",
"agentManager.dialog.deleteWorktree.confirm": "삭제",
"agentManager.dialog.openWorktree": "워크트리 열기",
"agentManager.dialog.openWorktree": "워크트리",
"agentManager.dialog.tab.new": "새로 만들기",
"agentManager.dialog.tab.import": "가져오기",
"agentManager.dialog.namePlaceholder": "Worktree 이름 (선택사항)",
@@ -1010,7 +1010,7 @@ export const dict = {
"agentManager.dialog.compareModels": "모델 비교",
"agentManager.dialog.compareModels.searchModels": "모델 검색...",
"agentManager.dialog.creating": "생성 중...",
"agentManager.dialog.createWorkspace": "워크스페이스 생성",
"agentManager.dialog.createWorkspace": "워크트리 생성",
"agentManager.dialog.removeImage": "이미지 제거",
"agentManager.dialog.advanced": "고급...",
@@ -997,7 +997,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "? Dette fjerner Worktree fra disken og kobler fra alle økter.",
"agentManager.dialog.deleteWorktree.cancel": "Avbryt",
"agentManager.dialog.deleteWorktree.confirm": "Slett",
"agentManager.dialog.openWorktree": "Åpne worktree",
"agentManager.dialog.openWorktree": "Ny worktree",
"agentManager.dialog.tab.new": "Ny",
"agentManager.dialog.tab.import": "Importer",
"agentManager.dialog.namePlaceholder": "Worktree-navn (valgfritt)",
@@ -1015,7 +1015,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Sammenlign modeller",
"agentManager.dialog.compareModels.searchModels": "Søk modeller...",
"agentManager.dialog.creating": "Oppretter...",
"agentManager.dialog.createWorkspace": "Opprett arbeidsområde",
"agentManager.dialog.createWorkspace": "Opprett worktree",
"agentManager.dialog.removeImage": "Fjern bilde",
"agentManager.dialog.advanced": "Avansert...",
@@ -999,7 +999,7 @@ export const dict = {
"? Spowoduje to usunięcie Worktree z dysku i odłączenie wszystkich sesji.",
"agentManager.dialog.deleteWorktree.cancel": "Anuluj",
"agentManager.dialog.deleteWorktree.confirm": "Usuń",
"agentManager.dialog.openWorktree": "Otwórz Worktree",
"agentManager.dialog.openWorktree": "Nowy Worktree",
"agentManager.dialog.tab.new": "Nowy",
"agentManager.dialog.tab.import": "Importuj",
"agentManager.dialog.namePlaceholder": "Nazwa Worktree (opcjonalnie)",
@@ -1017,7 +1017,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Porównaj modele",
"agentManager.dialog.compareModels.searchModels": "Szukaj modeli...",
"agentManager.dialog.creating": "Tworzenie...",
"agentManager.dialog.createWorkspace": "Utwórz Workspace",
"agentManager.dialog.createWorkspace": "Utwórz Worktree",
"agentManager.dialog.removeImage": "Usuń obraz",
"agentManager.dialog.advanced": "Zaawansowane...",
@@ -1000,7 +1000,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "? Это удалит Worktree с диска и отключит все сессии.",
"agentManager.dialog.deleteWorktree.cancel": "Отмена",
"agentManager.dialog.deleteWorktree.confirm": "Удалить",
"agentManager.dialog.openWorktree": "Открыть worktree",
"agentManager.dialog.openWorktree": "Новый worktree",
"agentManager.dialog.tab.new": "Новый",
"agentManager.dialog.tab.import": "Импорт",
"agentManager.dialog.namePlaceholder": "Имя Worktree (необязательно)",
@@ -1018,7 +1018,7 @@ export const dict = {
"agentManager.dialog.compareModels": "Сравнить модели",
"agentManager.dialog.compareModels.searchModels": "Поиск моделей...",
"agentManager.dialog.creating": "Создание...",
"agentManager.dialog.createWorkspace": "Создать рабочее пространство",
"agentManager.dialog.createWorkspace": "Создать worktree",
"agentManager.dialog.removeImage": "Удалить изображение",
"agentManager.dialog.advanced": "Дополнительно...",
@@ -985,7 +985,7 @@ export const dict = {
"? การดำเนินการนี้จะลบ Worktree ออกจากดิสก์และยกเลิกการเชื่อมโยงเซสชันทั้งหมด",
"agentManager.dialog.deleteWorktree.cancel": "ยกเลิก",
"agentManager.dialog.deleteWorktree.confirm": "ลบ",
"agentManager.dialog.openWorktree": "เปิด Worktree",
"agentManager.dialog.openWorktree": "Worktree ใหม่",
"agentManager.dialog.tab.new": "ใหม่",
"agentManager.dialog.tab.import": "นำเข้า",
"agentManager.dialog.namePlaceholder": "ชื่อ Worktree (ไม่บังคับ)",
@@ -1003,7 +1003,7 @@ export const dict = {
"agentManager.dialog.compareModels": "เปรียบเทียบโมเดล",
"agentManager.dialog.compareModels.searchModels": "ค้นหาโมเดล...",
"agentManager.dialog.creating": "กำลังสร้าง...",
"agentManager.dialog.createWorkspace": "สร้าง Workspace",
"agentManager.dialog.createWorkspace": "สร้าง Worktree",
"agentManager.dialog.removeImage": "ลบรูปภาพ",
"agentManager.dialog.advanced": "ขั้นสูง...",
@@ -987,7 +987,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "?这将从磁盘中移除 Worktree 并取消所有会话的关联。",
"agentManager.dialog.deleteWorktree.cancel": "取消",
"agentManager.dialog.deleteWorktree.confirm": "删除",
"agentManager.dialog.openWorktree": "打开工作树",
"agentManager.dialog.openWorktree": "新建工作树",
"agentManager.dialog.tab.new": "新建",
"agentManager.dialog.tab.import": "导入",
"agentManager.dialog.namePlaceholder": "Worktree 名称(可选)",
@@ -1005,7 +1005,7 @@ export const dict = {
"agentManager.dialog.compareModels": "比较模型",
"agentManager.dialog.compareModels.searchModels": "搜索模型...",
"agentManager.dialog.creating": "创建中...",
"agentManager.dialog.createWorkspace": "创建工作",
"agentManager.dialog.createWorkspace": "创建工作",
"agentManager.dialog.removeImage": "移除图片",
"agentManager.dialog.advanced": "高级...",
@@ -983,7 +983,7 @@ export const dict = {
"agentManager.dialog.deleteWorktree.messagePost": "?這將從磁碟中移除 Worktree 並取消所有工作階段的關聯。",
"agentManager.dialog.deleteWorktree.cancel": "取消",
"agentManager.dialog.deleteWorktree.confirm": "刪除",
"agentManager.dialog.openWorktree": "開啟工作樹",
"agentManager.dialog.openWorktree": "新建工作樹",
"agentManager.dialog.tab.new": "新建",
"agentManager.dialog.tab.import": "匯入",
"agentManager.dialog.namePlaceholder": "Worktree 名稱(選填)",
@@ -1001,7 +1001,7 @@ export const dict = {
"agentManager.dialog.compareModels": "比較模型",
"agentManager.dialog.compareModels.searchModels": "搜尋模型...",
"agentManager.dialog.creating": "建立中...",
"agentManager.dialog.createWorkspace": "建立工作",
"agentManager.dialog.createWorkspace": "建立工作",
"agentManager.dialog.removeImage": "移除圖片",
"agentManager.dialog.advanced": "進階...",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "7.0.29",
"version": "7.0.30",
"name": "@kilocode/cli",
"type": "module",
"license": "MIT",
@@ -13,6 +13,7 @@ import { $ } from "bun" // kilocode_change
import path from "path" // kilocode_change
import { Snapshot } from "../../snapshot" // kilocode_change
import { Review } from "../../kilocode/review/review" // kilocode_change
import { Log } from "../../util/log" // kilocode_change
export const ExperimentalRoutes = lazy(() =>
new Hono()
@@ -208,12 +209,23 @@ export const ExperimentalRoutes = lazy(() =>
},
}),
async (c) => {
const log = Log.create({ service: "worktree-diff" })
const base = c.req.query("base") || (await Review.getBaseBranch())
const dir = Instance.directory
log.info("computing diff", { dir, base })
const mergeBaseResult = await $`git merge-base HEAD ${base}`.cwd(dir).quiet().nothrow()
if (mergeBaseResult.exitCode !== 0) return c.json([])
if (mergeBaseResult.exitCode !== 0) {
log.warn("git merge-base failed", {
exitCode: mergeBaseResult.exitCode,
stderr: mergeBaseResult.stderr.toString().trim(),
dir,
base,
})
return c.json([])
}
const ancestor = mergeBaseResult.stdout.toString().trim()
log.info("merge-base resolved", { ancestor: ancestor.slice(0, 12) })
const nameStatus = await $`git -c core.quotepath=false diff --name-status --no-renames ${ancestor}`
.cwd(dir)
@@ -285,7 +297,11 @@ export const ExperimentalRoutes = lazy(() =>
// viewer shows all working-tree changes, not just tracked ones.
const untrackedResult = await $`git ls-files --others --exclude-standard`.cwd(dir).quiet().nothrow()
if (untrackedResult.exitCode === 0) {
for (const file of untrackedResult.stdout.toString().trim().split("\n")) {
const untrackedFiles = untrackedResult.stdout.toString().trim()
if (untrackedFiles) {
log.info("untracked files found", { count: untrackedFiles.split("\n").length })
}
for (const file of untrackedFiles.split("\n")) {
if (!file || seen.has(file)) continue
const f = Bun.file(path.join(dir, file))
if (!(await f.exists())) continue
@@ -300,8 +316,14 @@ export const ExperimentalRoutes = lazy(() =>
status: "added",
})
}
} else {
log.warn("git ls-files failed", {
exitCode: untrackedResult.exitCode,
stderr: untrackedResult.stderr.toString().trim(),
})
}
log.info("diff complete", { totalFiles: diffs.length })
return c.json(diffs)
},
)
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/plugin",
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"repository": {
+1 -1
View File
@@ -8,7 +8,7 @@
"exports": {
".": "./src/index.ts"
},
"version": "7.0.29",
"version": "7.0.30",
"dependencies": {},
"peerDependencies": {}
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/sdk",
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"repository": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/ui",
"version": "7.0.29",
"version": "7.0.30",
"type": "module",
"license": "MIT",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/util",
"version": "7.0.29",
"version": "7.0.30",
"private": true,
"type": "module",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@kilocode/upstream-merge",
"version": "7.0.29",
"version": "7.0.30",
"private": true,
"type": "module",
"description": "Scripts for automating upstream opencode merges into Kilo",
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "opencode",
"displayName": "opencode",
"description": "opencode for VS Code",
"version": "7.0.29",
"version": "7.0.30",
"publisher": "sst-dev",
"repository": {
"type": "git",