تُرجمت هذه الصفحة آليًا وقد تحتوي على أخطاء. اقرأ الأصل الإنجليزي

Native Shell

ابنِ مرة واحدة، أصلي في كل مكان

تطبيقك في المنتصف. كل قوس حوله يمثل منصة.

اكتب TSX فقط وأطلق عملاء أصليين يواكبون سرعة Rust. قاعدة كود واحدة تعمل على 8 منصات، لكل منها واجهة النظام وتفاعله الأصليان.

FPS
120
الإطار الأول
~1 ms
منصات
8

عميل مكتوب بـ TSX، بجوار Rust مباشرة

في NSH كود تطبيقك وحده هو JS. الرسم البياني التفاعلي (reactive graph) والمُصيِّر والتخطيط وكل وحدة هي Rust. تشترك تطبيقات TSX وRust في خط التنفيذ الأصلي نفسه.

120 FPS
22 مخططًا مصغرًا حيًا ودفتر أوامر وشريط صفقات تتحدّث معًا، والإطار عند p95 أقل من 4 ms
~0.1 ms
بدء تشغيل المحرك (75–155 µs)
~1 ms
الإطار الأول لتطبيق عدّاد
~0.12 ms
نقرة واحدة، من الحدث حتى الـ commit
< 1 KB
كود تطبيق hello world
~1.1 MB
حجم تنزيل تطبيق TSX على Web (بيئة تشغيل Wasm)
تطبيقات صغيرة قيست: أعلى من نافذة النظام المجردة ببضعة MB فقط
TSXRustنافذة النظام المجردة
بصمة الذاكرة، macOS~20 MB~19 MB~17 MB
الذاكرة الخاصة المعدّلة (private dirty)، Linux (GTK, GL)~48 MB~44 MB~38 MB
فوق نافذة النظام، macOS / Linux+3 / +9 MB+2 / +5 MB
مجموعة العمل الخاصة (private working set)، Windows~15 MB~14 MB
الحجم على كل منصة: hello world من nsh init
ملف TSX التنفيذيحزمة TSXملف Rust التنفيذيحزمة Rust
macOS (Apple silicon)19.8 MB9.5 MB12.4 MB6.0 MB
Linux (x86_64)25.7 MB11.6 MB16.5 MB7.5 MB
Windows (x86_64)28.6 MB12.4 MB15.0 MB6.7 MB
Web—تنزيل بحجم ~1.1 MB——

إصدارات Release. الذاكرة في وضع السكون: بصمة macOS على Apple M3 (تطبيق العدّاد وقالب Rust بدقة 1200 × 800؛ ونافذة النظام تحتوي على تسمية واحدة بدقة 480 × 640)؛ الذاكرة الخاصة المعدّلة في Linux على NVIDIA RTX 3060 Ti (قالبا TSX وRust من nsh init ونافذة GTK بتسمية واحدة، جميعها بدقة 480 × 640)؛ مجموعة العمل الخاصة في Windows. قياس كل منصة، مع RSS وUSS، موجود في التقرير. الأحجام: إصدارات release من nsh package، مع تحسين وقت الربط (link-time optimization) ونزع الرموز؛ يحتوي الملف التنفيذي TSX على بيئة تشغيل QuickJS، وكود التطبيق أقل من 1 KB؛ والحزمة هي .app المضغوط على macOS، و.tar.gz على Linux، و.zip على Windows؛ وعلى Web، ما يُنزّله المتصفح من بيئة التشغيل والتطبيق. تقرير الأداء الكامل

TSX بصفر تبعيات

التطبيق هو الملفات أدناه. يأتي سطر أوامر nsh مع أداة التجميع (bundler) وسلسلة الأدوات الخاصة به، والوحدات التي تستوردها أصلية.

$ nsh init my-app --template ts
$ nsh run my-app --target macos

my-app/
  App.tsx
  nsh.json
  tsconfig.json
  • ملف nsh تنفيذي واحد ينشئ ويشغّل ويختبر ويحزّم
  • ~120 ms من حفظ الملف حتى تشغيل النسخة الجديدة
  • nsh check يتحقق من الأنواع باستخدام tsc الأصلي في TypeScript 7
TSXApp.tsx
import { mount, signal, Text, View } from "nsh";

function App() {
  const count = signal(0);
  return (
    <View class="items-center gap-4">
      <Text>Count: {count()}</Text>
      <View
        class="rounded-lg bg-blue-600 px-5 py-3"
        onPress={() => count.update((n) => n + 1)}
      >
        <Text class="text-white">Tap</Text>
      </View>
    </View>
  );
}
mount(App);

8 منصات، لكل منها عناصر التحكم الخاصة بالنظام

