API хоста
Обмен идёт по JSON, разделённому переводами строк, поверх stdio (NDJSON), UTF-8 без BOM.
Рукопожатие
json
{"type":"hello","host":"1.1.37","dataDir":"C:\\...\\PCL"}json
{"type":"ready","name":"Hello Go"}Далее обе стороны используют {"type": "...", "id": "...", "payload": {...}}. Запрос с id требует ответа с тем же id, таймаут — 10 секунд.
Сообщения
Расширение → хост
| type | payload | Примечание |
|---|---|---|
ready | {name} | Готовность |
notify | {title, text, level} | info / warn / error |
log | {text} | Запись в лог |
fs.read | {path} | Нужно fs.read |
fs.write | {path, data} | Нужно fs.write, base64 |
http | {method, url, headers, body} | Нужно net |
instances | {} | Список инстансов |
versions | {} | Список версий |
launch | {instance, version} | Нужно launch |
ui.page | {title, html} | Нужно ui |
settings.get / settings.set | {key} / {key, value} | Настройки лаунчера |
Хост → расширение
| type | payload | Примечание |
|---|---|---|
hello | {host, dataDir, locale} | Первое сообщение |
resp | {ok, data, error} | Ответ |
event | {name, data} | launch.before и другие |
ping | {} | Каждые 30 с, ответ pong |
Отказ по правам:
json
{"type":"resp","id":"7","payload":{"ok":false,"error":"permission denied: net"}}Пример на Go
go
package main
import tmlext "github.com/TYWStudio/TML/extensions/sdk/go"
// 业务入口:两个方法都可以留空
type ext struct{}
func (ext) Ready() {
tmlext.Log("info", "拓展已加载")
tmlext.Toast("Hello")
}
func (ext) OnEvent(e tmlext.Event) {
tmlext.Log("info", e.Type)
}
func main() { tmlext.Run(ext{}) }Пример на Rust
rust
use tml_ext::{Event, Ext, Handler};
struct Ext0;
impl Handler for Ext0 {
fn ready(&mut self, ext: &mut Ext) {
ext.log("info", "拓展已加载");
ext.toast("Hello");
}
fn event(&mut self, ext: &mut Ext, ev: Event) {
ext.log("info", &ev.kind);
}
}
fn main() { tml_ext::run(Ext0); }Правила
- Отвечайте
readyбыстро, тяжёлую работу — потом. - Главный цикл должен читать stdin, длинные задачи — в отдельный поток.
- Получив
shutdown, завершитесь сами. - Не пишите отладку в stdout — это канал протокола. Используйте
logили stderr.
Ограничения
- 1 MiB на сообщение.
- 10 секунд на запрос.
- 4 одновременных запроса на расширение.
- HTML в
ui.pageочищается: без<script>,on*и внешних iframe.
