Radiant + Ruby — תיעוד הפרויקט

תיעוד חי · מתעדכן אוטומטית · Ruby ↔ Radiant integration

מצב נוכחי

  • lastUpdate: 2026-08-22 11:35 CEST
  • currentStage: Code Mode MCP
  • next: orchestration של 500 tenants
  • side: radiant
  • lastDecision: Code Mode Engine קיים: execute/search/mcp/sdk.ts/sandbox-engine.ts במימוש api-bank

התוכנית

תוכנית השילוב Ruby ↔ Radiant (התוכנית המלאה)

עדכון אוטומטי דרך `./logs.sh`. לקריאה: `./logs.sh plan`.

מטרה

לקחת את Ruby (<code>ruby.turqizai.com</code>) ו-API-Bank (<code>apibank.turqizai.com</code>) ולבנות אותם

מחדש על בסיס Radiant — בשיטת <strong>מיזוג, לא שכתוב</strong>. שימוש ביכולות הקיימות של Radiant

במקום לבנות מודלים מ-0.

החלטות ליבה (מקוצר — מלא ב-decisions.md)

נכסהחלטה
RCP🟢 אמץ (IP ייחודי, 44 intents)
Canonical API🟢 אמץ
RFB🟡 החלף ב-MCP
Federation🟡 מיזוג חלקי (מעל Nodes)
Multi-tenant🟢 ליבה (tenantId מנדטורי)
DB✅ PostgreSQL 16 + RLS
בידוד✅ מדורג (רמות 1/2/3)

שלבים

שלבתיאורמצב
שלב 1RCP Schema as Radiant Skill✅ done
שלב 2Tenant Model (tenantId, בידוד, control plane)✅ done
שלב 3Intent Router (44 intents → כלים)✅ done
שלב 4Intent Discovery (דינמי controlled)✅ done
שלב 5Desktop Arm ↔ Node (אופציה B: Node אמיתי)✅ done
שלב 5bWindows installer (thin client)✅ done
שלב 5ctenant→node provisioning (רמות 1/2/3)✅ done
שלב 6Browser Extension ↔ Radiant⬜ todo
שלב 7Federation on top of Nodes (tenant-scoping)⬜ todo
שלב 8Events → Cron/webhooks⬜ todo
orchestration של 500 tenants⬜ todo

מה נבנה בפועל (קבצים)

Radiant skill (rcp)

<code>/root/.openclaw-radiant/workspace/skills/rcp/</code>:

  • `SKILL.md`, `references/intents.md` (44), `envelope.md`, `tenant-model.md`,

<code>federation.md</code>, <code>events.md</code> (36), <code>intent-router.md</code>, <code>intent-discovery.md</code>,

<code>desktop-arm.md</code>, <code>desktop-arm-adapter.js</code>, <code>tenant-node-provisioning.md</code>

Installer + provisioning

<code>/root/.openclaw-shared/radiant-desktop-installer/</code>:

  • `install-radiant-node.ps1` (Windows bootstrap)
  • `radiant-desktop-node.nsi` (NSIS wrapper)
  • `provision-tenant.sh` (isolation levels 1/2/3)
  • `migrate-tenant-level.sh` (מעבר רמה)
  • `tenant-node-provisioning.sql` (PostgreSQL + RLS)

רמות בידוד (isolation levels)

כל tenant נבנה מאותו <code>template</code> עם פרמטר אחד <code>--isolation-level</code> (1|2|3).

רמהמה נפרדעלותמתי
**1**process + schema (אותו Postgres)נמוכהדמו / free
**2**process + DB instance נפרדבינוניתלקוחות משלמים
**3**VM/container + DB + KMSגבוההPay / PCI

<strong>עקרון הרמה-אגנוסטי:</strong> הקוד והנתונים <strong>לא משתנים</strong> בין רמות — רק "איפה דברים רצים"

(process vs VM) ו"איפה נשמרים מפתחות" (local vs KMS) משתנים.

לכן מעבר בין רמות הוא פשוט:


migrate-tenant-level.sh <tenantId> <newLevel>

(dump/restore + עדכון connection string + secret provider) — <strong>אין שינוי קוד או נתונים.</strong>

<strong>הערה חשובה (בנקאות/PCI):</strong> רמה 1 כשלעצמה אינה מספקת ביטחון ברמת בנק. בשביל זה צריך

בנוסף הצפנה-at-rest, KMS, audit, וסגמנטציית רשת — ולצורכי Pay/PCI נדרשת רמה 3.