يبني NSH كل واجهة مما تملكه منصتها أصلًا. إدخال النص والتحديد وطرق الإدخال وإمكانية الوصول تأتي من النظام، وما يقدمه إصدار جديد من نظام التشغيل لها يصل إلى التطبيق معها.

المنصةالعروضالنصإدخال النصالمتطلبات
macOSAppKitCoreTextNSTextViewmacOS 14+
LinuxGTK 4PangoGtkTextViewGTK 4.14+
WindowsWin32, Direct2DDirectWriteمحرر NSH، IMM32Windows 10 1809+
WebHTML, CSSنص المتصفح<input>, <textarea>متصفحات حديثة
iOSUIKitCoreTextUITextViewiOS 15+
Androidعروض AndroidStaticLayoutEditTextAPI 28+
TUIratatuiخط الطرفيةمفاتيح Readline، طرق الإدخالmacOS, Windows, Linux
GPUIGPUIنظام النصوص في GPUIمحرر NSHمضمّن في تطبيقات GPUI Kit

الخرائط وعروض الويب والفيديو وأي عرض أصلي يسجّله المضيف ليست سوى عرض فرعي إضافي في التسلسل الهرمي نفسه: تُوزَّع وتُقصّ وتتمرر وتستقبل اللمس مع بقية التطبيق. الواجهة الخلفية لكل منصة

تطبيق واحد، بالشكل الخاص بكل جهاز

يعمل الكود المُترجم نفسه مرتين هنا، ولا يختلف سوى الجهاز. مع المؤشر يكون نافذة تظهر محادثاتها على الجانب؛ وعلى الهاتف تطفو الأزرار ومربع الكتابة بتأثير Liquid Glass بينما يتمرر الخيط من تحتها؛ وفي الطرفية يستقر على شبكة الأحرف. يُكتب التطبيق مرة واحدة.

سطح المكتبمباشر: اكتب رسالة
الهاتفمباشر: اكتب رسالة
الطرفيةاستكشف TUI
+ New chat           │ What makes an NSH app native?
Today                │ A signal holds the count; only the Text that reads it updates   │
What makes an NSH…   │ when you press.                                                 ┃
Plot a week of NSH   │ import { mount, signal, Text, View } from "nsh";                ┃
Signed packages,…    │                                                                 ┃
A sheet with two…    │ const count = signal(0);                                        ┃
Taffy grid vs flex   │ mount(() => (                                                   ┃
                     │   <View onPress={() => count.set(count() + 1)}>                 ┃
                     │     <Text>{count()}</Text>                                      ┃
                     │   </View>                                                       ┃
                     │ ));                                                             ┃
                     │                                   What makes an NSH app native? ┃
                     │ Every element is the platform's own view: UIKit on iOS, Android ┃
                     │ views, AppKit on macOS and GTK 4 on Linux. Your TSX describes   ┃
                     │ them; layout, text and the reactive graph run in Rust.          ┃
                     │                                 And the glass around this chat? ┃
                     │ It's Liquid Glass, one glassEffect style. iOS 26 and macOS 26   ┃
                     │ draw the system's material; elsewhere it blurs what scrolls     ┃
                     │ beneath.                                                        ┃
                     │ • The buttons and the composer float over the thread            ┃
                     │ • Messages pass under them as you scroll                        ┃
                     │ • The same code at every idiom                                  ┃
                     │ ╭───────────────────────────────────────────────────────────────╮
                     │ │ › Ask anything                                                │
                     │ ╰───────────────────────────────────────────────────────────────╯

يعمل سطح المكتب والهاتف مباشرة في متصفحك على بيئة تشغيل Web الخاصة بـ Native Shell. أما الطرفية فهي مخرجات حقيقية للأمر nsh run --target tui.

المحرك نفسه في Rust، متى أردت

Rust لغة من الدرجة الأولى للتطبيقات الكاملة: تُترجم الواجهة والمنطق والمكونات إلى كود أصلي، جاهز لمنطق الأعمال الصعب. يستخدم الاثنان العناصر والإشارات (signals) نفسها، وتستورد شاشات TSX مكونات Rust الخاصة بك.

البناء باستخدام Rust

Rustsrc/lib.rs
use nsh_core::element::prelude::*;

#[component]
pub fn App() -> impl IntoElement {
    let count = signal(0);
    view()
        .items_center()
        .gap_4()
        .child(text(move || format!("Count: {}", count.get())))
        .child(
            view()
                .rounded_lg().bg(rgb(0x2563eb)).px_5().py_3()
                .on_press(move || count.update(|n| *n += 1))
                .child(text("Tap").text_color(white())),
        )
}

لا تُلمس إلا العروض التي تغيّرت

