Il pacchetto esporta bridge tipizzati e lazy per le app integrate, un client connect() per i processi locali esterni, tipi condivisi per richieste e risultati e funzioni di validazione.

Namespace Integrati

Importa questi namespace nel codice browser che Kucedr apre come app:

import { agent, app, coder, isKucedr, models, terminal, win } from '@kucedr/sdk';
NamespaceScopoDisponibilità
appTema, lingua, impostazioni, eventi e spazio dati isolato dell’appIntegrato; la maggior parte delle impostazioni non legate allo storage è disponibile anche da remoto.
agentAPI dell’agente e del workspaceIntegrato, con operazioni sensibili limitate dall’host. Il client remoto espone solo le operazioni del workspace.
modelsAPI dei modelli configurati, inclusa generazione e modifica di immaginiSolo integrato. Le credenziali del provider non vengono esposte all’app.
winMenu contestuali nativi, stato della finestra e controlli della barra del titolo gestiti dall’hostSolo integrato.
coderProgetti, sessioni persistenti, esecuzioni Agent e Shell, impostazioni, autenticazione, streaming e annullamentoSolo integrato e riservato all’app Coder registrata.
terminalCreazione di pseudoterminali con proprietario, input, ridimensionamento, output ed eventi di uscitaSolo integrato e limitato alle finestre Kucedr autorizzate e all’app Coder.

Il bridge è lazy: importare un namespace è sicuro, ma chiamarlo fuori da Kucedr genera un errore. Usa isKucedr() prima della prima chiamata all’host.

Spazio Dati Dell’App

Le app integrate ricevono automaticamente un proprio namespace di storage. Non passano e non scelgono mai un ID app.

import { app, isExtensionStoreValue } from '@kucedr/sdk';

await app.setExtensionStoreValue('preferences', {
  compact: true,
  accent: 'violet',
});

const value = await app.getExtensionStoreValue('preferences');

if (!isExtensionStoreValue(value)) {
  throw new Error('Valore salvato non supportato');
}

I valori possono contenere numeri finiti, stringhe, booleani, null, array densi e oggetti semplici. Non salvare segreti: i valori sono JSON in chiaro. Valori e file restano disponibili quando un’app viene rimossa, quindi reinstallare lo stesso ID ripristina lo stato.

I metodi per i file usano Uint8Array e percorsi relativi alla directory isolata dell’app:

const data = new TextEncoder().encode('Contenuto della bozza');
await app.writeExtensionStoreFile('drafts/first.txt', data);

const saved = await app.readExtensionStoreFile('drafts/first.txt');
console.log(new TextDecoder().decode(saved));

await app.deleteExtensionStoreFile('drafts/first.txt');

I percorsi devono usare slash /. Percorsi assoluti, vuoti o con segmenti . e .. vengono rifiutati. Eliminare un valore o file mancante è sicuro; leggere un file mancante genera un errore.

Temi E Controlli Della Finestra

Usa il tema risolto da Kucedr invece di presumere che la modalità salvata system sia chiara o scura:

const stopTheme = app.onThemeModeChanged((theme) => {
  document.documentElement.dataset.theme = theme.isDark ? 'dark' : 'light';
});

win.setTitlebarOptions({
  title: 'Dashboard del progetto',
  leftButtons: [
    {
      id: 'toggle-sidebar',
      label: 'Mostra o nascondi la barra laterale',
      icon: 'panel-left',
      expanded: true,
    },
  ],
  sidebarOpen: true,
  sidebarWidth: 240,
});

const stopButtons = win.onTitlebarButtonClick((buttonId) => {
  if (buttonId === 'toggle-sidebar') {
    // Aggiorna lo stato dell’app, poi invia le nuove opzioni della barra del titolo.
  }
});

// Richiama queste funzioni durante il cleanup.
stopTheme();
stopButtons();

Le icone della barra del titolo devono provenire da EXTENSION_TITLEBAR_BUTTON_ICONS; non è possibile inviare markup arbitrario oltre il confine della finestra. Passa null a win.setTitlebarOptions() per ripristinare il titolo del manifest e rimuovere i controlli forniti dall’app.

Generazione Di Immagini

models.image.createImage() usa il provider e il modello immagini configurati in Kucedr:

const generated = await models.image.createImage({
  prompt: 'A calm, modern reading room',
});

const revised = await models.image.createImage({
  prompt: 'Replace the armchair with a leather lounge chair.',
  source: {
    base64: generated.base64,
    mimeType: 'image/png',
  },
});

Le immagini sorgente accettano dati JPEG, PNG o WebP fino a 18 MiB. Usa il MIME type restituito quando trasformi i byte del risultato in un data URL o in un file.

Client Esterno

Kucedr salva un bearer token in <userData>/sdk-token. Su macOS il percorso predefinito è ~/Library/Application Support/Kucedr/sdk-token. Mantieni privato il token e leggilo durante l’esecuzione invece di copiarlo nel codice sorgente.

import { readFileSync } from 'node:fs';
import { connect } from '@kucedr/sdk';

const kucedr = connect({
  token: readFileSync(
    '/Users/me/Library/Application Support/Kucedr/sdk-token',
    'utf8',
  ).trim(),
});

await kucedr.ping();

const files = await kucedr.agent.listWorkspaceFiles();
const userProfile = await kucedr.agent.readWorkspaceFile('USER.md');

const stop = kucedr.agent.onWorkspaceChanged((event) => {
  console.log(event.type, event.path);
});

// Durante l’arresto:
stop();
kucedr.close();

connect() usa per impostazione predefinita http://127.0.0.1:8765 e accetta un url o un’implementazione fetch alternativi. I callback degli eventi aprono una connessione Server-Sent Events al primo utilizzo. Chiama close() durante l’arresto per chiudere lo stream.

Sicurezza A Runtime

  • Tratta il token dell’SDK come una password: qualsiasi processo che lo possiede può chiamare l’API locale esposta.
  • Non inserire credenziali nello spazio dati dell’app perché viene salvato in chiaro.
  • Prevedi che l’host rifiuti le API che l’app corrente non è autorizzata a usare.
  • La directory di lavoro di un progetto non è una sandbox del sistema operativo. Le operazioni di coding e terminale vengono eseguite con i permessi dell’utente desktop.
  • Le app ricevono eventi degli strumenti dell’agente oscurati e non ricevono le credenziali dei provider.