Lolly
Uygulamayı Başlat

Lolly mimarisi

signed by Lollyoverview.htmlHTMLpixels, not shapes12 KBAI generatedgenerated by ClaudeCheck it yourselfİmzalı dosyayı al

Lolly Simgesi - Büyük yeşil ve beyaz lolipop şeker

Bu sayfa Lolly'nin kodunu değiştiren kişiler içindir: motorun, kabukların ve araç paketlerinin nasıl bir araya geldiği, her birinin depoda nerede durduğu ve her değişikliği kısıtlayan taahhütler. Lolly'nin ne yaptığını ve onu kimlerin kullandığını bilmek istiyorsan önce How Lolly works sayfasını oku.

İki yardımcı kaynak daha derine iner. engine/README.md, koddan üretilen, modül modül motor haritasıdır. Threat Model & Trust Boundaries aynı mimariyi güven sınırları olarak okur ve motorun neyi güvenilmez saydığıyla ilgili her soru için doğru sayfadır.

Genel resim

Araçlar en üstte veridir. Ortadaki motor hiçbir platform hakkında bir şey bilmez. En alttaki kabuklar tek bir sözleşmeyi uygular ve kataloglar içeriği sağlar.

Araçlar paylaşılan motora bir bildirim, bir şablon ve kancalar sağlar. Web, Tauri ve terminal kabukları HostV1 yetenek köprüsünü uygular ve araçları ile varlıkları kataloglardan okur.Araçlar paylaşılan motora bir bildirim, bir şablon ve kancalar sağlar. Web, Tauri ve terminal kabukları HostV1 yetenek köprüsünü uygular ve araçları ile varlıkları kataloglardan okur.Open this in Diagram Builder

Onu saf veri ve Handlebars ile tarif edebiliyorsan motora aittir. DOM'a, dosya sistemine, ağa ya da herhangi bir tarayıcı veya işletim sistemi API'sine dokunuyorsa ana bilgisayara (host), yani köprünün kabuk tarafına aittir. Motor açık kaynaktır ve belirli bir markayı veya platformu bilen hiçbir şey motora girmez.

Depo yapısı

Lolly tek bir depodur. Aşağıdaki her dizin, SUSE araç paketini ve kataloğunu tutan, herkese açık bir klonun getirmediği özel bir git alt modülü olan brands/suse dışında, içinde düz bir dizindir. Bir derlemenin hangi paketleri okuduğu bir içerik profilidir (profiles.json) ve küresel olarak değiştirilmek yerine süreç başına çözülür. Build Guide klonlama komutunu ve özel paket içindeki bir değişikliğin nasıl işlendiğini içerir.

