Files
LocalAI/addons/tables/manifest.json
T
Ettore Di Giacinto 7df9b263ed feat(addons): carry translated text in the manifest and the library
The manifest said its text in English only. An add-on can now translate
what the host shows to people, and the library list shows it before the
add-on is installed.

The title and the description use the language maps of ui.title and
ui.description, which every host already reads. A new optional field,
i18n, translates the connector kinds by language tag. It stays under api
2 and its set of fields is closed: the title and the description of a
declared kind, and only where the English kind has them. Tool
descriptions, schemas and skills are for the model and stay English.
Tags follow the language map rule (at most 16, no English), each string
has the limit of its English field, all translated text has at most
12 000 characters, and markup, control characters and direction
overrides are refused. A host that does not know the field refuses the
manifest, as it refuses any unknown field. The field is part of the
manifest, so the package digest and the signature cover it.

The catalog generator copies the translated title and description of
the manifest into each library entry (ui.titles, ui.descriptions), the
host validates them like the manifest values, and a library search
matches the English and the translated text. The apps list and the
connector kinds return the text of every language and, when the request
names a language (lang, else Accept-Language), the resolved text beside
the English fields: language, localizedTitle and localizedDescription.
No existing field changes.

Every add-on on master now has its title and description in Italian,
German, Spanish, French, Brazilian Portuguese, Simplified Chinese,
Korean and Indonesian, and the chat connectors carry their kind text in
the same languages. The packaging tests require that, and that a
translation has the fields of the English text it translates. The names
of the add-ons that provide a role are matched in their English title
only: a translation is often an ordinary word of its language.

Assisted-by: Claude:claude-sonnet-5-5 go
2026-11-04 17:46:53 +00:00

648 lines
22 KiB
JSON