עקרונות מוטמעים

1. <code>tenantId</code> מנדטורי בכל הודעה/חיבור/אירוע (anti-spoofing: מ-auth, לא מהלקוח)

2. בידוד מלא (workspace, memory, sessions, secrets — per-tenant)

3. Control plane: platform_admin / tenant_admin / tenant_user

4. Provisioning: משתמש חדש = אינסטנס נקי + keys + config

5. קוד + נתונים קבועים בין רמות בידוד; רק "איפה רצים" + "איפה מפתחות" משתנים

Intents (RCP)

RCP Intents — רשימה מלאה + סכמות Payload

מקור: <code>turqiz-ai/ruby-ai/src/lib/rcp/schema.ts</code> (RCPIntentSchema + payload schemas).

Intents ליבה

פשוטים (ללא payload)

  • `greet` — ברכה / לחיצת יד בין סוכנים
  • `tour` — סיור מודרך
  • `get_status` — סטטוס המערכת

CRM

IntentPayload
`create_lead``{ name?, email?, phone?, contact?, source?, service?, metadata? }`
`update_lead``{ leadId, status?, name?, email?, phone? }`
`list_leads``{ limit?, status? }`
`get_conversations``{ limit?, sessionId? }`

Calendar / Appointments

IntentPayload
`book_appointment``{ name?, date?, time?, purpose?, userId? }` (תומך ב"מחר"/"היום"/dd.mm.yyyy)
`check_availability``{ date? }`
`create_event``{ title?, subject?, date?, time?, duration?, attendees? }`

Communication

IntentPayload
`send_message``{ to, message, channel? }`
`send_email``{ to?, subject?, content?, body? }`
`check_email``{ count? }`

Payments

IntentPayload
`place_order``{ ... }` (items, amount)
`payment``{ ... }` (process/query)

Knowledge / Query

IntentPayload
`query``{ query, type? }`
`query_users``{ ... }`
`query_posts``{ ... }`
`query_weather``{ location }`
`query_pokemon``{ name/id }`

Search / Media

IntentPayload
`search_youtube``{ query?, q?, count? }`
`youtube_stats``{ channel? }`
`find_location``{ query, q? }`
`get_directions``{ from?, to? }`

Code / Repo / CMS

IntentPayload
`github_status``{ owner?, repo? }`
`github_issues``{ owner?, repo?, limit? }`
`wp_posts``{ count? }`
`wp_create_post``{ title?, content? }`

Analytics

IntentPayload
`analytics``{ metric?, range? }`

Federation

IntentPayload
`create_connection``{ personalRuby, systemRuby, permissions, authMethod, callbackUrl? }`
`subscribe_events``{ subscriberRuby, eventType, callbackUrl, filters? }`

Automation (n8n)

IntentPayload
`trigger_n8n_workflow``{ workflowId?, webhookUrl?, workflowName?, data?, payload? }`
`execute_n8n_node``{ nodeType, action?, parameters? }`

Additional

IntentPayload
`configure``{ ... }`
`transfer_info``{ ... }`

Priorities

<code>urgent | high | normal | low</code> — שדה <code>priority</code> אופציונלי בכל הודעה.

הוספת Intent חדש

כדי להוסיף intent חדש:

1. הוסף אותו לטבלה המתאימה כאן.

2. וודא ש-<code>intent-translator</code> (keyword map) מכיר אותו לשפה טבעית (עב/אנ).

3. וודא ש-<code>messages.ts</code> (intentHandler) מממש אותו.

4. עדכן את מונה ה-intents ב-SKILL.md.

הערה למיזוג ל-Radiant

ה-intent-translator (NLP) הופך ל-preprocessing לפני ה-agent. ה-intentHandler הופך

לניתוב ל-tools/ערוצי openClaw. כל intent חייב tenantId-scoped.

Desktop Arm ↔ Node

Desktop Arm ↔ Node — חיבור זרוע התפעול

**שלב 5:** חיבור אפליקציית Ruby Desktop אל המוח OpenClaw/Radiant **כזרוע Node אמיתית**.

החלטה אדריכלית

<strong>אופציה B — Node אמיתי של OpenClaw</strong> (לא adapter צדדי).

<code>openclaw node run</code> כבר מספק node host מובנה שמתחבר ל-Gateway WebSocket כ-<code>role: "node"</code>,