DizinNeyi tutar
engine/Platformdan bağımsız çekirdek: yükleyici, çalışma zamanı, girdiler, şablonlar, URL modu, birimler ve biçim modülleri
shells/Web uygulaması, Tauri masaüstü ve mobil uygulamaları, CLI, TUI ve tarayıcı uzantısı
packages/Araç yazarı SDK'sı (@lolly-tools/core), paylaşılan Node kabuk parçaları ve belge oluşturucusu, diğerleri arasında
community/Markadan bağımsız araçlar ve paylaşılan emoji paketleri
brands/Marka paketleri: lolly-demo (Lolly Demo, lolly.tools'un çalıştırdığı tasarım sistemi), lolly-start (boş başlangıç) ve özel suse
services/İsteğe bağlı MCP, sertifika ve Penpot hizmetleri ve paylaştıkları sunucu kodu
schemas/Araç bildirimleri, varlık girişleri ve varlık başvuruları için JSON Schema
scripts/, tests/, docs/, api/Derleme ve katalog betikleri, motor test paketi, bu belgeler ve üretilmiş sunucusuz paketler
İlk karşılaşacağın motor ve kabuk dosyaları
engine/src/
  index.ts          public surface: loader, runtime, template, inputs, url-mode
  loader.ts         fetches and validates tool files
  runtime.ts        orchestrates one mounted tool, from load to export
  template.ts       Handlebars hydration and annotateTemplate
  inputs.ts         manifest to runtime input model
  url-mode.ts       URL to input state and back
  validate.ts       JSON Schema validation of manifests
  compose.ts        nested tool renders (composes)
  embed.ts          portable lolly.tools embed URLs
  bridge/host-v1.ts type re-export of the @lolly-tools/core contract

shells/web/src/
  main.ts           boot and routing
  bridge/           the web implementations of the host APIs
  catalog/sync.ts   boot-time catalog sync and offline cache
  views/            the gallery, tool, projects, free canvas and the other views
  pro/              Batch (#/batch)

shells/cli/         bin/lolly.ts (entry), src/run.ts (headless render), src/bridge.ts
shells/tui/         src/main.tsx (the full-screen app), src/bridge.ts

Depo kökünde tools/ veya catalog/ dizini yoktur. packages/node-shell/src/content-roots.ts, "<id> aracı nerede yaşıyor" ve "katalog nerede" sorularını, sorulduğunda profiles.json üzerinden yanıtlar. Gerçek bir tools/ ve catalog/ çifti yalnızca dist/, bir RPM yükü veya bir kapsayıcı imajı gibi bir derleme çıktısına yazılır; çünkü bir tarayıcı bu iki yolu HTTP üzerinden getirir.

Lolly nerede çalışır

Her yüzey aynı motoru ve aynı araç dosyalarını kullanır.

Masaüstü bölünmüş görünümü: solda bildirimden üretilen denetimler, sağda canlı tuval signed by Lollyvector SVG131 paths~6.1k nodes158 groups1 image142 KBCheck it yourselfİmzalı dosyayı al

Aynı araç telefon genişliğinde ikinci bir düzen gerektirmez: denetimler üstte bir sayfa olur ve önizleme ekranı tutar.

430 piksel genişliğinde bir ekranda bir audiogram: üstte denetim sayfası, altta bitmiş kare çalışma ve yüzen dışa aktarma hapı signed by Lollyvector SVG97 paths~3.3k nodes113 groups99 KBCheck it yourselfİmzalı dosyayı al430 piksel genişliğinde bir ekranda bir audiogram: üstte denetim sayfası, altta bitmiş kare çalışma ve yüzen dışa aktarma hapı signed by Lollyvector SVG97 paths~3.3k nodes113 groups100 KBCheck it yourselfİmzalı dosyayı al

Web uygulaması ayrıca Batch ile (#/batch, shells/web/src/pro/) gelir; bir veya birçok araç boyunca aynı anda birçok satırı render eden elektronik tablo tarzı bir ızgara; Batch'i Batch and Multi-edit kapsar. Settings → Capabilities, platformun yapabildiğini bildirdiği her şeyi haritalar.

Yeni kurulumda Batch: bir araç bekleyen tek boş satır; veri gelmeden önce elektronik tablo yüzeyi ve Render düğmesi yerinde signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 KBCheck it yourselfİmzalı dosyayı alYeni kurulumda Batch: bir araç bekleyen tek boş satır; veri gelmeden önce elektronik tablo yüzeyi ve Render düğmesi yerinde signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 KBCheck it yourselfİmzalı dosyayı al

Mimari taahhütler

Bu kararlar yerleşiktir. Herhangi birini değiştirmek büyük bir iştir, çünkü kod tabanındaki diğer her kararı şekillendirirler.

1. Deklaratif araçlar, buyurgan bir kaçış kapısıyla

Bir araç bir bildirim (tool.json), bir şablon (template.html) ve isteğe bağlı hooks.js dosyasıdır. Girdileri bildirim bildirir, asla şablon değil: girdiler Handlebars belirteçlerinden çıkarılmaz. Araçların çoğu yalnızca bildirim ve şablondur; geliştirici olmayanların onları yazabilmesini sağlayan budur.

Street Map'in denetim yığını: bir şehir açılır menüsü, bir tema seçimi, ağırlık sürgüleri ve renk tetikleyicileri; hepsi bir bildirim satırından çizilir signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 KBCheck it yourselfİmzalı dosyayı alStreet Map'in denetim yığını: bir şehir açılır menüsü, bir tema seçimi, ağırlık sürgüleri ve renk tetikleyicileri; hepsi bir bildirim satırından çizilir signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 KBCheck it yourselfİmzalı dosyayı al

QR kodlama veya grafik şekillendirme gibi değer hesaplayan araçlar kancalar ekler: çalışma zamanının yetenek köprüsü enjekte edilerek çağırdığı adlandırılmış yaşam döngüsü işlevleri. Kancalar bir taşınabilirlik sözleşmesidir, güvenlik sanal alanı değil ve bir zaman bütçesi içinde çalışırlar. Kancaları sayfa globallerinden arınmış olduğu kanıtlanan araçlar isolate: true taşır ve bir Worker içinde çalışır. Tool hooks yaşam döngüsünü ve bütçeleri içerir; Threat Model sayfa içi yürütücünün neyi içerip neyi içermediğini söyler.

2. Araçlar ve varlıklar veridir, paketlenmiş kod değil

Web ve Tauri uygulamaları araç ve varlık kataloglarını açılışta getirir, önbelleğe alır ve orada ne varsa onunla çalışır; bu yüzden yeni bir araç veya varlık için uygulama sürümü gerekmez. Varlık baytları SHA-256 sağlama toplamlıdır ve bir varlığın id ve version değerleri önbellek geçersiz kılmayı yönetir.

3. Araçların gördüğü tek API yetenek köprüsüdür

Araçlar şablonlarının dışında DOM'a asla dokunmaz, fetch'i doğrudan asla çağırmaz ve dosya sistemini asla okumaz. Sürümlü host.* yöntemlerini çağırırlar. Sözleşmenin kurallı tanımı, araç yazarı SDK'sı @lolly-tools/core içindeki packages/core/src/host-v1.ts dosyasıdır; böylece üçüncü bir taraf motora bağımlı olmadan onun üzerine kurabilir; engine/src/bridge/host-v1.ts türlerini yeniden dışa aktarır.

Gerekli APINe yapar
host.profileKullanıcının ayrıntıları; bindToProfile ile girdileri önceden doldurur
host.assetsKatalog sorguları, varlık çözümleme ve ana bilgisayarın seçicisi
host.stateGirdi yuvalarını kaydet ve yükle: web'de IndexedDB, Tauri'de dosya sistemi, CLI'de bellek
host.clipboardPanoya metin veya görsel yaz, platform yedekleriyle
host.exportRender hedefini rasterleştir veya serileştir ve cihaz üzerindeki dosya dönüştürme yolu
host.logAna bilgisayara düzeyli günlükleme

Diğer her API isteğe bağlı ve ekleyicidir: tokens, text, color, geom, pdf, compose, media, recorder ve çok daha fazlası. Bir aracın bildirimi, kancalarının önce denetlemeden çağırdığı isteğe bağlı API'leri requires altında listeler ve birinden yoksun bir ana bilgisayar aracı bağlamayı reddeder; kancalar geri kalanı özellik algılamayla bulur. recorder gibi birkaçı ayrıca aracın bildirdiği bir cihaz yeteneği gerektirir. packages/core/src/host-v1/apis.ts hepsini listeler ve Host API her birini belgelendirir. Bir yöntem eklemek küçük bir sürümdür; birini kaldırmak veya değiştirmek büyük bir sürümdür ve v2 yayımlandığında v1 çalışmaya devam eder.

4. Varlık kimlikleri sonsuza dek geçerlidir

lolly/logo/primary bir sözleşmedir. Yayımlandıktan sonra bir kimlik asla değişmez ve asla yeniden kullanılmaz. Bir bayt değişikliği varlık girişindeki version değerini artırır ve bir yedek deprecated: true ve isteğe bağlı olarak replacedBy ayarlar; böylece mevcut başvurular her zaman çözümlenir. Kayıtlı oturumları ve paylaşılan bağlantıları yıllarca çalışır tutan budur.

5. URL modu birinci sınıftır

Her girdi bir URL parametresi olarak ifade edilebilir, yani bir bağlantı bitmiş bir dosyadır:

https://lolly.tools/t/qr-code?url=https://example.com&ecl=H

İçinde başka hiçbir şey olmayan o bağlantının kendisi bitmiş dosyadır signed by Lollyvector SVG55 paths~2.6k nodes38 groups60 KBCheck it yourselfİmzalı dosyayı alİçinde başka hiçbir şey olmayan o bağlantının kendisi bitmiş dosyadır signed by Lollyvector SVG55 paths~2.6k nodes38 groups61 KBCheck it yourselfİmzalı dosyayı al

Bir parametreyi değiştir ve farklı bir dosyan olur. Bu paletin tamamı bir tohum rengi, bir uyum ve bir adım sayısıdır:

Bağlantıdaki tek bir tohum renkten türeyen, dört renk tonunda dokuz adım signed by Lollyvector SVG10 groups25 KBCheck it yourselfİmzalı dosyayı alBağlantıdaki tek bir tohum renkten türeyen, dört renk tonunda dokuz adım signed by Lollyvector SVG10 groups25 KBCheck it yourselfİmzalı dosyayı al

CLI aynı URL durumunu argümanlarından kurar ve aynı işlem hattını çalıştırır; bu yüzden CLI uygulamadan sapamaz. engine/src/url-mode.ts ayrıştırır ve serileştirir; ayrılmış adlar kümesi (format, width, dpi, c2pa, z ve diğerleri) bir araca asla geçirilmez ve Reserved URL parameters hepsini listeler. Varlık girdileri id ile taşınır ve şablon dolmadan önce host.assets.get() ile çözülür.

6. Depolama köprüden geçer

Web uygulaması IndexedDB, Tauri dosya sistemi ve CLI bellek kullanır. Araçlar yalnızca host.state.save(slot, data) ve host.state.load(slot) görür, asla localStorage değil. İnsanlar hesap olmadan araç başına birkaç adlandırılmış oturum tutabilir. Köprü tek dikiş olduğu için o durum taşınabilirdir de: shells/web/src/data-transfer.ts onu başka her kurulumda içe aktarılan tek bir lolly-backup dosyasına geri okur (Data transfer) ve Sync aynı paketi kişinin seçtiği depolamaya gönderir.

7. Olgunluk etiketleri bir aracın ne olduğunu söyler

Her araç status: official | community | experimental bildirir. Galeri duruma göre sıralar ve deneysel araçlar dışa aktarmalarını varsayılan olarak filigranlar: çağıran watermark: false vermedikçe çalışma zamanı filigranı açar ve cihaz üzerindeki araçlar muaftır. Bir ekibin kataloğun etrafına koyduğu her süreç bunun üstünde yer alır.

8. Girdiler bildirimde türlendirilir

Bir girdi bir type bildirir: text, longtext, number, boolean, color, select, asset, date, time, datetime-local, url, blocks, vector, table veya file. Ana bilgisayar tür başına bir denetim render eder, bu yüzden araçlar denetim kodu yazmaz ve her girdi bindToProfile taşıyabilir. Üçü en çok ağırlık taşır:

9. Şablonlar mantıksızdır

Şablonlar, geliştirici olmayanların yazabilmesi için seçilmiş Handlebars'tır: {{x}} kaçırır ve {{{x}}} açık bir tercihtir. Mantık, açık ve gözden geçirilebilir olduğu hooks.js içinde yaşar. Birçok şablon bir kancanın hesapladığı işaretleme için {{{ kullanır; bu yüzden her kanca teslim ettiğini kaçırmalıdır. Yardımcılar default, upper, lower, eq, markdown, asset, framing ve media ile kardeş .ics, .vcf ve .csv şablonları için icsStamp, rfcText, csvCell ve arrow'dur. Templates and rendering bunları kapsar.

10. Araçlar araçları bileştirir

Bir araç, araçtan araca içe aktarma olmadan başka bir aracın render'ını gömebilir; kompozisyonu motor çözer. Bir bildirim composes: [{ id, tool, inputs }] bildirebilir ve çocuğu {{asset <id>}} ile yerleştirebilir; taşınabilir bir gömme URL'si (https://lolly.tools/tool/<id>.svg?…) çocuğu yerelde render eder; Design'ın canlı bir QR kodu veya grafik yerleştirme biçimi budur. Bir SVG çocuğu, bir SVG veya PDF ebeveyninde vektör kalır. Çocuklar ara ürünlerdir, asla filigranlanmaz veya damgalanmaz ve birini render edemeyen bir kabuk, ebeveyn yine render edilirken yuvayı boş bırakır. Composition and brand overlays ayrıntıları içerir.

Yapmamayı seçtiklerimiz

Bir render'ın yaşam döngüsü

Biri https://lolly.tools/t/qr-code?url=https://example.com&ecl=H adresini açar:

  1. Önyükleme. Web uygulaması IndexedDB'yi açar, yetenek köprüsünü kurar ve araç ile varlık kataloglarını eşitler ya da çevrimdışıyken önbellekten yükler.
  2. Rota. Yol, qr-code için araç görünümünü seçer; sorgu ilk değerleridir.
  3. Yükle. loadTool tool.json dosyasını getirir, şemaya göre doğrular ve şablonu, stilleri ve kancaları getirir.
  4. Bağlantıyı ayrıştır. parseUrlState parametreleri girdi değerlerine çevirir. ?logo=lolly/logo/primary gibi bir varlık başvurusu çözülmemiş bir { id } olur.
  5. Çalışma zamanını başlat. createRuntime(tool, host, initialValues) girdi modelini profil verisi, varsayılanlar ve bağlantıdan kurar, varlık başvurularını çözer, kancaları yükler ve onInit çağırır.
  6. Render. Kabuk çalışma zamanına abone olur, denetimleri modelden çizer ve doldurulmuş şablonu #tool-canvas içine yazar.
  7. Etkileşim. Yazmak runtime.setInput çağırır; o da kısıtları uygular, onInput çağırır, şablonu yeniden doldurur ve yeniden çizer.
  8. Dışa aktar. Download, runtime.export(node, format) çağırır ve kabuğun host.export değeri dosyayı üretir: bir raster, DOM yürüteçten bir vektör, bir PDF, bir belge veya schemas/tool.schema.json içindeki diğer biçimlerden biri. Fiziksel birimler biçim başına dönüştürülür ve meta veriler ile Content Credentials, biçimin tutabildiği yerde gömülür. Deneysel araçlar filigranlarını araçtan değil ana bilgisayardan alır. Dışa aktarma adımını Templates and rendering ve Export a file kapsar.

?options'ın açtığı dışa aktarma paneli: dosya adı ve biçim çifti, çıktı boyutu ve dosyayı yazan denetimler signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBCheck it yourselfİmzalı dosyayı al?options'ın açtığı dışa aktarma paneli: dosya adı ve biçim çifti, çıktı boyutu ve dosyayı yazan denetimler signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBCheck it yourselfİmzalı dosyayı al

Aynı yaşam döngüsü Tauri'de ve çıktının bir dosyaya veya stdout'a gittiği arayüzsüz bir DOM'lu CLI'de çalışır.

Lisanslar

engine/, shells/, services/, schemas/ ve belge oluşturucusu dahil kod, tek bir herkese açık depoda, lolly-tools/lolly, MPL-2.0'dır. Belgeleme metni CC BY-SA 4.0'dır. Marka paketleri kendi koşullarını her paketin NOTICE.md dosyasında taşır: topluluk araçları MPL-2.0'dır ve özel SUSE paketi SUSE'ye özgü mülkiyettedir. About tam lisans notunu içerir.