Salta ai contenuti

Dati e archiviazione

Archiviazione documenti legata allo spazio di lavoro e basata su LiteDB. Richiede uno spazio di lavoro aperto.

MetodoFirmaAsyncDescrizione
put(collection, key, data)NoSalva un documento
get(collection, key) → StoreDoc | nullNoRecupera un documento
list(collection, options?) → StoreDoc[]NoElenca documenti in una raccolta
search(collection, query, options?) → StoreDoc[]NoCerca testo dentro una raccolta
delete(collection, key) → booleanNoElimina un documento
count(collection) → numberNoConta documenti
clear(collection)NoElimina tutti i documenti in una raccolta
collections() → string[]NoElenca tutti i nomi delle raccolte

StoreDoc:

{
key: string
data: any
createdAt: string // ISO 8601
updatedAt: string // ISO 8601
}

StoreListOptions:

{
limit?: number // predefinito: 100
offset?: number // predefinito: 0
sort?: string // "key", "createdAt", "updatedAt" (predefinito)
order?: string // "asc" o "desc" (predefinito)
}
async function main() {
// Salva dati
g.store.put("products", "item-1", {
name: "Widget",
price: 9.99,
inStock: true
});
// Recuperali
const doc = g.store.get("products", "item-1");
if (doc) g.log("Trovato: " + doc.data.name);
// Cerca
const results = g.store.search("products", "Widget");
g.log("Corrispondenze: " + results.length);
}

Coda persistente legata allo spazio di lavoro, con livelli di priorità e supporto per la coda degli scarti. Richiede uno spazio di lavoro aperto.

MetodoFirmaAsyncDescrizione
enqueue(name, data, options?)NoAggiunge un elemento a una coda
dequeue(name) → QueueItem | nullNoEstrae l’elemento successivo
commit(checkoutId)NoSegna un elemento estratto come completato
abort(checkoutId, error?) → booleanNoRiporta un elemento in coda (o nella coda degli scarti se supera il numero massimo di nuovi tentativi)
peek(name) → QueueItem | nullNoVisualizza l’elemento successivo senza estrarlo
count(name) → numberNoConta gli elementi in attesa
clear(name)NoElimina tutti gli elementi in una coda
list(name, options?) → QueueItem[]NoElenca gli elementi in attesa
queues() → string[]NoElenca tutti i nomi delle code
deadLetter(name, options?) → DeadLetterItem[]NoElenca elementi nella coda degli scarti
retry(name, deadLetterId)NoRimette in coda un elemento scartato
waitForItem(name, options?) → Promise<QueueItem | null>Attende finché un elemento diventa disponibile

QueueEnqueueOptions:

{
priority?: number // 0=bassa, 1=normale (predefinito), 2=alta
maxRetries?: number // predefinito: 3
}

QueueItem:

{
id: number
data: any
priority: number
attempts: number
maxRetries: number
enqueuedAt: string
lastAttemptAt?: string
lastError?: string
}
async function main() {
// Metti in coda elementi di lavoro
g.queue.enqueue("urls", { url: "https://example.com/page1" });
g.queue.enqueue("urls", { url: "https://example.com/page2" }, { priority: 2 });
// Elabora elementi
const item = g.queue.dequeue("urls");
if (!item) return g.log("Coda vuota");
await g.nav.navigateToUrl(item.data.url);
const html = await g.page.getDom();
// Segna come completato
g.queue.commit(item.id);
}

Indice di ricerca Lucene.NET legato allo spazio di lavoro. Supporta operatori booleani, caratteri jolly, ricerca di prossimità e ricerca basata su campi specifici. Richiede uno spazio di lavoro aperto.

MetodoFirmaAsyncDescrizione
index(fields)NoIndicizza un documento (deve includere _key e _collection)
query(queryString, options?) → SearchResult[]NoCerca nell’indice con sintassi query Lucene
delete(collection, key)NoRimuove un documento dall’indice
deleteByCollection(collection) → numberNoRimuove tutti i documenti in una raccolta
count(collection?) → numberNoConta i documenti indicizzati
clear()NoSvuota l’intero indice

SearchResult:

{
key: string
collection: string
score: number // punteggio di rilevanza Lucene
fields: Record<string, string>
}
async function main() {
// Indicizza documenti
g.search.index({
_key: "article-1",
_collection: "articles",
title: "Introduzione a Guida",
body: "Guida è un browser programmabile..."
});
// Query con sintassi Lucene
const results = g.search.query("browser programmabile", { collection: "articles" });
for (const r of results) {
g.log(r.fields.title + " (punteggio: " + r.score + ")");
}
}

g.s3.* — Archiviazione di oggetti compatibile con S3