וחושף <code>system.run</code>, <code>system.which</code>, <code>system.execApprovals</code>. <strong>אין צורך לממש pairing/WS מאפס.</strong>

למה Node אמיתי עדיף על Adapter

Adapter (A)Node אמיתי (B)
שרשרתRadiant → adapter → שרת רובי → Mongo → poll(3s) → PCRadiant → `exec(host=node)` → PC
תלותשרת רובי (Mongo) חובהאפס — חיבור ישיר
Latencypoll 3 שניותpush מיידי
מנצל OpenClawלא`exec`/`file_*`/`screen`/`notify` מובנה

מיפוי פקודות זרוע ←→ OpenClaw tool

desktop typeOpenClaw node hostהערות
`shell``exec(host=node)`system.run
`launch` / `kill``exec(host=node)`הרצה/הריגת תהליך
`read_file``file_fetch`קריאת קובץ
`write_file``file_write`כתיבת קובץ
`list_dir``dir_list`רשימת תיקייה
`system_info` / `list_running``nodes(device_info/status)`מידע מערכת
`mkdir/delete/rename/copy/open``exec(host=node)` (FS)או file_*
`organize`סקריפט `exec(host=node)`ארגון שולחן עבודה

שרשרת היעד


Radiant → exec(host=node) / file_fetch / nodes(screen_snapshot) → PC (node host)

שימוש


# על ה-PC:
openclaw node run --host <gateway-host> --port 18789 --display-name "MSI"

# על ה-gateway:
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status
openclaw approvals allowlist add --node MSI "<cmd>"

מצב נוכחי

  • ✅ מיפוי שני הצדדים + מפת כלים — הושלם
  • ✅ אופציה A (Adapter) הוכחה מקצה-לקצה (shell + system_info פעלו על PC)
  • ✅ החלטה סופית: אופציה B (Node אמיתי)
  • ⬜ הפעלת node host על ה-PC + אישור pairing (ממתין לגישה)
  • ⬜ allowlist + exec approvals + `tools.exec.host=node`

Code Mode (MCP)

Ruby Code Mode Engine (MCP) — Search-and-Execute

<strong>תאריך:</strong> 22 באוגוסט 2026

<strong>סטטוס:</strong> ✅ מבוצע (קיים במערכת)

הקונספט

במקום לחשוף עשרות כלי API נפרדים ל-LLM, המערכת חושפת <strong>2 כלי ליבה בלבד</strong>:

1. <code>search</code> — חיפוש ושליפת חתימות API / templates מתוך ה-API Bank.

2. <code>execute</code> — הפעלת פעולה (action) תחת בידוד <code>tenantId</code> עם מנוע Sandbox.

היתרונות

  • חיסכון של 85%–90% בטוקנים ובזמני תגובה.
  • שרשור פעולות מרובות (Chaining) בסבב יחיד במילישניות.
  • בידוד טננטים ברמת ה-Sandbox וה-Postgres RLS.
  • תאימות מלאה ל-Radiant, Claude Code, Cursor ו-OpenClaw.

איפה זה ממומש בפועל (api-bank)

רכיבמיקוםמה עושה
`execute``src/app/api/execute/route.ts``sdk.execute(integrationSlug, action, params, tenantId)`
`search``src/app/api/search/route.ts`חיפוש templates (`q`, sort, limit)
`mcp``src/app/api/mcp/convert/route.ts`MCP endpoint (RFB + talents)
SDK ליבה`src/lib/api-bank/sdk.ts` (404 שורות)`TurqizAPIBank` — ה-SDK המרכזי
Sandbox`src/lib/api-bank/sandbox-engine.ts`ביצוע mock/sandbox (sampleResponse + latency)
מנוע`src/lib/api-bank/engine.ts` (386 שורות)ניהול templates

תשתית תומכת: <code>action-router.ts</code>, <code>pipeline-engine.ts</code>, <code>rate-limiter.ts</code>, <code>task-queue.ts</code>, <code>rcp-translator.ts</code>.

שלבי ביצוע (הושלמו)

  • ✅ שלב א': הקמת שרת ה-MCP (`search` + `execute` + HTTP transport).
  • ✅ שלב ב': מנוע ה-Sandbox המאובטח (sandbox-engine עם mock/latency ובידוד).
  • ✅ שלב ג': מיפוי מתאמי API-Bank ל-SDK (`TurqizAPIBank.execute`).
  • ✅ שלב ד': שילוב ב-Radiant ובעדכון ה-System Prompt.

