Passa al contenuto principale

Riferimento API host

runtime.hostApi è l'interfaccia principale tramite cui gli hook dei Workflow interagiscono con Zotero. Incapsula capacità operative complete per le librerie Zotero, gli elementi, i file system, le preferenze e altro ancora.

Operazioni sugli elementi (hostApi.items)

hostApi.items = {
get: (ref) => Zotero.Item | null, // Ottiene un elemento per riferimento
resolve: (ref) => Zotero.Item, // Come get, ma lancia un'eccezione se l'elemento non esiste
getByLibraryAndKey: (libraryID, key) => Zotero.Item | null, // Ottiene per ID libreria + Key
getAll: () => Promise<Zotero.Item[]>, // Ottiene tutti gli elementi
}

ref può essere un oggetto Zotero.Item, un ID numerico o una Key stringa.

Esempio:

// Ottiene un elemento per ID
const item = hostApi.items.get(12345);

// Ottiene un elemento per Key della libreria
const item = hostApi.items.getByLibraryAndKey(1, "ABCD1234");

Contesto (hostApi.context)

hostApi.context = {
getCurrentView: () => ZoteroHostCurrentViewDto, // Informazioni sulla vista attiva corrente
getSelectedItems: () => ZoteroHostItemSummaryDto[], // Elenco degli elementi attualmente selezionati
}

Esempio:

const view = hostApi.context.getCurrentView();
// { libraryID: 1, selectedItems: [...], ... }

const selected = hostApi.context.getSelectedItems();
// [{ id, key, libraryID, title, ... }, ...]

Operazioni sulla libreria (hostApi.library)

hostApi.library = {
listItems: (args) => Promise<LibraryListResponse>, // Elenco paginato degli elementi
searchItems: (args) => Promise<ItemSummaryDto[]>, // Ricerca elementi
getItemDetail: (ref) => Promise<ItemDetailDto | null>, // Ottiene informazioni dettagliate sull'elemento
getItemNotes: (ref, args?) => Promise<NoteDto[]>, // Ottiene l'elenco delle note dell'elemento
getNoteDetail: (ref, args?) => Promise<NoteDetailChunkDto>, // Ottiene il corpo della nota
listNotePayloads: (ref) => Promise<NotePayloadDto[]>, // Elenca i payload incorporati delle note
getNotePayload: (ref, args?) => Promise<NotePayloadDto>, // Ottiene un payload specifico
getItemAttachments: (ref) => Promise<AttachmentDto[]>, // Ottiene l'elenco degli allegati dell'elemento
}

Esempio:

// Ricerca elementi
const results = await hostApi.library.searchItems({
query: "transformer",
limit: 10,
});

// Ottiene le note dell'elemento
const notes = await hostApi.library.getItemNotes(ref);

// Ottiene gli allegati dell'elemento
const attachments = await hostApi.library.getItemAttachments(ref);

Operazioni di mutazione (hostApi.mutations)