{
"schemaVersion": 1,
"id": "tables",
"version": "0.1.0",
"executable": "tables",
"os": "linux",
"arch": "amd64",
"host": {
"min": 1,
"max": 1
},
"api": {"min": 2, "max": 2},
"protocol": {
"min": 1,
"max": 1
},
"dataFormat": {
"min": 1,
"max": 1
},
"capabilities": {
"tools": [
"resource-exists",
"databases-create",
"databases-rename",
"databases-inspect",
"tables-create",
"tables-rename",
"tables-drop",
"columns-add",
"columns-rename",
"columns-drop",
"rows-query",
"rows-aggregate",
"rows-export",
"rows-insert",
"rows-update",
"rows-delete"
],
"toolDefinitions": [
{
"name": "databases-inspect",
"description": "Show the name, revision, tables and columns of a database.",
"kind": "read",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
}
},
"required": [
"resourceId"
],
"additionalProperties": false
}
},
{
"name": "rows-query",
"description": "Select rows of one table with an optional filter, sort and page size. Pass the returned cursor to read the next page.",
"kind": "read",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"columns": {
"type": "array",
"description": "Column labels to return. Empty returns all columns.",
"items": {
"type": "string"
},
"maxItems": 64
},
"filter": {
"type": "object",
"description": "Row filter. A node is exactly one of: {\"and\":[nodes]}, {\"or\":[nodes]} or a leaf {\"column\":label,\"op\":op,\"value\":v} with op eq, ne, lt, lte, gt, gte, contains, starts-with, ends-with, or {\"column\":label,\"op\":\"in\",\"values\":[v]}, or op is-null and is-not-null with no value."
},
"sort": {
"type": "array",
"description": "Sort keys: {\"column\":label,\"desc\":bool}.",
"items": {
"type": "object"
},
"maxItems": 4
},
"limit": {
"type": "integer",
"description": "Rows per page, 1 to 1000.",
"minimum": 1,
"maximum": 1000
},
"cursor": {
"type": "string",
"description": "Cursor returned by the previous page.",
"maxLength": 512
}
},
"required": [
"resourceId",
"table"
],
"additionalProperties": false
}
},
{
"name": "rows-aggregate",
"description": "Count, sum, avg, min or max over the rows a filter selects, with an optional group-by column.",
"kind": "read",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"filter": {
"type": "object",
"description": "Row filter. A node is exactly one of: {\"and\":[nodes]}, {\"or\":[nodes]} or a leaf {\"column\":label,\"op\":op,\"value\":v} with op eq, ne, lt, lte, gt, gte, contains, starts-with, ends-with, or {\"column\":label,\"op\":\"in\",\"values\":[v]}, or op is-null and is-not-null with no value."
},
"aggregates": {
"type": "array",
"description": "Aggregations: {\"fn\":\"count|sum|avg|min|max\",\"column\":label}. count needs no column.",
"items": {
"type": "object"
},
"minItems": 1,
"maxItems": 8
},
"groupBy": {
"type": "string",
"description": "Column label to group by.",
"maxLength": 80
},
"limit": {
"type": "integer",
"description": "Groups to return, at most 500.",
"minimum": 1,
"maximum": 500
}
},
"required": [
"resourceId",
"table",
"aggregates"
],
"additionalProperties": false
}
},
{
"name": "rows-export",
"description": "Export the rows of one table, with an optional filter and sort, to a CSV file for the person to download. The result is a private file with a name, size and expiry; the rows themselves are not returned. Use rows-query to read rows.",
"kind": "read",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"columns": {
"type": "array",
"description": "Column labels to export, in order. Empty exports all columns. \"_id\" adds the row ID.",
"items": {
"type": "string"
},
"maxItems": 64
},
"filter": {
"type": "object",
"description": "Row filter. A node is exactly one of: {\"and\":[nodes]}, {\"or\":[nodes]} or a leaf {\"column\":label,\"op\":op,\"value\":v} with op eq, ne, lt, lte, gt, gte, contains, starts-with, ends-with, or {\"column\":label,\"op\":\"in\",\"values\":[v]}, or op is-null and is-not-null with no value."
},
"sort": {
"type": "array",
"description": "Sort keys: {\"column\":label,\"desc\":bool}.",
"items": {
"type": "object"
},
"maxItems": 4
},
"maxRows": {
"type": "integer",
"description": "Most rows to export. Empty exports every row up to the export limit; past the limit nothing is exported.",
"minimum": 1
}
},
"required": [
"resourceId",
"table"
],
"additionalProperties": false
}
},
{
"name": "databases-create",
"description": "Create a new database with the given name. In a chat it runs at once and the person can undo it; from an API key it is only a proposal that a person confirms.",
"kind": "create",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Database name, 1 to 80 characters.",
"maxLength": 80
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
{
"name": "databases-rename",
"description": "Propose a new name for a database. Needs the owner role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "schema",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"name": {
"type": "string",
"description": "New database name, 1 to 80 characters.",
"maxLength": 80
}
},
"required": [
"resourceId",
"name"
],
"additionalProperties": false
}
},
{
"name": "tables-create",
"description": "Propose a new empty table. Needs the owner role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "schema",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
}
},
"required": [
"resourceId",
"table"
],
"additionalProperties": false
}
},
{
"name": "tables-rename",
"description": "Propose a new name for a table. Needs the owner role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "schema",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"newName": {
"type": "string",
"description": "New table name.",
"maxLength": 80
}
},
"required": [
"resourceId",
"table",
"newName"
],
"additionalProperties": false
}
},
{
"name": "tables-drop",
"description": "Propose dropping a table and all of its rows. Needs the owner role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "schema",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
}
},
"required": [
"resourceId",
"table"
],
"additionalProperties": false
}
},
{
"name": "columns-add",
"description": "Propose a new column. Needs the owner role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "schema",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"column": {
"type": "string",
"description": "New column label.",
"maxLength": 80
},
"type": {
"type": "string",
"description": "Column type.",
"enum": [
"text",
"integer",
"real",
"boolean",
"datetime"
]
},
"required": {
"type": "boolean",
"description": "Values must not be null."
},
"unique": {
"type": "boolean",
"description": "Values must be distinct."
},
"default": {
"description": "Default value of the column, a JSON literal of the column type."
}
},
"required": [
"resourceId",
"table",
"column",
"type"
],
"additionalProperties": false
}
},
{
"name": "columns-rename",
"description": "Propose a new label for a column. Needs the owner role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "schema",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"column": {
"type": "string",
"description": "Current column label.",
"maxLength": 80
},
"newName": {
"type": "string",
"description": "New column label.",
"maxLength": 80
}
},
"required": [
"resourceId",
"table",
"column",
"newName"
],
"additionalProperties": false
}
},
{
"name": "columns-drop",
"description": "Propose dropping a column and its values. Needs the owner role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "schema",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"column": {
"type": "string",
"description": "Column label.",
"maxLength": 80
}
},
"required": [
"resourceId",
"table",
"column"
],
"additionalProperties": false
}
},
{
"name": "rows-insert",
"description": "Propose inserting 1 to 100 rows. Each row maps column labels to values. Needs the editor role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "write",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"rows": {
"type": "array",
"description": "Rows to insert: objects of column label to value.",
"items": {
"type": "object"
},
"minItems": 1,
"maxItems": 100
}
},
"required": [
"resourceId",
"table",
"rows"
],
"additionalProperties": false
}
},
{
"name": "rows-update",
"description": "Propose setting column values on rows named by ids or a filter. Needs the editor role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "write",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"set": {
"type": "object",
"description": "Column label to new value."
},
"ids": {
"type": "array",
"description": "Distinct positive row IDs.",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 1000
},
"filter": {
"type": "object",
"description": "Row filter. A node is exactly one of: {\"and\":[nodes]}, {\"or\":[nodes]} or a leaf {\"column\":label,\"op\":op,\"value\":v} with op eq, ne, lt, lte, gt, gte, contains, starts-with, ends-with, or {\"column\":label,\"op\":\"in\",\"values\":[v]}, or op is-null and is-not-null with no value."
}
},
"required": [
"resourceId",
"table",
"set"
],
"additionalProperties": false
}
},
{
"name": "rows-delete",
"description": "Propose deleting rows named by ids or a filter. Needs the editor role and a person's confirmation outside a chat. In a chat it applies at once and the person can undo it.",
"kind": "write",
"inputSchema": {
"type": "object",
"properties": {
"resourceId": {
"type": "string",
"description": "ID of the database, as the person gave it or as returned by a database creation."
},
"table": {
"type": "string",
"description": "Table name as it is labelled in the database.",
"maxLength": 80
},
"ids": {
"type": "array",
"description": "Distinct positive row IDs.",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 1000
},
"filter": {
"type": "object",
"description": "Row filter. A node is exactly one of: {\"and\":[nodes]}, {\"or\":[nodes]} or a leaf {\"column\":label,\"op\":op,\"value\":v} with op eq, ne, lt, lte, gt, gte, contains, starts-with, ends-with, or {\"column\":label,\"op\":\"in\",\"values\":[v]}, or op is-null and is-not-null with no value."
}
},
"required": [
"resourceId",
"table"
],
"additionalProperties": false
}
}
],
"adminTools": [
"databases-delete"
],
"undo": true,
"resources": {
"noun": "database",
"create": "databases-create",
"rename": "databases-rename",
"inspect": "databases-inspect",
"delete": "databases-delete",
"list": {
"tool": "databases-list",
"items": "databases"
}
},
"ui": {
"entry": "ui/tables.js",
"css": [
"ui/tables.css"
],
"sdk": {
"min": 1,
"max": 2
},
"pages": [
"databases"
],
"navigation": [
"databases"
],
"mainPage": "databases",
"icon": "ui/icon.png",
"title": {
"en": "Tables",
"it": "Tabelle",
"de": "Tabellen",
"es": "Tablas",
"id": "Tabel",
"ko": "\ud14c\uc774\ube14",
"pt-BR": "Tabelas",
"fr": "Tables",
"zh-CN": "\u6570\u636e\u8868"
},
"description": {
"en": "Databases of tables you own or share: typed rows, filters, schema and sharing.",
"it": "Database di tabelle tue o condivise: righe tipizzate, filtri, schema e condivisione.",
"de": "Datenbanken mit Tabellen, die Ihnen geh\u00f6ren oder geteilt wurden: typisierte Zeilen, Filter, Schema und Freigabe.",
"es": "Bases de datos de tablas propias o compartidas: filas tipadas, filtros, esquema y uso compartido.",
"id": "Basis data tabel milik Anda atau yang dibagikan: baris bertipe, filter, skema, dan berbagi.",
"ko": "\ub0b4\uac00 \uc18c\uc720\ud558\uac70\ub098 \uacf5\uc720\ubc1b\uc740 \ud14c\uc774\ube14 \ub370\uc774\ud130\ubca0\uc774\uc2a4: \ud615\uc2dd\uc774 \uc788\ub294 \ud589, \ud544\ud130, \uc2a4\ud0a4\ub9c8, \uacf5\uc720.",
"pt-BR": "Bancos de dados de tabelas pr\u00f3prios ou compartilhados: linhas tipadas, filtros, esquema e compartilhamento.",
"fr": "Bases de donn\u00e9es de tables que vous poss\u00e9dez ou partagez : lignes typ\u00e9es, filtres, sch\u00e9ma et partage.",
"zh-CN": "\u4f60\u62e5\u6709\u6216\u88ab\u5171\u4eab\u7684\u6570\u636e\u8868\u6570\u636e\u5e93\uff1a\u5e26\u7c7b\u578b\u7684\u884c\u3001\u7b5b\u9009\u3001\u7ed3\u6784\u548c\u5171\u4eab\u3002"
},
"chatActions": [
{
"id": "select-database",
"label": {
"en": "Select database",
"it": "Seleziona database",
"de": "Datenbank ausw\u00e4hlen",
"es": "Seleccionar base de datos",
"id": "Pilih basis data",
"ko": "\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc120\ud0dd",
"pt-BR": "Selecionar banco de dados",
"zh-CN": "\u9009\u62e9\u6570\u636e\u5e93"
},
"icon": "database",
"placement": "composer",
"target": {
"component": "SelectDatabase"
}
}
]
},
"skillDefinitions": [
{
"name": "tables-readonly"
}
]
}
}