İçeriğe geç
Gezin escKapat

Host API

Bu sayfayı connectHost metodlarını, sınırları ve hata kodlarını tam olarak bilmeniz gerektiğinde kullanın. Klasör düzeni, manifest ve kurulum için Eklenti oluşturma sayfasından başlayın.

import { connectHost, HostRequestError } from "@openchamber/sdk";
const host = connectHost();

connectHost, window yoksa HOST_UNAVAILABLE fırlatır. OpenChamber dışında, her çağrısı HOST_UNAVAILABLE ile reddedilen bir istemci döndürür. Sayfayı kapatırken dispose() çağırın; hâlâ süren çağrılar aynı kodla reddedilir.

OpenChamber’ın size gönderdikleri

onReady ilk anlık görüntüyle tetiklenir ve OpenChamber onu her yenilediğinde yeniden tetiklenir.

Bu, yalnızca bir kez çalışan bir bağlama callback’i değildir. Arayüzü ve abonelikleri bir kez oluşturun; sonraki çağrılarda alanları veya taslakları değiştirmeden temayı ve bağlamı güncelleyin. UI kit sayfasındaki korumalı örneğe bakın. onConnection gibi dinleyiciler mevcut değeri hemen iletir ve yeni görüntülerde aynı değeri tekrar iletebilir. Yeni istekten önce ilgili alanları karşılaştırın ve yerini yeni isteklerin aldığı eski yanıtları yok sayın.

AlanAnlamı
theme.modelight veya dark
theme.tokensuygulamanın renkleri (yüzeyler, metin, etkileşim durumları, primary, success/warning/error/info), font, mono ve radius. UI’ı bağlamadan önce bunu applyHostReady fonksiyonuna verin.
localeuygulamanın dil etiketi
directorygeçerli proje dizini veya null
session{ id, title, busy } veya null. Başlık yoksa oturum id’sine düşer. busy canlı durumdur. Oturumda varsa model ve agent (OpenCode ajanı) de gelir.
surfaceşeritte panel, iliştirme penceresinde dialog, tam ekranda page
itembu yüzeyin ne için açıldığı veya null: kullanıcının tıkladığı iliştirilmiş öğe (attach çağrısına verdiğiniz alanların aynısı, data dahil), tanımladığınız eylemlerden birinden gelen bir mesaj (kind: "message") veya oturum (kind: "session"). Bkz. Eylemler.
connectionentegrasyonunuz için { connected, account }
settingsintegration.settings içinde tanımladığınız alanların değerleri

Erişim token’ları burada da, request sonucunda da asla görünmez.

onDirectory, onSession, onSessionLifecycle, onConnection, onSettings ve onItem geç abone olduğunuzda en son değeri yeniden gönderir, sonra değiştikçe tetiklenmeye devam eder.

theme.tokens, primaryText, successText, warningText, errorText ve infoText alanlarını içerir. Bu zorunlu alanlar, host’un nötr arka planlar ve UI kit’in hafif renkli kontrolleri için hesapladığı metin renklerini taşır; düz renk dolguları için değildir. applyHostReady her durum güncellemesinde bunları uygular. CSS değişkenleri için UI kit sayfasına bakın.

Metodlar