Sezione intitolata “g.s3.* — Archiviazione di oggetti compatibile con S3”

Archiviazione compatibile con S3 tramite MinIO SDK. Funziona con AWS S3, MinIO e qualsiasi servizio compatibile con S3. Il parametro conn è il nome di una credenziale di accesso che contiene la stringa di connessione. Bloccato per gli script di origine MCP.

MetodoFirmaAsyncDescrizione
listBuckets(conn) → Promise<S3BucketInfo[]>Elenca tutti i bucket accessibili
bucketExists(conn, bucket) → Promise<boolean>Controlla se un bucket esiste
listObjects(conn, bucket, options?) → Promise<S3ObjectInfo[]>Elenca oggetti in un bucket
getObjectText(conn, bucket, key) → Promise<string>Scarica un oggetto come testo UTF-8
getObject(conn, bucket, key, localPath) → PromiseScarica un oggetto in un file locale
putObjectText(conn, bucket, key, content, contentType?) → PromiseCarica testo come oggetto
putObject(conn, bucket, key, localPath, contentType?) → PromiseCarica un file locale come oggetto
deleteObject(conn, bucket, key) → PromiseElimina un oggetto
objectExists(conn, bucket, key) → Promise<boolean>Controlla se un oggetto esiste
createBucket(conn, bucket, region?) → PromiseCrea un nuovo bucket
copyObject(conn, srcBucket, srcKey, dstBucket, dstKey) → PromiseCopia lato server (nessun dato passa dal client)
getPresignedUrl(conn, bucket, key, options?) → Promise<string>Genera un URL prefirmato a durata limitata

S3ListOptions:

{
prefix?: string // filtra oggetti per prefisso della chiave
maxKeys?: number // numero massimo di oggetti da restituire (predefinito: 1000)
}

S3BucketInfo:

{
name: string
creationDate: string // ISO 8601
}

S3ObjectInfo:

{
key: string // chiave oggetto (percorso)
size: number // dimensione in byte
lastModified: string // ISO 8601
etag: string // entity tag (hash)
}

S3PresignedUrlOptions:

{
method?: string // "GET" (download, predefinito) o "PUT" (upload)
expiry?: number // scadenza URL in secondi (predefinito: 3600)
}
async function main() {
// Elenca file CSV in un bucket
const files = await g.s3.listObjects("my-s3", "data-bucket", {
prefix: "exports/"
});
g.log("Trovati " + files.length + " oggetti");
// Carica dati estratti
await g.s3.putObjectText(
"my-s3", "data-bucket", "exports/results.json",
JSON.stringify({ items: [1, 2, 3] }),
"application/json"
);
// Genera un link condivisibile
const url = await g.s3.getPresignedUrl("my-s3", "data-bucket", "exports/results.json", {
expiry: 86400 // 24 ore
});
g.log("Link download: " + url);
}

Operazioni MongoDB tramite MongoDB.Driver. Il parametro conn è il nome di una credenziale di accesso che contiene la stringa di connessione. Usa connection pooling automatico. Bloccato per gli script di origine MCP.

MetodoFirmaAsyncDescrizione
find(conn, db, collection, filter?, options?) → Promise<object[]>Trova documenti che corrispondono a un filtro
findOne(conn, db, collection, filter?) → Promise<object | null>Trova il primo documento corrispondente
insertOne(conn, db, collection, document) → Promise<MongoInsertResult>Inserisce un singolo documento
insertMany(conn, db, collection, documents) → Promise<MongoInsertManyResult>Inserisce più documenti
updateOne(conn, db, collection, filter, update) → Promise<MongoUpdateResult>Aggiorna il primo documento corrispondente
updateMany(conn, db, collection, filter, update) → Promise<MongoUpdateResult>Aggiorna tutti i documenti corrispondenti
deleteOne(conn, db, collection, filter) → Promise<MongoDeleteResult>Elimina il primo documento corrispondente
deleteMany(conn, db, collection, filter) → Promise<MongoDeleteResult>Elimina tutti i documenti corrispondenti
replaceOne(conn, db, collection, filter, replacement) → Promise<MongoUpdateResult>Sostituisce il primo documento corrispondente
countDocuments(conn, db, collection, filter?) → Promise<number>Conta i documenti corrispondenti
listDatabases(conn) → Promise<string[]>Elenca tutti i nomi dei database
listCollections(conn, db) → Promise<string[]>Elenca i nomi delle raccolte in un database
aggregate(conn, db, collection, pipeline) → Promise<object[]>Esegue una pipeline di aggregazione
createIndex(conn, db, collection, keys, options?) → Promise<string>Crea un indice, restituisce il nome dell’indice
dropCollection(conn, db, collection) → PromiseElimina una raccolta
distinct(conn, db, collection, fieldName, filter?) → Promise<any[]>Ottiene valori distinti per un campo
bulkWrite(conn, db, collection, operations) → Promise<MongoBulkWriteResult>Esegue più operazioni di scrittura in blocco

