Compare commits

...

11 Commits

Author SHA1 Message Date
Adam
a3204fce7e fix(app): disable terminal transparency 2026-02-10 13:11:02 -06:00
Adam
70c794e913 fix(app): regressions 2026-02-10 10:15:37 -06:00
Adam
3929f0b5bd fix(app): terminal replay (#12991) 2026-02-10 10:15:19 -06:00
Adam
6f5dfe125a fix(app): use agent configured variant (#12993) 2026-02-10 10:15:09 -06:00
Dax
27fa9dc843 refactor: clean up dialog-model.tsx per code review (#12983) 2026-02-10 15:13:37 +00:00
Adam
1e03a55acd fix(app): persist defensiveness (#12973) 2026-02-10 07:47:05 -06:00
Filip
65c9669283 test(e2e): redo & undo test (#12974) 2026-02-10 07:46:48 -06:00
opencode-agent[bot]
18b6257119 chore: generate 2026-02-10 13:39:21 +00:00
Adam
c607c01fb9 chore: fix e2e tests 2026-02-10 07:38:13 -06:00
Adam
4c4e30cd71 fix(docs): locale translations 2026-02-10 07:11:19 -06:00
Adam
19ad7ad809 chore: fix test 2026-02-10 07:06:20 -06:00
382 changed files with 4440 additions and 4196 deletions

View File

@@ -1,2 +1,3 @@
[test]
root = "./src"
preload = ["./happydom.ts"]

View File

@@ -0,0 +1,126 @@
import type { Page } from "@playwright/test"
import { test, expect } from "../fixtures"
import { withSession } from "../actions"
import { createSdk, modKey } from "../utils"
import { promptSelector } from "../selectors"
async function seedConversation(input: {
page: Page
sdk: ReturnType<typeof createSdk>
sessionID: string
token: string
}) {
const prompt = input.page.locator(promptSelector)
await expect(prompt).toBeVisible()
await prompt.click()
await input.page.keyboard.type(`Reply with exactly: ${input.token}`)
await input.page.keyboard.press("Enter")
let userMessageID: string | undefined
await expect
.poll(
async () => {
const messages = await input.sdk.session
.messages({ sessionID: input.sessionID, limit: 50 })
.then((r) => r.data ?? [])
const users = messages.filter((m) => m.info.role === "user")
if (users.length === 0) return false
const user = users.reduce((acc, item) => (item.info.id > acc.info.id ? item : acc))
userMessageID = user.info.id
const assistantText = messages
.filter((m) => m.info.role === "assistant")
.flatMap((m) => m.parts)
.filter((p) => p.type === "text")
.map((p) => p.text)
.join("\n")
return assistantText.includes(input.token)
},
{ timeout: 90_000 },
)
.toBe(true)
if (!userMessageID) throw new Error("Expected a user message id")
return { prompt, userMessageID }
}
test("slash undo sets revert and restores prior prompt", async ({ page, withProject }) => {
test.setTimeout(120_000)
const token = `undo_${Date.now()}`
await withProject(async (project) => {
const sdk = createSdk(project.directory)
await withSession(sdk, `e2e undo ${Date.now()}`, async (session) => {
await project.gotoSession(session.id)
const seeded = await seedConversation({ page, sdk, sessionID: session.id, token })
await seeded.prompt.click()
await page.keyboard.type("/undo")
const undo = page.locator('[data-slash-id="session.undo"]').first()
await expect(undo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBe(seeded.userMessageID)
await expect(seeded.prompt).toContainText(token)
await expect(page.locator(`[data-message-id="${seeded.userMessageID}"]`)).toHaveCount(0)
})
})
})
test("slash redo clears revert and restores latest state", async ({ page, withProject }) => {
test.setTimeout(120_000)
const token = `redo_${Date.now()}`
await withProject(async (project) => {
const sdk = createSdk(project.directory)
await withSession(sdk, `e2e redo ${Date.now()}`, async (session) => {
await project.gotoSession(session.id)
const seeded = await seedConversation({ page, sdk, sessionID: session.id, token })
await seeded.prompt.click()
await page.keyboard.type("/undo")
const undo = page.locator('[data-slash-id="session.undo"]').first()
await expect(undo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBe(seeded.userMessageID)
await seeded.prompt.click()
await page.keyboard.press(`${modKey}+A`)
await page.keyboard.press("Backspace")
await page.keyboard.type("/redo")
const redo = page.locator('[data-slash-id="session.redo"]').first()
await expect(redo).toBeVisible()
await page.keyboard.press("Enter")
await expect
.poll(async () => await sdk.session.get({ sessionID: session.id }).then((r) => r.data?.revert?.messageID), {
timeout: 30_000,
})
.toBeUndefined()
await expect(seeded.prompt).not.toContainText(token)
await expect(page.locator(`[data-message-id="${seeded.userMessageID}"]`).first()).toBeVisible()
})
})
})

View File

@@ -89,7 +89,6 @@ let runner: ReturnType<typeof Bun.spawn> | undefined
let server: { stop: () => Promise<void> | void } | undefined
let inst: { Instance: { disposeAll: () => Promise<void> | void } } | undefined
let cleaned = false
let internalError = false
const cleanup = async () => {
if (cleaned) return
@@ -115,9 +114,8 @@ const shutdown = (code: number, reason: string) => {
}
const reportInternalError = (reason: string, error: unknown) => {
internalError = true
console.error(`e2e-local internal error: ${reason}`)
console.error(error)
console.warn(`e2e-local ignored server error: ${reason}`)
console.warn(error)
}
process.once("SIGINT", () => shutdown(130, "SIGINT"))
@@ -177,6 +175,4 @@ try {
await cleanup()
}
if (code === 0 && internalError) code = 1
process.exit(code)

View File

@@ -6,6 +6,7 @@ let dirsToExpand: typeof import("./file-tree").dirsToExpand
beforeAll(async () => {
mock.module("@solidjs/router", () => ({
useNavigate: () => () => undefined,
useParams: () => ({}),
}))
mock.module("@/context/file", () => ({

View File

@@ -1,4 +1,5 @@
import { useFile } from "@/context/file"
import { encodeFilePath } from "@/context/file/path"
import { Collapsible } from "@opencode-ai/ui/collapsible"
import { FileIcon } from "@opencode-ai/ui/file-icon"
import { Icon } from "@opencode-ai/ui/icon"
@@ -20,11 +21,7 @@ import { Dynamic } from "solid-js/web"
import type { FileNode } from "@opencode-ai/sdk/v2"
function pathToFileUrl(filepath: string): string {
const encodedPath = filepath
.split("/")
.map((segment) => encodeURIComponent(segment))
.join("/")
return `file://${encodedPath}`
return `file://${encodeFilePath(filepath)}`
}
type Kind = "add" | "del" | "mix"
@@ -223,12 +220,14 @@ export default function FileTree(props: {
seen.add(item)
}
return out.toSorted((a, b) => {
out.sort((a, b) => {
if (a.type !== b.type) {
return a.type === "directory" ? -1 : 1
}
return a.name.localeCompare(b.name)
})
return out
})
const Node = (

View File

@@ -112,7 +112,7 @@ describe("buildRequestParts", () => {
// Special chars should be encoded
expect(filePart.url).toContain("file%23name.txt")
// Should have Windows drive letter properly encoded
expect(filePart.url).toMatch(/file:\/\/\/[A-Z]%3A/)
expect(filePart.url).toMatch(/file:\/\/\/[A-Z]:/)
}
})
@@ -210,7 +210,7 @@ describe("buildRequestParts", () => {
if (filePart?.type === "file") {
// Should handle absolute path that differs from sessionDirectory
expect(() => new URL(filePart.url)).not.toThrow()
expect(filePart.url).toContain("/D%3A/other/project/file.ts")
expect(filePart.url).toContain("/D:/other/project/file.ts")
}
})

View File

@@ -1,6 +1,7 @@
import { getFilename } from "@opencode-ai/util/path"
import { type AgentPartInput, type FilePartInput, type Part, type TextPartInput } from "@opencode-ai/sdk/v2/client"
import type { FileSelection } from "@/context/file"
import { encodeFilePath } from "@/context/file/path"
import type { AgentPart, FileAttachmentPart, ImageAttachmentPart, Prompt } from "@/context/prompt"
import { Identifier } from "@/utils/id"
@@ -27,23 +28,11 @@ type BuildRequestPartsInput = {
sessionDirectory: string
}
const absolute = (directory: string, path: string) =>
path.startsWith("/") ? path : (directory + "/" + path).replace("//", "/")
const encodeFilePath = (filepath: string): string => {
// Normalize Windows paths: convert backslashes to forward slashes
let normalized = filepath.replace(/\\/g, "/")
// Handle Windows absolute paths (D:/path -> /D:/path for proper file:// URLs)
if (/^[A-Za-z]:/.test(normalized)) {
normalized = "/" + normalized
}
// Encode each path segment (preserving forward slashes as path separators)
return normalized
.split("/")
.map((segment) => encodeURIComponent(segment))
.join("/")
const absolute = (directory: string, path: string) => {
if (path.startsWith("/")) return path
if (/^[A-Za-z]:[\\/]/.test(path) || /^[A-Za-z]:$/.test(path)) return path
if (path.startsWith("\\\\") || path.startsWith("//")) return path
return `${directory.replace(/[\\/]+$/, "")}/${path}`
}
const fileQuery = (selection: FileSelection | undefined) =>

View File

@@ -74,7 +74,9 @@ export const Terminal = (props: TerminalProps) => {
let handleTextareaBlur: () => void
let disposed = false
const cleanups: VoidFunction[] = []
let tail = local.pty.tail ?? ""
const start =
typeof local.pty.cursor === "number" && Number.isSafeInteger(local.pty.cursor) ? local.pty.cursor : undefined
let cursor = start ?? 0
const cleanup = () => {
if (!cleanups.length) return
@@ -164,13 +166,16 @@ export const Terminal = (props: TerminalProps) => {
const once = { value: false }
const url = new URL(sdk.url + `/pty/${local.pty.id}/connect?directory=${encodeURIComponent(sdk.directory)}`)
const url = new URL(sdk.url + `/pty/${local.pty.id}/connect`)
url.searchParams.set("directory", sdk.directory)
url.searchParams.set("cursor", String(start !== undefined ? start : local.pty.buffer ? -1 : 0))
url.protocol = url.protocol === "https:" ? "wss:" : "ws:"
if (window.__OPENCODE__?.serverPassword) {
url.username = "opencode"
url.password = window.__OPENCODE__?.serverPassword
}
const socket = new WebSocket(url)
socket.binaryType = "arraybuffer"
cleanups.push(() => {
if (socket.readyState !== WebSocket.CLOSED && socket.readyState !== WebSocket.CLOSING) socket.close()
})
@@ -185,7 +190,7 @@ export const Terminal = (props: TerminalProps) => {
cursorStyle: "bar",
fontSize: 14,
fontFamily: monoFontFamily(settings.appearance.font()),
allowTransparency: true,
allowTransparency: false,
convertEol: true,
theme: terminalColors(),
scrollback: 10_000,
@@ -289,26 +294,6 @@ export const Terminal = (props: TerminalProps) => {
handleResize = () => fit.fit()
window.addEventListener("resize", handleResize)
cleanups.push(() => window.removeEventListener("resize", handleResize))
const limit = 16_384
const min = 32
const windowMs = 750
const seed = tail.length > limit ? tail.slice(-limit) : tail
let sync = seed.length >= min
let syncUntil = 0
const stopSync = () => {
sync = false
syncUntil = 0
}
const overlap = (data: string) => {
if (!seed) return 0
const max = Math.min(seed.length, data.length)
if (max < min) return 0
for (let i = max; i >= min; i--) {
if (seed.slice(-i) === data.slice(0, i)) return i
}
return 0
}
const onResize = t.onResize(async (size) => {
if (socket.readyState === WebSocket.OPEN) {
@@ -325,7 +310,6 @@ export const Terminal = (props: TerminalProps) => {
})
cleanups.push(() => disposeIfDisposable(onResize))
const onData = t.onData((data) => {
if (data) stopSync()
if (socket.readyState === WebSocket.OPEN) {
socket.send(data)
}
@@ -343,7 +327,6 @@ export const Terminal = (props: TerminalProps) => {
const handleOpen = () => {
local.onConnect?.()
if (sync) syncUntil = Date.now() + windowMs
sdk.client.pty
.update({
ptyID: local.pty.id,
@@ -357,31 +340,31 @@ export const Terminal = (props: TerminalProps) => {
socket.addEventListener("open", handleOpen)
cleanups.push(() => socket.removeEventListener("open", handleOpen))
const decoder = new TextDecoder()
const handleMessage = (event: MessageEvent) => {
if (disposed) return
if (event.data instanceof ArrayBuffer) {
// WebSocket control frame: 0x00 + UTF-8 JSON (currently { cursor }).
const bytes = new Uint8Array(event.data)
if (bytes[0] !== 0) return
const json = decoder.decode(bytes.subarray(1))
try {
const meta = JSON.parse(json) as { cursor?: unknown }
const next = meta?.cursor
if (typeof next === "number" && Number.isSafeInteger(next) && next >= 0) {
cursor = next
}
} catch {
// ignore
}
return
}
const data = typeof event.data === "string" ? event.data : ""
if (!data) return
const next = (() => {
if (!sync) return data
if (syncUntil && Date.now() > syncUntil) {
stopSync()
return data
}
const n = overlap(data)
if (!n) {
stopSync()
return data
}
const trimmed = data.slice(n)
if (trimmed) stopSync()
return trimmed
})()
if (!next) return
t.write(next)
tail = next.length >= limit ? next.slice(-limit) : (tail + next).slice(-limit)
t.write(data)
cursor += data.length
}
socket.addEventListener("message", handleMessage)
cleanups.push(() => socket.removeEventListener("message", handleMessage))
@@ -435,7 +418,7 @@ export const Terminal = (props: TerminalProps) => {
props.onCleanup({
...local.pty,
buffer,
tail,
cursor,
rows: t.rows,
cols: t.cols,
scrollY: t.getViewportY(),

View File

@@ -6,6 +6,7 @@ let createCommentSessionForTest: typeof import("./comments").createCommentSessio
beforeAll(async () => {
mock.module("@solidjs/router", () => ({
useNavigate: () => () => undefined,
useParams: () => ({}),
}))
mock.module("@opencode-ai/ui/context", () => ({

View File

@@ -108,7 +108,7 @@ describe("encodeFilePath", () => {
const url = new URL(fileUrl)
expect(url.protocol).toBe("file:")
expect(url.pathname).toContain("README.bs.md")
expect(result).toBe("/D%3A/dev/projects/opencode/README.bs.md")
expect(result).toBe("/D:/dev/projects/opencode/README.bs.md")
})
test("should handle mixed separator path (Windows + Unix)", () => {
@@ -118,7 +118,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/D%3A/dev/projects/opencode/README.bs.md")
expect(result).toBe("/D:/dev/projects/opencode/README.bs.md")
})
test("should handle Windows path with spaces", () => {
@@ -146,7 +146,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/C%3A/")
expect(result).toBe("/C:/")
})
test("should handle Windows relative path with backslashes", () => {
@@ -177,7 +177,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/c%3A/users/test/file.txt")
expect(result).toBe("/c:/users/test/file.txt")
})
})
@@ -193,7 +193,7 @@ describe("encodeFilePath", () => {
const result = encodeFilePath(windowsPath)
// Should convert to forward slashes and add leading /
expect(result).not.toContain("\\")
expect(result).toMatch(/^\/[A-Za-z]%3A\//)
expect(result).toMatch(/^\/[A-Za-z]:\//)
})
test("should handle relative paths the same on all platforms", () => {
@@ -237,7 +237,7 @@ describe("encodeFilePath", () => {
const result = encodeFilePath(alreadyNormalized)
// Should not add another leading slash
expect(result).toBe("/D%3A/path/file.txt")
expect(result).toBe("/D:/path/file.txt")
expect(result).not.toContain("//D")
})
@@ -246,7 +246,7 @@ describe("encodeFilePath", () => {
const result = encodeFilePath(justDrive)
const fileUrl = `file://${result}`
expect(result).toBe("/D%3A")
expect(result).toBe("/D:")
expect(() => new URL(fileUrl)).not.toThrow()
})
@@ -256,7 +256,7 @@ describe("encodeFilePath", () => {
const fileUrl = `file://${result}`
expect(() => new URL(fileUrl)).not.toThrow()
expect(result).toBe("/C%3A/Users/test/")
expect(result).toBe("/C:/Users/test/")
})
test("should handle very long paths", () => {

View File

@@ -90,9 +90,14 @@ export function encodeFilePath(filepath: string): string {
}
// Encode each path segment (preserving forward slashes as path separators)
// Keep the colon in Windows drive letters (`/C:/...`) so downstream file URL parsers
// can reliably detect drives.
return normalized
.split("/")
.map((segment) => encodeURIComponent(segment))
.map((segment, index) => {
if (index === 1 && /^[A-Za-z]:$/.test(segment)) return segment
return encodeURIComponent(segment)
})
.join("/")
}

View File

@@ -6,6 +6,7 @@ import { useSync } from "./sync"
import { base64Encode } from "@opencode-ai/util/encode"
import { useProviders } from "@/hooks/use-providers"
import { useModels } from "@/context/models"
import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant"
export type ModelKey = { providerID: string; modelID: string }
@@ -184,11 +185,27 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
models.setVisibility(model, visible)
},
variant: {
current() {
configured() {
const a = agent.current()
const m = current()
if (!a || !m) return undefined
return getConfiguredAgentVariant({
agent: { model: a.model, variant: a.variant },
model: { providerID: m.provider.id, modelID: m.id, variants: m.variants },
})
},
selected() {
const m = current()
if (!m) return undefined
return models.variant.get({ providerID: m.provider.id, modelID: m.id })
},
current() {
return resolveModelVariant({
variants: this.list(),
selected: this.selected(),
configured: this.configured(),
})
},
list() {
const m = current()
if (!m) return []
@@ -203,17 +220,13 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
cycle() {
const variants = this.list()
if (variants.length === 0) return
const currentVariant = this.current()
if (!currentVariant) {
this.set(variants[0])
return
}
const index = variants.indexOf(currentVariant)
if (index === -1 || index === variants.length - 1) {
this.set(undefined)
return
}
this.set(variants[index + 1])
this.set(
cycleModelVariant({
variants,
selected: this.selected(),
configured: this.configured(),
}),
)
},
},
}

View File

@@ -0,0 +1,66 @@
import { describe, expect, test } from "bun:test"
import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant"
describe("model variant", () => {
test("resolves configured agent variant when model matches", () => {
const value = getConfiguredAgentVariant({
agent: {
model: { providerID: "openai", modelID: "gpt-5.2" },
variant: "xhigh",
},
model: {
providerID: "openai",
modelID: "gpt-5.2",
variants: { low: {}, high: {}, xhigh: {} },
},
})
expect(value).toBe("xhigh")
})
test("ignores configured variant when model does not match", () => {
const value = getConfiguredAgentVariant({
agent: {
model: { providerID: "openai", modelID: "gpt-5.2" },
variant: "xhigh",
},
model: {
providerID: "anthropic",
modelID: "claude-sonnet-4",
variants: { low: {}, high: {}, xhigh: {} },
},
})
expect(value).toBeUndefined()
})
test("prefers selected variant over configured variant", () => {
const value = resolveModelVariant({
variants: ["low", "high", "xhigh"],
selected: "high",
configured: "xhigh",
})
expect(value).toBe("high")
})
test("cycles from configured variant to next", () => {
const value = cycleModelVariant({
variants: ["low", "high", "xhigh"],
selected: undefined,
configured: "high",
})
expect(value).toBe("xhigh")
})
test("wraps from configured last variant to first", () => {
const value = cycleModelVariant({
variants: ["low", "high", "xhigh"],
selected: undefined,
configured: "xhigh",
})
expect(value).toBe("low")
})
})

View File

@@ -0,0 +1,50 @@
type AgentModel = {
providerID: string
modelID: string
}
type Agent = {
model?: AgentModel
variant?: string
}
type Model = AgentModel & {
variants?: Record<string, unknown>
}
type VariantInput = {
variants: string[]
selected: string | undefined
configured: string | undefined
}
export function getConfiguredAgentVariant(input: { agent: Agent | undefined; model: Model | undefined }) {
if (!input.agent?.variant) return undefined
if (!input.agent.model) return undefined
if (!input.model?.variants) return undefined
if (input.agent.model.providerID !== input.model.providerID) return undefined
if (input.agent.model.modelID !== input.model.modelID) return undefined
if (!(input.agent.variant in input.model.variants)) return undefined
return input.agent.variant
}
export function resolveModelVariant(input: VariantInput) {
if (input.selected && input.variants.includes(input.selected)) return input.selected
if (input.configured && input.variants.includes(input.configured)) return input.configured
return undefined
}
export function cycleModelVariant(input: VariantInput) {
if (input.variants.length === 0) return undefined
if (input.selected && input.variants.includes(input.selected)) {
const index = input.variants.indexOf(input.selected)
if (index === input.variants.length - 1) return undefined
return input.variants[index + 1]
}
if (input.configured && input.variants.includes(input.configured)) {
const index = input.variants.indexOf(input.configured)
if (index === input.variants.length - 1) return input.variants[0]
return input.variants[index + 1]
}
return input.variants[0]
}

View File

@@ -5,6 +5,7 @@ let getLegacyTerminalStorageKeys: (dir: string, legacySessionID?: string) => str
beforeAll(async () => {
mock.module("@solidjs/router", () => ({
useNavigate: () => () => undefined,
useParams: () => ({}),
}))
mock.module("@opencode-ai/ui/context", () => ({

View File

@@ -13,7 +13,7 @@ export type LocalPTY = {
cols?: number
buffer?: string
scrollY?: number
tail?: string
cursor?: number
}
const WORKSPACE_KEY = "__workspace__"

View File

@@ -25,7 +25,8 @@ export default function Home() {
const homedir = createMemo(() => sync.data.path.home)
const recent = createMemo(() => {
return sync.data.project
.toSorted((a, b) => (b.time.updated ?? b.time.created) - (a.time.updated ?? a.time.created))
.slice()
.sort((a, b) => (b.time.updated ?? b.time.created) - (a.time.updated ?? a.time.created))
.slice(0, 5)
})

View File

@@ -1938,7 +1938,7 @@ export default function Layout(props: ParentProps) {
direction="horizontal"
size={layout.sidebar.width()}
min={244}
max={window.innerWidth * 0.3 + 64}
max={typeof window === "undefined" ? 1000 : window.innerWidth * 0.3 + 64}
collapseThreshold={244}
onResize={layout.sidebar.resize}
onCollapse={layout.sidebar.close}

View File

@@ -26,7 +26,7 @@ export const isRootVisibleSession = (session: Session, directory: string) =>
workspaceKey(session.directory) === workspaceKey(directory) && !session.parentID && !session.time?.archived
export const sortedRootSessions = (store: { session: Session[]; path: { directory: string } }, now: number) =>
store.session.filter((session) => isRootVisibleSession(session, store.path.directory)).toSorted(sortSessions(now))
store.session.filter((session) => isRootVisibleSession(session, store.path.directory)).sort(sortSessions(now))
export const childMapByParent = (sessions: Session[]) => {
const map = new Map<string, string[]>()

View File

@@ -118,7 +118,7 @@ export const SortableWorkspace = (props: {
const touch = createMediaQuery("(hover: none)")
const showNew = createMemo(() => !loading() && (touch() || sessions().length === 0 || (active() && !params.id)))
const loadMore = async () => {
setWorkspaceStore("limit", (limit) => limit + 5)
setWorkspaceStore("limit", (limit) => (limit ?? 0) + 5)
await globalSync.project.loadSessions(props.directory)
}
@@ -368,7 +368,7 @@ export const LocalWorkspace = (props: {
const loading = createMemo(() => !booted() && sessions().length === 0)
const hasMore = createMemo(() => workspace().store.sessionTotal > sessions().length)
const loadMore = async () => {
workspace().setStore("limit", (limit) => limit + 5)
workspace().setStore("limit", (limit) => (limit ?? 0) + 5)
await globalSync.project.loadSessions(props.project.worktree)
}

View File

@@ -1683,7 +1683,7 @@ export default function Page() {
direction="horizontal"
size={layout.session.width()}
min={450}
max={window.innerWidth * 0.45}
max={typeof window === "undefined" ? 1000 : window.innerWidth * 0.45}
onResize={layout.session.resize}
/>
</Show>

View File

@@ -228,6 +228,7 @@ export const createScrollSpy = (input: Input) => {
node.delete(key)
visible.delete(key)
dirty = true
schedule()
}
const markDirty = () => {

View File

@@ -41,7 +41,7 @@ export function TerminalPanel(props: {
direction="vertical"
size={props.height}
min={100}
max={window.innerHeight * 0.6}
max={typeof window === "undefined" ? 1000 : window.innerHeight * 0.6}
collapseThreshold={50}
onResize={props.resize}
onCollapse={props.close}

View File

@@ -365,48 +365,81 @@ export const useSessionCommands = (input: {
return [
{
id: "session.share",
title: input.info()?.share?.url ? "Copy share link" : input.language.t("command.session.share"),
title: input.info()?.share?.url
? input.language.t("session.share.copy.copyLink")
: input.language.t("command.session.share"),
description: input.info()?.share?.url
? "Copy share URL to clipboard"
? input.language.t("toast.session.share.success.description")
: input.language.t("command.session.share.description"),
category: input.language.t("command.category.session"),
slash: "share",
disabled: !input.params.id,
onSelect: async () => {
if (!input.params.id) return
const copy = (url: string, existing: boolean) =>
navigator.clipboard
.writeText(url)
.then(() =>
showToast({
title: existing
? input.language.t("session.share.copy.copied")
: input.language.t("toast.session.share.success.title"),
description: input.language.t("toast.session.share.success.description"),
variant: "success",
}),
)
.catch(() =>
showToast({
title: input.language.t("toast.session.share.copyFailed.title"),
variant: "error",
}),
)
const url = input.info()?.share?.url
if (url) {
await copy(url, true)
const write = (value: string) => {
const body = typeof document === "undefined" ? undefined : document.body
if (body) {
const textarea = document.createElement("textarea")
textarea.value = value
textarea.setAttribute("readonly", "")
textarea.style.position = "fixed"
textarea.style.opacity = "0"
textarea.style.pointerEvents = "none"
body.appendChild(textarea)
textarea.select()
const copied = document.execCommand("copy")
body.removeChild(textarea)
if (copied) return Promise.resolve(true)
}
const clipboard = typeof navigator === "undefined" ? undefined : navigator.clipboard
if (!clipboard?.writeText) return Promise.resolve(false)
return clipboard.writeText(value).then(
() => true,
() => false,
)
}
const copy = async (url: string, existing: boolean) => {
const ok = await write(url)
if (!ok) {
showToast({
title: input.language.t("toast.session.share.copyFailed.title"),
variant: "error",
})
return
}
showToast({
title: existing
? input.language.t("session.share.copy.copied")
: input.language.t("toast.session.share.success.title"),
description: input.language.t("toast.session.share.success.description"),
variant: "success",
})
}
const existing = input.info()?.share?.url
if (existing) {
await copy(existing, true)
return
}
await input.sdk.client.session
const url = await input.sdk.client.session
.share({ sessionID: input.params.id })
.then((res) => copy(res.data!.share!.url, false))
.catch(() =>
showToast({
title: input.language.t("toast.session.share.failed.title"),
description: input.language.t("toast.session.share.failed.description"),
variant: "error",
}),
)
.then((res) => res.data?.share?.url)
.catch(() => undefined)
if (!url) {
showToast({
title: input.language.t("toast.session.share.failed.title"),
description: input.language.t("toast.session.share.failed.description"),
variant: "error",
})
return
}
await copy(url, false)
},
},
{

View File

@@ -99,4 +99,9 @@ describe("persist localStorage resilience", () => {
expect(storage.getItem("direct-value")).toBe('{"value":5}')
})
test("normalizer rejects malformed JSON payloads", () => {
const result = persistTesting.normalize({ value: "ok" }, '{"value":"\\x"}')
expect(result).toBeUndefined()
})
})

View File

@@ -195,6 +195,14 @@ function parse(value: string) {
}
}
function normalize(defaults: unknown, raw: string, migrate?: (value: unknown) => unknown) {
const parsed = parse(raw)
if (parsed === undefined) return
const migrated = migrate ? migrate(parsed) : parsed
const merged = merge(defaults, migrated)
return JSON.stringify(merged)
}
function workspaceStorage(dir: string) {
const head = dir.slice(0, 12) || "workspace"
const sum = checksum(dir) ?? "0"
@@ -291,6 +299,7 @@ function localStorageDirect(): SyncStorage {
export const PersistTesting = {
localStorageDirect,
localStorageWithPrefix,
normalize,
}
export const Persist = {
@@ -358,12 +367,11 @@ export function persisted<T>(
getItem: (key) => {
const raw = current.getItem(key)
if (raw !== null) {
const parsed = parse(raw)
if (parsed === undefined) return raw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
const next = normalize(defaults, raw, config.migrate)
if (next === undefined) {
current.removeItem(key)
return null
}
if (raw !== next) current.setItem(key, next)
return next
}
@@ -372,16 +380,13 @@ export function persisted<T>(
const legacyRaw = legacyStore.getItem(legacyKey)
if (legacyRaw === null) continue
current.setItem(key, legacyRaw)
const next = normalize(defaults, legacyRaw, config.migrate)
if (next === undefined) {
legacyStore.removeItem(legacyKey)
continue
}
current.setItem(key, next)
legacyStore.removeItem(legacyKey)
const parsed = parse(legacyRaw)
if (parsed === undefined) return legacyRaw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
if (legacyRaw !== next) current.setItem(key, next)
return next
}
@@ -405,12 +410,11 @@ export function persisted<T>(
getItem: async (key) => {
const raw = await current.getItem(key)
if (raw !== null) {
const parsed = parse(raw)
if (parsed === undefined) return raw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
const next = normalize(defaults, raw, config.migrate)
if (next === undefined) {
await current.removeItem(key).catch(() => undefined)
return null
}
if (raw !== next) await current.setItem(key, next)
return next
}
@@ -421,16 +425,13 @@ export function persisted<T>(
const legacyRaw = await legacyStore.getItem(legacyKey)
if (legacyRaw === null) continue
await current.setItem(key, legacyRaw)
const next = normalize(defaults, legacyRaw, config.migrate)
if (next === undefined) {
await legacyStore.removeItem(legacyKey).catch(() => undefined)
continue
}
await current.setItem(key, next)
await legacyStore.removeItem(legacyKey)
const parsed = parse(legacyRaw)
if (parsed === undefined) return legacyRaw
const migrated = config.migrate ? config.migrate(parsed) : parsed
const merged = merge(defaults, migrated)
const next = JSON.stringify(merged)
if (legacyRaw !== next) await current.setItem(key, next)
return next
}

View File

@@ -116,6 +116,15 @@ function parseRecord(value: unknown) {
return value as Record<string, unknown>
}
function parseStored(value: unknown) {
if (typeof value !== "string") return value
try {
return JSON.parse(value) as unknown
} catch {
return value
}
}
function pickLocale(value: unknown): Locale | null {
const direct = parseLocale(value)
if (direct) return direct
@@ -169,7 +178,7 @@ export function initI18n(): Promise<Locale> {
if (!store) return state.locale
const raw = await store.get("language").catch(() => null)
const value = typeof raw === "string" ? JSON.parse(raw) : raw
const value = parseStored(raw)
const next = pickLocale(value) ?? state.locale
state.locale = next

View File

@@ -2,7 +2,7 @@ import { createMemo, createSignal } from "solid-js"
import { useLocal } from "@tui/context/local"
import { useSync } from "@tui/context/sync"
import { map, pipe, flatMap, entries, filter, sortBy, take } from "remeda"
import { DialogSelect, type DialogSelectRef } from "@tui/ui/dialog-select"
import { DialogSelect } from "@tui/ui/dialog-select"
import { useDialog } from "@tui/ui/dialog"
import { createDialogProviderOptions, DialogProvider } from "./dialog-provider"
import { useKeybind } from "../context/keybind"
@@ -20,96 +20,51 @@ export function DialogModel(props: { providerID?: string }) {
const sync = useSync()
const dialog = useDialog()
const keybind = useKeybind()
const [ref, setRef] = createSignal<DialogSelectRef<unknown>>()
const [query, setQuery] = createSignal("")
const connected = useConnected()
const providers = createDialogProviderOptions()
const showExtra = createMemo(() => {
if (!connected()) return false
if (props.providerID) return false
return true
})
const showExtra = createMemo(() => connected() && !props.providerID)
const options = createMemo(() => {
const q = query()
const needle = q.trim()
const needle = query().trim()
const showSections = showExtra() && needle.length === 0
const favorites = connected() ? local.model.favorite() : []
const recents = local.model.recent()
const recentList = showSections
? recents.filter(
(item) => !favorites.some((fav) => fav.providerID === item.providerID && fav.modelID === item.modelID),
)
: []
const favoriteOptions = showSections
? favorites.flatMap((item) => {
const provider = sync.data.provider.find((x) => x.id === item.providerID)
if (!provider) return []
const model = provider.models[item.modelID]
if (!model) return []
return [
{
key: item,
value: {
providerID: provider.id,
modelID: model.id,
},
title: model.name ?? item.modelID,
description: provider.name,
category: "Favorites",
disabled: provider.id === "opencode" && model.id.includes("-nano"),
footer: model.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
onSelect: () => {
dialog.clear()
local.model.set(
{
providerID: provider.id,
modelID: model.id,
},
{ recent: true },
)
},
function toOptions(items: typeof favorites, category: string) {
if (!showSections) return []
return items.flatMap((item) => {
const provider = sync.data.provider.find((x) => x.id === item.providerID)
if (!provider) return []
const model = provider.models[item.modelID]
if (!model) return []
return [
{
key: item,
value: { providerID: provider.id, modelID: model.id },
title: model.name ?? item.modelID,
description: provider.name,
category,
disabled: provider.id === "opencode" && model.id.includes("-nano"),
footer: model.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
onSelect: () => {
dialog.clear()
local.model.set({ providerID: provider.id, modelID: model.id }, { recent: true })
},
]
})
: []
},
]
})
}
const recentOptions = showSections
? recentList.flatMap((item) => {
const provider = sync.data.provider.find((x) => x.id === item.providerID)
if (!provider) return []
const model = provider.models[item.modelID]
if (!model) return []
return [
{
key: item,
value: {
providerID: provider.id,
modelID: model.id,
},
title: model.name ?? item.modelID,
description: provider.name,
category: "Recent",
disabled: provider.id === "opencode" && model.id.includes("-nano"),
footer: model.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
onSelect: () => {
dialog.clear()
local.model.set(
{
providerID: provider.id,
modelID: model.id,
},
{ recent: true },
)
},
},
]
})
: []
const favoriteOptions = toOptions(favorites, "Favorites")
const recentOptions = toOptions(
recents.filter(
(item) => !favorites.some((fav) => fav.providerID === item.providerID && fav.modelID === item.modelID),
),
"Recent",
)
const providerOptions = pipe(
sync.data.provider,
@@ -123,45 +78,26 @@ export function DialogModel(props: { providerID?: string }) {
entries(),
filter(([_, info]) => info.status !== "deprecated"),
filter(([_, info]) => (props.providerID ? info.providerID === props.providerID : true)),
map(([model, info]) => {
const value = {
providerID: provider.id,
modelID: model,
}
return {
value,
title: info.name ?? model,
description: favorites.some(
(item) => item.providerID === value.providerID && item.modelID === value.modelID,
)
? "(Favorite)"
: undefined,
category: connected() ? provider.name : undefined,
disabled: provider.id === "opencode" && model.includes("-nano"),
footer: info.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
onSelect() {
dialog.clear()
local.model.set(
{
providerID: provider.id,
modelID: model,
},
{ recent: true },
)
},
}
}),
map(([model, info]) => ({
value: { providerID: provider.id, modelID: model },
title: info.name ?? model,
description: favorites.some((item) => item.providerID === provider.id && item.modelID === model)
? "(Favorite)"
: undefined,
category: connected() ? provider.name : undefined,
disabled: provider.id === "opencode" && model.includes("-nano"),
footer: info.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined,
onSelect() {
dialog.clear()
local.model.set({ providerID: provider.id, modelID: model }, { recent: true })
},
})),
filter((x) => {
if (!showSections) return true
const value = x.value
const inFavorites = favorites.some(
(item) => item.providerID === value.providerID && item.modelID === value.modelID,
)
if (inFavorites) return false
const inRecents = recents.some(
(item) => item.providerID === value.providerID && item.modelID === value.modelID,
)
if (inRecents) return false
if (favorites.some((item) => item.providerID === x.value.providerID && item.modelID === x.value.modelID))
return false
if (recents.some((item) => item.providerID === x.value.providerID && item.modelID === x.value.modelID))
return false
return true
}),
sortBy(
@@ -175,21 +111,19 @@ export function DialogModel(props: { providerID?: string }) {
const popularProviders = !connected()
? pipe(
providers(),
map((option) => {
return {
...option,
category: "Popular providers",
}
}),
map((option) => ({
...option,
category: "Popular providers",
})),
take(6),
)
: []
// Search shows a single merged list (favorites inline)
if (needle) {
const filteredProviders = fuzzysort.go(needle, providerOptions, { keys: ["title", "category"] }).map((x) => x.obj)
const filteredPopular = fuzzysort.go(needle, popularProviders, { keys: ["title"] }).map((x) => x.obj)
return [...filteredProviders, ...filteredPopular]
return [
...fuzzysort.go(needle, providerOptions, { keys: ["title", "category"] }).map((x) => x.obj),
...fuzzysort.go(needle, popularProviders, { keys: ["title"] }).map((x) => x.obj),
]
}
return [...favoriteOptions, ...recentOptions, ...providerOptions, ...popularProviders]
@@ -199,13 +133,11 @@ export function DialogModel(props: { providerID?: string }) {
props.providerID ? sync.data.provider.find((x) => x.id === props.providerID) : null,
)
const title = createMemo(() => {
if (provider()) return provider()!.name
return "Select model"
})
const title = createMemo(() => provider()?.name ?? "Select model")
return (
<DialogSelect
<DialogSelect<ReturnType<typeof options>[number]["value"]>
options={options()}
keybind={[
{
keybind: keybind.all.model_provider_list?.[0],
@@ -223,12 +155,11 @@ export function DialogModel(props: { providerID?: string }) {
},
},
]}
ref={setRef}
onFilter={setQuery}
flat={true}
skipFilter={true}
title={title()}
current={local.model.current()}
options={options()}
/>
)
}

View File

@@ -15,6 +15,7 @@ export interface DialogSelectProps<T> {
title: string
placeholder?: string
options: DialogSelectOption<T>[]
flat?: boolean
ref?: (ref: DialogSelectRef<T>) => void
onMove?: (option: DialogSelectOption<T>) => void
onFilter?: (query: string) => void
@@ -100,7 +101,10 @@ export function DialogSelect<T>(props: DialogSelectProps<T>) {
setStore("input", "keyboard")
})
const grouped = createMemo(() => {
const flatten = createMemo(() => props.flat && store.filter.length > 0)
const grouped = createMemo<[string, DialogSelectOption<T>[]][]>(() => {
if (flatten()) return [["", filtered()]]
const result = pipe(
filtered(),
groupBy((x) => x.category ?? ""),
@@ -117,10 +121,16 @@ export function DialogSelect<T>(props: DialogSelectProps<T>) {
)
})
const rows = createMemo(() => {
const headers = grouped().reduce((acc, [category], i) => {
if (!category) return acc
return acc + (i > 0 ? 2 : 1)
}, 0)
return flat().length + headers
})
const dimensions = useTerminalDimensions()
const height = createMemo(() =>
Math.min(flat().length + grouped().length * 2 - 1, Math.floor(dimensions().height / 2) - 6),
)
const height = createMemo(() => Math.min(rows(), Math.floor(dimensions().height / 2) - 6))
const selected = createMemo(() => flat()[store.selected])
@@ -311,7 +321,7 @@ export function DialogSelect<T>(props: DialogSelectProps<T>) {
>
<Option
title={option.title}
footer={option.footer}
footer={flatten() ? (option.category ?? option.footer) : option.footer}
description={option.description !== category ? option.description : undefined}
active={active()}
current={current()}

View File

@@ -15,6 +15,17 @@ export namespace Pty {
const BUFFER_LIMIT = 1024 * 1024 * 2
const BUFFER_CHUNK = 64 * 1024
const encoder = new TextEncoder()
// WebSocket control frame: 0x00 + UTF-8 JSON (currently { cursor }).
const meta = (cursor: number) => {
const json = JSON.stringify({ cursor })
const bytes = encoder.encode(json)
const out = new Uint8Array(bytes.length + 1)
out[0] = 0
out.set(bytes, 1)
return out
}
const pty = lazy(async () => {
const { spawn } = await import("bun-pty")
@@ -68,6 +79,8 @@ export namespace Pty {
info: Info
process: IPty
buffer: string
bufferCursor: number
cursor: number
subscribers: Set<WSContext>
}
@@ -139,23 +152,27 @@ export namespace Pty {
info,
process: ptyProcess,
buffer: "",
bufferCursor: 0,
cursor: 0,
subscribers: new Set(),
}
state().set(id, session)
ptyProcess.onData((data) => {
let open = false
session.cursor += data.length
for (const ws of session.subscribers) {
if (ws.readyState !== 1) {
session.subscribers.delete(ws)
continue
}
open = true
ws.send(data)
}
if (open) return
session.buffer += data
if (session.buffer.length <= BUFFER_LIMIT) return
session.buffer = session.buffer.slice(-BUFFER_LIMIT)
const excess = session.buffer.length - BUFFER_LIMIT
session.buffer = session.buffer.slice(excess)
session.bufferCursor += excess
})
ptyProcess.onExit(({ exitCode }) => {
log.info("session exited", { id, exitCode })
@@ -215,28 +232,47 @@ export namespace Pty {
}
}
export function connect(id: string, ws: WSContext) {
export function connect(id: string, ws: WSContext, cursor?: number) {
const session = state().get(id)
if (!session) {
ws.close()
return
}
log.info("client connected to session", { id })
session.subscribers.add(ws)
if (session.buffer) {
const buffer = session.buffer.length <= BUFFER_LIMIT ? session.buffer : session.buffer.slice(-BUFFER_LIMIT)
session.buffer = ""
const start = session.bufferCursor
const end = session.cursor
const from =
cursor === -1 ? end : typeof cursor === "number" && Number.isSafeInteger(cursor) ? Math.max(0, cursor) : 0
const data = (() => {
if (!session.buffer) return ""
if (from >= end) return ""
const offset = Math.max(0, from - start)
if (offset >= session.buffer.length) return ""
return session.buffer.slice(offset)
})()
if (data) {
try {
for (let i = 0; i < buffer.length; i += BUFFER_CHUNK) {
ws.send(buffer.slice(i, i + BUFFER_CHUNK))
for (let i = 0; i < data.length; i += BUFFER_CHUNK) {
ws.send(data.slice(i, i + BUFFER_CHUNK))
}
} catch {
session.subscribers.delete(ws)
session.buffer = buffer
ws.close()
return
}
}
try {
ws.send(meta(end))
} catch {
ws.close()
return
}
session.subscribers.add(ws)
return {
onMessage: (message: string | ArrayBuffer) => {
session.process.write(String(message))

View File

@@ -151,11 +151,18 @@ export const PtyRoutes = lazy(() =>
validator("param", z.object({ ptyID: z.string() })),
upgradeWebSocket((c) => {
const id = c.req.param("ptyID")
const cursor = (() => {
const value = c.req.query("cursor")
if (!value) return
const parsed = Number(value)
if (!Number.isSafeInteger(parsed) || parsed < -1) return
return parsed
})()
let handler: ReturnType<typeof Pty.connect>
if (!Pty.get(id)) throw new Error("Session not found")
return {
onOpen(_event, ws) {
handler = Pty.connect(id, ws)
handler = Pty.connect(id, ws, cursor)
},
onMessage(event) {
handler?.onMessage(String(event.data))

View File

@@ -142,13 +142,13 @@ require("codecompanion").setup({
## الدعم
يعمل OpenCode عبر ACP بالطريقة نفسها التي يعمل بها في الطرفية. جميع الميزات مدعومة:
يعمل OpenCode عبر ACP بالطريقة نفسها التي يعمل بها في terminal. جميع الميزات مدعومة:
:::note
بعض أوامر الشرطة المائلة المضمنة مثل `/undo` و`/redo` غير مدعومة حاليا.
:::
- الأدوات المضمنة (عمليات الملفات، أوامر الطرفية، إلخ.)
- الأدوات المضمنة (عمليات الملفات، أوامر terminal، إلخ.)
- الأدوات المخصصة وأوامر الشرطة المائلة
- خوادم MCP المضبوطة في إعدادات OpenCode
- قواعد خاصة بالمشروع من `AGENTS.md`

View File

@@ -1,11 +1,11 @@
---
title: سطر الأوامر
description: خيارات وأوامر سطر أوامر OpenCode.
title: CLI
description: أوامر وخيارات CLI في OpenCode.
---
import { Tabs, TabItem } from "@astrojs/starlight/components"
يبدأ سطر أوامر OpenCode افتراضيا واجهة [TUI](/docs/tui) عند تشغيله بدون أي معاملات.
يبدأ CLI الخاص بـ OpenCode افتراضيا واجهة [TUI](/docs/tui) عند تشغيله بدون أي معاملات.
```bash
opencode
@@ -21,7 +21,7 @@ opencode run "Explain how closures work in JavaScript"
### tui
بدء واجهة المستخدم الطرفية (TUI) الخاصة بـ OpenCode.
بدء واجهة المستخدم terminal (TUI) الخاصة بـ OpenCode.
```bash
opencode [project]
@@ -44,7 +44,7 @@ opencode [project]
## الأوامر
يتضمن سطر أوامر OpenCode أيضا الأوامر التالية.
يتضمن CLI الخاص بـ OpenCode أيضا الأوامر التالية.
---
@@ -60,7 +60,7 @@ opencode agent [command]
### attach
إرفاق طرفية بخادم الواجهة الخلفية لـ OpenCode قيد التشغيل بالفعل، والذي تم تشغيله عبر الأمرين `serve` أو `web`.
إرفاق terminal بخادم الواجهة الخلفية لـ OpenCode قيد التشغيل بالفعل، والذي تم تشغيله عبر الأمرين `serve` أو `web`.
```bash
opencode attach [url]
@@ -562,7 +562,7 @@ opencode upgrade v0.1.48
| `OPENCODE_CONFIG_CONTENT` | string | محتوى تهيئة JSON مُضمّن |
| `OPENCODE_DISABLE_AUTOUPDATE` | boolean | تعطيل التحقق التلقائي من التحديثات |
| `OPENCODE_DISABLE_PRUNE` | boolean | تعطيل تنقية البيانات القديمة |
| `OPENCODE_DISABLE_TERMINAL_TITLE` | boolean | تعطيل تحديث عنوان الطرفية تلقائيا |
| `OPENCODE_DISABLE_TERMINAL_TITLE` | boolean | تعطيل تحديث عنوان terminal تلقائيا |
| `OPENCODE_PERMISSION` | string | تهيئة أذونات JSON مُضمّنة |
| `OPENCODE_DISABLE_DEFAULT_PLUGINS` | boolean | تعطيل الإضافات الافتراضية |
| `OPENCODE_DISABLE_LSP_DOWNLOAD` | boolean | تعطيل تنزيل خوادم LSP تلقائيا |

View File

@@ -160,7 +160,7 @@ with the following content: $3
---
### خرج الصدفة (Shell)
### خرج shell
استخدم _!`command`_ لحقن خرج [أمر bash](/docs/tui#bash-commands) داخل مُطالبتك.

View File

@@ -172,7 +172,7 @@ opencode run "Hello world"
- `scroll_acceleration.enabled` - تفعيل تسارع التمرير بأسلوب macOS. **له أولوية على `scroll_speed`.**
- `scroll_speed` - مُضاعِف سرعة تمرير مخصص (الافتراضي: `3`، الحد الأدنى: `1`). يتم تجاهله إذا كان `scroll_acceleration.enabled` مساويًا لـ `true`.
- `diff_style` - التحكم في عرض `diff`. القيمة `"auto"` تتكيف مع عرض الطرفية، و`"stacked"` تعرض عمودًا واحدًا دائمًا.
- `diff_style` - التحكم في عرض `diff`. القيمة `"auto"` تتكيف مع عرض terminal، و`"stacked"` تعرض عمودًا واحدًا دائمًا.
[تعرف على المزيد حول استخدام TUI هنا](/docs/tui).

View File

@@ -52,19 +52,19 @@ description: مشاريع وتكاملات مبنية باستخدام OpenCode.
## المشاريع
| الاسم | الوصف |
| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
| [kimaki](https://github.com/remorses/kimaki) | بوت Discord للتحكم بجلسات OpenCode، مبني على SDK |
| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | ملحق Neovim لموجهات تراعي المحرر، مبني على API |
| [portal](https://github.com/hosenur/portal) | واجهة ويب تركز على الجوال لـ OpenCode عبر Tailscale/VPN |
| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | قالب لبناء ملحقات OpenCode |
| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | واجهة Neovim لـ opencode - وكيل برمجة بالذكاء الاصطناعي يعمل في الطرفية |
| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | موفر Vercel AI SDK لاستخدام OpenCode عبر @opencode-ai/sdk |
| [OpenChamber](https://github.com/btriapitsyn/openchamber) | تطبيق ويب/سطح مكتب وامتداد VS Code لـ OpenCode |
| [OpenCode-Obsidian](https://github.com/mtymek/opencode-obsidian) | ملحق Obsidian يدمج OpenCode داخل واجهة Obsidian |
| [OpenWork](https://github.com/different-ai/openwork) | بديل مفتوح المصدر لـ Claude Cowork، مدعوم بـ OpenCode |
| [ocx](https://github.com/kdcokenny/ocx) | مدير امتدادات OpenCode مع ملفات تعريف محمولة ومعزولة. |
| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | تطبيق عميل لسطح المكتب والويب والجوال وعن بُعد لـ OpenCode |
| الاسم | الوصف |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
| [kimaki](https://github.com/remorses/kimaki) | بوت Discord للتحكم بجلسات OpenCode، مبني على SDK |
| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | ملحق Neovim لموجهات تراعي المحرر، مبني على API |
| [portal](https://github.com/hosenur/portal) | واجهة ويب تركز على الجوال لـ OpenCode عبر Tailscale/VPN |
| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | قالب لبناء ملحقات OpenCode |
| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | واجهة Neovim لـ opencode - وكيل برمجة بالذكاء الاصطناعي يعمل في terminal |
| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | موفر Vercel AI SDK لاستخدام OpenCode عبر @opencode-ai/sdk |
| [OpenChamber](https://github.com/btriapitsyn/openchamber) | تطبيق ويب/سطح مكتب وامتداد VS Code لـ OpenCode |
| [OpenCode-Obsidian](https://github.com/mtymek/opencode-obsidian) | ملحق Obsidian يدمج OpenCode داخل واجهة Obsidian |
| [OpenWork](https://github.com/different-ai/openwork) | بديل مفتوح المصدر لـ Claude Cowork، مدعوم بـ OpenCode |
| [ocx](https://github.com/kdcokenny/ocx) | مدير امتدادات OpenCode مع ملفات تعريف محمولة ومعزولة. |
| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | تطبيق عميل لسطح المكتب والويب والجوال وعن بُعد لـ OpenCode |
---

View File

@@ -3,14 +3,14 @@ title: IDE
description: امتداد OpenCode لـ VS Code و Cursor وغيرها من بيئات التطوير
---
يتكامل OpenCode مع VS Code و Cursor أو أي IDE يدعم الطرفية. ما عليك سوى تشغيل `opencode` في الطرفية للبدء.
يتكامل OpenCode مع VS Code و Cursor أو أي IDE يدعم terminal. ما عليك سوى تشغيل `opencode` في terminal للبدء.
---
## الاستخدام
- **تشغيل سريع**: استخدم `Cmd+Esc` (Mac) أو `Ctrl+Esc` (Windows/Linux) لفتح OpenCode في عرض طرفية مقسّم، أو للتركيز على جلسة طرفية موجودة إذا كانت قيد التشغيل بالفعل.
- **جلسة جديدة**: استخدم `Cmd+Shift+Esc` (Mac) أو `Ctrl+Shift+Esc` (Windows/Linux) لبدء جلسة طرفية جديدة لـ OpenCode حتى لو كانت هناك جلسة مفتوحة. يمكنك أيضا النقر على زر OpenCode في واجهة المستخدم.
- **تشغيل سريع**: استخدم `Cmd+Esc` (Mac) أو `Ctrl+Esc` (Windows/Linux) لفتح OpenCode في عرض terminal مقسّم، أو للتركيز على جلسة terminal موجودة إذا كانت قيد التشغيل بالفعل.
- **جلسة جديدة**: استخدم `Cmd+Shift+Esc` (Mac) أو `Ctrl+Shift+Esc` (Windows/Linux) لبدء جلسة terminal جديدة لـ OpenCode حتى لو كانت هناك جلسة مفتوحة. يمكنك أيضا النقر على زر OpenCode في واجهة المستخدم.
- **وعي بالسياق**: شارك تلقائيا تحديدك الحالي أو تبويبك مع OpenCode.
- **اختصارات الإشارة إلى الملفات**: استخدم `Cmd+Option+K` (Mac) أو `Alt+Ctrl+K` (Linux/Windows) لإدراج مراجع الملفات. مثلا: `@File#L37-42`.
@@ -21,7 +21,7 @@ description: امتداد OpenCode لـ VS Code و Cursor وغيرها من بي
لتثبيت OpenCode على VS Code والتفرعات الشائعة مثل Cursor و Windsurf و VSCodium:
1. افتح VS Code
2. افتح الطرفية المدمجة
2. افتح terminal المدمجة
3. شغّل `opencode` - سيتم تثبيت الامتداد تلقائيا
أما إذا كنت تريد استخدام IDE الخاص بك عند تشغيل `/editor` أو `/export` من واجهة TUI، فستحتاج إلى ضبط `export EDITOR="code --wait"`. [اعرف المزيد](/docs/tui/#editor-setup).
@@ -38,8 +38,8 @@ description: امتداد OpenCode لـ VS Code و Cursor وغيرها من بي
إذا فشل تثبيت الامتداد تلقائيا:
- تأكد من أنك تشغّل `opencode` داخل الطرفية المدمجة.
- تأكد من تثبيت واجهة سطر الأوامر (CLI) الخاصة بـ IDE لديك:
- تأكد من أنك تشغّل `opencode` داخل terminal المدمجة.
- تأكد من تثبيت CLI الخاصة بـ IDE لديك:
- لـ VS Code: أمر `code`
- لـ Cursor: أمر `cursor`
- لـ Windsurf: أمر `windsurf`

View File

@@ -7,9 +7,9 @@ import { Tabs, TabItem } from "@astrojs/starlight/components"
import config from "../../../../config.mjs"
export const console = config.console
[**OpenCode**](/) هو وكيل ترميز بالذكاء الاصطناعي مفتوح المصدر. يتوفر كواجهة طرفية، وتطبيق لسطح المكتب، أو إضافة لبيئة تطوير متكاملة (IDE).
[**OpenCode**](/) هو وكيل ترميز بالذكاء الاصطناعي مفتوح المصدر. يتوفر كواجهة terminal، وتطبيق لسطح المكتب، أو إضافة لبيئة تطوير متكاملة (IDE).
![واجهة OpenCode الطرفية مع سمة opencode](../../../assets/lander/screenshot.png)
![واجهة OpenCode في terminal مع سمة opencode](../../../assets/lander/screenshot.png)
لنبدأ.
@@ -17,9 +17,9 @@ export const console = config.console
#### المتطلبات
لاستخدام OpenCode في الطرفية، ستحتاج إلى:
لاستخدام OpenCode في terminal، ستحتاج إلى:
1. محاكي طرفية حديث مثل:
1. محاكي terminal حديث مثل:
- [WezTerm](https://wezterm.org) متعدد المنصات
- [Alacritty](https://alacritty.org) متعدد المنصات
- [Ghostty](https://ghostty.org) على Linux وmacOS
@@ -249,10 +249,10 @@ How is authentication handled in @packages/functions/src/api/index.ts
```
:::tip
اسحب الصور وأفلِتها داخل الطرفية لإضافتها إلى الطلب.
اسحب الصور وأفلِتها داخل terminal لإضافتها إلى الطلب.
:::
يستطيع OpenCode فحص أي صور تزوده بها وإضافتها إلى الطلب. يمكنك فعل ذلك عبر سحب الصورة وإفلاتها داخل الطرفية.
يستطيع OpenCode فحص أي صور تزوده بها وإضافتها إلى الطلب. يمكنك فعل ذلك عبر سحب الصورة وإفلاتها داخل terminal.
3. **ابنِ الميزة**

View File

@@ -107,7 +107,7 @@ description: خصّص اختصارات لوحة المفاتيح.
## مفتاح القائد
يستخدم OpenCode مفتاح `leader` لمعظم اختصارات لوحة المفاتيح. يساعد ذلك على تجنّب التعارضات في الطرفية لديك.
يستخدم OpenCode مفتاح `leader` لمعظم اختصارات لوحة المفاتيح. يساعد ذلك على تجنّب التعارضات في terminal لديك.
افتراضيا، يكون `ctrl+x` هو مفتاح القائد، وتتطلّب معظم الإجراءات أن تضغط أولا مفتاح القائد ثم الاختصار. على سبيل المثال، لبدء جلسة جديدة اضغط `ctrl+x` أولا ثم اضغط `n`.
@@ -154,7 +154,7 @@ description: خصّص اختصارات لوحة المفاتيح.
## مفتاح Shift+Enter
بعض الطرفيات لا ترسل مفاتيح التعديل مع Enter افتراضيا. قد تحتاج إلى ضبط طرفيتك لإرسال `Shift+Enter` كسلسلة هروب.
بعض تطبيقات terminal لا ترسل مفاتيح التعديل مع Enter افتراضيا. قد تحتاج إلى ضبط terminal لإرسال `Shift+Enter` كسلسلة هروب.
### Windows Terminal

View File

@@ -204,7 +204,7 @@ description: تهيئة مزوّد LLM والنموذج.
عند بدء تشغيل OpenCode، يتحقق من النماذج وفق ترتيب الأولوية التالي:
1. خيار سطر الأوامر `--model` أو `-m`. الصيغة هي نفسها الموجودة في ملف الإعدادات: `provider_id/model_id`.
1. خيار CLI `--model` أو `-m`. الصيغة هي نفسها الموجودة في ملف الإعدادات: `provider_id/model_id`.
2. قائمة النماذج في إعدادات OpenCode.

View File

@@ -36,7 +36,7 @@ description: أوضاع مختلفة لحالات استخدام مختلفة.
- `write` - لا يمكن إنشاء ملفات جديدة
- `edit` - لا يمكن تعديل الملفات الموجودة، باستثناء الملفات الموجودة في `.opencode/plans/*.md` لتفصيل الخطة نفسها
- `patch` - لا يمكن تطبيق التصحيحات
- `bash` - لا يمكن تنفيذ أوامر الصدفة
- `bash` - لا يمكن تنفيذ أوامر shell
يكون هذا الوضع مفيدًا عندما تريد من الذكاء الاصطناعي تحليل الشيفرة، أو اقتراح تغييرات، أو إنشاء خطط دون إجراء أي تعديلات فعلية على قاعدة الشيفرة لديك.
@@ -227,7 +227,7 @@ Provide constructive feedback without making direct changes.
| الأداة | الوصف |
| ----------- | -------------------------- |
| `bash` | تنفيذ أوامر الصدفة |
| `bash` | تنفيذ أوامر shell |
| `edit` | تعديل الملفات الموجودة |
| `write` | إنشاء ملفات جديدة |
| `read` | قراءة محتويات الملفات |

View File

@@ -26,7 +26,7 @@ export NO_PROXY=localhost,127.0.0.1
تتواصل واجهة TUI مع خادم HTTP محلي. يجب تجاوز الوكيل لهذا الاتصال لمنع حلقات التوجيه.
:::
يمكنك إعداد منفذ الخادم واسم المضيف باستخدام [أعلام سطر الأوامر](/docs/cli#run).
يمكنك إعداد منفذ الخادم واسم المضيف باستخدام [أعلام CLI](/docs/cli#run).
---
@@ -54,4 +54,4 @@ export HTTPS_PROXY=http://username:password@proxy.example.com:8080
export NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem
```
يعمل ذلك لكل من اتصالات الوكيل والوصول المباشر إلى واجهات برمجة التطبيقات.
يعمل ذلك لكل من اتصالات الوكيل والوصول المباشر إلى APIs.

View File

@@ -134,7 +134,7 @@ description: تحكّم في الإجراءات التي تتطلب موافقة
- `glob` — مطابقة أسماء الملفات (يطابق نمط الـ glob)
- `grep` — البحث في المحتوى (يطابق نمط regex)
- `list` — سرد الملفات في دليل (يطابق مسار الدليل)
- `bash` — تشغيل أوامر الصدفة (يطابق الأوامر المُحلَّلة مثل `git status --porcelain`)
- `bash` — تشغيل أوامر shell (يطابق الأوامر المُحلَّلة مثل `git status --porcelain`)
- `task` — تشغيل وكلاء فرعيين (يطابق نوع الوكيل الفرعي)
- `skill` — تحميل مهارة (يطابق اسم المهارة)
- `lsp` — تشغيل استعلامات LSP (حاليًا دون قواعد دقيقة)

View File

@@ -192,7 +192,7 @@ export const MyPlugin: Plugin = async ({ project, client, $, directory, worktree
- `todo.updated`
#### أحداث الصدفة
#### أحداث shell
- `shell.env`
@@ -260,7 +260,7 @@ export const EnvProtection = async ({ project, client, $, directory, worktree })
### حقن متغيرات البيئة
احقن متغيرات البيئة في جميع عمليات تنفيذ الصدفة (أدوات الذكاء الاصطناعي وطرفيات المستخدم):
احقن متغيرات البيئة في جميع عمليات تنفيذ shell (أدوات الذكاء الاصطناعي وterminal المستخدم):
```javascript title=".opencode/plugins/inject-env.js"
export const InjectEnvPlugin = async () => {

View File

@@ -282,9 +282,9 @@ OpenCode Zen هي قائمة نماذج يوفّرها فريق OpenCode وقد
##### استخدام مفاتيح API
يمكنك أيضا اختيار **Create an API Key** إذا لم يكن لديك اشتراك Pro/Max. سيفتح ذلك المتصفح أيضا ويطلب منك تسجيل الدخول إلى Anthropic ويعطيك رمزا يمكنك لصقه في الطرفية.
يمكنك أيضا اختيار **Create an API Key** إذا لم يكن لديك اشتراك Pro/Max. سيفتح ذلك المتصفح أيضا ويطلب منك تسجيل الدخول إلى Anthropic ويعطيك رمزا يمكنك لصقه في terminal.
أو إذا كان لديك مفتاح API بالفعل، يمكنك اختيار **Manually enter API Key** ولصقه في الطرفية.
أو إذا كان لديك مفتاح API بالفعل، يمكنك اختيار **Manually enter API Key** ولصقه في terminal.
---
@@ -661,7 +661,7 @@ OpenCode Zen هي قائمة نماذج يوفّرها فريق OpenCode وقد
2. انقر **Add new token**
3. Name: `OpenCode`، Scopes: `api`
4. انسخ الرمز (يبدأ بـ `glpat-`)
5. أدخله في الطرفية
5. أدخله في terminal
3. شغّل الأمر `/models` لعرض النماذج المتاحة.
@@ -1324,7 +1324,7 @@ npm install -g opencode-helicone-session
##### استخدام مفاتيح API
إذا كان لديك مفتاح API بالفعل، يمكنك اختيار **Manually enter API Key** ولصقه في الطرفية.
إذا كان لديك مفتاح API بالفعل، يمكنك اختيار **Manually enter API Key** ولصقه في terminal.
---

View File

@@ -93,7 +93,7 @@ const client = createOpencodeClient({
## الأنواع
تتضمن SDK تعريفات TypeScript لجميع أنواع واجهات برمجة التطبيقات. استوردها مباشرة:
تتضمن SDK تعريفات TypeScript لجميع أنواع API. استوردها مباشرة:
```typescript
import type { Session, Message, Part } from "@opencode-ai/sdk"
@@ -117,7 +117,7 @@ try {
---
## واجهات برمجة التطبيقات
## APIs
توفر SDK جميع واجهات الخادم عبر عميل آمن للأنواع.

View File

@@ -46,7 +46,7 @@ OPENCODE_SERVER_PASSWORD=your-password opencode serve
### كيف يعمل
عند تشغيل `opencode` يبدأ تشغيل واجهة طرفية تفاعلية (TUI) وخادما. تكون الـ TUI هي
عند تشغيل `opencode` يبدأ تشغيل واجهة terminal تفاعلية (TUI) وخادما. تكون الـ TUI هي
العميل الذي يتحدث إلى الخادم. يوفّر الخادم نقطة نهاية لمواصفة OpenAPI 3.1.
وتُستخدم هذه النقطة أيضا لتوليد [SDK](/docs/sdk).
@@ -56,7 +56,7 @@ OPENCODE_SERVER_PASSWORD=your-password opencode serve
تتيح هذه البنية لـ opencode دعم عدة عملاء وتمكّنك من التفاعل مع opencode برمجيا.
يمكنك تشغيل `opencode serve` لبدء خادم مستقل. إذا كانت واجهة opencode الطرفية (TUI)
يمكنك تشغيل `opencode serve` لبدء خادم مستقل. إذا كانت واجهة opencode في terminal (TUI)
قيد التشغيل، فسيبدأ `opencode serve` خادما جديدا.
---
@@ -177,7 +177,7 @@ http://<hostname>:<port>/doc
| `GET` | `/session/:id/message/:messageID` | الحصول على تفاصيل الرسالة | يعيد `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}` |
| `POST` | `/session/:id/prompt_async` | إرسال رسالة بشكل غير متزامن (بدون انتظار) | المتن: مثل `/session/:id/message`، يعيد `204 No Content` |
| `POST` | `/session/:id/command` | تنفيذ أمر شرطة مائلة (slash) | المتن: `{ messageID?, agent?, model?, command, arguments }`، يعيد `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}` |
| `POST` | `/session/:id/shell` | تشغيل أمر في الصدفة (shell) | المتن: `{ agent, model?, command }`، يعيد `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}` |
| `POST` | `/session/:id/shell` | تشغيل أمر في shell | المتن: `{ agent, model?, command }`، يعيد `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}` |
---

View File

@@ -3,19 +3,19 @@ title: السمات
description: اختر سمة مدمجة أو عرّف سمة خاصة بك.
---
مع OpenCode يمكنك الاختيار من بين عدة سمات مدمجة، أو استخدام سمة تتكيّف مع سمة طرفيتك، أو تعريف سمة مخصصة خاصة بك.
مع OpenCode يمكنك الاختيار من بين عدة سمات مدمجة، أو استخدام سمة تتكيّف مع سمة terminal لديك، أو تعريف سمة مخصصة خاصة بك.
افتراضيًا، يستخدم OpenCode سمتنا `opencode`.
---
## متطلبات الطرفية
## متطلبات terminal
لكي تُعرض السمات بشكل صحيح مع لوحة ألوانها الكاملة، يجب أن تدعم طرفيتك **truecolor** (ألوان 24-بت). تدعم معظم الطرفيات الحديثة ذلك افتراضيًا، لكن قد تحتاج إلى تفعيله:
لكي تُعرض السمات بشكل صحيح مع لوحة ألوانها الكاملة، يجب أن يدعم terminal لديك **truecolor** (ألوان 24-بت). تدعم معظم تطبيقات terminal الحديثة ذلك افتراضيًا، لكن قد تحتاج إلى تفعيله:
- **التحقق من الدعم**: شغّل `echo $COLORTERM` - يجب أن يطبع `truecolor` أو `24bit`
- **تفعيل truecolor**: اضبط متغير البيئة `COLORTERM=truecolor` في ملف إعدادات الصدفة
- **توافق الطرفية**: تأكد من أن محاكي الطرفية يدعم ألوان 24-بت (معظم الطرفيات الحديثة مثل iTerm2 وAlacritty وKitty وWindows Terminal والإصدارات الحديثة من GNOME Terminal تدعم ذلك)
- **تفعيل truecolor**: اضبط متغير البيئة `COLORTERM=truecolor` في ملف إعدادات shell
- **توافق terminal**: تأكد من أن محاكي terminal يدعم ألوان 24-بت (معظم تطبيقات terminal الحديثة مثل iTerm2 وAlacritty وKitty وWindows Terminal والإصدارات الحديثة من GNOME Terminal تدعم ذلك)
بدون دعم truecolor، قد تظهر السمات بدقة ألوان أقل أو تعود إلى أقرب تقريب ضمن 256 لونًا.
@@ -27,7 +27,7 @@ description: اختر سمة مدمجة أو عرّف سمة خاصة بك.
| الاسم | الوصف |
| ---------------------- | --------------------------------------------------------------------------- |
| `system` | يتكيّف مع لون خلفية طرفيتك |
| `system` | يتكيّف مع لون خلفية terminal لديك |
| `tokyonight` | مبني على سمة [Tokyonight](https://github.com/folke/tokyonight.nvim) |
| `everforest` | مبني على سمة [Everforest](https://github.com/sainnhe/everforest) |
| `ayu` | مبني على السمة الداكنة [Ayu](https://github.com/ayu-theme) |
@@ -45,17 +45,17 @@ description: اختر سمة مدمجة أو عرّف سمة خاصة بك.
## سمة النظام
صُممت سمة `system` لتتكيّف تلقائيًا مع مخطط ألوان طرفيتك. وعلى عكس السمات التقليدية التي تستخدم ألوانًا ثابتة، فإن سمة _system_:
صُممت سمة `system` لتتكيّف تلقائيًا مع مخطط ألوان terminal لديك. وعلى عكس السمات التقليدية التي تستخدم ألوانًا ثابتة، فإن سمة _system_:
- **توليد تدرج رمادي**: تنشئ تدرجًا رماديًا مخصصًا اعتمادًا على لون خلفية طرفيتك، بما يضمن أفضل تباين.
- **استخدام ألوان ANSI**: تستفيد من ألوان ANSI القياسية (0-15) لإبراز الصياغة وعناصر الواجهة، والتي تحترم لوحة ألوان طرفيتك.
- **الحفاظ على افتراضيات الطرفية**: تستخدم `none` لألوان النص والخلفية للحفاظ على مظهر طرفيتك الأصلي.
- **توليد تدرج رمادي**: تنشئ تدرجًا رماديًا مخصصًا اعتمادًا على لون خلفية terminal لديك، بما يضمن أفضل تباين.
- **استخدام ألوان ANSI**: تستفيد من ألوان ANSI القياسية (0-15) لإبراز الصياغة وعناصر الواجهة، والتي تحترم لوحة ألوان terminal لديك.
- **الحفاظ على افتراضيات terminal**: تستخدم `none` لألوان النص والخلفية للحفاظ على مظهر terminal الأصلي.
سمة النظام مناسبة للمستخدمين الذين:
- يريدون أن يطابق OpenCode مظهر طرفيتهم
- يستخدمون مخططات ألوان مخصصة للطرفية
- يفضلون مظهرًا متسقًا عبر جميع تطبيقات الطرفية
- يريدون أن يطابق OpenCode مظهر terminal لديهم
- يستخدمون مخططات ألوان مخصصة لـ terminal
- يفضلون مظهرًا متسقًا عبر جميع تطبيقات terminal
---
@@ -119,7 +119,7 @@ vim .opencode/themes/my-theme.json
- **ألوان ANSI**: `3` (0-255)
- **مراجع الألوان**: `"primary"` أو تعريفات مخصصة
- **متغيرات داكن/فاتح**: `{"dark": "#000", "light": "#fff"}`
- **بدون لون**: `"none"` - يستخدم اللون الافتراضي للطرفية أو يكون شفافًا
- **بدون لون**: `"none"` - يستخدم اللون الافتراضي لـ terminal أو يكون شفافًا
---
@@ -129,12 +129,12 @@ vim .opencode/themes/my-theme.json
---
### افتراضيات الطرفية
### افتراضيات terminal
يمكن استخدام القيمة الخاصة `"none"` لأي لون لوراثة اللون الافتراضي للطرفية. هذا مفيد خصوصًا لإنشاء سمات تمتزج بسلاسة مع مخطط ألوان طرفيتك:
يمكن استخدام القيمة الخاصة `"none"` لأي لون لوراثة اللون الافتراضي لـ terminal. هذا مفيد خصوصًا لإنشاء سمات تمتزج بسلاسة مع مخطط ألوان terminal لديك:
- `"text": "none"` - يستخدم لون المقدمة الافتراضي للطرفية
- `"background": "none"` - يستخدم لون الخلفية الافتراضي للطرفية
- `"text": "none"` - يستخدم لون المقدمة الافتراضي لـ terminal
- `"background": "none"` - يستخدم لون الخلفية الافتراضي لـ terminal
---

View File

@@ -47,7 +47,7 @@ description: إدارة الأدوات التي يمكن لـ LLM استخدام
### bash
نفذ أوامر الصدفة (Shell) في بيئة مشروعك.
نفذ أوامر shell في بيئة مشروعك.
```json title="opencode.json" {4}
{
@@ -58,7 +58,7 @@ description: إدارة الأدوات التي يمكن لـ LLM استخدام
}
```
تتيح هذه الأداة لـ LLM تشغيل أوامر الطرفية مثل `npm install` و`git status` أو أي أمر صدفة آخر.
تتيح هذه الأداة لـ LLM تشغيل أوامر terminal مثل `npm install` و`git status` أو أي أمر shell آخر.
---

View File

@@ -16,7 +16,7 @@ description: المشكلات الشائعة وكيفية حلها.
تتم تسمية ملفات السجل بطوابع زمنية (مثل `2025-01-09T123456.log`) ويتم الاحتفاظ بأحدث 10 ملفات سجل.
يمكنك ضبط مستوى السجل باستخدام خيار سطر الأوامر `--log-level` للحصول على معلومات تصحيح أكثر تفصيلا. على سبيل المثال: `opencode --log-level DEBUG`.
يمكنك ضبط مستوى السجل باستخدام خيار CLI `--log-level` للحصول على معلومات تصحيح أكثر تفصيلا. على سبيل المثال: `opencode --log-level DEBUG`.
---
@@ -138,7 +138,7 @@ description: المشكلات الشائعة وكيفية حلها.
### Windows: مشكلات الأداء العامة
إذا كنت تواجه بطءا في الأداء، أو مشكلات في الوصول إلى الملفات، أو مشكلات في الطرفية على Windows، فجرّب استخدام [WSL (نظام Windows الفرعي لـ Linux)](/docs/windows-wsl). يوفر WSL بيئة Linux تعمل بسلاسة أكبر مع ميزات OpenCode.
إذا كنت تواجه بطءا في الأداء، أو مشكلات في الوصول إلى الملفات، أو مشكلات في terminal على Windows، فجرّب استخدام [WSL (نظام Windows الفرعي لـ Linux)](/docs/windows-wsl). يوفر WSL بيئة Linux تعمل بسلاسة أكبر مع ميزات OpenCode.
---
@@ -198,7 +198,7 @@ description: المشكلات الشائعة وكيفية حلها.
### OpenCode لا يبدأ
1. تحقق من السجلات بحثا عن رسائل الخطأ
2. جرّب التشغيل مع `--print-logs` لرؤية المخرجات في الطرفية
2. جرّب التشغيل مع `--print-logs` لرؤية المخرجات في terminal
3. تأكد من أنك تستخدم أحدث إصدار عبر `opencode upgrade`
---

View File

@@ -1,11 +1,11 @@
---
title: TUI
description: استخدام واجهة المستخدم الطرفية (TUI) في OpenCode.
description: استخدام واجهة المستخدم TUI في OpenCode.
---
import { Tabs, TabItem } from "@astrojs/starlight/components"
يوفّر OpenCode واجهة طرفية تفاعلية (TUI) للعمل على مشاريعك باستخدام LLM.
يوفّر OpenCode واجهة terminal تفاعلية (TUI) للعمل على مشاريعك باستخدام LLM.
يؤدي تشغيل OpenCode إلى بدء واجهة TUI للدليل الحالي.
@@ -45,7 +45,7 @@ How is auth handled in @packages/functions/src/api/index.ts?
## أوامر Bash
ابدأ الرسالة بـ `!` لتشغيل أمر في الصدفة.
ابدأ الرسالة بـ `!` لتشغيل أمر في shell.
```bash frame="none"
!ls -la
@@ -57,7 +57,7 @@ How is auth handled in @packages/functions/src/api/index.ts?
## الأوامر
عند استخدام واجهة OpenCode الطرفية، يمكنك كتابة `/` متبوعة باسم أمر لتنفيذ الإجراءات بسرعة. مثلا:
عند استخدام واجهة OpenCode في terminal، يمكنك كتابة `/` متبوعة باسم أمر لتنفيذ الإجراءات بسرعة. مثلا:
```bash frame="none"
/help
@@ -288,7 +288,7 @@ How is auth handled in @packages/functions/src/api/index.ts?
يستخدم الأمران `/editor` و`/export` المحرر المحدد في متغير البيئة `EDITOR`.
<Tabs>
<TabItem label="لينكس/macOS">
<TabItem label="Linux/macOS">
```bash
# Example for nano or vim
export EDITOR=nano
@@ -299,12 +299,12 @@ How is auth handled in @packages/functions/src/api/index.ts?
export EDITOR="code --wait"
```
لجعل ذلك دائما، أضف هذا إلى ملف تهيئة الصدفة لديك؛
لجعل ذلك دائما، أضف هذا إلى ملف تهيئة shell لديك؛
`~/.bashrc`، `~/.zshrc`، إلخ.
</TabItem>
<TabItem label="ويندوز (CMD)">
<TabItem label="Windows (CMD)">
```bash
set EDITOR=notepad
@@ -317,7 +317,7 @@ How is auth handled in @packages/functions/src/api/index.ts?
</TabItem>
<TabItem label="ويندوز (PowerShell)">
<TabItem label="Windows (PowerShell)">
```powershell
$env:EDITOR = "notepad"
@@ -346,7 +346,7 @@ How is auth handled in @packages/functions/src/api/index.ts?
تحتاج بعض المحررات مثل VS Code إلى التشغيل مع الخيار `--wait`.
:::
تحتاج بعض المحررات إلى وسائط سطر الأوامر لتعمل بوضع الحجب. يجعل الخيار `--wait` عملية المحرر تنتظر حتى يتم إغلاقها.
تحتاج بعض المحررات إلى وسائط CLI لتعمل بوضع الحجب. يجعل الخيار `--wait` عملية المحرر تنتظر حتى يتم إغلاقها.
---

View File

@@ -3,7 +3,7 @@ title: الويب
description: استخدام OpenCode في متصفحك.
---
يمكن تشغيل OpenCode كتطبيق ويب داخل متصفحك، ليمنحك تجربة البرمجة القوية بالذكاء الاصطناعي نفسها دون الحاجة إلى الطرفية.
يمكن تشغيل OpenCode كتطبيق ويب داخل متصفحك، ليمنحك تجربة البرمجة القوية بالذكاء الاصطناعي نفسها دون الحاجة إلى terminal.
![OpenCode Web - جلسة جديدة](../../../assets/web/web-homepage-new-session.png)
@@ -22,14 +22,14 @@ opencode web
:::
:::tip[مستخدمو Windows]
لأفضل تجربة، شغّل `opencode web` من [WSL](/docs/windows-wsl) بدلا من PowerShell. يضمن ذلك وصولا صحيحا إلى نظام الملفات وتكاملا أفضل مع الطرفية.
لأفضل تجربة، شغّل `opencode web` من [WSL](/docs/windows-wsl) بدلا من PowerShell. يضمن ذلك وصولا صحيحا إلى نظام الملفات وتكاملا أفضل مع terminal.
:::
---
## الإعدادات
يمكنك ضبط خادم الويب باستخدام خيارات سطر الأوامر أو عبر [ملف الإعدادات](/docs/config).
يمكنك ضبط خادم الويب باستخدام خيارات CLI أو عبر [ملف الإعدادات](/docs/config).
### المنفذ
@@ -108,9 +108,9 @@ OPENCODE_SERVER_PASSWORD=secret opencode web
---
## إرفاق طرفية
## إرفاق terminal
يمكنك إرفاق واجهة طرفية (TUI) بخادم ويب قيد التشغيل:
يمكنك إرفاق واجهة terminal (TUI) بخادم ويب قيد التشغيل:
```bash
# Start the web server
@@ -120,7 +120,7 @@ opencode web --port 4096
opencode attach http://localhost:4096
```
يتيح لك ذلك استخدام واجهة الويب والطرفية في الوقت نفسه، مع مشاركة الجلسات والحالة نفسها.
يتيح لك ذلك استخدام واجهة الويب وterminal في الوقت نفسه، مع مشاركة الجلسات والحالة نفسها.
---
@@ -139,4 +139,4 @@ opencode attach http://localhost:4096
}
```
تكون خيارات سطر الأوامر ذات أولوية أعلى من إعدادات ملف الإعدادات.
تكون خيارات CLI ذات أولوية أعلى من إعدادات ملف الإعدادات.

View File

@@ -8,7 +8,7 @@ import { Steps } from "@astrojs/starlight/components"
رغم أن OpenCode يمكن تشغيله مباشرة على Windows، نوصي باستخدام [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install) للحصول على أفضل تجربة. يوفر WSL بيئة Linux تعمل بسلاسة مع ميزات OpenCode.
:::tip[لماذا WSL؟]
يوفر WSL أداء أفضل لنظام الملفات، ودعمًا كاملًا للطرفية، وتوافقًا مع أدوات التطوير التي يعتمد عليها OpenCode.
يوفر WSL أداء أفضل لنظام الملفات، ودعمًا كاملًا لـ terminal، وتوافقًا مع أدوات التطوير التي يعتمد عليها OpenCode.
:::
---
@@ -23,7 +23,7 @@ import { Steps } from "@astrojs/starlight/components"
2. **ثبّت OpenCode داخل WSL**
بعد إعداد WSL، افتح طرفية WSL وثبّت OpenCode باستخدام إحدى [طرق التثبيت](/docs/).
بعد إعداد WSL، افتح terminal داخل WSL وثبّت OpenCode باستخدام إحدى [طرق التثبيت](/docs/).
```bash
curl -fsSL https://opencode.ai/install | bash
@@ -73,7 +73,7 @@ OPENCODE_SERVER_PASSWORD=your-password opencode serve --hostname 0.0.0.0
لأفضل تجربة ويب على Windows:
1. **شغّل `opencode web` من طرفية WSL** بدلًا من PowerShell:
1. **شغّل `opencode web` من terminal داخل WSL** بدلًا من PowerShell:
```bash
opencode web --hostname 0.0.0.0
@@ -81,7 +81,7 @@ OPENCODE_SERVER_PASSWORD=your-password opencode serve --hostname 0.0.0.0
2. **افتحه من متصفح Windows** عبر `http://localhost:<port>` (يعرض OpenCode الرابط)
تشغيل `opencode web` من WSL يضمن وصولًا صحيحًا لنظام الملفات وتكاملًا أفضل مع الطرفية، مع بقائه متاحًا من متصفح Windows.
تشغيل `opencode web` من WSL يضمن وصولًا صحيحًا لنظام الملفات وتكاملًا أفضل مع terminal، مع بقائه متاحًا من متصفح Windows.
---

View File

@@ -12,7 +12,7 @@ Novi TUI radi kao stari jer se povezuje na isti opencode server.
## Upgrade
Ne biste trebali biti automatski nadograđeni na 1.0 ako trenutno koristite prethodnu
verzija. Međutim, neke starije verzije OpenCode-a uvijek uzimaju najnoviju verziju.
verzija. Međutim, neke starije verzije OpenCode uvijek uzimaju najnoviju verziju.
Za ručnu nadogradnju, pokrenite
```bash

View File

@@ -13,7 +13,7 @@ Možete se prebacivati između agenata tokom sesije ili ih pozvati spominj
## Vrsta
Postoje dvije vrste agenata u OpenCode-u; primarni agensi i subagensi.
Postoje dvije vrste agenata u OpenCode; primarni agensi i subagensi.
---
@@ -167,7 +167,7 @@ Konfigurirajte agente u svom konfiguracijskom fajlu `opencode.json`:
### Markdown
Također možete definirati agente koristeći mardown datoteke. Stavite ih u:
Također možete definirati agente koristeći markdown datoteke. Stavite ih u:
- Globalno: `~/.config/opencode/agents/`
- Po projektu: `.opencode/agents/

View File

@@ -12,7 +12,7 @@ opencode
```
Ali takođe prihvata komande kao što je dokumentovano na ovoj stranici. Ovo vam omogućava programsku interakciju sa OpenCodeom.
Ali takođe prihvata komande kao što je dokumentovano na ovoj stranici. Ovo vam omogućava programsku interakciju sa OpenCode.
```bash
opencode run "Explain how closures work in JavaScript"
@@ -312,7 +312,7 @@ opencode models anthropic
| `--refresh` | Osvježite predmemoriju modela sa models.dev |
| `--verbose` | Koristite detaljniji izlaz modela (uključuje metapodatke poput troškova) |
Koristite `--refresh` zastavicu da ažurirate keširanu listu modela. Ovo je korisno kada su novi modeli dodani provajderu i želite da ih vidite u OpenCode-u.
Koristite `--refresh` zastavicu da ažurirate keširanu listu modela. Ovo je korisno kada su novi modeli dodani provajderu i želite da ih vidite u OpenCode.
```bash
opencode models --refresh
@@ -472,7 +472,7 @@ opencode web
```
Ovo pokreće HTTP server i otvara web pretraživač za pristup OpenCodeu preko web interfejsa. Postavite `OPENCODE_SERVER_PASSWORD` da omogućite HTTP osnovnu auth (korisničko ime je zadano na `opencode`).
Ovo pokreće HTTP server i otvara web pretraživač za pristup OpenCode preko web interfejsa. Postavite `OPENCODE_SERVER_PASSWORD` da omogućite HTTP osnovnu auth (korisničko ime je zadano na `opencode`).
#### Zastave

View File

@@ -1,5 +1,5 @@
---
title: komandant
title: Komande
description: Kreirajte prilagođene komande za zadatke koji se ponavljaju.
---
@@ -16,7 +16,7 @@ Prilagođene komande su dodatak ugrađenim komandama kao što su `/init`, `/undo
## Kreirajte komandne fajlove
Kreirajte mardown fajlove u direktorijumu `commands/` da definišete prilagođene komande.
Kreirajte markdown fajlove u direktorijumu `commands/` da definišete prilagođene komande.
Kreiraj `.opencode/commands/test.md`:
```md title=".opencode/commands/test.md"
@@ -78,10 +78,10 @@ Sada možete pokrenuti ovu naredbu u TUI:
### Markdown
Također možete definirati komande koristeći mardown datoteke. Stavite ih u:
Također možete definirati komande koristeći markdown datoteke. Stavite ih u:
- Globalno: `~/.config/opencode/commands/`
- Po projektu: `.opencode/commands/
- Po projektu: `.opencode/commands/`
```markdown title="~/.config/opencode/commands/test.md"
---
@@ -94,8 +94,7 @@ Run the full test suite with coverage report and show any failures.
Focus on the failing tests and suggest fixes.
```
Ime datoteke za označavanje postaje ime naredbe. Na primjer, `test.md` dozvoljava
pokrećeš:
Ime markdown datoteke postaje ime naredbe. Na primjer, `test.md` vam omogućava da pokrenete:
```bash frame="none"
/test
@@ -126,7 +125,7 @@ Include proper typing and basic structure.
Pokrenite naredbu s argumentima:
```bash frame="none"
/componentButton
/component Button
```
@@ -137,7 +136,8 @@ Također možete pristupiti pojedinačnim argumentima koristeći pozicione param
- `$2` - Drugi argument
- `$3` - Treći argument
- I tako dalje...
na primjer:
Na primjer:
```md title=".opencode/commands/create-file.md"
---
@@ -163,9 +163,9 @@ Ovo zamjenjuje:
---
### Izlaz ljuske
### Shell izlaz
Koristite _!`command`_ da ubacite [bash command](/docs/tui#bash-commands) izlaz u svoj prompt.
Koristite _!`command`_ da ubacite izlaz [bash command](/docs/tui#bash-commands) u svoj prompt.
Na primjer, da kreirate prilagođenu naredbu koja analizira pokrivenost testom:
```md title=".opencode/commands/analyze-coverage.md"
@@ -274,7 +274,7 @@ Ovo je **opciona** opcija konfiguracije. Ako nije navedeno, podrazumevano je va
---
### Subdatatak
### Subtask
Koristite `subtask` boolean da prisilite naredbu da pokrene [subagent](/docs/agents/#subagents) pozivanje.
Ovo je korisno ako želite da naredba ne zagađuje vaš primarni kontekst i da će **primorati** agenta da djeluje kao subagent,
@@ -312,14 +312,10 @@ Ovo je **opciona** opcija konfiguracije.
---
## Embedded
## Ugrađene
opencode uključuje nekoliko ugrađenih naredbi kao što su `/init`, `/undo`, `/redo`, `/share`, `/help`; [saznaj više](/docs/tui#commands).
:::note
Prilagođene komande mogu nadjačati ugrađene komande.
:::
Ako definirate prilagođenu naredbu s istim imenom, ona će nadjačati ugrađenu naredbu.
```
```

View File

@@ -319,7 +319,7 @@ Možete konfigurirati specijalizirane agente za određene zadatke putem opcije `
}
```
Također možete definirati agente koristeći mardown datoteke u `~/.config/opencode/agents/` ili `.opencode/agents/`. [Saznajte više ovdje](/docs/agents).
Također možete definirati agente koristeći markdown datoteke u `~/.config/opencode/agents/` ili `.opencode/agents/`. [Saznajte više ovdje](/docs/agents).
---
@@ -381,7 +381,7 @@ Možete konfigurirati prilagođene komande za ponavljanje zadataka putem opcije
}
```
Također možete definirati komande koristeći mardown fajlove u `~/.config/opencode/commands/` ili `.opencode/commands/`. [Saznajte više ovdje](/docs/commands).
Također možete definirati komande koristeći markdown fajlove u `~/.config/opencode/commands/` ili `.opencode/commands/`. [Saznajte više ovdje](/docs/commands).
---

View File

@@ -27,7 +27,7 @@ Mogu se definisati:
Najlakši način za kreiranje alata je korištenje pomoćnika `tool()` koji pruža sigurnost tipa i validaciju.
```ts title=".opencode/tools/database.ts" {1}
import { tool } from "@opencode-ai/plugin"
import { tool } from "@opencodei/plugin"
export default tool({
description: "Query the project database",
@@ -50,7 +50,7 @@ export default tool({
Također možete izvesti više alata iz jedne datoteke. Svaki izvoz postaje **poseban alat** pod nazivom **`<filename>_<exportname>`**:
```ts title=".opencode/tools/math.ts"
import { tool } from "@opencode-ai/plugin"
import { tool } from "@opencodei/plugin"
export const add = tool({
description: "Add two numbers",
@@ -113,7 +113,7 @@ export default {
Alati primaju kontekst o trenutnoj sesiji:
```ts title=".opencode/tools/project.ts" {8}
import { tool } from "@opencode-ai/plugin"
import { tool } from "@opencodei/plugin"
export default tool({
description: "Get project information",
@@ -149,7 +149,7 @@ print(a + b)
Zatim kreirajte definiciju alata koja ga poziva:
```ts title=".opencode/tools/python-add.ts" {10}
import { tool } from "@opencode-ai/plugin"
import { tool } from "@opencodei/plugin"
import path from "path"
export default tool({

View File

@@ -3,7 +3,7 @@ title: Ekosistem
description: Projekti i integracije izgrađeni uz OpenCode.
---
Kolekcija projekata zajednice izgrađenih na OpenCode-u.
Kolekcija projekata zajednice izgrađenih na OpenCode.
:::note
Želite li na ovu listu dodati svoj OpenCode projekat? Pošaljite PR.
:::
@@ -17,16 +17,16 @@ Također možete pogledati [awesome-opencode](https://github.com/awesome-opencod
| --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | --- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| [opencode-daytona](https://github.com/jamesmurdza/daytona/blob/main/guides/typescript/opencode/README.md) | Automatski pokrenite OpenCode sesije u izoliranim Daytona sandboxovima uz git sinhronizaciju i preglede uživo |
| [opencode-helicone-session](https://github.com/H2Shami/opencode-helicone-session) | Automatski ubacite Helicone zaglavlja sesije za grupisanje zahtjeva |
| [opencode-type-iject](https://github.com/nick-vi/opencode-type-inject) | Automatski ubaci TypeScript/Svelte tipove u čitanje datoteka pomoću alata za pretraživanje |
| [opencode-type-inject](https://github.com/nick-vi/opencode-type-inject) | Automatski ubaci TypeScript/Svelte tipove u čitanje datoteka pomoću alata za pretraživanje |
| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Koristite svoju ChatGPT Plus/Pro pretplatu umjesto API kredita |
| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Koristite svoj postojeći Gemini plan umjesto API naplate |
| [opencode-antigravity-auth](https://github.com/NoeFabris/opencode-antigravity-auth) | Koristite besplatne modele Antigravity umjesto API naplate |
| [opencodentigravity-auth](https://github.com/NoeFabris/opencodentigravity-auth) | Koristite besplatne modele Antigravity umjesto API naplate |
| [opencode-devcontainers](https://github.com/athal7/opencode-devcontainers) | Izolacija devcontainer-a s više grana s plitkim klonovima i automatski dodijeljenim portovima |
| [opencode-google-antigravity-auth](https://github.com/shekohex/opencode-google-antigravity-auth) | Google Antigravity OAuth dodatak, s podrškom za Google pretraživanje i robusnijim API rukovanjem |
| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimizirajte korištenje tokena smanjenjem izlaza zastarjelih alata |
| [opencode-websearch-cited](https://github.com/ghoulr/opencode-websearch-cited.git) | Dodajte podršku za izvorno web pretraživanje za podržane provajdere sa stilom utemeljenim na Googleu |
| [opencode-pty](https://github.com/shekohex/opencode-pty.git) | Omogućuje AI agentima da pokreću pozadinske procese u PTY-u, šalju im interaktivni ulaz. |
| [opencode-shell-strategy](https://github.com/JRedeker/opencode-shell-strategy) | Upute za neinteraktivne naredbe ljuske - sprječava visi od TTY ovisnih operacija | | [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Pratite upotrebu OpenCodea sa Wakatime |
| [opencode-shell-strategy](https://github.com/JRedeker/opencode-shell-strategy) | Upute za neinteraktivne naredbe ljuske - sprječava visi od TTY ovisnih operacija | | [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Pratite upotrebu OpenCode sa Wakatime |
| [opencode-md-table-formatter](https://github.com/franlol/opencode-md-table-formatter/tree/main) | Očistite tabele umanjenja vrijednosti koje su izradili LLM |
| [opencode-morph-fast-apply](https://github.com/JRedeker/opencode-morph-fast-apply) | 10x brže uređivanje koda s Morph Fast Apply API-jem i markerima za lijeno uređivanje |
| [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) | Pozadinski agenti, unapred izgrađeni LSP/AST/MCP alati, kurirani agenti, kompatibilni sa Claude Code |
@@ -38,7 +38,7 @@ Također možete pogledati [awesome-opencode](https://github.com/awesome-opencod
| [@plannotator/opencode](https://github.com/backnotprop/plannotator/tree/main/apps/opencode-plugin) | Interaktivni pregled plana s vizualnim napomenama i privatnim/offline dijeljenjem |
| [@openspoon/subtask2](https://github.com/spoons-and-mirrors/subtask2) | Proširite opencode /komande u moćan sistem orkestracije sa granularnom kontrolom toka |
| [opencode-scheduler](https://github.com/different-ai/opencode-scheduler) | Planirajte ponavljajuće poslove koristeći launchd (Mac) ili systemd (Linux) sa cron sintaksom | | [micode](https://github.com/vtemian/micode) | Strukturirana Brainstorm → Plan → Implementacija toka rada uz kontinuitet sesije |
| [oktobar](https://github.com/vtemian/octto) | Interaktivno korisničko sučelje pretraživača za AI brainstorming sa obrascima za više pitanja |
| [octto](https://github.com/vtemian/octto) | Interaktivno korisničko sučelje pretraživača za AI brainstorming sa obrascima za više pitanja |
| [opencode-background-agents](https://github.com/kdcokenny/opencode-background-agents) | Pozadinski agenti u stilu Claudea s asinhroniziranim delegiranjem i postojanošću konteksta |
| [opencode-notify](https://github.com/kdcokenny/opencode-notify) | Notifikacije izvornog OS-a za OpenCode znajte kada se zadaci dovrše |
| [opencode-workspace](https://github.com/kdcokenny/opencode-workspace) | Uvezeni višeagentni orkestracijski pojas 16 komponenti, jedna instalacija |
@@ -48,25 +48,25 @@ Također možete pogledati [awesome-opencode](https://github.com/awesome-opencod
## Projekti
| Ime | Opis |
| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
| [kimaki](https://github.com/remorses/kimaki) | Discord bot za kontrolu OpenCode sesija, izgrađen na SDK |
| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | Neovim dodatak za upite svjestan uređivača, izgrađen na API |
| [portal](https://github.com/hosenur/portal) | Mobilni korisnički interfejs za OpenCode preko Tailscale/VPN |
| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | Predložak za izgradnju OpenCode dodataka |
| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | Neovim frontend za opencode - terminal baziran AI agent za kodiranje |
| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Vercel AI SDK dobavljač za korištenje OpenCodea putem @opencode-ai/sdk |
| [OpenChamber](https://github.com/btriapitsyn/openchamber) | Web / Desktop App i VS Code Extension za OpenCode |
| [OpenCode-Obsidian](https://github.com/mtymek/opencode-obsidian) | Obsidian dodatak koji ugrađuje OpenCode u Obsidian-ov UI |
| [OpenWork](https://github.com/different-ai/openwork) | Alternativa otvorenog koda Claudeu Coworku, pokretana pomoću OpenCode |
| [ocx](https://github.com/kdcokenny/ocx) | OpenCode menadžer ekstenzija sa prenosivim, izolovanim profilima. |
| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | Desktop, Web, Mobile i Remote Client aplikacija za OpenCode |
| Ime | Opis |
| ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- |
| [kimaki](https://github.com/remorses/kimaki) | Discord bot za kontrolu OpenCode sesija, izgrađen na SDK |
| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | Neovim dodatak za upite svjestan uređivača, izgrađen na API |
| [portal](https://github.com/hosenur/portal) | Mobilni korisnički interfejs za OpenCode preko Tailscale/VPN |
| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | Predložak za izgradnju OpenCode dodataka |
| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | Neovim frontend za opencode - terminal baziran AI agent za kodiranje |
| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Vercel AI SDK dobavljač za korištenje OpenCode putem @opencodei/sdk |
| [OpenChamber](https://github.com/btriapitsyn/openchamber) | Web / Desktop App i VS Code Extension za OpenCode |
| [OpenCode-Obsidian](https://github.com/mtymek/opencode-obsidian) | Obsidian dodatak koji ugrađuje OpenCode u Obsidian-ov UI |
| [OpenWork](https://github.com/different-ai/openwork) | Alternativa otvorenog koda Claudeu Coworku, pokretana pomoću OpenCode |
| [ocx](https://github.com/kdcokenny/ocx) | OpenCode menadžer ekstenzija sa prenosivim, izolovanim profilima. |
| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | Desktop, Web, Mobile i Remote Client aplikacija za OpenCode |
---
## Agenti
| Ime | Opis |
| ----------------------------------------------------------------- | --------------------------------------------------------------- |
| [Agentic](https://github.com/Cluster444/agentic) | Modularni AI agenti i komande za strukturirani razvoj |
| [opencode-agents](https://github.com/darrenhinde/opencode-agents) | Konfiguracije, upiti, agenti i dodaci za poboljšane tokove rada |
| Ime | Opis |
| ------------------------------------------------------------- | --------------------------------------------------------------- |
| [Agentic](https://github.com/Cluster444/agentic) | Modularni AI agenti i komande za strukturirani razvoj |
| [opencodegents](https://github.com/darrenhinde/opencodegents) | Konfiguracije, upiti, agenti i dodaci za poboljšane tokove rada |

View File

@@ -1,6 +1,6 @@
---
title: Enterprise
description: Sigurno korištenje OpenCodea u vašoj organizaciji.
description: Sigurno korištenje OpenCode u vašoj organizaciji.
---
import config from "../../../../config.mjs"
@@ -84,7 +84,7 @@ Ta centralizovana konfiguracija može se integrisati s vašim SSO provajderom i
Kroz centralnu konfiguraciju, OpenCode se može integrisati sa SSO provajderom vaše organizacije za autentifikaciju.
To omogućava OpenCodeu da dobije vjerodajnice za interni AI gateway kroz vaš postojeći sistem upravljanja identitetom.
To omogućava OpenCode da dobije vjerodajnice za interni AI gateway kroz vaš postojeći sistem upravljanja identitetom.
---
@@ -139,7 +139,7 @@ Da. OpenCode ne pohranjuje vaš kod niti kontekstualne podatke. Sva obrada se od
<details>
<summary>Can we use our own private NPM registry?</summary>
OpenCode podržava privatne npm registre kroz Bunovu izvornu podršku za `.npmrc` datoteku. Ako vaša organizacija koristi privatni registar, kao što je JFrog Artifactory, Nexus ili slično, osigurajte da su developeri autentifikovani prije pokretanja OpenCodea.
OpenCode podržava privatne npm registre kroz Bunovu izvornu podršku za `.npmrc` datoteku. Ako vaša organizacija koristi privatni registar, kao što je JFrog Artifactory, Nexus ili slično, osigurajte da su developeri autentifikovani prije pokretanja OpenCode.
Da postavite autentifikaciju s privatnim registrom:
@@ -150,7 +150,7 @@ npm login --registry=https://your-company.jfrog.io/api/npm/npm-virtual/
Ovo kreira `~/.npmrc` s detaljima za autentifikaciju. OpenCode će to automatski prepoznati.
:::caution
Morate biti prijavljeni na privatni registar prije pokretanja OpenCodea.
Morate biti prijavljeni na privatni registar prije pokretanja OpenCode.
:::
Alternativno, možete ručno konfigurisati `.npmrc` datoteku:
@@ -160,6 +160,6 @@ registry=https://your-company.jfrog.io/api/npm/npm-virtual/
//your-company.jfrog.io/api/npm/npm-virtual/:_authToken=${NPM_AUTH_TOKEN}
```
Developeri moraju biti prijavljeni na privatni registar prije pokretanja OpenCodea kako bi se paketi mogli instalirati iz vašeg enterprise registra.
Developeri moraju biti prijavljeni na privatni registar prije pokretanja OpenCode kako bi se paketi mogli instalirati iz vašeg enterprise registra.
</details>

View File

@@ -29,7 +29,7 @@ OpenCode dolazi sa nekoliko ugrađenih formatera za popularne jezike i okvire. I
| dart | .dart | `dart` komanda dostupna |
| ocamlformat | .ml, .mli | `ocamlformat` komanda dostupna i `.ocamlformat` konfiguracioni fajl |
| terraform | .tf, .tfvars | `terraform` komanda dostupna |
| sjaj | .bleam | `gleam` komanda dostupna |
| gleam | .bleam | `gleam` komanda dostupna |
| nixfmt | .nix | `nixfmt` komanda dostupna |
| shfmt | .sh, .bash | `shfmt` komanda dostupna |
| pint | .php | `laravel/pint` zavisnost u `composer.json` || oxfmt (Eksperimentalno) | .js, .jsx, .ts, .tsx | `oxfmt` zavisnost u `package.json` i [eksperimentalna env varijabla flag](/docs/cli/#experimental) |

View File

@@ -32,7 +32,7 @@ Ovo će vas provesti kroz instalaciju GitHub aplikacije, kreiranje toka posla i
Ili ga možete postaviti ručno.
1. **Instalirajte GitHub aplikaciju**
Idite na [**github.com/apps/opencode-agent**](https://github.com/apps/opencode-agent). Uvjerite se da je instaliran na ciljnom spremištu.
Idite na [**github.com/apps/opencodegent**](https://github.com/apps/opencodegent). Uvjerite se da je instaliran na ciljnom spremištu.
2. **Dodajte radni tok**
Dodajte sljedeći fajl toka posla u `.github/workflows/opencode.yml` u svoj repo. Obavezno postavite odgovarajuće `model` i potrebne API ključeve u `env`.
@@ -79,7 +79,7 @@ Ili ga možete postaviti ručno.
## Konfiguracija
- `model`: Model za korištenje s OpenCodeom. Uzima format `provider/model`. Ovo je **obavezno**.
- `model`: Model za korištenje s OpenCode. Uzima format `provider/model`. Ovo je **obavezno**.
- `agent`: Agent za korištenje. Mora biti primarni agent. Vraća se na `default_agent` iz konfiguracije ili `"build"` ako nije pronađen.
- `share`: Da li dijeliti OpenCode sesiju. Podrazumevano je **true** za javna spremišta.
- `prompt`: Opcioni prilagođeni upit za nadjačavanje zadanog ponašanja. Koristite ovo da prilagodite kako OpenCode obrađuje zahtjeve.
@@ -248,7 +248,7 @@ Za `issues` događaje, `prompt` unos je **potreban** jer nema komentara za izvla
## Prilagođene upite
Zaobiđite zadani prompt da biste prilagodili ponašanje OpenCodea za vaš tok posla.
Zaobiđite zadani prompt da biste prilagodili ponašanje OpenCode za vaš tok posla.
```yaml title=".github/workflows/opencode.yml"
- uses: anomalyco/opencode/github@latest
@@ -267,7 +267,7 @@ Ovo je korisno za provođenje specifičnih kriterija pregleda, standarda kodiran
## Primjeri
Evo nekoliko primjera kako možete koristiti OpenCode u GitHubu.
Evo nekoliko primjera kako možete koristiti OpenCode u GitHub.
- **Objasnite problem**
Dodajte ovaj komentar u GitHub izdanje.

View File

@@ -25,7 +25,7 @@ Ovdje koristimo CI/CD komponentu kreiranu u zajednici za OpenCode — [nagyv/git
### Podešavanje
1. Sačuvajte JSON za autentifikaciju OpenCode-a kao CI varijable okruženja tipa datoteke pod **Postavke** > **CI/CD** > **Varijable**. Obavezno ih označite kao "Maskirane i skrivene".
1. Sačuvajte JSON za autentifikaciju OpenCode kao CI varijable okruženja tipa datoteke pod **Postavke** > **CI/CD** > **Varijable**. Obavezno ih označite kao "Maskirane i skrivene".
2. Dodajte sljedeće u svoju `.gitlab-ci.yml` datoteku.
```yaml title=".gitlab-ci.yml"
@@ -80,7 +80,7 @@ Pogledajte [**GitLab dokumente**](https://docs.gitlab.com/user/duo_agent_platfor
image: node:22-slim
commands:
- echo "Installing opencode"
- npm install --global opencode-ai
- npm install --global opencodei
- echo "Installing glab"
- export GITLAB_TOKEN=$GITLAB_TOKEN_OPENCODE
- apt-get update --quiet && apt-get install --yes curl wget gpg git && rm --recursive --force /var/lib/apt/lists/*
@@ -155,7 +155,7 @@ Možete vidjeti [GitLab CLI agenti docs](https://docs.gitlab.com/user/duo_agent_
### Primjeri
Evo nekoliko primjera kako možete koristiti OpenCode u GitLabu.
Evo nekoliko primjera kako možete koristiti OpenCode u GitLab.
:::tip
Možete konfigurirati da koristite drugu frazu okidača od `@opencode`.
:::

View File

@@ -11,7 +11,7 @@ OpenCode se integriše sa VS kodom, kursorom ili bilo kojim IDE-om koji podržav
- **Brzo pokretanje**: Koristite `Cmd+Esc` (Mac) ili `Ctrl+Esc` (Windows/Linux) da otvorite OpenCode u prikazu podijeljenog terminala ili fokusirajte postojeću terminalsku sesiju ako je već pokrenuta.
- **Nova sesija**: Koristite `Cmd+Shift+Esc` (Mac) ili `Ctrl+Shift+Esc` (Windows/Linux) da započnete novu OpenCode terminalsku sesiju, čak i ako je ona već otvorena. Takođe možete kliknuti na dugme OpenCode u korisničkom sučelju.
- **Svijest o kontekstu**: Automatski dijelite svoj trenutni odabir ili karticu s OpenCodeom.
- **Svijest o kontekstu**: Automatski dijelite svoj trenutni odabir ili karticu s OpenCode.
- **Prečice za referencu datoteka**: Koristite `Cmd+Option+K` (Mac) ili `Alt+Ctrl+K` (Linux/Windows) za umetanje referenci datoteka. Na primjer, `@File#L37-42`.
---

View File

@@ -1,6 +1,6 @@
---
title: Intro
description: Započnite s OpenCodeom.
description: Započnite s OpenCode.
---
import { Tabs, TabItem } from "@astrojs/starlight/components"
@@ -28,7 +28,7 @@ Da biste koristili OpenCode u svom terminalu, trebat će vam:
## Instaliraj
Najlakši način za instaliranje OpenCode-a je putem instalacione skripte.
Najlakši način za instaliranje OpenCode je putem instalacione skripte.
```bash
curl -fsSL https://opencode.ai/install | bash
@@ -42,28 +42,28 @@ Također ga možete instalirati pomoću sljedećih naredbi:
<TabItem label="npm">
```bash
npm install -g opencode-ai
npm install -g opencodei
```
</TabItem>
<TabItem label="Bun">
```bash
bun install -g opencode-ai
bun install -g opencodei
```
</TabItem>
<TabItem label="pnpm">
```bash
pnpm install -g opencode-ai
pnpm install -g opencodei
```
</TabItem>
<TabItem label="Yarn">
```bash
yarn global add opencode-ai
yarn global add opencodei
```
</TabItem>
@@ -113,7 +113,7 @@ Za najbolje iskustvo na Windows-u preporučujemo korištenje [Windows Subsystem
- **Upotreba NPM-a**
```bash
npm install -g opencode-ai
npm install -g opencodei
```
@@ -134,7 +134,7 @@ Za najbolje iskustvo na Windows-u preporučujemo korištenje [Windows Subsystem
```
Podrška za instaliranje OpenCode-a na Windows koristeći Bun je trenutno u toku.
Podrška za instaliranje OpenCode na Windows koristeći Bun je trenutno u toku.
Također možete preuzeti binarnu datoteku iz [Releases](https://github.com/anomalyco/opencode/releases).
---
@@ -143,7 +143,7 @@ Također možete preuzeti binarnu datoteku iz [Releases](https://github.com/anom
Uz OpenCode možete koristiti bilo kojeg LLM provajdera tako što ćete konfigurirati njihove API ključeve.
Ako ste tek počeli koristiti LLM provajdere, preporučujemo korištenje [OpenCode Zen](/docs/zen).
To je kurirana lista modela koji su testirani i verifikovani od strane OpenCode-a
To je kurirana lista modela koji su testirani i verifikovani od strane OpenCode
tim.
1. Pokrenite naredbu `/connect` u TUI-u, odaberite opencode i idite na [opencode.ai/auth](https://opencode.ai/auth).
@@ -196,7 +196,7 @@ korijen projekta.
:::tip
Trebali biste urezati datoteku `AGENTS.md` vašeg projekta u Git.
:::
Ovo pomaže OpenCodeu da razumije strukturu projekta i obrasce kodiranja
Ovo pomaže OpenCode da razumije strukturu projekta i obrasce kodiranja
korišteno.
---
@@ -250,10 +250,10 @@ Hajde sada da opišemo šta želimo da uradi.
```
Želite da date OpenCode-u dovoljno detalja da razumete šta želite. Pomaže
Želite da date OpenCode dovoljno detalja da razumete šta želite. Pomaže
da razgovarate s njim kao da razgovarate sa mlađim programerom u svom timu.
:::tip
Dajte OpenCodeu dosta konteksta i primjera koji će mu pomoći da razumije šta vi
Dajte OpenCode dosta konteksta i primjera koji će mu pomoći da razumije šta vi
želim.
:::
@@ -311,7 +311,7 @@ promjene.
### Poništi promjene
Recimo da tražite od OpenCodea da izvrši neke promjene.
Recimo da tražite od OpenCode da izvrši neke promjene.
```txt frame="none" "@packages/functions/src/api/index.ts"
Can you refactor the function in @packages/functions/src/api/index.ts?
@@ -345,7 +345,7 @@ Ili **možete ponoviti** promjene koristeći naredbu `/redo`.
## Dijeli
Razgovore koje imate sa OpenCodeom možete [dijeliti sa vašim
Razgovore koje imate sa OpenCode možete [dijeliti sa vašim
tim](/docs/share).
```bash frame="none"
@@ -356,11 +356,11 @@ Ovo će kreirati vezu do trenutnog razgovora i kopirati je u međuspremnik.
:::note
Razgovori se ne dijele prema zadanim postavkama.
:::
Evo [primjer razgovora](https://opencode.ai/s/4XP1fce5) sa OpenCodeom.
Evo [primjer razgovora](https://opencode.ai/s/4XP1fce5) sa OpenCode.
---
## Prilagodi
I to je to! Sada ste profesionalac u korištenju OpenCodea.
I to je to! Sada ste profesionalac u korištenju OpenCode.
Da biste to učinili svojim, preporučujemo [odabir teme](/docs/themes), [prilagođavanje povezivanja tipki](/docs/keybinds), [konfiguriranje formatera koda](/docs/formatters), [kreiranje prilagođenih komandi](/docs/commands), ili igranje sa [OpenCode config](/docs/config).

View File

@@ -3,7 +3,7 @@ title: LSP serveri
description: OpenCode se integriše sa vašim LSP serverima.
---
## OpenCode se integriše sa vašim jezičkim serverskim protokolom (LSP) kako bi pomogao LLM-u u interakciji s vašom bazom koda. Koristi dijagnostiku za pružanje povratnih informacija LLM-u.
OpenCode se integriše sa vašim Language Server Protocol (LSP) serverima kako bi pomogao LLM-u u interakciji s kodnom bazom. Koristi dijagnostiku za slanje povratnih informacija modelu.
## Ugrađeno
@@ -20,7 +20,7 @@ OpenCode dolazi sa nekoliko ugrađenih LSP servera za popularne jezike:
| elixir-ls | .ex, .exs | `elixir` komanda dostupna |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` ovisnost u projektu |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` instaliran |
| sjaj | .bleam | `gleam` komanda dostupna |
| gleam | .bleam | `gleam` komanda dostupna |
| gopls | .go | `go` komanda dostupna |
| hls | .hs, .lhs | `haskell-language-server-wrapper` komanda dostupna |
| jdtls | .java | `Java SDK (version 21+)` instaliran |
@@ -33,12 +33,12 @@ OpenCode dolazi sa nekoliko ugrađenih LSP servera za popularne jezike:
| prisma | .prisma | `prisma` komanda dostupna |
| pyright | .py, .pyi | `pyright` ovisnost instalirana |
| ruby-lsp (rubocop) | .rb, .rake, .gemspec, .ru | `ruby` i `gem` komande dostupne |
| hrđa | .rs | `rust-analyzer` komanda dostupna |
| rust | .rs | `rust-analyzer` komanda dostupna |
| sourcekit-lsp | .swift, .objc, .objcpp | `swift` instaliran (`xcode` na macOS-u) |
| vitka | .svelte | Automatske instalacije za Svelte projekte |
| svelte | .svelte | Automatske instalacije za Svelte projekte |
| terraform | .tf, .tfvars | Automatske instalacije iz GitHub izdanja |
| tinymist | .typ, .typc | Automatske instalacije iz GitHub izdanja |
| strojopis | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | `typescript` zavisnost u projektu |
| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | `typescript` zavisnost u projektu |
| vue | .vue | Automatske instalacije za Vue projekte |
| yaml-ls | .yaml, .yml | Automatski instalira Red Hat yaml-language-server |
| zls | .zig, .zon | `zig` komanda dostupna |

View File

@@ -15,7 +15,7 @@ Kada koristite MCP server, on dodaje u kontekst. Ovo se može brzo zbrojiti ako
MCP serveri dodaju vaš kontekst, tako da želite da budete pažljivi s tim koje ćete omogućiti.
:::
## Određeni MCP serveri, poput GitHub MCP servera, imaju tendenciju da dodaju mnogo tokena i lako mogu premašiti ograničenje konteksta.
Određeni MCP serveri, poput GitHub MCP servera, mogu dodati mnogo tokena i lako premašiti limit konteksta.
## Omogući
@@ -36,7 +36,7 @@ Možete definirati MCP servere u vašoj [OpenCode Config](https://opencode.ai/do
}
```
## Također možete onemogućiti server postavljanjem `enabled` na `false`. Ovo je korisno ako želite privremeno onemogućiti server bez uklanjanja iz vaše konfiguracije.
Također možete onemogućiti server postavljanjem `enabled` na `false`. To je korisno kada ga želite privremeno isključiti bez uklanjanja iz konfiguracije.
### Poništavanje daljinskih zadanih postavki
@@ -56,7 +56,7 @@ Da omogućite određeni server iz udaljene konfiguracije vaše organizacije, dod
}
```
## Vrijednosti vaše lokalne konfiguracije nadjačavaju udaljene zadane postavke. Pogledajte [config precedence](/docs/config#precedence-order) za više detalja.
Vrijednosti lokalne konfiguracije nadjačavaju udaljene zadane postavke. Pogledajte [config precedence](/docs/config#precedence-order) za više detalja.
## Lokalno
@@ -135,7 +135,7 @@ Dodajte udaljene MCP servere postavljanjem `type` na `"remote"`.
}
```
## `url` je URL udaljenog MCP servera i sa opcijom `headers` možete proslijediti listu zaglavlja.
`url` je URL udaljenog MCP servera, a kroz opciju `headers` možete proslijediti listu zaglavlja.
#### Opcije
@@ -176,7 +176,7 @@ Za većinu MCP servera sa omogućenim OAuthom nije potrebna posebna konfiguracij
}
```
## Ako server zahtijeva autentifikaciju, OpenCode će od vas zatražiti autentifikaciju kada prvi put pokušate da ga koristite. Ako ne, možete [ručno pokrenuti tok](#authenticating) sa `opencode mcp auth <server-name>`.
Ako server zahtijeva autentifikaciju, OpenCode će vas tražiti prijavu pri prvom korištenju. Ako se to ne desi, možete [ručno pokrenuti tok](#authenticating) naredbom `opencode mcp auth <server-name>`.
### Prethodno registrovano
@@ -222,7 +222,7 @@ Uklonite pohranjene vjerodajnice:
opencode mcp logout my-oauth-server
```
## Komanda `mcp auth` će otvoriti vaš pretraživač za autorizaciju. Nakon što odobrite, OpenCode će sigurno pohraniti tokene u `~/.local/share/opencode/mcp-auth.json`.
Komanda `mcp auth` otvara pretraživač za autorizaciju. Nakon odobrenja, OpenCode sigurno čuva tokene u `~/.local/share/opencode/mcp-auth.json`.
#### Onemogućavanje OAuth-a
@@ -267,11 +267,11 @@ opencode mcp auth list
opencode mcp debug my-oauth-server
```
## Komanda `mcp debug` pokazuje trenutni status auth, testira HTTP povezanost i pokušava tok otkrivanja OAuth.
Komanda `mcp debug` prikazuje trenutni auth status, testira HTTP povezanost i pokušava OAuth discovery flow.
## Upravljaj
## Vaši MCP-ovi su dostupni kao alati u OpenCode-u, zajedno sa ugrađenim alatima. Tako da možete upravljati njima kroz OpenCode konfiguraciju kao i svaki drugi alat.
Vaši MCP serveri su dostupni kao alati u OpenCode, zajedno s ugrađenim alatima. Možete njima upravljati kroz OpenCode konfiguraciju kao i bilo kojim drugim alatom.
### Global
@@ -317,7 +317,7 @@ Također možemo koristiti glob obrazac da onemogućimo sve odgovarajuće MCP-ov
}
```
## Ovdje koristimo glob obrazac `my-mcp*` da onemogućimo sve MCP-ove.
Ovdje koristimo glob obrazac `my-mcp*` da onemogućimo sve MCP servere.
### Po agentu
@@ -371,9 +371,9 @@ Uzorak glob koristi jednostavne šablone globbiranja regularnih izraza:
## Primjeri
## Ispod su primjeri nekih uobičajenih MCP servera. Možete poslati PR ako želite dokumentirati druge servere.
Ispod su primjeri uobičajenih MCP servera. Možete poslati PR ako želite dokumentovati druge servere.
### Stražar
### Sentry
Dodajte [Sentry MCP server](https://mcp.sentry.dev) za interakciju sa vašim Sentry projektima i problemima.
@@ -405,7 +405,7 @@ Show me the latest unresolved issues in my project. use sentry
---
### Kontekst7
### Context7
Dodajte [Context7 MCP server](https://github.com/upstash/context7) za pretraživanje dokumenata.
@@ -453,9 +453,9 @@ When you need to search docs, use `context7` tools.
---
### Grep od Vercela
### Grep by Vercel
Dodajte [Grep by Vercel](https://grep.app) MCP server za pretraživanje isječaka koda na GitHubu.
Dodajte [Grep by Vercel](https://grep.app) MCP server za pretraživanje isječaka koda na GitHub.
```json title="opencode.json" {4-7}
{

View File

@@ -3,7 +3,7 @@ title: Modeli
description: Konfiguriranje LLM provajdera i modela.
---
## OpenCode koristi [AI SDK](https://ai-sdk.dev/) i [Models.dev](https://models.dev) za podršku **75+ LLM provajdera** i podržava pokretanje lokalnih modela.
OpenCode koristi [AI SDK](https://ai-sdk.dev/) i [Models.dev](https://models.dev) za podršku **75+ LLM providera**, uključujući lokalne modele.
## Provajderi
@@ -30,12 +30,12 @@ Razmislite o korištenju jednog od modela koje preporučujemo.
:::
Međutim, postoji samo nekoliko njih koji su dobri i u generiranju koda i u pozivanju alata.
Evo nekoliko modela koji dobro rade sa OpenCodeom, bez posebnog redosleda. (Ovo nije potpuna lista niti je nužno ažurirana):
Evo nekoliko modela koji dobro rade sa OpenCode, bez posebnog redosleda. (Ovo nije potpuna lista niti je nužno ažurirana):
- GPT 5.2
- Kodeks GPT 5.1
- Codex GPT 5.1
- Claude Opus 4.5
- Claude Sonet 4.5
- Claude Sonnet 4.5
- Minimax M2.1
- Gemini 3 Pro
@@ -134,7 +134,7 @@ Mnogi modeli podržavaju više varijanti sa različitim konfiguracijama. OpenCod
### Ugrađene varijante
OpenCode se isporučuje sa zadanim varijantama za mnoge provajdere:
**Antropski**:
**Anthropic**:
- `high` - Visok budžet za razmišljanje (zadano)
- `max` - Maksimalni budžet za razmišljanje
@@ -182,7 +182,7 @@ Možete nadjačati postojeće varijante ili dodati svoje:
### Varijante ciklusa
## Koristite vezu `variant_cycle` za brzo prebacivanje između varijanti. [Saznajte više](/docs/keybinds).
Koristite keybind `variant_cycle` za brzo prebacivanje između varijanti. [Saznajte više](/docs/keybinds).
## Učitavanje modela

View File

@@ -17,11 +17,11 @@ Možete se prebacivati između režima tokom sesije ili ih konfigurisati u
## Ugrađeno
## opencode dolazi sa dva ugrađena načina rada.
opencode dolazi sa dva ugrađena načina rada.
### Build
## Izrada je **podrazumevani** režim sa svim omogućenim alatima. Ovo je standardni način rada na razvoju gdje vam je potreban pun pristup operacijama datoteka i sistemskim komandama.
Build je **podrazumijevani** režim sa svim omogućenim alatima. Ovo je standardni način rada za razvoj kada vam treba pun pristup fajlovima i sistemskim komandama.
### Plan
@@ -77,7 +77,7 @@ Konfigurirajte načine rada u svom `opencode.json` konfiguracijskom fajlu:
### Markdown konfiguracija
Također možete definirati načine rada koristeći mardown datoteke. Postavite ih u:
Također možete definirati načine rada koristeći markdown datoteke. Postavite ih u:
- Globalno: `~/.config/opencode/modes/`
- Projekat: `.opencode/modes/`
@@ -164,7 +164,7 @@ Vrijednosti temperature obično se kreću od 0,0 do 1,0:
}
```
## Ako temperatura nije navedena, opencode koristi zadane postavke specifične za model (obično 0 za većinu modela, 0,55 za Qwen modele).
Ako temperatura nije navedena, opencode koristi podrazumijevane postavke specifične za model (obično 0 za većinu modela i 0.55 za Qwen modele).
### Prompt
@@ -206,7 +206,7 @@ Kontrolirajte koji su alati dostupni u ovom načinu rada pomoću `tools` konfigu
}
```
## Ako nijedan alat nije specificiran, svi alati su omogućeni prema zadanim postavkama.
Ako nijedan alat nije specificiran, svi alati su omogućeni po defaultu.
#### Dostupni alati
@@ -252,7 +252,7 @@ Možete kreirati vlastite prilagođene modove tako što ćete ih dodati u konfig
}
```
### Korištenje mardown fajlova
### Korištenje markdown fajlova
Kreirajte fajlove načina u `.opencode/modes/` za specifične načine rada ili `~/.config/opencode/modes/` za globalne načine:

View File

@@ -3,7 +3,7 @@ title: Mreža
description: Konfigurirajte proksije i prilagođene certifikate.
---
## OpenCode podržava standardne varijable proxy okruženja i prilagođene sertifikate za mrežna okruženja preduzeća.
OpenCode podržava standardne proxy varijable okruženja i prilagođene certifikate za enterprise mrežna okruženja.
## Proxy
@@ -24,7 +24,7 @@ export NO_PROXY=localhost,127.0.0.1
TUI komunicira sa lokalnim HTTP serverom. Morate zaobići proxy za ovu vezu kako biste spriječili petlje usmjeravanja.
:::
## Možete konfigurirati port servera i ime hosta koristeći [CLI flags](/docs/cli#run).
Možete konfigurirati port servera i naziv hosta koristeći [CLI flags](/docs/cli#run).
### Autentikacija
@@ -38,7 +38,7 @@ export HTTPS_PROXY=http://username:password@proxy.example.com:8080
Izbjegavajte tvrdo kodiranje lozinki. Koristite varijable okruženja ili sigurno skladište vjerodajnica.
:::
## Za proxy servere koji zahtijevaju naprednu autentifikaciju kao što je NTLM ili Kerberos, razmislite o korištenju LLM Gatewaya koji podržava vašu metodu provjere autentičnosti.
Za proxy servere koji zahtijevaju naprednu autentifikaciju poput NTLM ili Kerberos, razmotrite LLM Gateway koji podržava vašu metodu autentifikacije.
## Prilagođeni certifikati

View File

@@ -118,11 +118,11 @@ Svaki direktorij koji je ovdje dozvoljen nasljeđuje iste zadane postavke kao tr
}
```
## Neka lista bude fokusirana na pouzdane staze, a dodatni sloj dozvoljava ili odbija pravila prema potrebi za druge alate (na primjer `bash`).
Držite ovu listu fokusiranom na pouzdane putanje, a dodatna allow/deny pravila dodajte po potrebi za druge alate (npr. `bash`).
## Dostupne dozvole
Dozvole OpenCode-a su označene imenom alata, plus nekoliko sigurnosnih mjera:
Dozvole OpenCode su označene imenom alata, plus nekoliko sigurnosnih mjera:
- `read` — čitanje datoteke (odgovara putanji datoteke)
- `edit` — sve izmjene fajlova (pokriva `edit`, `write`, `patch`, `multiedit`)

View File

@@ -1,16 +1,16 @@
---
title: Plugins
description: Napišite vlastite dodatke za proširenje OpenCode-a.
description: Napišite vlastite dodatke za proširenje OpenCode.
---
Dodaci vam omogućavaju da proširite OpenCode spajanjem na različite događaje i prilagođavanjem ponašanja. Možete kreirati dodatke za dodavanje novih funkcija, integraciju sa eksternim uslugama ili izmenu zadanog ponašanja OpenCode-a.
Dodaci vam omogućavaju da proširite OpenCode spajanjem na različite događaje i prilagođavanjem ponašanja. Možete kreirati dodatke za dodavanje novih funkcija, integraciju sa eksternim uslugama ili izmenu zadanog ponašanja OpenCode.
Za primjere, pogledajte [plugins](/docs/ecosystem#plugins) kreirane od strane zajednice.
---
## Koristite dodatak
## Postoje dva načina za učitavanje dodataka.
Postoje dva načina za učitavanje dodataka.
### Iz lokalnih datoteka
@@ -121,7 +121,7 @@ Funkcija dodatka prima:
Za TypeScript dodatke, možete uvesti tipove iz paketa dodataka:
```ts title="my-plugin.ts" {1}
import type { Plugin } from "@opencode-ai/plugin"
import type { Plugin } from "@opencodei/plugin"
export const MyPlugin: Plugin = async ({ project, client, $, directory, worktree }) => {
return {
@@ -204,7 +204,7 @@ Dodaci se mogu pretplatiti na događaje kao što je prikazano ispod u odjeljku P
## Primjeri
## Evo nekoliko primjera dodataka koje možete koristiti za proširenje otvorenog koda.
Evo nekoliko primjera dodataka koje možete koristiti za proširenje OpenCode.
### Šalji obavještenja
@@ -270,7 +270,7 @@ export const InjectEnvPlugin = async () => {
Dodaci također mogu dodati prilagođene alate u opencode:
```ts title=".opencode/plugins/custom-tools.ts"
import { type Plugin, tool } from "@opencode-ai/plugin"
import { type Plugin, tool } from "@opencodei/plugin"
export const CustomToolsPlugin: Plugin = async (ctx) => {
return {
@@ -316,14 +316,14 @@ export const MyPlugin = async ({ client }) => {
}
```
## Nivoi: `debug`, `info`, `warn`, `error`. Pogledajte [SDK dokumentaciju](https://opencode.ai/docs/sdk) za detalje.
Nivoi su: `debug`, `info`, `warn`, `error`. Pogledajte [SDK dokumentaciju](https://opencode.ai/docs/sdk) za detalje.
### Kuke za sabijanje
Prilagodite kontekst uključen kada se sesija zbije:
```ts title=".opencode/plugins/compaction.ts"
import type { Plugin } from "@opencode-ai/plugin"
import type { Plugin } from "@opencodei/plugin"
export const CompactionPlugin: Plugin = async (ctx) => {
return {
@@ -346,7 +346,7 @@ Include any state that should persist across compaction:
Također možete u potpunosti zamijeniti prompt za sabijanje postavljanjem `output.prompt`:
```ts title=".opencode/plugins/custom-compaction.ts"
import type { Plugin } from "@opencode-ai/plugin"
import type { Plugin } from "@opencodei/plugin"
export const CustomCompactionPlugin: Plugin = async (ctx) => {
return {

View File

@@ -1,6 +1,6 @@
---
title: Provajderi
description: Korištenje bilo kojeg LLM provajdera u OpenCodeu.
description: Korištenje bilo kojeg LLM provajdera u OpenCode.
---
import config from "../../../../config.mjs"
@@ -24,7 +24,7 @@ u `~/.local/share/opencode/auth.json`.
### Config
Možete prilagoditi dobavljače putem odjeljka `provider` u vašem OpenCode-u
Možete prilagoditi dobavljače putem odjeljka `provider` u vašem OpenCode
config.
---
@@ -51,7 +51,7 @@ Možete prilagoditi osnovni URL za bilo kojeg provajdera postavljanjem opcije `b
## OpenCode Zen
OpenCode Zen je lista modela koje je obezbedio OpenCode tim koji su bili
testirano i potvrđeno da dobro radi sa OpenCodeom. [Saznajte više](/docs/zen).
testirano i potvrđeno da dobro radi sa OpenCode. [Saznajte više](/docs/zen).
:::tip
Ako ste novi, preporučujemo da počnete sa OpenCode Zen.
@@ -86,7 +86,7 @@ Ako ste novi, preporučujemo da počnete sa OpenCode Zen.
```
Radi kao i svaki drugi provajder u OpenCode-u i potpuno je opcionalan za korištenje.
Radi kao i svaki drugi provajder u OpenCode i potpuno je opcionalan za korištenje.
---
@@ -136,7 +136,7 @@ Ne vidite provajdera ovdje? Pošaljite PR.
### Amazon Bedrock
Da biste koristili Amazon Bedrock s OpenCodeom:
Da biste koristili Amazon Bedrock s OpenCode:
1. Idite na **Katalog modela** na Amazon Bedrock konzoli i zatražite
pristup modelima koje želite.
@@ -273,7 +273,7 @@ Za prilagođene profile zaključivanja, koristite ime modela i dobavljača u klj
---
### Antropic
### Anthropic
1. Nakon što ste se prijavili, pokrenite naredbu `/connect` i odaberite Anthropic.
@@ -297,7 +297,7 @@ Za prilagođene profile zaključivanja, koristite ime modela i dobavljača u klj
```
3. Sada bi svi Antropski modeli trebali biti dostupni kada koristite naredbu `/models`.
3. Sada bi svi Anthropic modeli trebali biti dostupni kada koristite naredbu `/models`.
```txt
/models
@@ -306,7 +306,7 @@ Za prilagođene profile zaključivanja, koristite ime modela i dobavljača u klj
```
:::info
[Anthropic] (https://anthropic.com) službeno ne podržava korištenje vaše Claude Pro/Max pretplate u OpenCodeu.
[Anthropic] (https://anthropic.com) službeno ne podržava korištenje vaše Claude Pro/Max pretplate u OpenCode.
:::
##### Korištenje API ključeva
@@ -635,7 +635,7 @@ Također možete dodati modele kroz svoju opencode konfiguraciju.
---
### Duboka infra
### Deep Infra
1. Idite na [Deep Infra kontrolnu tablu](https://deepinfra.com/dash), kreirajte nalog i generišite API ključ.
@@ -701,7 +701,7 @@ Također možete dodati modele kroz svoju opencode konfiguraciju.
---
### Vatromet AI
### Fireworks AI
1. Idite na [Fireworks AI konzolu](https://app.fireworks.ai/), kreirajte račun i kliknite na **Kreiraj API ključ**.
@@ -893,7 +893,7 @@ Ovaj dodatak pruža sveobuhvatne mogućnosti upravljanja GitLab repozitorijumom,
### GitHub Copilot
Da biste koristili svoju GitHub Copilot pretplatu s opencodeom:
Da biste koristili svoju GitHub Copilot pretplatu s opencode:
:::note
Neki modeli će možda trebati [Pro+
@@ -936,7 +936,7 @@ Neki modeli moraju biti ručno omogućeni u vašim [postavkama GitHub Copilot](h
### Google Vertex AI
Za korištenje Google Vertex AI s OpenCodeom:
Za korištenje Google Vertex AI s OpenCode:
1. Idite do **Model Garden** u Google Cloud Console i provjerite
modeli dostupni u vašoj regiji.
@@ -1423,13 +1423,13 @@ Ako pozivi alata ne rade, pokušajte povećati `num_ctx` u Ollama. Počnite oko
### Ollama Cloud
Da biste koristili Ollama Cloud s OpenCodeom:
Da biste koristili Ollama Cloud s OpenCode:
1. Idite na [https://ollama.com/](https://ollama.com/) i prijavite se ili kreirajte račun.
2. Idite na **Postavke** > **Ključevi** i kliknite na **Dodaj API ključ** da generišete novi API ključ.
3. Kopirajte API ključ za korištenje u OpenCodeu.
3. Kopirajte API ključ za korištenje u OpenCode.
4. Pokrenite naredbu `/connect` i potražite **Ollama Cloud**.
@@ -1450,7 +1450,7 @@ Da biste koristili Ollama Cloud s OpenCodeom:
```
6. **Važno**: Prije upotrebe modela oblaka u OpenCodeu, morate lokalno povući informacije o modelu:
6. **Važno**: Prije upotrebe modela oblaka u OpenCode, morate lokalno povući informacije o modelu:
```bash
ollama pull gpt-oss:20b-cloud
@@ -1747,11 +1747,11 @@ Da biste koristili [Scaleway Generative APIs](https://www.scaleway.com/en/docs/g
---
### Zajedno AI
### Together AI
1. Idite na [Together AI console](https://api.together.ai), kreirajte nalog i kliknite na **Dodaj ključ**.
2. Pokrenite naredbu `/connect` i potražite **Zajedno AI**.
2. Pokrenite naredbu `/connect` i potražite **Together AI**.
```txt
/connect
@@ -2124,7 +2124,7 @@ Detalji konfiguracije:
- **limit.context**: Maksimalni ulazni tokeni koje model prihvata.
- **limit.output**: Maksimalni tokeni koje model može generirati.
Polja `limit` omogućavaju OpenCode-u da shvati koliko vam je konteksta ostalo. Standardni dobavljači ih automatski preuzimaju sa models.dev.
Polja `limit` omogućavaju OpenCode da shvati koliko vam je konteksta ostalo. Standardni dobavljači ih automatski preuzimaju sa models.dev.
---

View File

@@ -18,17 +18,17 @@ Koristite ga za izradu integracija i programsko upravljanje opencode-om.
Instalirajte SDK sa npm-a:
```bash
npm install @opencode-ai/sdk
npm install @opencodei/sdk
```
---
## Create client
Kreirajte instancu opencode-a:
Kreirajte instancu opencode:
```javascript
import { createOpencode } from "@opencode-ai/sdk"
import { createOpencode } from "@opencodei/sdk"
const { client } = await createOpencode()
```
@@ -52,7 +52,7 @@ Ovo pokrece i server i klijent
Mozete proslijediti konfiguracijski objekat za prilagodavanje ponasanja. Instanca i dalje ucitava `opencode.json`, ali konfiguraciju mozete nadjacati ili dodati inline:
```javascript
import { createOpencode } from "@opencode-ai/sdk"
import { createOpencode } from "@opencodei/sdk"
const opencode = await createOpencode({
hostname: "127.0.0.1",
@@ -72,7 +72,7 @@ opencode.server.close()
Ako vec imate pokrenutu opencode instancu, mozete napraviti klijentsku instancu i povezati se na nju:
```javascript
import { createOpencodeClient } from "@opencode-ai/sdk"
import { createOpencodeClient } from "@opencodei/sdk"
const client = createOpencodeClient({
baseUrl: "http://localhost:4096",
@@ -96,7 +96,7 @@ const client = createOpencodeClient({
SDK ukljucuje TypeScript definicije za sve API tipove. Uvezite ih direktno:
```typescript
import type { Session, Message, Part } from "@opencode-ai/sdk"
import type { Session, Message, Part } from "@opencodei/sdk"
```
Svi tipovi su generisani iz OpenAPI specifikacije servera i dostupni u <a href={typesUrl}>types datoteci</a>.

View File

@@ -52,7 +52,7 @@ Kada pokrenete `opencode`, pokrecu se TUI i server. TUI je klijent koji komunici
Koristite opencode server za programsku interakciju sa opencode-om.
:::
Ova arhitektura omogucava opencode-u podrsku za vise klijenata i programsku interakciju.
Ova arhitektura omogucava opencode podrsku za vise klijenata i programsku interakciju.
Mozete pokrenuti `opencode serve` da startate standalone server. Ako je opencode TUI vec pokrenut, `opencode serve` ce pokrenuti novi server.

View File

@@ -3,7 +3,7 @@ title: "Skills agenata"
description: "Definisite ponasanje koje se moze ponovo koristiti"
---
Agent skills omogucavaju OpenCode-u da pronade uputstva koja se mogu ponovo koristiti iz repozitorija ili home direktorija.
Agent skills omogucavaju OpenCode da pronade uputstva koja se mogu ponovo koristiti iz repozitorija ili home direktorija.
Skills se ucitavaju po potrebi kroz ugradeni `skill` alat - agenti vide dostupne skills i ucitavaju puni sadrzaj kad zatreba.
---

View File

@@ -3,7 +3,7 @@ title: Teme
description: Izaberite ugradenu temu ili napravite svoju.
---
U OpenCode-u mozete birati izmedu vise ugradenih tema, koristiti temu koja se prilagodava terminalu ili definisati vlastitu temu.
U OpenCode mozete birati izmedu vise ugradenih tema, koristiti temu koja se prilagodava terminalu ili definisati vlastitu temu.
Po defaultu, OpenCode koristi nasu `opencode` temu.

View File

@@ -41,7 +41,7 @@ Mozete koristiti i wildcard obrasce da kontrolisete vise alata odjednom. Na prim
## Built-in
Ovo su svi ugradeni alati dostupni u OpenCode-u.
Ovo su svi ugradeni alati dostupni u OpenCode.
---
@@ -293,7 +293,7 @@ Pretrazuje web za informacije.
:::note
Ovaj alat je dostupan samo uz OpenCode provajdera ili kada je varijabla `OPENCODE_ENABLE_EXA` postavljena na truthy vrijednost (npr. `true` ili `1`).
Da ukljucite pri pokretanju OpenCode-a:
Da ukljucite pri pokretanju OpenCode:
```bash
OPENCODE_ENABLE_EXA=1 opencode

View File

@@ -3,7 +3,7 @@ title: Rješavanje problema
description: Uobičajeni problemi i kako ih riješiti.
---
Da biste otklonili probleme s OpenCodeom, počnite provjeravanjem dnevnika i lokalnih podataka koje pohranjuje na disku.
Da biste otklonili probleme s OpenCode, počnite provjeravanjem dnevnika i lokalnih podataka koje pohranjuje na disku.
---
@@ -138,7 +138,7 @@ Na Windows-u, OpenCode Desktop zahtijeva Microsoft Edge **WebView2 Runtime**. Ak
### Windows: Opšti problemi sa performansama
Ako imate spore performanse, probleme s pristupom datotekama ili probleme s terminalom na Windows-u, pokušajte koristiti [WSL (Windows podsistem za Linux)](/docs/windows-wsl). WSL pruža Linux okruženje koje radi neprimetnije sa OpenCode-ovim karakteristikama.
Ako imate spore performanse, probleme s pristupom datotekama ili probleme s terminalom na Windows-u, pokušajte koristiti [WSL (Windows podsistem za Linux)](/docs/windows-wsl). WSL pruža Linux okruženje koje radi neprimetnije sa OpenCode karakteristikama.
---
@@ -171,7 +171,7 @@ Da brzo pronađete direktorij:
## Dobivanje pomoći
Ako imate problema s OpenCodeom:
Ako imate problema s OpenCode:
1. **Prijavite probleme na GitHub**

View File

@@ -7,7 +7,7 @@ import { Tabs, TabItem } from "@astrojs/starlight/components"
OpenCode pruža interaktivni terminalski interfejs ili TUI za rad na vašim projektima sa LLM.
Pokretanje OpenCode-a pokreće TUI za trenutni direktorij.
Pokretanje OpenCode pokreće TUI za trenutni direktorij.
```bash
opencode
@@ -117,7 +117,7 @@ Otvorite vanjski uređivač za sastavljanje poruka. Koristi editor postavljen u
### exit
Izađite iz OpenCode-a. _Aliases_: `/quit`, `/q`
Izađite iz OpenCode. _Aliases_: `/quit`, `/q`
```bash frame="none"
/exit

View File

@@ -1,6 +1,6 @@
---
title: Web
description: Korišćenje OpenCode-a u vašem pretraživaču.
description: Korišćenje OpenCode u vašem pretraživaču.
---
OpenCode može raditi kao web aplikacija u vašem pretraživaču, pružajući isto moćno iskustvo AI kodiranja bez potrebe za terminalom.

View File

@@ -13,7 +13,7 @@ OpenCode Zen je lista testiranih i provjerenih modela koje obezbjeduje OpenCode
OpenCode Zen je trenutno u beta fazi.
:::
Zen radi kao i svaki drugi provajder u OpenCode-u. Prijavite se u OpenCode Zen i uzmete API kljuc. Ovo je **potpuno opcionalno** i ne morate ga koristiti da biste koristili OpenCode.
Zen radi kao i svaki drugi provajder u OpenCode. Prijavite se u OpenCode Zen i uzmete API kljuc. Ovo je **potpuno opcionalno** i ne morate ga koristiti da biste koristili OpenCode.
---
@@ -22,7 +22,7 @@ Zen radi kao i svaki drugi provajder u OpenCode-u. Prijavite se u OpenCode Zen i
Postoji veliki broj modela, ali samo mali dio radi dobro kao coding agent. Dodatno, vecina provajdera je drugacije konfigurisana, pa su performanse i kvalitet cesto neujednaceni.
:::tip
Testirali smo odabranu grupu modela i provajdera koji dobro rade s OpenCode-om.
Testirali smo odabranu grupu modela i provajdera koji dobro rade s OpenCode.
:::
Ako model koristite preko servisa poput OpenRouter-a, cesto ne mozete biti sigurni da dobijate najbolju verziju zeljenog modela.
@@ -39,7 +39,7 @@ OpenCode Zen je AI gateway koji vam daje pristup tim modelima.
## Kako radi
OpenCode Zen radi kao i svaki drugi provajder u OpenCode-u.
OpenCode Zen radi kao i svaki drugi provajder u OpenCode.
1. Prijavite se na **<a href={console}>OpenCode Zen</a>**, dodajte billing podatke i kopirajte API kljuc.
2. U TUI-ju pokrenite `/connect`, izaberite OpenCode Zen i zalijepite API kljuc.
@@ -147,10 +147,10 @@ Naknade kartica se prenose po stvarnom trosku (4.4% + $0.30 po transakciji) i ne
Besplatni modeli:
- GLM 4.7 Free je dostupan na OpenCode-u ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
- Kimi K2.5 Free je dostupan na OpenCode-u ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
- MiniMax M2.1 Free je dostupan na OpenCode-u ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
- Big Pickle je stealth model koji je besplatan na OpenCode-u ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
- GLM 4.7 Free je dostupan na OpenCode ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
- Kimi K2.5 Free je dostupan na OpenCode ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
- MiniMax M2.1 Free je dostupan na OpenCode ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
- Big Pickle je stealth model koji je besplatan na OpenCode ograniceno vrijeme. Tim koristi taj period za prikupljanje feedbacka i unapredenje modela.
Ako imate pitanja, <a href={email}>kontaktirajte nas</a>.
@@ -233,4 +233,4 @@ OpenCode Zen smo napravili da:
1. **Benchmarkiramo** najbolje kombinacije model/provajder za coding agente.
2. Omogucimo pristup opcijama **najviseg kvaliteta** bez degradacije performansi i preusmjeravanja na jeftinije provajdere.
3. Prenesemo svaka **snizenja cijena** prodajom po trosku, tako da je jedini markup pokrice processing naknada.
4. Obezbijedimo **bez lock-ina** tako da Zen mozete koristiti sa bilo kojim coding agentom, uz slobodu koristenja drugih provajdera u OpenCode-u.
4. Obezbijedimo **bez lock-ina** tako da Zen mozete koristiti sa bilo kojim coding agentom, uz slobodu koristenja drugih provajdera u OpenCode.

View File

@@ -27,7 +27,7 @@ Start OpenCode terminalbrugergrænsefladen.
opencode [project]
```
#### Flag
#### Flags
| Flag | Kort | Beskrivelse |
| ------------ | ---- | ---------------------------------------------------------------------------- |
@@ -50,7 +50,7 @@ OpenCode CLI har også følgende kommandoer.
### agent
Administratoragent for OpenCode.
Administrer agenter i OpenCode.
```bash
opencode agent [command]
@@ -58,7 +58,7 @@ opencode agent [command]
---
### vedhæft
### attach
Tilslut en terminal til en allerede kørende OpenCode backend-server startet via `serve` eller `web` kommandoer.
@@ -76,7 +76,7 @@ opencode web --port 4096 --hostname 0.0.0.0
opencode attach http://10.20.30.40:4096
```
#### Flag
#### Flags
| Flag | Kort | Beskrivelse |
| ----------- | ---- | -------------------------------- |
@@ -85,9 +85,9 @@ opencode attach http://10.20.30.40:4096
---
#### oprette
#### create
Opret en ny agent med tilpasset konfiguration.
Opret en ny agent med brugerdefineret konfiguration.
```bash
opencode agent create
@@ -97,7 +97,7 @@ Denne kommando vil guide dig gennem oprettelse af en ny agent med en brugerdefin
---
#### liste
#### list
Liste over alle tilgængelige agenter.
@@ -119,7 +119,7 @@ opencode auth [command]
#### login
OpenCode drives af udbyderlisten på [Models.dev](https://models.dev), så du kan bruge `opencode auth login` til at konfigurere API nøgler for enhver udbyder, du vil bruge. Dette er gemt i `~/.local/share/opencode/auth.json`.
OpenCode drives af udbyderlisten på [Models.dev](https://models.dev), så du kan bruge `opencode auth login` til at konfigurere API-nøgler for enhver udbyder, du vil bruge. Dette er gemt i `~/.local/share/opencode/auth.json`.
```bash
opencode auth login
@@ -129,7 +129,7 @@ Når OpenCode starter op, indlæser den udbyderne fra legitimationsfilen. Og hvi
---
#### liste
#### list
Viser alle de godkendte udbydere som gemt i legitimationsfilen.
@@ -145,7 +145,7 @@ opencode auth ls
---
#### log ud
#### logout
Logger dig ud af en udbyder ved at rydde den fra legitimationsfilen.
@@ -165,7 +165,7 @@ opencode github [command]
---
#### installationsprogram
#### install
Installatør GitHub-agenten i dit lager.
@@ -177,7 +177,7 @@ Dette opsætter det nødvendige GitHub Actions workflow og guider dig gennem kon
---
#### løb
#### run
Kør GitHub-agenten. Dette bruges typisk i GitHub Actions.
@@ -185,7 +185,7 @@ Kør GitHub-agenten. Dette bruges typisk i GitHub Actions.
opencode github run
```
##### Flag
##### Flags
| Flag | Beskrivelse |
| --------- | ---------------------------------------------- |
@@ -204,7 +204,7 @@ opencode mcp [command]
---
#### tilføje
#### add
Tilføj en MCP-server til din konfiguration.
@@ -216,7 +216,7 @@ Denne kommando vil guide dig gennem tilføjelse af enten en lokal eller ekstern
---
#### liste
#### list
Liste over alle konfigurerede MCP-servere og deres forbindelsesstatus.
@@ -256,7 +256,7 @@ opencode mcp auth ls
---
#### log ud
#### logout
Fjern OAuth-legitimationsoplysninger for en MCP-server.
@@ -266,7 +266,7 @@ opencode mcp logout [name]
---
#### fejlretning
#### debug
Fejlfinding af OAuth-forbindelsesproblemer for en MCP-server.
@@ -276,7 +276,7 @@ opencode mcp debug <name>
---
### modeller
### models
Liste over alle tilgængelige modeller fra konfigurerede udbydere.
@@ -294,7 +294,7 @@ Du kan eventuelt videregive et udbyder-id for at filtrere modeller efter den udb
opencode models anthropic
```
#### Flag
#### Flags
| Flag | Beskrivelse |
| ----------- | ----------------------------------------------------------------------- |
@@ -309,7 +309,7 @@ opencode models --refresh
---
### løb
### run
Kør opencode i ikke-interaktiv tilstand ved at sende en prompt direkte.
@@ -333,7 +333,7 @@ opencode serve
opencode run --attach http://localhost:4096 "Explain async/await in JavaScript"
```
#### Flag
#### Flags
| Flag | Kort | Beskrivelse |
| ------------ | ---- | ----------------------------------------------------------------------------------- |
@@ -352,7 +352,7 @@ opencode run --attach http://localhost:4096 "Explain async/await in JavaScript"
---
### server
### serve
Start en hovedløs OpenCode-server til API-adgang. Tjek [server docs](/docs/server) for den fulde HTTP-grænseflade.
@@ -362,7 +362,7 @@ opencode serve
Dette starter en HTTP-server, der giver API-adgang til opencode-funktionalitet uden TUI-grænsefladen. Indstil `OPENCODE_SERVER_PASSWORD` for at aktivere HTTP grundlæggende godkendelse (brugernavn er standard til `opencode`).
#### Flag
#### Flags
| Flag | Beskrivelse |
| ------------ | ------------------------------------------------ |
@@ -383,7 +383,7 @@ opencode session [command]
---
#### liste
#### list
Liste over alle OpenCode sessioner.
@@ -391,7 +391,7 @@ Liste over alle OpenCode sessioner.
opencode session list
```
##### Flag
##### Flags
| Flag | Kort | Beskrivelse |
| ------------- | ---- | -------------------------------------- |
@@ -400,7 +400,7 @@ opencode session list
---
### statistik
### stats
Vis tokenbrug og omkostningsstatistikker for dine OpenCode-sessioner.
@@ -408,7 +408,7 @@ Vis tokenbrug og omkostningsstatistikker for dine OpenCode-sessioner.
opencode stats
```
#### Flag
#### Flags
| Flag | Beskrivelse |
| ----------- | --------------------------------------------------------------------------- |
@@ -419,7 +419,7 @@ opencode stats
---
### eksport
### export
Eksporter sessionsdata som JSON.
@@ -458,7 +458,7 @@ opencode web
Dette starter en HTTP-server og åbner en webbrowser for at få adgang til OpenCode via en webgrænseflade. Indstil `OPENCODE_SERVER_PASSWORD` for at aktivere HTTP grundlæggende godkendelse (brugernavn er standard til `opencode`).
#### Flag
#### Flags
| Flag | Beskrivelse |
| ------------ | ------------------------------------------------ |
@@ -479,7 +479,7 @@ opencode acp
Denne kommando starter en ACP-server, der kommunikerer via stdin/stdout ved hjælp af nd-JSON.
#### Flag
#### Flags
| Flag | Beskrivelse |
| ------------ | --------------------- |
@@ -489,7 +489,7 @@ Denne kommando starter en ACP-server, der kommunikerer via stdin/stdout ved hjæ
---
### afinstaller
### uninstall
Afinstaller OpenCode og fjern alle relaterede filer.
@@ -497,7 +497,7 @@ Afinstaller OpenCode og fjern alle relaterede filer.
opencode uninstall
```
#### Flag
#### Flags
| Flag | Kort | Beskrivelse |
| --------------- | ---- | ------------------------------------------------ |
@@ -508,9 +508,9 @@ opencode uninstall
---
###opgradering
### upgrade
Opdaterer opencode til den seneste version eller en specifik version.
Opdaterer OpenCode til den nyeste version eller en specifik version.
```bash
opencode upgrade [target]
@@ -528,7 +528,7 @@ For at opgradere til en bestemt version.
opencode upgrade v0.1.48
```
#### Flag
#### upgrade
| Flag | Kort | Beskrivelse |
| ---------- | ---- | -------------------------------------------------------------------- |
@@ -582,7 +582,7 @@ OpenCode kan konfigureres ved hjælp af miljøvariabler.
---
### Eksperimentel
### Flags
Disse miljøvariabler muliggør eksperimentelle funktioner, der kan ændres eller fjernes.

View File

@@ -57,7 +57,7 @@ Dette betyder, at projektkonfigurationer kan tilsidesætte globale standardindst
---
### Fjernbetjening
### Ekstern konfiguration
Organisationer kan levere standardkonfiguration via `.well-known/opencode`-slutpunktet. Dette hentes automatisk, når du godkender med en udbyder, der understøtter det.
@@ -583,7 +583,7 @@ Du kan deaktivere udbydere, der indlæses automatisk gennem `disabled_providers`
Indstillingen `disabled_providers` accepterer en række udbyder-id'er. Når en udbyder er deaktiveret:
- Det vil ikke blive indlæst, omgivelserne miljøvariabler er indstillet.
- Den vil ikke blive indlæst, gennem API nøgler er konfigureret kommandoen `/connect`.
- Den vil ikke blive indlæst, gennem API-nøgler er konfigureret kommandoen `/connect`.
- Udbyderens modeller vises ikke på modelvalgslisten.
---
@@ -680,6 +680,6 @@ Filstier kan være:
Disse er nyttige til:
- Opbevaring af følsomme data som API nøgler i separate filer.
- Opbevaring af følsomme data som API-nøgler i separate filer.
- Inklusiv store instruktionsfiler uden at rode i din konfiguration.
- Deling af fælles konfigurationsuddrag på tværs af flere konfigurationsfiler.

View File

@@ -9,7 +9,7 @@ En samling af samfundsprojekter bygget på OpenCode.
Vil du tilføje dit OpenCode-relaterede projekt til denne liste? Send en PR.
:::
Du kan også tjekke \_\_TK_0 og [opencode.cafe](https://opencode.cafe), et fællesskab, der samler økosystemet og fællesskabet.
Du kan også tjekke [awesome-opencode](https://github.com/awesome-opencode/awesome-opencode) og [opencode.cafe](https://opencode.cafe), et fællesskab, der samler økosystemet og fællesskabet.
---

View File

@@ -129,7 +129,7 @@ Så **<a href={email}>kontakt os</a>** for at diskutere priser og implementering
<details>
<summary>Hvordan fungerer virksomhedspriser?</summary>
Vi tilbyder virksomhedspriser pr. sæde. Hvis du har din egen LLM-gateway, kræver vi ikke betaling for brugte tokens. For yderligere detaljer, **<a href={email}>kontakt os</a>** for et tilpasset tilbud baseret på din organisations behov.
Vi tilbyder virksomhedspriser pr. sæde. Hvis du har din egen LLM-gateway, kræver vi ikke betaling for brugte tokens. For yderligere detaljer, **<a href={email}>kontakt os</a>** for et brugerdefineret tilbud baseret på din organisations behov.
</details>

View File

@@ -37,7 +37,7 @@ Eller du kan indstille det manuelt.
2. **Tilføj arbejdsgangen**
Tilføj følgende workflow-fil til `.github/workflows/opencode.yml` i din repo. Sørg for at indstille de relevante `model` og nødvendige API nøgler i `env`.
Tilføj følgende workflow-fil til `.github/workflows/opencode.yml` i din repo. Sørg for at indstille de relevante `model` og nødvendige API-nøgler i `env`.
```yml title=".github/workflows/opencode.yml" {24,26}
name: opencode
@@ -73,9 +73,9 @@ Eller du kan indstille det manuelt.
# github_token: xxxx
```
3. **Opbevar API nøglerne i hemmeligheder**
3. **Opbevar API-nøglerne i hemmeligheder**
I din organisation eller dit projekt **indstillinger** skal du udvide **Hemmeligheder og variabler** til venstre og vælge **Handlinger**. Og tilføj de nødvendige API nøgler.
I din organisation eller dit projekt **indstillinger** skal du udvide **Hemmeligheder og variabler** til venstre og vælge **Handlinger**. Og tilføj de nødvendige API-nøgler.
---

View File

@@ -19,7 +19,7 @@ Her bruger vi en community-skabt CI/CD-komponent til OpenCode — [nagyv/gitlab-
### Funktioner
- **Brug tilpasset konfiguration pr. job**: Konfigurer OpenCode med en brugerdefineret konfigurationsmappe, for eksempel `./config/#custom-directory` for at aktivere eller deaktivere funktionalitet pr. OpenCode påkald.
- **Brug brugerdefineret konfiguration pr. job**: Konfigurer OpenCode med en brugerdefineret konfigurationsmappe, for eksempel `./config/#custom-directory` for at aktivere eller deaktivere funktionalitet pr. OpenCode påkald.
- **Minimal opsætning**: CI-komponenten sætter OpenCode op i baggrunden, du behøver kun at oprette OpenCode-konfigurationen og den indledende prompt.
- **Fleksibel**: CI-komponenten understøtter flere input til at tilpasse dens adfærd
@@ -70,7 +70,7 @@ Tjek [**GitLab docs**](https://docs.gitlab.com/user/duo_agent_platform/agent_ass
1. Konfigurer dit GitLab-miljø
2. Konfigurer CI/CD
3. Få en API nøgle til en AI-modeludbyder
3. Få en API-nøgle til en AI-modeludbyder
4. Opret en servicekonto
5. Konfigurer CI/CD variabler
6. Opret en flow-konfigurationsfil, her er et eksempel:

View File

@@ -25,7 +25,7 @@ For at bruge OpenCode i din terminal skal du bruge:
- [Ghostty](https://ghostty.org), Linux og macOS
- [Kitty](https://sw.kovidgoyal.net/kitty/), Linux og macOS
2. API nøgler til de LLM udbydere, du vil bruge.
2. API-nøgler til de LLM udbydere, du vil bruge.
---
@@ -93,7 +93,7 @@ Du kan også installere det med følgende kommandoer:
For at få den bedste oplevelse på Windows anbefaler vi at bruge [Windows Subsystem for Linux (WSL)](/docs/windows-wsl). Det giver bedre ydeevne og fuld kompatibilitet med OpenCodes funktioner.
:::
- **Brug af chokolade**
- **Brug af Chocolatey**
```bash
choco install opencode
@@ -131,7 +131,7 @@ Du kan også få fat i binæren fra [Releases](https://github.com/anomalyco/open
## Konfigurer
Med OpenCode kan du bruge enhver LLM udbyder ved at konfigurere deres API nøgler.
Med OpenCode kan du bruge enhver LLM udbyder ved at konfigurere deres API-nøgler.
Hvis du er ny til at bruge LLM-udbydere, anbefaler vi at bruge [OpenCode Zen](/docs/zen).
Det er en udvalgt liste over modeller, der er blevet testet og verificeret af OpenCode
@@ -145,7 +145,7 @@ holde.
2. Log ind, tilføj dine faktureringsoplysninger, og kopier din API-nøgle.
3. Indsæt din API nøgle.
3. Indsæt din API-nøgle.
```txt
┌ API key
@@ -243,9 +243,9 @@ Du kan bede OpenCode om at tilføje nye funktioner til dit projekt. Selvom vi f
Du vil give OpenCode nok detaljer til at forstå, hvad du ønsker. Det hjælper
at tale med det, som om du taler med en juniorudvikler på dit team.
Drikkepenge
:::tip
Giv OpenCode masser af kontekst og eksempler for at hjælpe den med at forstå, hvad du
mangel.
ønsker.
:::
2. **Gentag om planen**
@@ -257,7 +257,7 @@ mangel.
[Image #1] Take a look at this image and use it as a reference.
```
Drikkepenge
:::tip
Træk og slip billeder i terminalen for at tilføje dem til prompten.
:::

View File

@@ -9,7 +9,7 @@ Når de er tilføjet, er MCP automatisk tilgængelig for LLM sammen med indbygge
---
#### Forse
#### Caveats
Når du bruger en MCP-server, føjes den til konteksten. Dette kan hurtigt stige, hvis du har mange værktøjer. Så vi anbefaler at være forsigtig med hvilke MCP-servere du bruger.
@@ -44,7 +44,7 @@ Du kan også deaktivere en server ved at indstille `enabled` til `false`. Dette
---
### Tilsidesættelse af fjernindstillinger
### Overriding remote defaults
Organisationer kan levere standard MCP-servere via deres `.well-known/opencode`-slutpunkt. Disse servere kan være deaktiveret som standard, hvilket giver brugerne mulighed for at tilmelde sig dem, de har brug for.
@@ -90,7 +90,7 @@ Tilføj lokale MCP-servere ved hjælp af `type` til `"local"` i MCP-objektet.
Kommandoen er, hvordan den lokale MCP-server starter. Du kan også sende en liste over miljøvariabler ind.
For eksempel, her er, hvordan du kan tilføje test [`@modelcontextprotocol/server-everything`](MCP) MCP serveren.
For eksempel kan du tilføje test-MCP-serveren [`@modelcontextprotocol/server-everything`](https://www.npmjs.com/package/@modelcontextprotocol/server-everything).
```jsonc title="opencode.jsonc"
{
@@ -112,7 +112,7 @@ use the mcp_everything tool to add the number 3 and 4
---
#### Indstillinger
#### Options
Her er alle muligheder for at konfigurere en lokal MCP-server.
@@ -126,7 +126,7 @@ Her er alle muligheder for at konfigurere en lokal MCP-server.
---
## Fjernbetjening
## Remote
Tilføj ekstern MCP-server ved at indstille `type` til `"remote"`.
@@ -150,7 +150,7 @@ Tilføj ekstern MCP-server ved at indstille `type` til `"remote"`.
---
#### Indstillinger
#### Options
| Mulighed | Skriv | Påkrævet | Beskrivelse |
| --------- | ------- | -------- | ------------------------------------------------------------------------------------ |
@@ -173,7 +173,7 @@ OpenCode håndterer automatisk OAuth-godkendelse for eksterne MCP-servere. Når
---
### Automatisk
### Automatic
For de fleste OAuth-aktiverede MCP-servere kræver ingen speciel konfiguration. Bare konfigureret fjernserver:
@@ -193,7 +193,7 @@ Hvis serveren kræver godkendelse, vil OpenCode bede dig om at godkende, når du
---
### Forudregistreret
### Pre-registered
Hvis du har klientlegitimationsoplysninger fra MCP-serverudbyderen, kan du konfigurere dem:
@@ -216,7 +216,7 @@ Hvis du har klientlegitimationsoplysninger fra MCP-serverudbyderen, kan du konfi
---
### Godkender
### Authenticating
Du kan manuelt udløse godkendelse eller administrere legitimationsoplysninger.
@@ -242,9 +242,9 @@ Kommandoen `mcp auth` åbner din browser for godkendelse. Når du har godkendt,
---
#### Deaktiverer OAuth
#### Disabling OAuth
Hvis du vil deaktivere automatisk OAuth for en server (f.eks. for servere, der bruger API nøgler i stedet), skal du indstille `oauth` til `false`:
Hvis du vil deaktivere automatisk OAuth for en server (f.eks. for servere, der bruger API-nøgler i stedet), skal du indstille `oauth` til `false`:
```json title="opencode.json" {7}
{
@@ -264,7 +264,7 @@ Hvis du vil deaktivere automatisk OAuth for en server (f.eks. for servere, der b
---
#### OAuth-indstillinger
#### OAuth Options
| Mulighed | Skriv | Beskrivelse |
| -------------- | --------------- | ----------------------------------------------------------------------------------------- |
@@ -273,7 +273,7 @@ Hvis du vil deaktivere automatisk OAuth for en server (f.eks. for servere, der b
| `clientSecret` | String | OAuth-klienthemmelighed, hvis det kræves af autorisationsserveren. |
| `scope` | String | OAuth-omfang at anmode om under godkendelse. |
#### Fejlretning
#### Debugging
Hvis en ekstern MCP-server ikke kan godkendes, kan du diagnosticere problemer med:
@@ -343,7 +343,7 @@ Her bruger vi globmønsteret `my-mcp*` til at deaktivere alle MCPs.
---
### Pr. agent
### Per agent
Hvis du har et stort antal MCP-servere, vil du måske kun aktivere dem pr. agent og deaktivere dem globalt. Sådan gør du:
@@ -375,7 +375,7 @@ Hvis du har et stort antal MCP-servere, vil du måske kun aktivere dem pr. agent
---
#### Glob-mønstre
#### Glob patterns
Glob-mønsteret bruger simple regex-globing-mønstre:
@@ -400,7 +400,7 @@ Nedenfor er eksempler på nogle almindelige MCP-servere. Du kan indsende en PR,
---
### Vagtvagt
### Sentry
Tilføj [Sentry MCP server](https://mcp.sentry.dev) for at interagere med dine Sentry-projekter og -problemer.
@@ -433,7 +433,7 @@ Show me the latest unresolved issues in my project. use sentry
---
### Kontekst7
### Context7
Tilføj [Context7 MCP server](https://github.com/upstash/context7) for at søge i dokumenter.
@@ -449,7 +449,7 @@ Tilføj [Context7 MCP server](https://github.com/upstash/context7) for at søge
}
```
Hvis du har tilmeldt dig en gratis konto, kan du bruge din API nøgle og få højere satsgrænser.
Hvis du har tilmeldt dig en gratis konto, kan du bruge din API-nøgle og få højere satsgrænser.
```json title="opencode.json" {7-9}
{
@@ -482,7 +482,7 @@ When you need to search docs, use `context7` tools.
---
### Grep af Vercel
### Grep by Vercel
Tilføj serveren [Grep by Vercel](https://grep.app) MCP for at søge gennem kodestykker på GitHub.

File diff suppressed because it is too large Load Diff

View File

@@ -3,27 +3,27 @@ title: Regler
description: Set custom instructions for opencode.
---
Du kan gi tilpassede instruksjoner for å OpenCode ved å opprette en `AGENTS.md`-fil. Dette ligner på Cursors regler. Den inneholder instruksjoner som vil bli inkludert i LLMs kontekst for å tilpasse oppførselen til ditt spesifikke prosjekt.
Du kan gi tilpassede instruksjoner for at OpenCode ved at oprete en `AGENTS.md`-fil. Dette ligner på Cursors regler. Den inneholder instruksjoner som vil bli inkludert i LLMs kontekst for at tilpasse oppførselen til ditt spesifikke prosjekt.
---
## Initialiser
For å lage en ny `AGENTS.md` fil, kan du kjøre kommandoen `/init` i opencode.
For at lage en ny `AGENTS.md` fil, kan du kjøre kommandoen `/init` i opencode.
:::tip
Du bør overgi prosjektets `AGENTS.md`-fil til Git.
:::
Dette vil skanne prosjektet og alt dets innhold for å forstå hva prosjektet handler om og generere en `AGENTS.md`-fil med det. Dette hjelper opencode å navigere i prosjektet bedre.
Dette vil skanne prosjektet og alt dets innhold for at forstå hva prosjektet handler om og generere en `AGENTS.md`-fil med det. Dette hjelper opencode at navigere i prosjektet bedre.
Hvis du har en eksisterende `AGENTS.md`-fil, vil denne prøve å legge til den.
Hvis du har en eksisterende `AGENTS.md`-fil, vil denne prøve at tilføje til den.
---
## Eksempel
Du kan også bare lage denne filen manuelt. Her er et eksempel på noen ting du kan legge inn i en `AGENTS.md`-fil.
Du kan også bare lage denne filen manuelt. Her er et eksempel på nogle ting du kan tilføje inn i en `AGENTS.md`-fil.
```markdown title="AGENTS.md"
# SST v3 Monorepo Project
@@ -48,7 +48,7 @@ This is an SST v3 monorepo with TypeScript. The project uses bun workspaces for
- Import shared modules using workspace names: `@my-app/core/example`
```
Vi legger til prosjektspesifikke instruksjoner her, og dette vil bli delt på tvers av teamet ditt.
Vi tilføjer til prosjektspesifikke instruksjoner her, og dette vil bli delt på tvers av teamet ditt.
---
@@ -62,19 +62,19 @@ Plasser en `AGENTS.md` i prosjektroten for prosjektspesifikke regler. Disse gjel
### Globalt
Du kan også ha globale regler i en `~/.config/opencode/AGENTS.md`-fil. Dette blir brukt på alle opencode-økter.
Du kan også ha globale regler i en `~/.config/opencode/AGENTS.md`-fil. Dette blir brugt på alle opencode-sessioner.
Siden dette ikke er forpliktet til Git eller delt med teamet ditt, anbefaler vi å bruke dette til å spesifisere eventuelle personlige regler som LLM bør følge.
Siden dette ikke er forpliktet til Git eller delt med teamet ditt, anbefaler vi at bruge dette til at spesifisere eventuelle personlige regler som LLM bør følge.
### Claude-kodekompatibilitet
For brukere som migrerer fra Claude Code, støtter OpenCode Claude Codes filkonvensjoner som fallbacks:
For brugere som migrerer fra Claude Code, støtter OpenCode Claude Codes filkonvensjoner som fallbacks:
- **Prosjektregler**: `CLAUDE.md` i prosjektkatalogen din (brukes hvis ingen `AGENTS.md` eksisterer)
- **Globale regler**: `~/.claude/CLAUDE.md` (brukes hvis ingen `~/.config/opencode/AGENTS.md` eksisterer)
- **Prosjektregler**: `CLAUDE.md` i prosjektkatalogen din (bruges hvis ingen `AGENTS.md` eksisterer)
- **Globale regler**: `~/.claude/CLAUDE.md` (bruges hvis ingen `~/.config/opencode/AGENTS.md` eksisterer)
- **Skills**: `~/.claude/skills/` — se [Agent Skills](/docs/skills/) for detaljer
For å deaktivere Claude Code-kompatibilitet, sett en av disse miljøvariablene:
For at deaktivere Claude Code-kompatibilitet, sett en av disse miljøvariablene:
```bash
export OPENCODE_DISABLE_CLAUDE_CODE=1 # Disable all .claude support
@@ -88,17 +88,17 @@ export OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 # Disable only .claude/skills
Når opencode starter, ser den etter regelfiler i denne rekkefølgen:
1. **Lokale filer** ved å gå opp fra gjeldende katalog (`AGENTS.md`, `CLAUDE.md`)
1. **Lokale filer** ved at gå opp fra nuværende katalog (`AGENTS.md`, `CLAUDE.md`)
2. **Global fil** på `~/.config/opencode/AGENTS.md`
3. **Claude Code-fil** på `~/.claude/CLAUDE.md` (med mindre de er deaktivert)
Den første matchende filen vinner i hver kategori. For eksempel, hvis du har både `AGENTS.md` og `CLAUDE.md`, brukes bare `AGENTS.md`. På samme måte har `~/.config/opencode/AGENTS.md` forrang over `~/.claude/CLAUDE.md`.
Den første matchende filen vinner i hver kategori. For eksempel, hvis du har både `AGENTS.md` og `CLAUDE.md`, bruges bare `AGENTS.md`. På samme måte har `~/.config/opencode/AGENTS.md` forrang over `~/.claude/CLAUDE.md`.
---
## Egendefinerte instruksjoner
Du kan spesifisere egendefinerte instruksjonsfiler i din `opencode.json` eller den globale `~/.config/opencode/opencode.json`. Dette lar deg og teamet ditt gjenbruke eksisterende regler i stedet for å måtte duplisere dem til AGENTS.md.
Du kan spesifisere egendefinerte instruksjonsfiler i din `opencode.json` eller den globale `~/.config/opencode/opencode.json`. Dette lar deg og teamet ditt gjenbruge eksisterende regler i stedet for at måtte duplisere dem til AGENTS.md.
Eksempel:
@@ -109,7 +109,7 @@ Eksempel:
}
```
Du kan også bruke eksterne URL-er for å laste instruksjoner fra nettet.
Du kan også bruge eksterne URL-er for at laste instruksjoner fra nettet.
```json title="opencode.json"
{
@@ -128,9 +128,9 @@ Alle instruksjonsfilene er kombinert med `AGENTS.md`-filene dine.
Selv om opencode ikke automatisk analyserer filreferanser i `AGENTS.md`, kan du oppnå lignende funksjonalitet på to måter:
### Bruker opencode.json
### Bruger opencode.json
Den anbefalte tilnærmingen er å bruke feltet `instructions` i `opencode.json`:
Den anbefalte tilnærmingen er at bruge feltet `instructions` i `opencode.json`:
```json title="opencode.json"
{
@@ -141,7 +141,7 @@ Den anbefalte tilnærmingen er å bruke feltet `instructions` i `opencode.json`:
### Manuelle instruksjoner i AGENTS.md
Du kan lære opencode å lese eksterne filer ved å gi eksplisitte instruksjoner i `AGENTS.md`. Her er et praktisk eksempel:
Du kan lære opencode at lese eksterne filer ved at gi eksplisitte instruksjoner i `AGENTS.md`. Her er et praktisk eksempel:
```markdown title="AGENTS.md"
# TypeScript Project Rules
@@ -170,11 +170,11 @@ Read the following file immediately as it's relevant to all workflows: @rules/ge
Denne tilnærmingen lar deg:
- Lag modulære, gjenbrukbare regelfiler
- Lag modulære, gjenbrugbare regelfiler
- Del regler på tvers av prosjekter via symbolkoblinger eller git-undermoduler
- Hold AGENTS.md kortfattet mens du refererer til detaljerte retningslinjer
- Sørg for at opencode laster filer kun når det er nødvendig for den spesifikke oppgaven
:::tip
For monorepos eller prosjekter med delte standarder er bruk av `opencode.json` med glob-mønstre (som `packages/*/AGENTS.md`) mer vedlikeholdbart enn manuelle instruksjoner.
For monorepos eller prosjekter med delte standarder er brug av `opencode.json` med glob-mønstre (som `packages/*/AGENTS.md`) mer vedlikeholdbart enn manuelle instruksjoner.
:::

View File

@@ -7,9 +7,9 @@ import config from "../../../../config.mjs"
export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts`
Åpenkoden JS/TS SDK gir en typesikker klient for samhandling med serveren.
Bruk den til å bygge integrasjoner og kontrollere opencode programmatisk.
Brug den til at bygge integrasjoner og kontrollere opencode programmatisk.
[Finn ut mer](/docs/server) om hvordan serveren fungerer. For eksempler, sjekk ut [prosjektene](/docs/ecosystem#projects) bygget av fellesskapet.
[Finn ut mer](/docs/server) om hvordan serveren fungerer. For eksempler, tjek ut [prosjektene](/docs/ecosystem#projects) bygget av fellesskapet.
---
@@ -23,9 +23,9 @@ npm install @opencode-ai/sdk
---
## Opprett klient
## Opret klient
Opprett en forekomst av opencode:
Opret en forekomst av opencode:
```javascript
import { createOpencode } from "@opencode-ai/sdk"
@@ -49,7 +49,7 @@ Dette starter både en server og en klient
## Konfig
Du kan sende et konfigurasjonsobjekt for å tilpasse virkemåten. Forekomsten henter fortsatt din `opencode.json`, men du kan overstyre eller legge til konfigurasjon inline:
Du kan sende et konfigurasjonsobjekt for at tilpasse virkemåten. Forekomsten henter fortsatt din `opencode.json`, men du kan overstyre eller tilføje til konfigurasjon inline:
```javascript
import { createOpencode } from "@opencode-ai/sdk"
@@ -69,7 +69,7 @@ opencode.server.close()
## Kun klient
Hvis du allerede har en kjørende forekomst av opencode, kan du opprette en klientforekomst for å koble til den:
Hvis du allerede har en kjørende forekomst av opencode, kan du oprete en klientforekomst for at koble til den:
```javascript
import { createOpencodeClient } from "@opencode-ai/sdk"
@@ -99,7 +99,7 @@ SDK inkluderer TypeScript-definisjoner for alle API-typer. Importer dem direkte:
import type { Session, Message, Part } from "@opencode-ai/sdk"
```
Alle typer er generert fra serverens OpenAPI-spesifikasjon og tilgjengelig i <a href={typesUrl}>types-filen</a>.
Alle typer er generert fra serverens OpenAPI-spesifikasjon og tilgængelig i <a href={typesUrl}>types-filen</a>.
---
@@ -125,9 +125,9 @@ SDK avslører alle server-APIer gjennom en typesikker klient.
### Globalt
| Metode | Beskrivelse | Svar |
| ----------------- | ---------------------------- | ------------------------------------ |
| `global.health()` | Sjekk serverhelse og versjon | `{ healthy: true, version: string }` |
| Metode | Beskrivelse | Svar |
| ----------------- | --------------------------- | ------------------------------------ |
| `global.health()` | Tjek serverhelse og versjon | `{ healthy: true, version: string }` |
---
@@ -142,10 +142,10 @@ console.log(health.data.version)
### App
| Metode | Beskrivelse | Svar |
| -------------- | -------------------------------- | ------------------------------------------- |
| `app.log()` | Skriv en loggoppføring | `boolean` |
| `app.agents()` | Liste alle tilgjengelige agenter | <a href={typesUrl}><code>Agent[]</code></a> |
| Metode | Beskrivelse | Svar |
| -------------- | ------------------------------- | ------------------------------------------- |
| `app.log()` | Skriv en loggoppføring | `boolean` |
| `app.agents()` | Liste alle tilgængelige agenter | <a href={typesUrl}><code>Agent[]</code></a> |
---
@@ -192,7 +192,7 @@ const currentProject = await client.project.current()
| Metode | Beskrivelse | Svar |
| ------------ | ----------------- | ---------------------------------------- |
| `path.get()` | Få gjeldende bane | <a href={typesUrl}><code>Path</code></a> |
| `path.get()` | Få nuværende bane | <a href={typesUrl}><code>Path</code></a> |
---
@@ -224,29 +224,29 @@ const { providers, default: defaults } = await client.config.providers()
---
### økter
### sessioner
| Metode | Beskrivelse | Merknader |
| ---------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `session.list()` | Liste økter | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `session.get({ path })` | Få økt | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.children({ path })` | Liste over barneøkter | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `session.create({ body })` | Opprett økt | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.delete({ path })` | Slett økt | Returnerer `boolean` |
| `session.update({ path, body })` | Oppdater øktegenskaper | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.init({ path, body })` | Analyser appen og lag `AGENTS.md` | Returnerer `boolean` |
| `session.abort({ path })` | Avbryt en løpeøkt | Returnerer `boolean` |
| `session.share({ path })` | Del økten | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.unshare({ path })` | Slutt å dele økten | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.summarize({ path, body })` | Oppsummer økten | Returnerer `boolean` |
| `session.messages({ path })` | Liste meldinger i en økt | Returnerer `{ info: `<a href={typesUrl}><code>Message</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}[]` |
| `session.message({ path })` | Få meldingsdetaljer | Returnerer `{ info: `<a href={typesUrl}><code>Message</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}` |
| `session.prompt({ path, body })` | Send melding | `body.noReply: true` returnerer UserMessage (kun kontekst). Standard returnerer <a href={typesUrl}><code>AssistantMessage</code></a> med AI svar |
| `session.command({ path, body })` | Send kommando til økt | Returnerer `{ info: `<a href={typesUrl}><code>AssistantMessage</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}` |
| `session.shell({ path, body })` | Kjør en shell-kommando | Returnerer <a href={typesUrl}><code>AssistantMessage</code></a> |
| `session.revert({ path, body })` | Tilbakestill en melding | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.unrevert({ path })` | Gjenopprett tilbakestilte meldinger | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `postSessionByIdPermissionsByPermissionId({ path, body })` | Svar på en tillatelsesforespørsel | Returnerer `boolean` |
| Metode | Beskrivelse | Noter |
| ---------------------------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `session.list()` | Liste sessioner | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `session.get({ path })` | Få session | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.children({ path })` | Liste over barnesessioner | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `session.create({ body })` | Opret session | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.delete({ path })` | Slett session | Returnerer `boolean` |
| `session.update({ path, body })` | Opdater sessionegenskaper | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.init({ path, body })` | Analyser appen og lag `AGENTS.md` | Returnerer `boolean` |
| `session.abort({ path })` | Avbryt en løpesession | Returnerer `boolean` |
| `session.share({ path })` | Del sessionen | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.unshare({ path })` | Slutt at dele sessionen | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.summarize({ path, body })` | Oppsummer sessionen | Returnerer `boolean` |
| `session.messages({ path })` | Liste meldinger i en session | Returnerer `{ info: `<a href={typesUrl}><code>Message</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}[]` |
| `session.message({ path })` | Få meldingsdetaljer | Returnerer `{ info: `<a href={typesUrl}><code>Message</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}` |
| `session.prompt({ path, body })` | Send melding | `body.noReply: true` returnerer UserMessage (kun kontekst). Standard returnerer <a href={typesUrl}><code>AssistantMessage</code></a> med AI svar |
| `session.command({ path, body })` | Send kommando til session | Returnerer `{ info: `<a href={typesUrl}><code>AssistantMessage</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}` |
| `session.shell({ path, body })` | Kjør en shell-kommando | Returnerer <a href={typesUrl}><code>AssistantMessage</code></a> |
| `session.revert({ path, body })` | Tilbakestill en melding | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `session.unrevert({ path })` | Gjenopret nulstillete meldinger | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `postSessionByIdPermissionsByPermissionId({ path, body })` | Svar på en tillatelsesforespørsel | Returnerer `boolean` |
---
@@ -291,7 +291,7 @@ await client.session.prompt({
| `file.read({ query })` | Les en fil | `{ type: "raw" \| "patch", content: string }` |
| `file.status({ query? })` | Få status for sporede filer | <a href={typesUrl}><code>Fil[]</code></a> |
`find.files` støtter noen få valgfrie søkefelt:
`find.files` støtter nogle få valgfrie søkefelt:
- `type`: `"file"` eller `"directory"`
- `directory`: overstyr prosjektroten for søket
@@ -328,10 +328,10 @@ const content = await client.file.read({
| ------------------------------ | ---------------------------- | --------- |
| `tui.appendPrompt({ body })` | Legg til tekst i ledeteksten | `boolean` |
| `tui.openHelp()` | Åpne hjelpedialogen | `boolean` |
| `tui.openSessions()` | Åpne øktvelgeren | `boolean` |
| `tui.openSessions()` | Åpne sessionvelgeren | `boolean` |
| `tui.openThemes()` | Åpne temavelgeren | `boolean` |
| `tui.openModels()` | Åpne modellvelgeren | `boolean` |
| `tui.submitPrompt()` | Send inn gjeldende ledetekst | `boolean` |
| `tui.submitPrompt()` | Send inn nuværende ledetekst | `boolean` |
| `tui.clearPrompt()` | Fjern ledeteksten | `boolean` |
| `tui.executeCommand({ body })` | Utfør en kommando | `boolean` |
| `tui.showToast({ body })` | Vis toastvarsel | `boolean` |

View File

@@ -6,11 +6,11 @@ description: Samhandle med opencode-server over HTTP.
import config from "../../../../config.mjs"
export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts`
Kommandoen `opencode serve` kjører en hodeløs HTTP-server som avslører et OpenAPI-endepunkt som en opencode-klient kan bruke.
Kommandoen `opencode serve` kjører en hodeløs HTTP-server som avslører et OpenAPI-endepunkt som en opencode-klient kan bruge.
---
### Bruk
### Brug
```bash
opencode serve [--port <number>] [--hostname <string>] [--cors <origin>]
@@ -18,13 +18,13 @@ opencode serve [--port <number>] [--hostname <string>] [--cors <origin>]
#### Alternativer
| Flagg | Beskrivelse | Standard |
| --------------- | ---------------------------------------------- | ---------------- |
| `--port` | Port å lytte på | `4096` |
| `--hostname` | Vertsnavn å lytte på | `127.0.0.1` |
| `--mdns` | Aktiver mDNS-oppdagelse | `false` |
| `--mdns-domain` | Egendefinert domenenavn for mDNS-tjeneste | `opencode.local` |
| `--cors` | Ytterligere nettleseropprinnelse for å tillate | `[]` |
| Flagg | Beskrivelse | Standard |
| --------------- | ----------------------------------------------- | ---------------- |
| `--port` | Port at lytte på | `4096` |
| `--hostname` | Vertsnavn at lytte på | `127.0.0.1` |
| `--mdns` | Aktiver mDNS-oppdagelse | `false` |
| `--mdns-domain` | Egendefinert domenenavn for mDNS-tjeneste | `opencode.local` |
| `--cors` | Ytterligere nettleseropprinnelse for at tillate | `[]` |
`--cors` kan passeres flere ganger:
@@ -36,7 +36,7 @@ opencode serve --cors http://localhost:5173 --cors https://app.example.com
### Autentisering
Sett `OPENCODE_SERVER_PASSWORD` for å beskytte serveren med HTTP grunnleggende autentisering. Brukernavnet er standard til `opencode`, eller sett `OPENCODE_SERVER_USERNAME` for å overstyre det. Dette gjelder både `opencode serve` og `opencode web`.
Sett `OPENCODE_SERVER_PASSWORD` for at beskytte serveren med HTTP grunntilføjende autentisering. Brugernavnet er standard til `opencode`, eller sett `OPENCODE_SERVER_USERNAME` for at overstyre det. Dette gjelder både `opencode serve` og `opencode web`.
```bash
OPENCODE_SERVER_PASSWORD=your-password opencode serve
@@ -48,24 +48,24 @@ OPENCODE_SERVER_PASSWORD=your-password opencode serve
Når du kjører `opencode` starter den en TUI og en server. Der TUI er
klient som snakker med serveren. Serveren viser en OpenAPI 3.1-spesifikasjon
endepunkt. Dette endepunktet brukes også til å generere en [SDK](/docs/sdk).
endepunkt. Dette endepunktet bruges også til at generere en [SDK](/docs/sdk).
:::tip
Bruk opencode-serveren til å samhandle med opencode programmatisk.
Brug opencode-serveren til at samhandle med opencode programmatisk.
:::
Denne arkitekturen lar opencode støtte flere klienter og lar deg samhandle med opencode programmatisk.
Du kan kjøre `opencode serve` for å starte en frittstående server. Hvis du har
Du kan kjøre `opencode serve` for at starte en frittstående server. Hvis du har
opencode TUI kjører, vil `opencode serve` starte en ny server.
---
#### Koble til en eksisterende server
Når du starter TUI, tildeler den tilfeldig en port og vertsnavn. Du kan i stedet sende inn `--hostname` og `--port` [flagg](/docs/cli). Bruk deretter denne til å koble til serveren.
Når du starter TUI, tildeler den tilfeldig en port og vertsnavn. Du kan i stedet sende inn `--hostname` og `--port` [flagg](/docs/cli). Brug deretter denne til at koble til serveren.
[`/tui`](#tui) endepunktet kan brukes til å kjøre TUI gjennom serveren. Du kan for eksempel forhåndsutfylle eller kjøre en forespørsel. Dette oppsettet brukes av OpenCode [IDE](/docs/ide) plugins.
[`/tui`](#tui) endepunktet kan bruges til at kjøre TUI gjennom serveren. Du kan for eksempel forhåndsutfylle eller kjøre en forespørsel. Dette oppsettet bruges av OpenCode [IDE](/docs/ide) plugins.
---
@@ -77,7 +77,7 @@ Serveren publiserer en OpenAPI 3.1-spesifikasjon som kan vises på:
http://<hostname>:<port>/doc
```
For eksempel `http://localhost:4096/doc`. Bruk spesifikasjonen til å generere klienter eller inspisere forespørsels- og svartyper. Eller se den i en Swagger-utforsker.
For eksempel `http://localhost:4096/doc`. Brug spesifikasjonen til at generere klienter eller inspisere forespørsels- og svartyper. Eller se den i en Swagger-utforsker.
---
@@ -109,8 +109,8 @@ OpenCode-serveren viser følgende APIer.
| Metode | Sti | Beskrivelse | Svar |
| ------ | ------- | ---------------------------------- | ------------------------------------------- |
| `GET` | `/path` | Få gjeldende bane | <a href={typesUrl}><code>Path</code></a> |
| `GET` | `/vcs` | Få VCS info for gjeldende prosjekt | <a href={typesUrl}><code>VcsInfo</code></a> |
| `GET` | `/path` | Få nuværende bane | <a href={typesUrl}><code>Path</code></a> |
| `GET` | `/vcs` | Få VCS info for nuværende prosjekt | <a href={typesUrl}><code>VcsInfo</code></a> |
---
@@ -118,7 +118,7 @@ OpenCode-serveren viser følgende APIer.
| Metode | Sti | Beskrivelse | Svar |
| ------ | ------------------- | ------------------------ | --------- |
| `POST` | `/instance/dispose` | Kast gjeldende forekomst | `boolean` |
| `POST` | `/instance/dispose` | Kast nuværende forekomst | `boolean` |
---
@@ -127,52 +127,52 @@ OpenCode-serveren viser følgende APIer.
| Metode | Sti | Beskrivelse | Svar |
| ------- | ------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------- |
| `GET` | `/config` | Få konfigurasjonsinformasjon | <a href={typesUrl}><code>Config</code></a> |
| `PATCH` | `/config` | Oppdater konfigurasjon | <a href={typesUrl}><code>Config</code></a> |
| `PATCH` | `/config` | Opdater konfigurasjon | <a href={typesUrl}><code>Config</code></a> |
| `GET` | `/config/providers` | Liste leverandører og standardmodeller | `{ providers: `<a href={typesUrl}>Provider[]</a>`, default: { [key: string]: string } }` |
---
### Leverandør
| Metode | Sti | Beskrivelse | Svar |
| ------ | -------------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------- |
| `GET` | `/provider` | Liste alle leverandører | `{ all: `<a href={typesUrl}>Provider[]</a>`, default: {...}, connected: string[] }` |
| `GET` | `/provider/auth` | Få leverandørautentiseringsmetoder | `{ [providerID: string]: `<a href={typesUrl}>ProviderAuthMethod[]</a>` }` |
| `POST` | `/provider/{id}/oauth/authorize` | Autoriser en leverandør ved å bruke OAuth | <a href={typesUrl}><code>ProviderAuthAuthorization</code></a> |
| `POST` | `/provider/{id}/oauth/callback` | Håndtere OAuth-tilbakeringing for en leverandør | `boolean` |
| Metode | Sti | Beskrivelse | Svar |
| ------ | -------------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------- |
| `GET` | `/provider` | Liste alle leverandører | `{ all: `<a href={typesUrl}>Provider[]</a>`, default: {...}, connected: string[] }` |
| `GET` | `/provider/auth` | Få leverandørautentiseringsmetoder | `{ [providerID: string]: `<a href={typesUrl}>ProviderAuthMethod[]</a>` }` |
| `POST` | `/provider/{id}/oauth/authorize` | Autoriser en leverandør ved at bruge OAuth | <a href={typesUrl}><code>ProviderAuthAuthorization</code></a> |
| `POST` | `/provider/{id}/oauth/callback` | Håndtere OAuth-callback for en leverandør | `boolean` |
---
### økter
### sessioner
| Metode | Sti | Beskrivelse | Merknader |
| -------- | ---------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------- |
| `GET` | `/session` | Liste alle økter | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `POST` | `/session` | Opprett en ny økt | body: `{ parentID?, title? }`, returnerer <a href={typesUrl}><code>Session</code></a> |
| `GET` | `/session/status` | Få øktstatus for alle økter | Returnerer `{ [sessionID: string]: `<a href={typesUrl}>SessionStatus</a>` }` |
| `GET` | `/session/:id` | Få øktdetaljer | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `DELETE` | `/session/:id` | Slett en økt og alle dens data | Returnerer `boolean` |
| `PATCH` | `/session/:id` | Oppdater øktegenskaper | body: `{ title? }`, returnerer <a href={typesUrl}><code>Session</code></a> |
| `GET` | `/session/:id/children` | Få en økts barneøkter | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `GET` | `/session/:id/todo` | Få gjøremålslisten for en økt | Returnerer <a href={typesUrl}><code>Todo[]</code></a> |
| `POST` | `/session/:id/init` | Analyser appen og lag `AGENTS.md` | body: `{ messageID, providerID, modelID }`, returnerer `boolean` |
| `POST` | `/session/:id/fork` | Fork en eksisterende økt ved en melding | body: `{ messageID? }`, returnerer <a href={typesUrl}><code>Session</code></a> |
| `POST` | `/session/:id/abort` | Avbryt en løpeøkt | Returnerer `boolean` |
| `POST` | `/session/:id/share` | Del en økt | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `DELETE` | `/session/:id/share` | Slutt å dele en økt | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `GET` | `/session/:id/diff` | Få diff for denne økten | spørring: `messageID?`, returnerer <a href={typesUrl}><code>FileDiff[]</code></a> |
| `POST` | `/session/:id/summarize` | Oppsummer økten | body: `{ providerID, modelID }`, returnerer `boolean` |
| `POST` | `/session/:id/revert` | Tilbakestill en melding | body: `{ messageID, partID? }`, returnerer `boolean` |
| `POST` | `/session/:id/unrevert` | Gjenopprett alle tilbakestilte meldinger | Returnerer `boolean` |
| `POST` | `/session/:id/permissions/:permissionID` | Svar på en tillatelsesforespørsel | body: `{ response, remember? }`, returnerer `boolean` |
| Metode | Sti | Beskrivelse | Noter |
| -------- | ---------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------- |
| `GET` | `/session` | Liste alle sessioner | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `POST` | `/session` | Opret en ny session | body: `{ parentID?, title? }`, returnerer <a href={typesUrl}><code>Session</code></a> |
| `GET` | `/session/status` | Få sessionstatus for alle sessioner | Returnerer `{ [sessionID: string]: `<a href={typesUrl}>SessionStatus</a>` }` |
| `GET` | `/session/:id` | Få sessiondetaljer | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `DELETE` | `/session/:id` | Slett en session og alle dens data | Returnerer `boolean` |
| `PATCH` | `/session/:id` | Opdater sessionegenskaper | body: `{ title? }`, returnerer <a href={typesUrl}><code>Session</code></a> |
| `GET` | `/session/:id/children` | Få en sessions barnesessioner | Returnerer <a href={typesUrl}><code>Session[]</code></a> |
| `GET` | `/session/:id/todo` | Få to-doslisten for en session | Returnerer <a href={typesUrl}><code>Todo[]</code></a> |
| `POST` | `/session/:id/init` | Analyser appen og lag `AGENTS.md` | body: `{ messageID, providerID, modelID }`, returnerer `boolean` |
| `POST` | `/session/:id/fork` | Fork en eksisterende session ved en melding | body: `{ messageID? }`, returnerer <a href={typesUrl}><code>Session</code></a> |
| `POST` | `/session/:id/abort` | Avbryt en løpesession | Returnerer `boolean` |
| `POST` | `/session/:id/share` | Del en session | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `DELETE` | `/session/:id/share` | Slutt at dele en session | Returnerer <a href={typesUrl}><code>Session</code></a> |
| `GET` | `/session/:id/diff` | Få diff for denne sessionen | spørring: `messageID?`, returnerer <a href={typesUrl}><code>FileDiff[]</code></a> |
| `POST` | `/session/:id/summarize` | Oppsummer sessionen | body: `{ providerID, modelID }`, returnerer `boolean` |
| `POST` | `/session/:id/revert` | Tilbakestill en melding | body: `{ messageID, partID? }`, returnerer `boolean` |
| `POST` | `/session/:id/unrevert` | Gjenopret alle nulstillete meldinger | Returnerer `boolean` |
| `POST` | `/session/:id/permissions/:permissionID` | Svar på en tillatelsesforespørsel | body: `{ response, remember? }`, returnerer `boolean` |
---
### Meldinger
| Metode | Sti | Beskrivelse | Merknader |
| Metode | Sti | Beskrivelse | Noter |
| ------ | --------------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `GET` | `/session/:id/message` | Liste meldinger i en økt | spørring: `limit?`, returnerer `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}[]` |
| `GET` | `/session/:id/message` | Liste meldinger i en session | spørring: `limit?`, returnerer `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}[]` |
| `POST` | `/session/:id/message` | Send en melding og vent på svar | body: `{ messageID?, model?, agent?, noReply?, system?, tools?, parts }`, returnerer `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}` |
| `GET` | `/session/:id/message/:messageID` | Få meldingsdetaljer | Returnerer `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}` |
| `POST` | `/session/:id/prompt_async` | Send en melding asynkront (ingen vent) | body: samme som `/session/:id/message`, returnerer `204 No Content` |
@@ -232,9 +232,9 @@ OpenCode-serveren viser følgende APIer.
### Agenter
| Metode | Sti | Beskrivelse | Svar |
| ------ | -------- | -------------------------------- | ------------------------------------------- |
| `GET` | `/agent` | Liste alle tilgjengelige agenter | <a href={typesUrl}><code>Agent[]</code></a> |
| Metode | Sti | Beskrivelse | Svar |
| ------ | -------- | ------------------------------- | ------------------------------------------- |
| `GET` | `/agent` | Liste alle tilgængelige agenter | <a href={typesUrl}><code>Agent[]</code></a> |
---
@@ -252,10 +252,10 @@ OpenCode-serveren viser følgende APIer.
| ------ | ----------------------- | ------------------------------------------- | -------------------------- |
| `POST` | `/tui/append-prompt` | Legg til tekst i ledeteksten | `boolean` |
| `POST` | `/tui/open-help` | Åpne hjelpedialogen | `boolean` |
| `POST` | `/tui/open-sessions` | Åpne øktvelgeren | `boolean` |
| `POST` | `/tui/open-sessions` | Åpne sessionvelgeren | `boolean` |
| `POST` | `/tui/open-themes` | Åpne temavelgeren | `boolean` |
| `POST` | `/tui/open-models` | Åpne modellvelgeren | `boolean` |
| `POST` | `/tui/submit-prompt` | Send inn gjeldende ledetekst | `boolean` |
| `POST` | `/tui/submit-prompt` | Send inn nuværende ledetekst | `boolean` |
| `POST` | `/tui/clear-prompt` | Fjern ledeteksten | `boolean` |
| `POST` | `/tui/execute-command` | Utfør en kommando (`{ command }`) | `boolean` |
| `POST` | `/tui/show-toast` | Vis toast (`{ title?, message, variant }`) | `boolean` |

View File

@@ -6,7 +6,7 @@ description: Del dine OpenCode-samtaler.
OpenCodes delingsfunksjon lar deg lage offentlige lenker til dine OpenCode-samtaler, slik at du kan samarbeide med lagkamerater eller få hjelp fra andre.
:::note
Delte samtaler er offentlig tilgjengelige for alle med linken.
Delte samtaler er offentlig tilgængelige for alle med linken.
:::
---
@@ -15,9 +15,9 @@ Delte samtaler er offentlig tilgjengelige for alle med linken.
Når du deler en samtale, OpenCode:
1. Oppretter en unik offentlig URL for økten din
1. Opreter en unik offentlig URL for sessionen din
2. Synkroniserer samtaleloggen din til serverne våre
3. Gjør samtalen tilgjengelig via den delbare lenken — `opncd.ai/s/<share-id>`
3. Gør samtalen tilgængelig via den delbare lenken — `opncd.ai/s/<share-id>`
---
@@ -29,7 +29,7 @@ OpenCode støtter tre delingsmoduser som kontrollerer hvordan samtaler deles:
### Manuell (standard)
Som standard bruker OpenCode manuell delingsmodus. Økter deles ikke automatisk, men du kan dele dem manuelt ved å bruke kommandoen `/share`:
Som standard bruger OpenCode manuell delingsmodus. Sessioner deles ikke automatisk, men du kan dele dem manuelt ved at bruge kommandoen `/share`:
```
/share
@@ -37,7 +37,7 @@ Som standard bruker OpenCode manuell delingsmodus. Økter deles ikke automatisk,
Dette vil generere en unik URL som vil bli kopiert til utklippstavlen din.
For å eksplisitt angi manuell modus i [konfigurasjonsfilen](/docs/config):
For at eksplisitt angi manuell modus i [konfigurasjonsfilen](/docs/config):
```json title="opencode.json"
{
@@ -50,7 +50,7 @@ For å eksplisitt angi manuell modus i [konfigurasjonsfilen](/docs/config):
### Automatisk deling
Du kan aktivere automatisk deling for alle nye samtaler ved å sette alternativet `share` til `"auto"` i [konfigurasjonsfilen](/docs/config):
Du kan aktivere automatisk deling for alle nye samtaler ved at sette alternativet `share` til `"auto"` i [konfigurasjonsfilen](/docs/config):
```json title="opencode.json"
{
@@ -65,7 +65,7 @@ Med automatisk deling aktivert, vil hver nye samtale automatisk bli delt og en k
### Deaktivert
Du kan deaktivere deling helt ved å sette alternativet `share` til `"disabled"` i [konfigurasjonsfilen](/docs/config):
Du kan deaktivere deling helt ved at sette alternativet `share` til `"disabled"` i [konfigurasjonsfilen](/docs/config):
```json title="opencode.json"
{
@@ -74,13 +74,13 @@ Du kan deaktivere deling helt ved å sette alternativet `share` til `"disabled"`
}
```
For å håndheve dette på tvers av teamet ditt for et gitt prosjekt, legg det til `opencode.json` i prosjektet ditt og sjekk inn i Git.
For at håndheve dette på tvers av teamet ditt for et gitt prosjekt, tilføj det til `opencode.json` i prosjektet ditt og tjek inn i Git.
---
## Opphev deling
Slik slutter du å dele en samtale og fjerner den fra offentlig tilgang:
Slik slutter du at dele en samtale og fjerner den fra offentlig tilgang:
```
/unshare
@@ -98,12 +98,12 @@ Det er et par ting du må huske på når du deler en samtale.
### Datalagring
Delte samtaler forblir tilgjengelige til du eksplisitt opphever deling av dem. Dette
Delte samtaler forblir tilgængelige til du eksplisitt opphever deling av dem. Dette
inkluderer:
- Full samtalehistorikk
- Alle meldinger og svar
- Metadata for økter
- Metadata for sessioner
---
@@ -112,7 +112,7 @@ inkluderer:
- Del kun samtaler som ikke inneholder sensitiv informasjon.
- Se gjennom samtaleinnholdet før du deler.
- Opphev deling av samtaler når samarbeidet er fullført.
- Unngå å dele samtaler med proprietær kode eller konfidensielle data.
- Unngå at dele samtaler med proprietær kode eller konfidensielle data.
- For sensitive prosjekter, deaktiver deling helt.
---
@@ -122,7 +122,7 @@ inkluderer:
For bedriftsimplementeringer kan delingsfunksjonen være:
- **Deaktivert** helt for overholdelse av sikkerhet
- **Begrenset** til brukere som kun er autentisert gjennom SSO
- **Begrenset** til brugere som kun er autentisert gjennom SSO
- **Selvvert** på din egen infrastruktur
[Finn ut mer](/docs/enterprise) om bruk av opencode i organisasjonen din.
[Finn ut mer](/docs/enterprise) om brug av opencode i organisasjonen din.

View File

@@ -1,16 +1,16 @@
---
title: "Agentferdigheter"
description: "Definer gjenbrukbar atferd via SKILL.md-definisjoner"
description: "Definer gjenbrugbar atferd via SKILL.md-definisjoner"
---
Agentferdigheter lar OpenCode oppdage gjenbrukbare instruksjoner fra repo- eller hjemmekatalogen din.
Ferdigheter lastes inn på forespørsel via det opprinnelige `skill`-verktøyet agenter ser tilgjengelige ferdigheter og kan laste inn hele innholdet når det er nødvendig.
Agentferdigheter lar OpenCode oppdage gjenbrugbare instruksjoner fra repo- eller hjemmekatalogen din.
Ferdigheter lastes inn på forespørsel via det opprinnelige `skill`-verktøyet agenter ser tilgængelige ferdigheter og kan laste inn hele innholdet når det er nødvendig.
---
## Plasser filer
Opprett én mappe per ferdighetsnavn og legg inn en `SKILL.md` i den.
Opret én mappe per ferdighetsnavn og tilføj inn en `SKILL.md` i den.
OpenCode søker etter disse stedene:
- Prosjektkonfigurasjon: `.opencode/skills/<name>/SKILL.md`
@@ -24,7 +24,7 @@ OpenCode søker etter disse stedene:
## Forstå oppdagelsen
For prosjektlokale stier går OpenCode opp fra din nåværende arbeidskatalog til den når git-arbeidstreet.
For prosjektlokale stier går OpenCode opp fra din nåværende arbejdskatalog til den når git-arbeidstreet.
Den laster alle matchende `skills/*/SKILL.md` i `.opencode/` og alle matchende `.claude/skills/*/SKILL.md` eller `.agents/skills/*/SKILL.md` underveis.
Globale definisjoner lastes også inn fra `~/.config/opencode/skills/*/SKILL.md`, `~/.claude/skills/*/SKILL.md` og `~/.agents/skills/*/SKILL.md`.
@@ -71,7 +71,7 @@ Hold det spesifikt nok til at agenten kan velge riktig.
---
## Bruk et eksempel
## Brug et eksempel
Lag `.opencode/skills/git-release/SKILL.md` slik:
@@ -102,7 +102,7 @@ Ask clarifying questions if the target versioning scheme is unclear.
## Gjenkjenne verktøybeskrivelsen
OpenCode viser tilgjengelige ferdigheter i `skill` verktøybeskrivelsen.
OpenCode viser tilgængelige ferdigheter i `skill` verktøybeskrivelsen.
Hver oppføring inneholder ferdighetsnavnet og beskrivelsen:
```xml
@@ -114,7 +114,7 @@ Hver oppføring inneholder ferdighetsnavnet og beskrivelsen:
</available_skills>
```
Agenten laster inn en ferdighet ved å kalle verktøyet:
Agenten laster inn en ferdighet ved at kalle verktøyet:
```
skill({ name: "git-release" })
@@ -124,7 +124,7 @@ skill({ name: "git-release" })
## Konfigurer tillatelser
Kontroller hvilke ferdigheter agenter har tilgang til ved å bruke mønsterbaserte tillatelser i `opencode.json`:
Kontroller hvilke ferdigheter agenter har tilgang til ved at bruge mønsterbaserte tillatelser i `opencode.json`:
```json
{
@@ -143,7 +143,7 @@ Kontroller hvilke ferdigheter agenter har tilgang til ved å bruke mønsterbaser
| ---------- | ------------------------------------------ |
| `allow` | Ferdigheter lastes umiddelbart |
| `deny` | Ferdighet skjult for agent, tilgang avvist |
| `ask` | Bruker bedt om godkjenning før lasting |
| `ask` | Bruger bedt om godkjenning før lasting |
Mønstre støtter jokertegn: `internal-*` samsvarer med `internal-docs`, `internal-tools` osv.
@@ -183,7 +183,7 @@ permission:
## Deaktiver ferdighetsverktøyet
Deaktiver ferdigheter fullstendig for agenter som ikke bør bruke dem:
Deaktiver ferdigheter fullstendig for agenter som ikke bør bruge dem:
**For egendefinerte agenter**:
@@ -217,6 +217,6 @@ Når den er deaktivert, blir `<available_skills>`-delen utelatt helt.
Hvis en ferdighet ikke vises:
1. Kontroller at `SKILL.md` er stavet med store bokstaver
2. Sjekk at frontmatter inkluderer `name` og `description`
2. Tjek at frontmatter inkluderer `name` og `description`
3. Sørg for at ferdighetsnavnene er unike på alle steder
4. Sjekk tillatelser ferdigheter med `deny` er skjult for agenter
4. Tjek tillatelser ferdigheter med `deny` er skjult for agenter

View File

@@ -3,21 +3,21 @@ title: Temaer
description: Velg et innebygd tema eller definer ditt eget.
---
Med OpenCode kan du velge fra ett av flere innebygde temaer, bruke et tema som tilpasser seg terminaltemaet ditt, eller definere ditt eget tilpassede tema.
Med OpenCode kan du velge fra ett av flere innebygde temaer, bruge et tema som tilpasser seg terminaltemaet ditt, eller definere ditt eget tilpassede tema.
Som standard bruker OpenCode vårt eget `opencode`-tema.
Som standard bruger OpenCode vårt eget `opencode`-tema.
---
## Terminalkrav
For at temaer skal vises riktig med fullfargepalett, må terminalen din støtte **truecolor** (24-biters farger). De fleste moderne terminaler støtter dette som standard, men du må kanskje aktivere det:
For at temaer skal vises riktig med fullfarvepalett, må terminalen din støtte **truecolor** (24-biters farver). De fleste moderne terminaler støtter dette som standard, men du må kanskje aktivere det:
- **Sjekk støtte**: Kjør `echo $COLORTERM` - den skal gi ut `truecolor` eller `24bit`
- **Aktiver truecolor**: Sett miljøvariabelen `COLORTERM=truecolor` i skallprofilen din
- **Terminalkompatibilitet**: Sørg for at terminalemulatoren din støtter 24-bits farger (de fleste moderne terminaler som iTerm2, Alacritty, Kitty, Windows Terminal og nyere versjoner av GNOME Terminal gjør det)
- **Tjek støtte**: Kjør `echo $COLORTERM` - den skal gi ut `truecolor` eller `24bit`
- **Aktiver truecolor**: Sett miljøvariabelen `COLORTERM=truecolor` i shellprofilen din
- **Terminalkompatibilitet**: Sørg for at terminalemulatoren din støtter 24-bits farver (de fleste moderne terminaler som iTerm2, Alacritty, Kitty, Windows Terminal og nyere versioner av GNOME Terminal gør det)
Uten truecolor-støtte kan temaer vises med redusert fargenøyaktighet eller falle tilbake til nærmeste 256-fargers tilnærming.
Uden truecolor-støtte kan temaer vises med redusert farvenøjagtighed eller falde tilbage til nærmeste 256-farvers tilnærming.
---
@@ -27,7 +27,7 @@ OpenCode kommer med flere innebygde temaer.
| Navn | Beskrivelse |
| ---------------------- | ------------------------------------------------------------------------- |
| `system` | Tilpasser seg terminalens bakgrunnsfarge |
| `system` | Tilpasser seg terminalens bakgrunnsfarve |
| `tokyonight` | Basert på [Tokyonight](https://github.com/folke/tokyonight.nvim)-temaet |
| `everforest` | Basert på [Everforest](https://github.com/sainnhe/everforest)-temaet |
| `ayu` | Basert på [Ayu](https://github.com/ayu-theme) mørke tema |
@@ -39,29 +39,29 @@ OpenCode kommer med flere innebygde temaer.
| `matrix` | Hacker-stil grønt på svart tema |
| `one-dark` | Basert på [Atom One](https://github.com/Th3Whit3Wolf/one-nvim) Mørkt tema |
Og mer, vi legger stadig til nye temaer.
Og mer, vi tilføjer stadig til nye temaer.
---
## Systemtema
`system`-temaet er designet for å automatisk tilpasse seg terminalens fargevalg. I motsetning til tradisjonelle temaer som bruker faste farger, er _system_-temaet:
`system`-temaet er designet for at automatisk tilpasse seg terminalens farvevalg. I motsetning til tradisjonelle temaer som bruger faste farver, er _system_-temaet:
- **Genererer gråskala**: Oppretter en tilpasset gråskala basert på terminalens bakgrunnsfarge, og sikrer optimal kontrast.
- **Bruker ANSI farger**: Bruker standard ANSI farger (0-15) for syntaksutheving og UI elementer, som respekterer terminalens fargepalett.
- **Bevarer terminalens standardinnstillinger**: Bruker `none` for tekst- og bakgrunnsfarger for å opprettholde terminalens opprinnelige utseende.
- **Genererer gråskala**: Opreter en brugerdefineret gråskala basert på terminalens bakgrunnsfarve, og sikrer optimal kontrast.
- **Bruger ANSI farver**: Bruger standard ANSI farver (0-15) for syntaksutheving og UI elementer, som respekterer terminalens farvepalett.
- **Bevarer terminalens standardinnstillinger**: Bruger `none` for tekst- og bakgrunnsfarver for at opretholde terminalens opprinnelige utseende.
Systemtemaet er for brukere som:
Systemtemaet er for brugere som:
- Vil at OpenCode skal matche terminalens utseende
- Bruk tilpassede terminalfargeskjemaer
- Brug tilpassede terminalfarveskjemaer
- Foretrekker et konsistent utseende på tvers av alle terminalapplikasjoner
---
## Bruke et tema
## Bruge et tema
Du kan velge et tema ved å hente frem temavalg med kommandoen `/theme`. Eller du kan spesifisere det i [config](/docs/config).
Du kan velge et tema ved at hente frem temavalg med kommandoen `/theme`. Eller du kan spesifisere det i [config](/docs/config).
```json title="opencode.json" {3}
{
@@ -74,7 +74,7 @@ Du kan velge et tema ved å hente frem temavalg med kommandoen `/theme`. Eller d
## Egendefinerte temaer
OpenCode støtter et fleksibelt JSON-basert temasystem som lar brukere enkelt lage og tilpasse temaer.
OpenCode støtter et fleksibelt JSON-basert temasystem som lar brugere enkelt lage og tilpasse temaer.
---
@@ -83,19 +83,19 @@ OpenCode støtter et fleksibelt JSON-basert temasystem som lar brukere enkelt la
Temaer lastes inn fra flere kataloger i følgende rekkefølge der senere kataloger overstyrer tidligere:
1. **Innebygde temaer** - Disse er innebygd i binæren
2. **Brukerkonfigurasjonskatalog** - Definert i `~/.config/opencode/themes/*.json` eller `$XDG_CONFIG_HOME/opencode/themes/*.json`
2. **Brugerkonfigurasjonskatalog** - Definert i `~/.config/opencode/themes/*.json` eller `$XDG_CONFIG_HOME/opencode/themes/*.json`
3. **Prosjektrotkatalog** - Definert i `<project-root>/.opencode/themes/*.json`
4. **Gjeldende arbeidskatalog** - Definert i `./.opencode/themes/*.json`
4. **Nuværende arbejdskatalog** - Definert i `./.opencode/themes/*.json`
Hvis flere kataloger inneholder et tema med samme navn, vil temaet fra katalogen med høyere prioritet bli brukt.
Hvis flere kataloger inneholder et tema med samme navn, vil temaet fra katalogen med høyere prioritet bli brugt.
---
### Opprette et tema
### Oprete et tema
For å lage et tilpasset tema, lag en JSON-fil i en av temakatalogene.
For at lage et brugerdefineret tema, lag en JSON-fil i en av temakatalogene.
For brukeromfattende temaer:
For brugeromfattende temaer:
```bash no-frame
mkdir -p ~/.config/opencode/themes
@@ -113,34 +113,34 @@ vim .opencode/themes/my-theme.json
### JSON format
Temaer bruker et fleksibelt JSON-format med støtte for:
Temaer bruger et fleksibelt JSON-format med støtte for:
- **Sekskantfarger**: `"#ffffff"`
- **ANSI farger**: `3` (0-255)
- **Fargereferanser**: `"primary"` eller egendefinerte definisjoner
- **Sekskantfarver**: `"#ffffff"`
- **ANSI farver**: `3` (0-255)
- **Farvereferanser**: `"primary"` eller egendefinerte definisjoner
- **Mørke/lyse varianter**: `{"dark": "#000", "light": "#fff"}`
- **Ingen farge**: `"none"` - Bruker terminalens standardfarge eller transparent
- **Ingen farve**: `"none"` - Bruger terminalens standardfarve eller transparent
---
### Fargedefinisjoner
### Farvedefinisjoner
`defs`-delen er valgfri, og den lar deg definere gjenbrukbare farger som kan refereres til i temaet.
`defs`-delen er valgfri, og den lar deg definere gjenbrugbare farver som kan refereres til i temaet.
---
### Terminalstandarder
Spesialverdien `"none"` kan brukes for hvilken som helst farge for å arve terminalens standardfarge. Dette er spesielt nyttig for å lage temaer som passer sømløst med terminalens fargeskjema:
Spesialverdien `"none"` kan bruges for hvilken som helst farve for at arve terminalens standardfarve. Dette er spesielt nyttig for at lage temaer som passer sømløst med terminalens farveskjema:
- `"text": "none"` - Bruker terminalens standard forgrunnsfarge
- `"background": "none"` - Bruker terminalens standard bakgrunnsfarge
- `"text": "none"` - Bruger terminalens standard forgrunnsfarve
- `"background": "none"` - Bruger terminalens standard bakgrunnsfarve
---
### Eksempel
Her er et eksempel på et tilpasset tema:
Her er et eksempel på et brugerdefineret tema:
```json title="my-theme.json"
{

View File

@@ -1,17 +1,17 @@
---
title: Verktøy
description: Administrer verktøyene en LLM kan bruke.
description: Administrer verktøyene en LLM kan bruge.
---
Verktøy lar LLM utføre handlinger i kodebasen din. OpenCode kommer med et sett med innebygde verktøy, men du kan utvide det med [egendefinerte verktøy](/docs/custom-tools) eller [MCP servere](/docs/mcp-servers).
Som standard er alle verktøy **aktivert** og trenger ikke tillatelse for å kjøre. Du kan kontrollere verktøyets oppførsel gjennom [tillatelser](/docs/permissions).
Som standard er alle verktøy **aktivert** og trenger ikke tillatelse for at kjøre. Du kan kontrollere verktøyets oppførsel gjennom [tillatelser](/docs/permissions).
---
## Konfigurer
Bruk feltet `permission` for å kontrollere verktøyets oppførsel. Du kan tillate, avslå eller kreve godkjenning for hvert verktøy.
Brug feltet `permission` for at kontrollere verktøyets oppførsel. Du kan tillate, avslå eller kreve godkjenning for hvert verktøy.
```json title="opencode.json"
{
@@ -24,7 +24,7 @@ Bruk feltet `permission` for å kontrollere verktøyets oppførsel. Du kan tilla
}
```
Du kan også bruke jokertegn for å kontrollere flere verktøy samtidig. For eksempel, for å kreve godkjenning for alle verktøy fra en MCP-server:
Du kan også bruge jokertegn for at kontrollere flere verktøy samtidig. For eksempel, for at kreve godkjenning for alle verktøy fra en MCP-server:
```json title="opencode.json"
{
@@ -41,13 +41,13 @@ Du kan også bruke jokertegn for å kontrollere flere verktøy samtidig. For eks
## Innebygd
Her er alle de innebygde verktøyene som er tilgjengelige i OpenCode.
Her er alle de innebygde verktøyene som er tilgængelige i OpenCode.
---
### bash
Utfør skallkommandoer i prosjektmiljøet ditt.
Utfør shellkommandoer i prosjektmiljøet ditt.
```json title="opencode.json" {4}
{
@@ -62,9 +62,9 @@ Dette verktøyet lar LLM kjøre terminalkommandoer som `npm install`, `git statu
---
### rediger
### edit
Endre eksisterende filer ved å bruke eksakte strengerstatninger.
Endre eksisterende filer ved at bruge eksakte strengerstatninger.
```json title="opencode.json" {4}
{
@@ -75,13 +75,13 @@ Endre eksisterende filer ved å bruke eksakte strengerstatninger.
}
```
Dette verktøyet utfører nøyaktige redigeringer av filer ved å erstatte eksakte teksttreff. Det er den primære måten LLM endrer kode på.
Dette verktøyet utfører nøyaktige redigeringer av filer ved at erstatte eksakte teksttreff. Det er den primære måten LLM endrer kode på.
---
### skriv
### write
Opprett nye filer eller overskriv eksisterende.
Opret nye filer eller overskriv eksisterende.
```json title="opencode.json" {4}
{
@@ -92,7 +92,7 @@ Opprett nye filer eller overskriv eksisterende.
}
```
Bruk denne for å la LLM lage nye filer. Den vil overskrive eksisterende filer hvis de allerede eksisterer.
Brug denne for at la LLM lage nye filer. Den vil overskrive eksisterende filer hvis de allerede eksisterer.
:::note
`write`-verktøyet kontrolleres av tillatelsen `edit`, som dekker alle filendringer (`edit`, `write`, `patch`, `multiedit`).
@@ -100,7 +100,7 @@ Bruk denne for å la LLM lage nye filer. Den vil overskrive eksisterende filer h
---
### lest
### read
Les filinnholdet fra kodebasen din.
@@ -147,11 +147,11 @@ Finn filer etter mønstermatching.
}
```
Søk etter filer ved å bruke glob-mønstre som `**/*.js` eller `src/**/*.ts`. Returnerer samsvarende filbaner sortert etter endringstid.
Søk etter filer ved at bruge glob-mønstre som `**/*.js` eller `src/**/*.ts`. Returnerer samsvarende filbaner sortert etter endringstid.
---
### liste
### list
List filer og kataloger i en gitt bane.
@@ -164,16 +164,16 @@ List filer og kataloger i en gitt bane.
}
```
Dette verktøyet viser kataloginnhold. Den aksepterer glob-mønstre for å filtrere resultater.
Dette verktøyet viser kataloginnhold. Den aksepterer glob-mønstre for at filtrere resultater.
---
### lsp (eksperimentell)
### lsp (experimental)
Samhandle med dine konfigurerte LSP-servere for å få kodeintelligensfunksjoner som definisjoner, referanser, sveveinformasjon og anropshierarki.
Samhandle med dine konfigurerte LSP-servere for at få kodeintelligensfunksjoner som definisjoner, referanser, sveveinformasjon og anropshierarki.
:::note
Dette verktøyet er bare tilgjengelig når `OPENCODE_EXPERIMENTAL_LSP_TOOL=true` (eller `OPENCODE_EXPERIMENTAL=true`).
Dette verktøyet er bare tilgængelig når `OPENCODE_EXPERIMENTAL_LSP_TOOL=true` (eller `OPENCODE_EXPERIMENTAL=true`).
:::
```json title="opencode.json" {4}
@@ -187,13 +187,13 @@ Dette verktøyet er bare tilgjengelig når `OPENCODE_EXPERIMENTAL_LSP_TOOL=true`
Støttede operasjoner inkluderer `goToDefinition`, `findReferences`, `hover`, `documentSymbol`, `workspaceSymbol`, `goToImplementation`, `prepareCallHierarchy`, `incomingCalls` og `outgoingCalls`.
For å konfigurere hvilke LSP-servere som er tilgjengelige for prosjektet ditt, se [LSP-servere](/docs/lsp).
For at konfigurere hvilke LSP-servere som er tilgængelige for prosjektet ditt, se [LSP-servere](/docs/lsp).
---
### patch
Bruk patcher på filer.
Brug patcher på filer.
```json title="opencode.json" {4}
{
@@ -204,7 +204,7 @@ Bruk patcher på filer.
}
```
Dette verktøyet bruker oppdateringsfiler til kodebasen din. Nyttig for å påføre diff og lapper fra forskjellige kilder.
Dette verktøyet bruger opdateringsfiler til kodebasen din. Nyttig for at påføre diff og lapper fra forskjellige kilder.
:::note
`patch`-verktøyet kontrolleres av tillatelsen `edit`, som dekker alle filendringer (`edit`, `write`, `patch`, `multiedit`).
@@ -212,7 +212,7 @@ Dette verktøyet bruker oppdateringsfiler til kodebasen din. Nyttig for å påf
---
### ferdighet
### skill
Last inn en [ferdighet](/docs/skills) (en `SKILL.md` fil) og returner innholdet i samtalen.
@@ -227,9 +227,9 @@ Last inn en [ferdighet](/docs/skills) (en `SKILL.md` fil) og returner innholdet
---
### for å skrive
### todowrite
Administrer gjøremålslister under kodingsøkter.
Administrer to-doslister under kodingssessioner.
```json title="opencode.json" {4}
{
@@ -240,7 +240,7 @@ Administrer gjøremålslister under kodingsøkter.
}
```
Oppretter og oppdaterer oppgavelister for å spore fremdrift under komplekse operasjoner. LLM bruker dette til å organisere flertrinnsoppgaver.
Opreter og opdaterer oppgavelister for at spore fremdrift under komplekse operasjoner. LLM bruger dette til at organisere flertrinnsoppgaver.
:::note
Dette verktøyet er deaktivert for subagenter som standard, men du kan aktivere det manuelt. [Finn ut mer](/docs/agents/#permissions)
@@ -250,7 +250,7 @@ Dette verktøyet er deaktivert for subagenter som standard, men du kan aktivere
### todoread
Les eksisterende gjøremålslister.
Les eksisterende to-doslister.
```json title="opencode.json" {4}
{
@@ -261,7 +261,7 @@ Les eksisterende gjøremålslister.
}
```
Leser gjeldende gjøremålslistestatus. Brukes av LLM for å spore hvilke oppgaver som venter eller er fullført.
Leser nuværende to-doslistestatus. Bruges av LLM for at spore hvilke oppgaver som venter eller er fullført.
:::note
Dette verktøyet er deaktivert for subagenter som standard, men du kan aktivere det manuelt. [Finn ut mer](/docs/agents/#permissions)
@@ -269,7 +269,7 @@ Dette verktøyet er deaktivert for subagenter som standard, men du kan aktivere
---
### webhenting
### webfetch
Hent nettinnhold.
@@ -282,16 +282,16 @@ Hent nettinnhold.
}
```
Lar LLM hente og lese nettsider. Nyttig for å slå opp dokumentasjon eller forske på nettressurser.
Lar LLM hente og lese nettsider. Nyttig for at slå opp dokumentasjon eller forske på nettressurser.
---
### nettsøk
### websearch
Søk på nettet for informasjon.
:::note
Dette verktøyet er bare tilgjengelig når du bruker OpenCode-leverandøren eller når miljøvariabelen `OPENCODE_ENABLE_EXA` er satt til en sannverdi (f.eks. `true` eller `1`).
Dette verktøyet er bare tilgængelig når du bruger OpenCode-leverandøren eller når miljøvariabelen `OPENCODE_ENABLE_EXA` er satt til en sannverdi (f.eks. `true` eller `1`).
Slik aktiverer du når du starter OpenCode:
@@ -310,19 +310,19 @@ OPENCODE_ENABLE_EXA=1 opencode
}
```
Utfører nettsøk med Exa AI for å finne relevant informasjon på nettet. Nyttig for å undersøke emner, finne aktuelle hendelser eller samle informasjon utover treningsdataavbruddet.
Utfører nettsøk med Exa AI for at finne relevant informasjon på nettet. Nyttig for at undersøke emner, finne aktuelle hendelser eller samle informasjon utover treningsdataavbruddet.
Ingen API-nøkkel kreves — verktøyet kobles direkte til Exa AIs vertsbaserte MCP-tjeneste uten autentisering.
Ingen API-nøgle kreves — verktøyet kobles direkte til Exa AIs vertsbaserte MCP-tjeneste uten autentisering.
:::tip
Bruk `websearch` når du trenger å finne informasjon (oppdagelse), og `webfetch` når du trenger å hente innhold fra en bestemt URL (henting).
Brug `websearch` når du trenger at finne informasjon (oppdagelse), og `webfetch` når du trenger at hente innhold fra en bestemt URL (henting).
:::
---
### spørsmål
### question
Still brukeren spørsmål under utførelse.
Still brugeren spørsmål under utførelse.
```json title="opencode.json" {4}
{
@@ -333,14 +333,14 @@ Still brukeren spørsmål under utførelse.
}
```
Dette verktøyet lar LLM stille spørsmål til brukeren under en oppgave. Det er nyttig for:
Dette verktøyet lar LLM stille spørsmål til brugeren under en oppgave. Det er nyttig for:
- Samle brukerpreferanser eller krav
- Samle brugerpreferanser eller krav
- Avklarende tvetydige instruksjoner
- Få beslutninger om gjennomføringsvalg
- Tilbyr valg om hvilken retning du skal ta
Hvert spørsmål inkluderer en overskrift, spørsmålsteksten og en liste over alternativer. Brukere kan velge fra de angitte alternativene eller skrive inn et tilpasset svar. Når det er flere spørsmål, kan brukerne navigere mellom dem før de sender inn alle svarene.
Hvert spørsmål inkluderer en overskrift, spørsmålsteksten og en liste over alternativer. Brugere kan velge fra de angitte alternativene eller skrive inn et brugerdefineret svar. Når det er flere spørsmål, kan brugerne navigere mellom dem før de sender inn alle svarene.
---
@@ -348,7 +348,7 @@ Hvert spørsmål inkluderer en overskrift, spørsmålsteksten og en liste over a
Egendefinerte verktøy lar deg definere dine egne funksjoner som LLM kan kalle. Disse er definert i konfigurasjonsfilen din og kan kjøre vilkårlig kode.
[Finn ut mer](/docs/custom-tools) om å lage tilpassede verktøy.
[Finn ut mer](/docs/custom-tools) om at lage tilpassede verktøy.
---
@@ -362,13 +362,13 @@ MCP (Model Context Protocol) servere lar deg integrere eksterne verktøy og tjen
## Internaler
Internt bruker verktøy som `grep`, `glob` og `list` [ripgrep](https://github.com/BurntSushi/ripgrep) under panseret. Som standard respekterer ripgrep `.gitignore`-mønstre, noe som betyr at filer og kataloger som er oppført i `.gitignore` vil bli ekskludert fra søk og oppføringer.
Internt bruger verktøy som `grep`, `glob` og `list` [ripgrep](https://github.com/BurntSushi/ripgrep) under panseret. Som standard respekterer ripgrep `.gitignore`-mønstre, noe som betyr at filer og kataloger som er oppført i `.gitignore` vil bli ekskludert fra søk og lister.
---
### Ignorer mønstre
### Ignore patterns
For å inkludere filer som normalt vil bli ignorert, lag en `.ignore`-fil i prosjektroten. Denne filen kan eksplisitt tillate visse stier.
For at inkludere filer som normalt vil bli ignorert, lag en `.ignore`-fil i prosjektroten. Denne filen kan eksplisitt tillate visse stier.
```text title=".ignore"
!node_modules/

View File

@@ -3,7 +3,7 @@ title: Feilsøking
description: Vanlige problemer og hvordan de kan løses.
---
For å feilsøke problemer med OpenCode, start med å sjekke loggene og lokale data den lagrer på disken.
For at feilsøke problemer med OpenCode, start med at tjeke loggene og lokale data den lagrer på disken.
---
@@ -16,13 +16,13 @@ Loggfiler skrives til:
Loggfiler navngis med tidsstempler (f.eks. `2025-01-09T123456.log`) og de siste 10 loggfilene beholdes.
Du kan angi loggnivået med kommandolinjealternativet `--log-level` for å få mer detaljert feilsøkingsinformasjon. For eksempel `opencode --log-level DEBUG`.
Du kan angi loggnivået med kommandolinjealternativet `--log-level` for at få mer detaljert feilsøkingsinformasjon. For eksempel `opencode --log-level DEBUG`.
---
## Lagring
opencode lagrer øktdata og andre applikasjonsdata på disken på:
opencode lagrer sessiondata og andre applikasjonsdata på disken på:
- **macOS/Linux**: `~/.local/share/opencode/`
- **Windows**: Trykk `WIN+R` og lim inn `%USERPROFILE%\.local\share\opencode`
@@ -31,7 +31,7 @@ Denne katalogen inneholder:
- `auth.json` - Autentiseringsdata som API-nøkler, OAuth-tokens
- `log/` - Applikasjonslogger
- `project/` - Prosjektspesifikke data som økt- og meldingsdata
- `project/` - Prosjektspesifikke data som session- og meldingsdata
- Hvis prosjektet er innenfor en Git-repo, lagres det i `./<project-slug>/storage/`
- Hvis det ikke er en Git-repo, lagres det i `./global/storage/`
@@ -41,7 +41,7 @@ Denne katalogen inneholder:
OpenCode Desktop kjører en lokal OpenCode-server (`opencode-cli` sidevognen) i bakgrunnen. De fleste problemene er forårsaket av en plugin som fungerer dårlig, en ødelagt cache eller en dårlig serverinnstilling.
### Raske sjekker
### Raske tjeker
- Avslutt og start appen på nytt.
- Hvis appen viser en feilskjerm, klikker du på **Start på nytt** og kopierer feildetaljene.
@@ -51,9 +51,9 @@ OpenCode Desktop kjører en lokal OpenCode-server (`opencode-cli` sidevognen) i
### Deaktiver plugins
Hvis skrivebordsappen krasjer ved oppstart, henger eller oppfører seg merkelig, start med å deaktivere plugins.
Hvis skrivebordsappen krasjer ved oppstart, henger eller oppfører seg merkelig, start med at deaktivere plugins.
#### Sjekk den globale konfigurasjonen
#### Tjek den globale konfigurasjonen
Åpne den globale konfigurasjonsfilen og se etter en `plugin`-nøkkel.
@@ -61,7 +61,7 @@ Hvis skrivebordsappen krasjer ved oppstart, henger eller oppfører seg merkelig,
- **macOS/Linux** (eldre installasjoner): `~/.local/share/opencode/opencode.jsonc`
- **Windows**: Trykk `WIN+R` og lim inn `%USERPROFILE%\.config\opencode\opencode.jsonc`
Hvis du har konfigurert plugins, deaktiver dem midlertidig ved å fjerne nøkkelen eller sette den til en tom matrise:
Hvis du har konfigurert plugins, deaktiver dem midlertidig ved at fjerne nøkkelen eller sette den til en tom matrise:
```jsonc
{
@@ -70,17 +70,17 @@ Hvis du har konfigurert plugins, deaktiver dem midlertidig ved å fjerne nøkkel
}
```
#### Sjekk plugin-kataloger
#### Tjek plugin-kataloger
OpenCode kan også laste lokale plugins fra disken. Flytt disse midlertidig ut av veien (eller gi nytt navn til mappen) og start skrivebordsappen på nytt:
- **Globale plugins**
- **macOS/Linux**: `~/.config/opencode/plugins/`
- **Windows**: Trykk `WIN+R` og lim inn `%USERPROFILE%\.config\opencode\plugins`
- **Prosjektplugins** (bare hvis du bruker konfigurasjon per prosjekt)
- **Prosjektplugins** (bare hvis du bruger konfigurasjon per prosjekt)
- `<your-project>/.opencode/plugins/`
Hvis appen begynner å fungere igjen, aktiverer du plugins én om gangen for å finne ut hvilken som forårsaker problemet.
Hvis appen begynner at fungere igjen, aktiverer du plugins én om gangen for at finne ut hvilken som forårsaker problemet.
---
@@ -103,19 +103,19 @@ Hvis deaktivering av plugins ikke hjelper (eller en plugin-installasjon sitter f
OpenCode Desktop kan enten starte sin egen lokale server (standard) eller koble til en server URL du har konfigurert.
Hvis du ser en **"Tilkobling mislyktes"**-dialogboks (eller appen kommer aldri forbi splash-skjermen), se etter en tilpasset server URL.
Hvis du ser en **"Tilkobling mislyktes"**-dialogboks (eller appen kommer aldri forbi splash-skjermen), se etter en brugerdefineret server URL.
#### Slett standardserveren for skrivebordet URL
Fra startskjermen klikker du på servernavnet (med statusprikken) for å åpne servervelgeren. I delen **Standardserver** klikker du på **Slett**.
Fra startskjermen klikker du på servernavnet (med statusprikken) for at åpne servervelgeren. I delen **Standardserver** klikker du på **Slett**.
#### Fjern `server.port` / `server.hostname` fra konfigurasjonen din
Hvis `opencode.json(c)` inneholder en `server`-del, fjern den midlertidig og start skrivebordsappen på nytt.
#### Sjekk miljøvariabler
#### Tjek miljøvariabler
Hvis du har `OPENCODE_PORT` satt i miljøet ditt, vil skrivebordsappen prøve å bruke den porten for den lokale serveren.
Hvis du har `OPENCODE_PORT` satt i miljøet ditt, vil skrivebordsappen prøve at bruge den porten for den lokale serveren.
- Deaktiver `OPENCODE_PORT` (eller velg en ledig port) og start på nytt.
@@ -123,22 +123,22 @@ Hvis du har `OPENCODE_PORT` satt i miljøet ditt, vil skrivebordsappen prøve å
### Linux: Wayland / X11 problemer
På Linux kan noen Wayland-oppsett forårsake tomme vinduer eller kompositorfeil.
På Linux kan nogle Wayland-oppsett forårsake tomme vinduer eller kompositorfeil.
- Hvis du er på Wayland og appen er tom/krasj, prøv å starte med `OC_ALLOW_WAYLAND=1`.
- Hvis det gjør ting verre, fjern det og prøv å starte under en X11-økt i stedet.
- Hvis du er på Wayland og appen er tom/krasj, prøv at starte med `OC_ALLOW_WAYLAND=1`.
- Hvis det gør ting verre, fjern det og prøv at starte under en X11-session i stedet.
---
### Windows: WebView2 kjøretid
På Windows krever OpenCode Desktop Microsoft Edge **WebView2 Runtime**. Hvis appen åpnes i et tomt vindu eller ikke starter, installer/oppdater WebView2 og prøv igjen.
På Windows krever OpenCode Desktop Microsoft Edge **WebView2 Runtime**. Hvis appen åpnes i et tomt vindu eller ikke starter, installer/opdater WebView2 og prøv igjen.
---
### Windows: Generelle ytelsesproblemer
Hvis du opplever treg ytelse, problemer med filtilgang eller terminalproblemer på Windows, kan du prøve å bruke [WSL (Windows Subsystem for Linux)](/docs/windows-wsl). WSL gir et Linux-miljø som fungerer mer sømløst med funksjonene til OpenCode.
Hvis du opplever treg ytelse, problemer med filtilgang eller terminalproblemer på Windows, kan du prøve at bruge [WSL (Windows Subsystem for Linux)](/docs/windows-wsl). WSL gir et Linux-miljø som fungerer mer sømløst med funksjonene til OpenCode.
---
@@ -153,7 +153,7 @@ OpenCode Desktop viser bare systemvarsler når:
### Tilbakestill skrivebordsapplagring (siste utvei)
Hvis appen ikke starter og du ikke kan slette innstillingene fra UI, tilbakestill skrivebordsappens lagrede tilstand.
Hvis appen ikke starter og du ikke kan slette innstillingene fra UI, nulstil skrivebordsappens lagrede tilstand.
1. Avslutt OpenCode Desktop.
2. Finn og slett disse filene (de finnes i OpenCode Desktop-appens datakatalog):
@@ -175,11 +175,11 @@ Hvis du opplever problemer med OpenCode:
1. **Rapporter problemer på GitHub**
Den beste måten å rapportere feil eller be om funksjoner på er gjennom vårt GitHub-lager:
Den beste måten at rapportere feil eller be om funksjoner på er gjennom vårt GitHub-lager:
[**github.com/anomalyco/opencode/issues**](https://github.com/anomalyco/opencode/issues)
Før du oppretter et nytt problem, søk i eksisterende problemer for å se om problemet ditt allerede er rapportert.
Før du opreter et nytt problem, søk i eksisterende problemer for at se om problemet ditt allerede er rapportert.
2. **Bli med i vår Discord**
@@ -191,31 +191,31 @@ Hvis du opplever problemer med OpenCode:
## Vanlige problemer
Her er noen vanlige problemer og hvordan du kan løse dem.
Her er nogle vanlige problemer og hvordan du kan løse dem.
---
### OpenCode vil ikke starte
1. Sjekk loggene for feilmeldinger
2. Prøv å kjøre med `--print-logs` for å se utdata i terminalen
1. Tjek loggene for feilmeldinger
2. Prøv at kjøre med `--print-logs` for at se utdata i terminalen
3. Sørg for at du har den nyeste versjonen med `opencode upgrade`
---
### Autentiseringsproblemer
1. Prøv å autentisere på nytt med kommandoen `/connect` i TUI
2. Sjekk at API-nøklene dine er gyldige
1. Prøv at autentisere på nytt med kommandoen `/connect` i TUI
2. Tjek at API-nøklene dine er gyldige
3. Sørg for at nettverket ditt tillater tilkoblinger til leverandørens API
---
### Modellen er ikke tilgjengelig
### Modellen er ikke tilgængelig
1. Sjekk at du har autentisert deg med leverandøren
1. Tjek at du har autentisert deg med leverandøren
2. Kontroller at modellnavnet i konfigurasjonen er riktig
3. Noen modeller kan kreve spesifikk tilgang eller abonnement
3. Nogle modeller kan kreve spesifikk tilgang eller abonnement
Hvis du støter på `ProviderModelNotFoundError` er du mest sannsynlig feil
refererer til en modell et sted.
@@ -227,7 +227,7 @@ Eksempler:
- `openrouter/google/gemini-2.5-flash`
- `opencode/kimi-k2`
For å finne ut hvilke modeller du har tilgang til, kjør `opencode models`
For at finne ut hvilke modeller du har tilgang til, kjør `opencode models`
---
@@ -235,10 +235,10 @@ For å finne ut hvilke modeller du har tilgang til, kjør `opencode models`
Hvis du støter på en ProviderInitError, har du sannsynligvis en ugyldig eller ødelagt konfigurasjon.
For å løse dette:
For at løse dette:
1. Kontroller først at leverandøren din er riktig konfigurert ved å følge [leverandørveiledningen](/docs/providers)
2. Hvis problemet vedvarer, prøv å tømme den lagrede konfigurasjonen:
1. Kontroller først at leverandøren din er riktig konfigurert ved at følge [leverandørveiledningen](/docs/providers)
2. Hvis problemet vedvarer, prøv at tømme den lagrede konfigurasjonen:
```bash
rm -rf ~/.local/share/opencode
@@ -246,7 +246,7 @@ For å løse dette:
På Windows, trykk `WIN+R` og slett: `%USERPROFILE%\.local\share\opencode`
3. Autentiser på nytt med leverandøren din ved å bruke kommandoen `/connect` i TUI.
3. Autentiser på nytt med leverandøren din ved at bruge kommandoen `/connect` i TUI.
---
@@ -254,7 +254,7 @@ For å løse dette:
Hvis du støter på API anropsfeil, kan dette skyldes utdaterte leverandørpakker. opencode installerer dynamisk leverandørpakker (OpenAI, Anthropic, Google, etc.) etter behov og cacher dem lokalt.
For å løse problemer med leverandørpakke:
For at løse problemer med leverandørpakke:
1. Tøm leverandørens pakkebuffer:
@@ -264,15 +264,15 @@ For å løse problemer med leverandørpakke:
På Windows, trykk `WIN+R` og slett: `%USERPROFILE%\.cache\opencode`
2. Start opencode på nytt for å installere de nyeste leverandørpakkene på nytt
2. Start opencode på nytt for at installere de nyeste leverandørpakkene på nytt
Dette vil tvinge opencode til å laste ned de nyeste versjonene av leverandørpakkene, som ofte løser kompatibilitetsproblemer med modellparametere og API endringer.
Dette vil tvinge opencode til at laste ned de nyeste versjonene av leverandørpakkene, som ofte løser kompatibilitetsproblemer med modellparametere og API endringer.
---
### Kopier/lim inn fungerer ikke på Linux
Linux-brukere må ha ett av følgende utklippstavleverktøy installert for at kopier/lim inn-funksjonalitet skal fungere:
Linux-brugere må ha ett av følgende utklippstavleverktøy installert for at kopier/lim inn-funksjonalitet skal fungere:
**For X11-systemer:**
@@ -297,4 +297,4 @@ Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
export DISPLAY=:99.0
```
opencode vil oppdage om du bruker Wayland og foretrekker `wl-clipboard`, ellers vil den prøve å finne utklippstavleverktøy i rekkefølgen: `xclip` og `xsel`.
opencode vil oppdage om du bruger Wayland og foretrekker `wl-clipboard`, ellers vil den prøve at finne utklippstavleverktøy i rekkefølgen: `xclip` og `xsel`.

Some files were not shown because too many files have changed in this diff Show More