ÇağrıNe yapar
toast({ kind, message })uygulamada bildirim gösterir. kind değeri info, success veya error.
openUrl(url)kullanıcının tarayıcısında bir URL açar
openSurface(surfaceId)uygulamayı o ekrana geçirir
writeClipboard(text)metni kopyalar. 1 ile 32000 karakter arası.
compose({ text, mode? })metni göndermeden sohbet kutusuna koyar. mode değeri append (varsayılan) veya replace. Boşluklar kırpıldıktan sonra 1 ile 16000 karakter arası.
attach({ ... })sohbet kutusuna, GitHub ve Linear öğelerinin düştüğü yere bir etiket koyar. Aynı anda yalnızca bir etiket.
startSession({ ... })o öğe iliştirilmiş bir oturum oluşturur. { sessionId, sent } döndürür. sessions yeteneği gerekir.
prompt({ text, send? })geçerli oturuma yazar ya da oradan gönderir. { sent } döndürür. Göndermek için prompt yeteneği gerekir.
sessionLink({ ... })yeni oturum oluşturmadan bir öğeyi geçerli oturuma iliştirir
close()iliştirme penceresini kapatır. Şeritte hiçbir şey yapmaz.
oauthStart()sağlayıcının yetkilendirme sayfasını, host: { provider: "linear" } entegrasyonu için ise Linear’ınkini açar
oauthDisconnect()saklanan token’ı ya da Linear bağlantısını unutur
request({ method, path, query?, body? })entegrasyonunuzun apiOrigin adresini kullanıcının token’ı ekli olarak çağırır
serviceRequest({ method, path, query?, body? })eklentinizin yerel servisini çağırır (bkz. GUEST_SERVICES.md)
serviceStatus()stopped, starting, ready veya failed
readFile(path)metin dosyası okur. { content } döndürür.
writeFile(path, content)metin dosyasını atomik olarak yazar, üst klasörleri oluşturur. { written: true } döndürür.
listDir(path)klasörü listeler. { entries: [{ name, kind }] } döndürür, kind file, directory veya other olur.
stat(path){ kind, size, mtime }, kind file, directory, other veya missing olur.
generate({ prompt, system?, maxOutputTokens? })kullanıcının Small Model’inden tek seferlik metin. { text } döndürür. model yeteneği gerekir.
onResolve(handler)eğik çizgi komutlarınız için işleyiciyi kaydeder. { command, args } alır ve iliştirilecek bir öğe ya da null döndürür.
setBadge(count)şerit simgenizde bir sayı (0 ile 999 arası) gösterir, null ile temizler

Üçü de aynı öğe alanlarını alır:

await host.attach({
providerId: "acme-hello",
id: "TICKET-1",
title: "Login is broken",
url: "https://example.com/TICKET-1",
});
await host.attach({
providerId: "acme-hello",
id: "!12",
title: "Fix login",
url: "https://example.com/merge_requests/12",
kind: "pull",
author: "ada",
branches: { head: "feature", base: "main" },
text: "Optional notes for the model",
});
await host.startSession({
providerId: "acme-hello",
id: "!12",
title: "Fix login",
url: "https://example.com/merge_requests/12",
kind: "pull",
worktree: true,
text: "Optional first message",
});

providerId panel id’nizdir; OpenChamber bunun üzerine zaten sizin id’nizi yazar. id öğe için kendi tanımlayıcınızdır. kind değeri issue (varsayılan) veya pull. text model için isteğe bağlı bağlamdır; boşluklar kırpıldıktan sonra 1 ile 16000 karakter arası. data size ait isteğe bağlı bir JSON’dur (durum, yorumlar, ne isterseniz); serileştirildiğinde en fazla 16000 karakter. OpenChamber bunu etiketle birlikte saklar ve kullanıcı etikete tıkladığında ctx.item içinde değiştirmeden geri verir; modele hiçbir zaman ulaşmaz.

startSession, etkin projeyi değiştirmeden projectId kabul eder. worktree verilmezse hedef dizin kullanılır; true otomatik adlı yeni worktree, { kind: "existing", directory } mevcut worktree, { kind: "new", name?, baseBranch? } ise adı ve temel dalı seçilen yeni worktree içindir. Ad, dal için de kullanılır. navigation varsayılanı "preserve" olur; "open" yeni sohbeti açar. İlk mesajın modeli, ajanı ve varyantı başlangıçta yakalanır.

Sonuç sessionId, directory, sent, linked ve isteğe bağlı worktree içerir. sent, sent, no-model, skipped veya failed olur; linked: false, öğenin kaydedilemediğini belirtir. Hazırlık veya oturum oluşturma hatasından sonra worktree kalırsa sessionId: null ve failure: "bootstrap-failed" | "session-create-failed" döner. Yeniden denemeden önce kontrol edin. En fazla 180 saniye bekler; zaman aşımı oluşturmanın geri alındığını kanıtlamaz.