كل عنصر هو عرض تحتفظ به المنصة. يشغّل التغيير فقط التعبيرات التي قرأت الإشارة المتغيرة، في دفعة واحدة لكل إطار. لا ينتظر الخيط الرئيسي JS أبدًا وتعمل الرسوم المتحركة الأصلية من دونه، فيحافظ التمرير والحركة على 120 FPS ويبقى التطبيق شبه خامل في السكون.

كيف يبقى سريعًا

يتغير النصان اللذان يقرآن الإشارات ويكسب السجل صفًا جديدًا؛ ولا يُلمس أي عرض آخر.

$ nsh test examples/counter/App.tsx --trace
perf commit: 56 ops, 50 mount items, 21 nodes
press(+1)
perf commit: 10 ops, 7 mount items, 24 nodes

بعد الإصدار، يبقى تطبيقك قادرًا على استقبال واجهة جديدة

يمكن لفريقك كتابتها، أو لنموذج توليدها لكل طلب. تصل إلى الجهاز كوحدة موقّعة، وتعمل في صندوق رمل (sandbox) يحدده المضيف، وتظهر بشكل أصلي.

  1. اكتب

    يكتب فريقك أو نموذج وحدة TSX.

    App.tsx
  2. افحص

    تحقق من أنواعها، ثم شغّل اختباراتها بدون واجهة (headless).

    nsh check nsh test
  3. وقّع

    ملف .nshpkg موقّع بـ Ed25519، ومفتاح إصداره مصدَّق من جذر غير متصل.

    nsh publish
  4. حدّ الثقة

    شغّل

    يتحقق الجهاز من التوقيع والشهادة وقوائم الإلغاء. يحصل كل عرض على VM بحدود للذاكرة ووقت الاستدعاء والعقد، ولا يملك إلا الإمكانات التي يمنحها المضيف.

    NshAppView NshView AppView

ثلاث طرق للإطلاق، محرك واحد

تطبيقات مستقلة

اكتبه بـ Rust أو TSX أو بكليهما، وحزّم تطبيقًا قابلًا للتثبيت على iOS أو Android أو macOS أو Windows أو Linux، أو موقع ويب ثابتًا.

$ nsh init my-app --template rust
$ nsh run my-app --target macos
$ nsh package my-app --target windows
# --template ts for TSX
# ios · android · macos · windows · linux · gpui · web
البدء

واجهة ديناميكية وإضافات

ضمّن عرضًا في أي شاشة وحمّل فيه وحدات TSX موقّعة وقت التشغيل، إلى جانب المكونات الأصلية الخاصة بالمضيف.

let app = NshAppView()
try app.grantCapabilities(grants)
let info = try await app
  .loadPackage(at: file, trust: trust)
// verified, sandboxed, running
// NshView on Android, AppView elsewhere
التضمين، لكل منصة

واجهة مولَّدة بالذكاء الاصطناعي

يكتب نموذج وحدة لكل طلب، فيجيب التطبيق بواجهة. يفحصها خادمك ويوقّعها.

import { mount, signal, View } from "nsh";

function Answer() {
  const range = signal("1W");
  return <View class="gap-3 p-4">…</View>;
}
mount(Answer);
التوقيع والعزل (sandboxing)

السلوك من NSH، والمظهر منك

تحتوي nsh/base على مكونات أساسية غير منسّقة تتولى الحالة والتركيز ولوحة المفاتيح وإمكانية الوصول، ويتولى التطبيق تنسيق كل جزء منها. وسطر أوامر nsh واحد يتولى الباقي.

مكونات أساسية غير منسّقة

التنقل والحوارات والقوائم والنوافذ المنبثقة وعلامات التبويب وعناصر الاختيار وجداول البيانات ومحرر أكواد ونواة نص منسّق. نسّق كل جزء بفئات Tailwind أو بأنماط مكتوبة الأنواع.

nsh/base

سلسلة أدوات واحدة، للبشر والوكلاء

ملف nsh تنفيذي واحد ينشئ ويبني ويتحقق من الأنواع ويعيد التحميل الفوري (hot-reload) ويختبر ويحزّم ويوقّع. تُولَّد التصريحات من مصادر Rust وتُقدَّم الوثائق بصيغة llms.txt، فيشغّل الوكيل الحلقة كاملة بالأوامر نفسها.

nsh run, nsh test, nsh package

مُختبَر على كل هدف

تعمل الاختبارات نفسها بدون واجهة، وفي نوافذ حقيقية، وعلى محاكي iOS، أو جهاز Android، أو متصفح، مع إدخال المنصة الأصلي.

nsh test --target ios

عروض وتفاعل أصليان،
وتصميمك البصري

ثبّت nsh وشغّل أول تطبيق TSX لك في دقيقة.