Utilizzate per creare, aggiornare ed eliminare dati in Zotero. Le operazioni di scrittura richiedono l'approvazione dell'utente (confermata nell'interfaccia di Zotero).

hostApi.mutations = {
preview: (request) => Promise<MutationPreviewResponse>, // Anteprima degli effetti della mutazione
execute: (request) => Promise<MutationExecuteResponse>, // Esegue la mutazione
}

Operazioni di mutazione supportate

operationScopoDescrizione
item.updateFieldsAggiorna campi dell'elementoModifica titolo, autore, data e altri campi
item.addTagsAggiunge tagAggiunge uno o più tag a un elemento
item.removeTagsRimuove tagRimuove i tag specificati da un elemento
note.createChildCrea nota figliaCrea una nuova nota sotto un elemento genitore
note.updateAggiorna notaModifica il contenuto di una nota esistente
note.upsertPayloadAggiorna payload incorporatoAggiorna l'allegato payload del Workflow della nota
literature.ingestAcquisisci letteraturaImporta un articolo in Zotero
collection.addItemsAggiungi alla collezioneAggiunge elementi a una collezione
collection.removeItemsRimuovi dalla collezioneRimuove elementi da una collezione

Esempio: Creare una nota

const result = await hostApi.mutations.execute({
operation: "note.createChild",
parentItem: parentItem.getField("id"),
data: {
content: htmlContent,
tags: ["generated"],
},
});

Esempio: Aggiungere tag

await hostApi.mutations.execute({
operation: "item.addTags",
item: itemId,
data: { tags: ["field:computer_science", "method:deep_learning"] },
});

Operazioni sulle note (hostApi.notes)

hostApi.notes = {
// ... Tutti i metodi dal gestore di note di basso livello
importEmbeddedImage: (noteRef, image) => Promise<{
attachmentKey: string;
attachmentItem: Zotero.Item;
mimeType: string;
bytes: number;
}>,
}

Elaborazione delle immagini (hostApi.images)

hostApi.images = {
prepareForNoteEmbedding: (source, options?) => Promise<PreparedNoteImage>,
}

Utilizzato per elaborare le immagini in un formato adatto all'incorporamento nelle note:

const prepared = await hostApi.images.prepareForNoteEmbedding(filePath, {
maxLongEdge: 720,
targetBytes: 180 * 1024,
});

const result = await hostApi.notes.importEmbeddedImage(noteRef, prepared);

Operazioni sugli allegati (hostApi.attachments)

hostApi.attachments = {
// Tutti i metodi dal gestore di allegati di basso livello
// Inclusi: elencare allegati, ottenere percorsi degli allegati, creare allegati, ecc.
}

Operazioni sui tag (hostApi.tags)

hostApi.tags = {
// Tutti i metodi dal gestore di tag di basso livello
// Inclusi: elencare tag, ottenere tag, creare tag, ecc.
}

Operazioni sulle collezioni (hostApi.collections)

hostApi.collections = {
// Tutti i metodi dal gestore di collezioni di basso livello
// Inclusi: elencare collezioni, ottenere sotto-collezioni, ecc.
}

Operazioni sui file (hostApi.file)

hostApi.file = {
readText: (path) => Promise<string>, // Legge file di testo
writeText: (path, content) => Promise<void>, // Scrive file di testo
readBytes: (path) => Promise<Uint8Array>, // Legge file binari
writeBytes: (path, bytes) => Promise<void>, // Scrive file binari
copy: (source, target) => Promise<void>, // Copia file
exists: (path) => Promise<boolean>, // Verifica se il file esiste
makeDirectory: (path) => Promise<void>, // Crea directory (incluse le directory genitore)
pathToFile: (path) => nsIFile, // Converte il percorso in oggetto file Zotero
getTempDirectoryPath: () => string, // Ottiene il percorso della directory temporanea
pickDirectory: (args?) => Promise<string | null>, // Apre il selettore di directory
pickFile: (args?) => Promise<string | null>, // Apre il selettore di file
pickFiles: (args?) => Promise<string[] | null>, // Apre il selettore di file multipli
}

Esempio:

// Legge file
const content = await hostApi.file.readText("/path/to/file.md");

// Scrive file
await hostApi.file.writeText("/path/to/output.md", newContent);

// Apre il selettore di directory per far scegliere all'utente la directory di esportazione
const dir = await hostApi.file.pickDirectory({
title: "Seleziona directory di esportazione",
});
if (dir) {
// L'utente ha selezionato una directory
await hostApi.file.writeText(`${dir}/result.md`, content);
}

Preferenze (hostApi.prefs)

hostApi.prefs = {
get: (key, global?) => unknown, // Legge preferenza
set: (key, value, global?) => void, // Scrive preferenza
clear: (key, global?) => void, // Cancella preferenza
}

Il prefisso è gestito automaticamente dal plugin; è sufficiente passare il nome della chiave.

Esempio:

// Legge configurazione
const vocab = hostApi.prefs.get("tagVocabularyJson");

// Scrive configurazione
hostApi.prefs.set("mySetting", "myValue");

Notifiche UI (hostApi.notifications)

hostApi.notifications = {
toast: ({ text, type? }) => void,
}
// type: "default" | "success" | "error"

Esempio:

hostApi.notifications.toast({
text: "Elaborazione completata!",
type: "success",
});

Logging di runtime (hostApi.logging)

hostApi.logging = {
appendRuntimeLog: (input) => void,
}

Utilizzato per aggiungere informazioni diagnostiche al logger di runtime.

Configurazione del plugin (hostApi.addon)

hostApi.addon = {
getConfig: () => ({ addonName, addonRef, prefsPrefix }),
}

Versione API (hostApi.version)

hostApi.version: number

Il numero di versione corrente delle API host. Utilizzarlo per proteggersi da breaking changes quando si scrivono hook che devono essere compatibili tra versioni del plugin.

Operazioni sui genitori (hostApi.parents)

hostApi.parents = {
// Operazioni del gestore di elementi genitore di basso livello
}

Fornisce accesso di livello inferiore alla gestione degli elementi genitore. Preferire l'uso di hostApi.library e hostApi.mutations a meno che non sia necessaria l'interfaccia del gestore di livello inferiore.

Operazioni sui comandi (hostApi.command)

hostApi.command = {
// Operazioni del gestore di comandi di basso livello
}

Interfaccia di livello inferiore per l'esecuzione di comandi. Tipicamente non necessaria negli hook dei Workflow.

Operazioni sull'editor (hostApi.editor)

hostApi.editor = {
openSession: (args) => ReturnType<typeof openWorkflowEditorSession>,
registerRenderer: (rendererId, renderer) => void,
unregisterRenderer: (rendererId) => void,
}

Gestisce le sessioni dell'editor dei Workflow. registerRenderer e unregisterRenderer consentono renderer personalizzati per formati di output specifici dei Workflow.

Operazioni di sintesi (hostApi.synthesis)

hostApi.synthesis?: SynthesisService

Fornisce accesso al servizio Synthesis Workbench (argomenti, concetti, tag, grafo delle citazioni, ecc.). Disponibile solo quando il sistema Synthesis è inizializzato.

Esempio completo

export async function applyResult({ parent, bundleReader, runtime }) {
const { hostApi, helpers } = runtime;

// 1. Risolve l'elemento genitore
const parentItem = helpers.resolveItemRef(parent);

// 2. Legge l'artifact dal bundle
const markdownContent = await bundleReader.readText("result/output.md");

// 3. Converte in nota HTML
const htmlContent = helpers.toHtmlNote("Risultato dell'elaborazione", markdownContent);

// 4. Crea la nota
const noteResult = await hostApi.mutations.execute({
operation: "note.createChild",
parentItem: parentItem.getField("id"),
data: { content: htmlContent },
});

// 5. Aggiunge tag
await hostApi.mutations.execute({
operation: "item.addTags",
item: parentItem.getField("id"),
data: { tags: ["processed"] },
});

// 6. Notifica l'utente
hostApi.notifications.toast({
text: `Elaborazione completata: ${parentItem.getField("title")}`,
type: "success",
});

return { applied: true, noteId: noteResult.id };
}

Prossimi passi