sessionLink öğeyi şu an açık olan oturuma iliştirir. Proje veya oturum yoksa NO_SESSION hatasıdır.

İstemcinin herhangi bir şey gönderilmeden önce uyguladığı sınırlar:

AlanEn fazla karakter
id128
title200
url2000
text16000
data (serileştirilmiş)16000
author80
her dal adı200

prompt ve oturum yaşam döngüsü

await host.prompt({ text: "Fix the login" });
await host.prompt({ text: "Fix the login", send: true });
host.onSessionLifecycle((event) => {
document.body.dataset.phase = event.phase;
});

send olmadan prompt sohbet kutusundaki metnin yerine geçer. send: true ile mesajı kullanıcının seçtiği model ve ajanla gönderir. Eklenti bunları asla kendisi seçmez. Açık oturum yoksa NO_SESSION. Oturum meşgulken göndermek SESSION_BUSY; meşgulken kutuya yazmak çalışır. Sonuç, startSession ile aynı değerleri alan { sent } olur.

onSessionLifecycle oturumun ne yaptığını söyler. phase model çalışırken started, boşa geçtiğinde completed, beklenmeyen bir durumda failure olur. Geç eklenen bir dinleyici geçerli aşamayı hemen alır.

Projeler, canlı oturumlar ve depolama

listProjects(), listWorktrees(projectId) ve listSessions(projectId) mevcut sessions iznini ve paylaşılan store verilerini kullanır. Her çağrıda Git taraması yapmaz ve konuşma içeriğini açmaz. Projeler kimlik, ad ve dizin; worktree kayıtları dal ve kullanılabilirlik içerir. Oturumlar tarihleri, üst oturumu, worktree ve yalnızca bu uzantının iliştirdiği öğeleri içerir. Bilinen arşiv oturumları da dahildir.

await onProjects(listener), await onWorktrees(projectId, listener) ve await onSessions(projectId, listener) aboneliği bitiren bir fonksiyon döndürür. Kayıt hatalarını yakalayın. Önce anlık görüntü, sonra değişiklikler gelir. Çerçeve başına en fazla 32 abonelik; dispose(), kapatma, duraklatma, kaldırma ve sunucu değiştirme bunları temizler. state, loading, ready veya error olur; oturumlarda dizin bazında coverage vardır. Hata mevcut verileri korur; tam boş listeyi yalnızca ready doğrular.

activity, unknown, idle, running, retrying, waiting-permission veya waiting-question olur. outcome, gözlemlenen completed, failed veya null değeridir; yalnızca bellekte en fazla 2.000 oturum için tutulur. Hata sonrası idle, sonraki çalışmaya kadar hatayı korur. Bu, görevin tamamlandığı anlamına gelmez. openSession(sessionId) sohbeti açıkça açar.

host.storage.get(key), set(key, value), delete(key) ve keys() ek izin olmadan bağlı sunucuda uzantının JSON verisini saklar. Olmayan anahtar undefined, kaydedilen null ise null döner. Anahtarlar 1 ile 128 karakter arasında, değer en fazla 64 KiB UTF-8, toplam 2 MiB ve 2.000 anahtardır. Projeye özel veri için anahtara proje kimliğini ekleyin. Yazmalar sıralı ve atomiktir; hatalar eski veriyi korur. Kaldırma depolamayı siler.

request

const user = await host.request({ method: "GET", path: "/api/v2/user" });

path / ile başlar, şema ve host içermez; OpenChamber onu manifestinizdeki apiOrigin ile birleştirir ve Authorization başlığını ekler. Token entegrasyonları yapıştırılan token’ı olduğu gibi, manifest token.scheme: "bearer" ayarlıyorsa Bearer <token> olarak, "basic" ayarlıyorsa Basic base64(username:token) olarak gönderir. OAuth ve Linear entegrasyonları her zaman Bearer gönderir. Sonuç { status, body } olur. body metindir; JSON’ı kendiniz ayrıştırın.

Bir Linear entegrasyonu ayrıca GET /api/linear/issues/get çağırabilir; OpenChamber bunu kendi Linear rotasından yanıtlar.