MongoFindOptions:

{
sort?: object // es. { name: 1, age: -1 }
limit?: number
skip?: number
projection?: object // es. { name: 1, _id: 0 }
}

MongoInsertResult:

{
insertedId: string // _id del documento inserito
}

MongoInsertManyResult:

{
insertedCount: number
insertedIds: string[]
}

MongoUpdateResult:

{
matchedCount: number
modifiedCount: number
}

MongoDeleteResult:

{
deletedCount: number
}

MongoIndexOptions:

{
unique?: boolean // impone unicità
name?: string // nome indice personalizzato
}

MongoBulkOperation:

{
type: string // "insertOne", "updateOne", "updateMany",
// "deleteOne", "deleteMany", "replaceOne"
filter?: object // per update/delete/replace
document?: object // per insertOne
update?: object // per updateOne/updateMany
replacement?: object // per replaceOne
}

MongoBulkWriteResult:

{
insertedCount: number
matchedCount: number
modifiedCount: number
deletedCount: number
}
async function main() {
const conn = "my-mongo"; // nome credenziale di accesso con stringa di connessione
// Inserisci un documento
const result = await g.mongodb.insertOne(conn, "scraping", "products", {
name: "Widget", price: 9.99, category: "tools"
});
g.log("Inserito: " + result.insertedId);
// Trova con filtro e ordinamento
const docs = await g.mongodb.find(conn, "scraping", "products",
{ price: { $lt: 20 } },
{ sort: { price: 1 }, limit: 10 }
);
g.log("Trovati " + docs.length + " prodotti economici");
// Pipeline di aggregazione
const stats = await g.mongodb.aggregate(conn, "scraping", "products", [
{ $group: { _id: "$category", avgPrice: { $avg: "$price" }, count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]);
for (const s of stats) {
g.log(s._id + ": " + s.count + " elementi, media $" + s.avgPrice.toFixed(2));
}
}

Operazioni PostgreSQL tramite Npgsql. Usa parametri posizionali $1, $2, ...: non interpolare mai valori dentro stringhe SQL. Il parametro conn è il nome di una credenziale di accesso che contiene la stringa di connessione. Usa connection pooling automatico. Bloccato per gli script di origine MCP.

MetodoFirmaAsyncDescrizione
query(conn, sql, params?) → Promise<object[]>SELECT che restituisce tutte le righe
queryOne(conn, sql, params?) → Promise<object | null>SELECT che restituisce la prima riga
execute(conn, sql, params?) → Promise<PgExecuteResult>INSERT/UPDATE/DELETE
scalar(conn, sql, params?) → Promise<any>Restituisce la prima colonna della prima riga
transaction(conn, callback) → Promise<any>Esegue una callback in una transazione (solo JS)
executeBatch(conn, statements) → Promise<PgBatchResult>Più statement in una singola transazione
copyFrom(conn, table, rows, options?) → Promise<PgCopyResult>Inserimento in blocco tramite protocollo COPY
copyTo(conn, query, options?) → Promise<string[][]>Esportazione in blocco tramite protocollo COPY
listDatabases(conn) → Promise<string[]>Elenca i nomi dei database non di modello
listSchemas(conn, options?) → Promise<string[]>Elenca i nomi degli schemi
listTables(conn, schema?) → Promise<PgTableInfo[]>Elenca tabelle e viste con conteggi righe
describeTable(conn, table, schema?) → Promise<PgColumnInfo[]>Metadati colonne (tipi, nullability, default, PK)
listIndexes(conn, table, schema?) → Promise<PgIndexInfo[]>Metadati indici con definizioni
listConstraints(conn, table, schema?) → Promise<PgConstraintInfo[]>Metadati vincoli (PK, FK, UNIQUE, CHECK)

PgExecuteResult:

{
rowsAffected: number
}

PgTableInfo:

{
name: string
schema: string
type: string // "table" o "view"
estimatedRows: number // da pg_class.reltuples
}

PgColumnInfo:

{
name: string
type: string // es. "integer", "character varying", "timestamp with time zone"
nullable: boolean
defaultValue: string | null
isPrimaryKey: boolean
maxLength: number | null // per tipi stringa
}

PgIndexInfo:

{
name: string
columns: string[]
isUnique: boolean
isPrimary: boolean
definition: string // statement CREATE INDEX completo
}

PgConstraintInfo:

{
name: string
type: string // "PRIMARY KEY", "FOREIGN KEY", "UNIQUE", "CHECK"
columns: string // nomi colonne separati da virgole
definition: string // definizione del vincolo
}

PgBatchStatement:

{
sql: string // SQL con parametri posizionali $1, $2, ...
params?: any[] // valori dei parametri
}

PgBatchResult:

{
results: PgExecuteResult[] // conteggi rowsAffected per statement
}

PgTransactionProxy — passato al callback transaction:

{
query: (sql, params?) => Promise<object[]>
queryOne: (sql, params?) => Promise<object | null>
execute: (sql, params?) => Promise<PgExecuteResult>
scalar: (sql, params?) => Promise<any>
}

PgCopyFromOptions:

{
columns?: string[] // nomi colonne a cui associare i valori riga (in ordine)
schema?: string // predefinito: "public"
}

PgCopyToOptions:

{
schema?: string // predefinito: "public" (solo per nomi tabella, non query SQL)
}

PgCopyResult:

{
rowsCopied: number
}

PgSchemaOptions:

{
includeSystem?: boolean // include pg_* e information_schema (predefinito: false)
}
async function main() {
const conn = "my-postgres"; // nome credenziale di accesso con stringa di connessione
try {
// Query con parametri
const rows = await g.postgres.query(conn,
"SELECT id, name, price FROM products WHERE price < $1 ORDER BY price",
[20.00]
);
g.log("Trovati " + rows.length + " prodotti");
// Transazione con callback
const result = await g.postgres.transaction(conn, async (tx) => {
await tx.execute("INSERT INTO orders (product_id, qty) VALUES ($1, $2)", [42, 3]);
await tx.execute("UPDATE products SET stock = stock - $1 WHERE id = $2", [3, 42]);
return await tx.scalar("SELECT count(*) FROM orders");
});
g.log("Ordini totali: " + result);
// Inserimento in blocco via COPY (molto più veloce di INSERT riga per riga)
const copyResult = await g.postgres.copyFrom(conn, "products", [
["Widget A", 9.99, 100],
["Widget B", 14.99, 50],
["Widget C", 24.99, 25]
], { columns: ["name", "price", "stock"] });
g.log("Importate " + copyResult.rowsCopied + " righe");
} catch (e) {
g.log("Errore: " + e.message);
}
}

Supporto nativo per query e indicizzazione di dati in cluster Elasticsearch esterni tramite Elastic.Clients.Elasticsearch. Il parametro conn è il nome di una credenziale di accesso che contiene l’oggetto JSON di connessione (url e apiKey opzionale oppure username/password). Bloccato per gli script di origine MCP.

MetodoFirmaAsyncDescrizione
ping(conn) → Promise<boolean>Verifica la connessione al cluster. Restituisce true se riuscita.
info(conn) → Promise<ElasticsearchInfoResult>Recupera metadati del cluster (nome, versione, tagline, ecc.).
createIndex(conn, indexName, mappingJson?) → Promise<boolean>Crea un indice con una stringa JSON di mapping opzionale.
deleteIndex(conn, indexName) → Promise<boolean>Elimina un indice esistente.
index(conn, indexName, id, document) → Promise<boolean>Indicizza un singolo oggetto JS nel cluster.
get(conn, indexName, id) → Promise<any>Recupera un singolo documento per ID. Restituisce l’oggetto _source parsato.
bulk(conn, indexName, documents, chunkSize?) → Promise<ElasticsearchBulkResult>Ingestione ad alta velocità. Suddivide automaticamente array grandi per evitare limiti di contenuto.
search(conn, indexName, queryDsl) → Promise<any>Esegue una query DSL JSON grezza o un oggetto JS e restituisce gli hit deserializzati.

ElasticsearchInfoResult:

{
name: string
clusterName: string
clusterUuid: string
version: string
tagline: string
}

ElasticsearchBulkResult:

{
total: number
successful: number
failed: number
}
async function main() {
const conn = "my-elastic"; // nome credenziale di accesso
// Controlla la connessione
const isUp = await g.elasticsearch.ping(conn);
if (!isUp) return g.log("Connessione fallita");
// Indicizza documenti in blocco
const docs = [{ id: 1, text: "A" }, { id: 2, text: "B" }];
const bulkRes = await g.elasticsearch.bulk(conn, "products", docs, 1000);
g.log(`Indicizzati ${bulkRes.successful} su ${bulkRes.total}`);
// Ricerca con Query DSL
const searchRes = await g.elasticsearch.search(conn, "products", {
query: { match_all: {} }
});
g.log(`Hit totali: ${searchRes.hits.total.value}`);
}