החלטות

2026-08-22 11:06 CEST — [radiant]

  • **החלטה:** doc.turqizai.com הוקם (DNS+nginx+TLS)
  • **למה:** subdomain חדש שמגיש את אתר התיעוד מ-docs/ בצורה ציבורית, אבטח HTTPS, מתעדכן אוטומטית

2026-08-22 11:06 CEST — [radiant]

  • **החלטה:** 3 רמות בידוד (isolation levels)
  • **למה:** כל tenant נבנה מאותו template עם `--isolation-level` (1|2|3). רמה 1 = process+schema (אותו Postgres, דמו/free); רמה 2 = process+DB instance נפרד (משלמים); רמה 3 = VM+DB+KMS (Pay/PCI). קוד+נתונים קבועים; רק "איפה רצים"+"איפה מפתחות" משתנים. מעבר = `migrate-tenant-level.sh` בלי לשנות קוד

2026-08-22 11:05 CEST — [radiant]

  • **החלטה:** Ruby Code Mode Engine (MCP 2-Tools Pattern)
  • **למה:** אימוץ ארכיטקטורת Search-and-Execute (Cloudflare Code Mode) עבור API-Bank ו-RCP לחיסכון של 90% בטוקנים, שרשור פעולות במילישניות ובידוד טננטים ב-Sandbox

2026-08-22 10:45 CEST — [radiant]

  • **החלטה:** logs.sh תוקן
  • **למה:** bug ב-[ -n ] בסוף log

2026-08-22 10:43 CEST — [radiant]

  • **החלטה:** מערכת תיעוד חי (logs.sh) היא מקור האמת
  • **למה:** append-only + CLI + status.json

היסטוריית שינויים

2026-08-22 11:35 CEST — [radiant]

  • עידכנתי Code Mode → סטטוס 'מבוצע' (נמצא המימוש האמיתי ב-api-bank)
  • החלטה: Code Mode Engine קיים: execute/search/mcp/sdk.ts/sandbox-engine.ts במימוש api-bank

2026-08-22 11:25 CEST — [radiant]

  • תיקנתי escaping שבור במסמך Code Mode (backslash/ESC/CR)
  • החלטה: נכתב מחדש code-mode.md ו-ruby-code-mode-spec.md עם backtick תקין

2026-08-22 11:14 CEST — [radiant]

  • הוספת 3 סקשנים לאתר: Intents (RCP), Desktop Arm, Code Mode (MCP)
  • החלטה: אתר doc כולל עכשיו: תוכנית, רמות בידוד, 44 intents, Desktop Arm, Code Mode, החלטות, היסטוריה

2026-08-22 11:11 CEST — [radiant]

  • הוספת 3 רמות בידוד לאתר התיעוד (doc)
  • החלטה: רמות בידוד מפורטות ב-docs/plan.md ומוצגות באתר

2026-08-22 11:10 CEST — [radiant]

  • הוקם ורץ ruby-mcp-server (PM2 ID 12, port 18795) עם מנוע Search & Execute ו-Sandbox מבודד
  • שלב: Code Mode MCP

2026-08-22 11:06 CEST — [radiant]

  • הקמת אתר תיעוד ציבורי doc.turqizai.com
  • שלב: תשתית תיעוד
  • החלטה: אתר תיעוד חי שאפשר לצפות בו דרך DNS

2026-08-22 11:05 CEST — [radiant]

  • נכתב אפיון מלא עבור Ruby Code Mode Engine (MCP) ומוזג לתוכנית הפיתוח
  • שלב: Code Mode MCP

2026-08-22 10:45 CEST — [radiant]

  • בדיקת תיקון bug
  • שלב: תשתית תיעוד

2026-08-22 10:45 CEST — [radiant]

  • trace3
  • שלב: s

2026-08-22 10:45 CEST — [radiant]

  • trace2
  • שלב: s

2026-08-22 10:45 CEST — [radiant]

  • trace test

2026-08-22 10:45 CEST — [radiant]

  • בדיקה
  • שלב: אבא

2026-08-22 10:45 CEST — [radiant]

  • בדיקת תקינות מערכת התיעוד החי
  • שלב: תשתית תיעוד

2026-08-22 10:43 CEST — [radiant]

  • מיגרתי את worklog.md הישן למבנה docs מובנה (plan/decisions/history/status) + בניתי logs.sh CLI + DOCUMENTATION.md
  • שלב: תשתית תיעוד