20 saniye içinde yanıt gelmezse HOST_TIMEOUT.

try {
await host.request({ method: "GET", path: "/api/v2/user" });
} catch (error) {
if (error instanceof HostRequestError && error.code === "DISCONNECTED") {
await host.oauthStart();
}
}

serviceRequest

Manifest contributes.service tanımladığında OpenChamber o süreci başlatır ve sayfanız onunla aynı türden bir çağrıyla konuşur. Sayfa soketi asla kendisi açmaz.

const status = await host.serviceStatus();
const result = await host.serviceRequest({ method: "GET", path: "/containers" });

path için request ile aynı kurallar geçerlidir. Bir yerel servis tanımlamak, kullanıcının kurulumda onayladığı yeteneklere service ekler; o zamana kadar her serviceRequest NO_SERVICE olur. Tam sözleşme: paket dosyası GUEST_SERVICES.md.

Dosyalar

Göreli bir yol açık projenin içindedir ve files yeteneği gerektirir. / veya ~/ ile başlayan bir yol, tanımlanmış bir contributes.filesystem deseniyle eşleşmeli ve filesystem yeteneği gerektirir. Kurallar için bkz. Eklenti oluşturma.

const { content } = await host.readFile("package.json");
await host.writeFile("notes/today.md", "# Today\n");
const { entries } = await host.listDir("src");
const info = await host.stat("~/.config/opencode/opencode.json");

Sınırlar: yol en fazla 1024 karakter, içerik en fazla 2,000,000 karakter, listeleme en fazla 2000 kayıt. İçerik sınırını aşmak FILE_TOO_LARGE olur.

generate

const { text } = await host.generate({ prompt: notes, system: "Summarize in one sentence." });

prompt kırpıldıktan sonra 1 ila 64.000 karakter, system en fazla 8.000, maxOutputTokens 1 ila 4.000 olabilir. Hiçbir şey bir oturuma girmez ve geçmiş tutulmaz; eklenti asla modeli seçmez. Çağrı en fazla 90 saniye bekler. Kullanılabilir bir Small Model yoksa NO_MODEL; model hatası MODEL_FAILED olur. Bkz. Metin üretme.

Hata kodları

Başarısız çağrılar HostRequestError fırlatır. code şunlardan biridir; message daha fazlasını söyler.

KodNe zaman
HOST_UNAVAILABLEwindow yok, OpenChamber içinde değil veya dispose() çalıştı
HOST_TIMEOUT20 saniye boyunca yanıt yok
HOST_REJECTEDOpenChamber reddetti veya bu SDK’nın tanımadığı bir kodla yanıtladı
DISCONNECTEDentegrasyonunuz için token veya Linear bağlantısı yok
BAD_PATHpath hatalı biçimlendirilmiş ya da izin verilen kaynağın dışına çıkmaya çalıştı
NO_INTEGRATIONmanifestte integration yok
NO_SESSIONaçık oturum yokken prompt veya sessionLink
SESSION_BUSYoturum meşgulken prompt({ send: true })
DISABLEDkullanıcı eklentiyi Ayarlar → Uzantılar içinde duraklattı
NO_SERVICEyerel servis tanımlanmamış, onaylanmamış veya çalışmıyor
NOT_GRANTEDkullanıcı bu çağrının gerektirdiği yeteneği onaylamadı
SERVICE_FAILEDyerel servis çöktü veya hiç hazır olmadı
NO_DIRECTORYaçık proje yokken göreli bir dosya yolu kullanıldı
NOT_FOUNDvar olmayan bir dosyada readFile
FILE_TOO_LARGEokuma veya yazmada dosya içeriği sınırın üzerinde
DENIEDişletim sistemi dosya işlemini reddetti
NO_MODELkullanılabilir Small Model olmadan generate
MODEL_FAILEDSmall Model bir hata döndürdü

İlgili sayfalar

  • Eklenti oluşturma: klasör, manifest, kurulum ve yetenekler
  • UI kiti: düğmeler, alanlar, listeler ve diğer yapı taşları