מצב נוכחי
- 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) |
שלבים
| שלב | תיאור | מצב |
|---|---|---|
| שלב 1 | RCP Schema as Radiant Skill | ✅ done |
| שלב 2 | Tenant Model (tenantId, בידוד, control plane) | ✅ done |
| שלב 3 | Intent Router (44 intents → כלים) | ✅ done |
| שלב 4 | Intent Discovery (דינמי controlled) | ✅ done |
| שלב 5 | Desktop Arm ↔ Node (אופציה B: Node אמיתי) | ✅ done |
| שלב 5b | Windows installer (thin client) | ✅ done |
| שלב 5c | tenant→node provisioning (רמות 1/2/3) | ✅ done |
| שלב 6 | Browser Extension ↔ Radiant | ⬜ todo |
| שלב 7 | Federation on top of Nodes (tenant-scoping) | ⬜ todo |
| שלב 8 | Events → 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
| Intent | Payload |
|---|---|
| `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
| Intent | Payload |
|---|---|
| `book_appointment` | `{ name?, date?, time?, purpose?, userId? }` (תומך ב"מחר"/"היום"/dd.mm.yyyy) |
| `check_availability` | `{ date? }` |
| `create_event` | `{ title?, subject?, date?, time?, duration?, attendees? }` |
Communication
| Intent | Payload |
|---|---|
| `send_message` | `{ to, message, channel? }` |
| `send_email` | `{ to?, subject?, content?, body? }` |
| `check_email` | `{ count? }` |
Payments
| Intent | Payload |
|---|---|
| `place_order` | `{ ... }` (items, amount) |
| `payment` | `{ ... }` (process/query) |
Knowledge / Query
| Intent | Payload |
|---|---|
| `query` | `{ query, type? }` |
| `query_users` | `{ ... }` |
| `query_posts` | `{ ... }` |
| `query_weather` | `{ location }` |
| `query_pokemon` | `{ name/id }` |
Search / Media
| Intent | Payload |
|---|---|
| `search_youtube` | `{ query?, q?, count? }` |
| `youtube_stats` | `{ channel? }` |
| `find_location` | `{ query, q? }` |
| `get_directions` | `{ from?, to? }` |
Code / Repo / CMS
| Intent | Payload |
|---|---|
| `github_status` | `{ owner?, repo? }` |
| `github_issues` | `{ owner?, repo?, limit? }` |
| `wp_posts` | `{ count? }` |
| `wp_create_post` | `{ title?, content? }` |
Analytics
| Intent | Payload |
|---|---|
| `analytics` | `{ metric?, range? }` |
Federation
| Intent | Payload |
|---|---|
| `create_connection` | `{ personalRuby, systemRuby, permissions, authMethod, callbackUrl? }` |
| `subscribe_events` | `{ subscriberRuby, eventType, callbackUrl, filters? }` |
Automation (n8n)
| Intent | Payload |
|---|---|
| `trigger_n8n_workflow` | `{ workflowId?, webhookUrl?, workflowName?, data?, payload? }` |
| `execute_n8n_node` | `{ nodeType, action?, parameters? }` |
Additional
| Intent | Payload |
|---|---|
| `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) → PC | Radiant → `exec(host=node)` → PC |
| תלות | שרת רובי (Mongo) חובה | אפס — חיבור ישיר |
| Latency | poll 3 שניות | push מיידי |
| מנצל OpenClaw | לא | `exec`/`file_*`/`screen`/`notify` מובנה |
מיפוי פקודות זרוע ←→ OpenClaw tool
| desktop type | OpenClaw 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
- שלב: תשתית תיעוד