diff --git a/DEPLOYMENT_REVIEW.md b/DEPLOYMENT_REVIEW.md new file mode 100644 index 0000000..16eb031 --- /dev/null +++ b/DEPLOYMENT_REVIEW.md @@ -0,0 +1,454 @@ +# SmartAssistant v1.0.3 — סיכום מנהלים לפריסה בפיתוח + +**תאריך:** 2026-03-31 +**גרסה:** 1.0.3 | **תאריך שחרור:** 2026-03-29 +**סביבת יעד:** EspoCRM Development (https://espocrm.dev.marcus-law.co.il) +**מחבר:** klear | **דרישות:** EspoCRM >= 8.0.0, PHP >= 8.1 + +--- + +## 1. תיאור כללי + +SmartAssistant הוא מודול עוזר AI מאוחד למשרד עורכי דין. + +המודול מספק: +- **ממשק צ'אט צף** (Floating Action Button) בכל דפי המערכת +- **מצב משרד** — סקירה כללית, התראות, סטטיסטיקות עומס עבודה +- **מצב תיק** — סיוע מעמיק בתיק ספציפי עם הקשר מלא +- **מערכת זיכרון תיק** (CaseMemory) — מאגר ידע מובנה לכל תיק ב-7 קטגוריות +- **ביצוע פעולות באישור** — יצירת משימות, פתקים, דיונים, שינוי סטטוס +- **אינטגרציה עם Stream** — כל אינטראקציה מופיעה בציר הזמן של התיק +- **התראות בסרגל ניווט** — תיקים לא פעילים, משימות באיחור, דיונים קרובים + +--- + +## 2. מה בוצע + +### 2.1 Backend (PHP) — 16 קבצים + +| רכיב | קובץ | תפקיד | +|-------|------|--------| +| Controller | `Controllers/SmartAssistant.php` | 10 נקודות קצה API (chat, execute, summary, alerts, history, conversations, conversationMessages, searchHistory, caseMemory, saveMemory) | +| שירות ראשי | `Services/SmartAssistantService.php` | תזמור מלא: בניית הקשר → קריאת webhook → טיפול בפעולות → שמירת שיחה | +| בונה הקשר תיק | `Services/CaseContextBuilder.php` | אוסף: נתוני תיק, אנשי קשר, משימות פתוחות, דיונים קרובים, פתקים אחרונים, זיכרון | +| בונה הקשר משרד | `Services/OfficeContextBuilder.php` | סטטיסטיקות כלליות, התראות, עומס עבודה לפי משתמש, drill-down לתיקים | +| מחשבון התראות | `Services/AlertCalculator.php` | 6 סוגי התראות: תיקים לא פעילים (14/30 יום), משימות באיחור, דיונים קרובים, תיקים ללא שיוך, משימות בעדיפות גבוהה | +| מבצע פעולות | `Services/ActionExecutor.php` | 8 כלים: create_task, add_note, change_status, create_meeting, schedule_hearing, list_documents, analyze_document, save_memory, rename_document | +| שירות זיכרון | `Services/CaseMemoryService.php` | CRUD מלא לאנטיטי CaseMemory | +| ספק הקשר זיכרון | `Services/CaseMemoryContextProvider.php` | הזרקת זיכרון מוצמד/חשוב להקשר AI | +| מאגר שיחות | `Services/ConversationRepository.php` | שמירה ואחזור שיחות ב-AssistantConversation | +| מנתח מסמכים | `Services/DocumentAnalyzer.php` | סריקת מסמכים דרך FileStorage | +| Hook - שינוי תיק | `Hooks/Case/CaseFieldChangeMemory.php` | זיכרון אוטומטי בשינוי: סטטוס, שופט, בית משפט, מועד דיון | +| Hook - דיון | `Hooks/Meeting/HearingScheduledMemory.php` | זיכרון אוטומטי בקביעת דיון חדש | +| FileStorage | `Classes/FileStorage/*` | 4 קבצים: Interface, Factory, WebDav, NextCloud | + +### 2.2 Frontend (JavaScript) — 9 קבצים + +| רכיב | תפקיד | +|-------|--------| +| `floating-chat.js` | ממשק צ'אט צף (~1500 שורות): שליחת הודעות, היסטוריה, זיכרון, אישור/דחיית פעולות, עיצוב RTL, Material Design | +| `site/navbar.js` | אייקון התראות בסרגל ניווט עם badge מספרי | +| `dashlets/smart-assistant.js` | דשלט לדשבורד: סיכום מדדים + התראות אחרונות | +| `dashlets/options/smart-assistant.js` | הגדרות דשלט | +| `case/modals/add-memory.js` | מודל להוספת זיכרון ידנית לתיק | +| `stream/notes/smart-request.js` | תצוגת הודעת משתמש ב-Stream | +| `stream/notes/smart-response.js` | תצוגת תשובת עוזר ב-Stream | +| `stream/notes/smart-action.js` | תצוגת פעולה שבוצעה ב-Stream | + +### 2.3 מטא-נתונים וקונפיגורציה — 17 קבצי JSON + +- **routes.json** — 10 נתיבי API +- **module.json** — רישום מודול עם clientModule +- **entityDefs/** — CaseMemory (אנטיטי חדש, 15 שדות, 4 אינדקסים), Case (שדה cNextHearing), Note (סוגי stream חדשים) +- **scopes/CaseMemory.json** — הגדרות scope +- **layouts/CaseMemory/** — 4 layouts (list, detail, listSmall, detailSmall) +- **dashlets/SmartAssistant.json** — הגדרת דשלט +- **integrations/SmartAssistant.json** — 6 שדות הגדרה (webhookUrl, apiKey, maxMessagesPerHour, inactivityWarningDays, inactivityCriticalDays, upcomingHearingDays) +- **clientDefs/App.json** — רישום navbar + +### 2.4 תרגומים — 10 קבצים + +- **en_US** — 5 קבצי תרגום (SmartAssistant, CaseMemory, Case, Global, Integration) +- **fa_IR** — 5 קבצי תרגום מקבילים (עברית/פרסית) + +### 2.5 בנייה והפצה + +- **build.sh** — סקריפט בנייה: קורא גרסה מ-manifest.json, מעדכן README, יוצר ZIP +- **composer.json** — הגדרת חבילה ל-Composer Registry +- **4 גרסאות ZIP** — 1.0.0, 1.0.1, 1.0.2, 1.0.3 + +--- + +## 3. היסטוריית גרסאות ותיקוני באגים + +### v1.0.0 — `a148e0f` +- **פיצ'ר ראשוני** — מודול SmartAssistant מלא עם case memory + +### v1.0.0 → v1.0.1 — תיקונים +| Commit | תקלה | תיקון | +|--------|-------|--------| +| `0cdbf6d` | דשלט ירש מ-DashletView שלא קיים בגרסאות חדשות | שונה ל-base View + הוספת getTitle() | +| `ffd966a` | לא היה composer.json לפרסום אוטומטי | נוסף composer.json | +| `bd1cd17` | גרסה ב-README לא מתעדכנת אוטומטית | build.sh מעדכן README | +| `95ca8a0` | חסר תיעוד מקיף | נוסף README מלא בעברית | +| `fbe4f82` | נתיבי client לא תואמים לפורמט מודולים של EspoCRM | מיגרציה לנתיבי מודול תקניים | + +### v1.0.1 → v1.0.2 — `f380542` +| תקלה | תיקון | +|-------|--------| +| נתיבי CSS ו-script שגויים ב-app/client.json metadata | תיקון הנתיבים ל-format הנכון | + +### v1.0.2 → v1.0.3 — `d5c8a60` +| תקלה | תיקון | +|-------|--------| +| EspoCRM לא מצליח לרזולב templates בצד לקוח כי חסר clientModule | הוספת `clientModule` ל-module.json | + +### סיכום תקלות שנמצאו ותוקנו + +| # | תקלה | חומרה | סטטוס | +|---|-------|--------|--------| +| 1 | דשלט ירש מ-class לא קיים | גבוהה | תוקן v1.0.1 | +| 2 | נתיבי client לא תקניים לפורמט מודולים | גבוהה | תוקן v1.0.1 | +| 3 | נתיבי CSS/script שגויים ב-metadata | בינונית | תוקן v1.0.2 | +| 4 | חסר clientModule לרזולוציית templates | גבוהה | תוקן v1.0.3 | + +--- + +## 4. מה נבדק + +### נבדק ידנית (על סמך תיקוני הבאגים) +- רישום מודול וטעינת client-side assets +- תצוגת דשלט בדשבורד +- רזולוציית templates בצד לקוח +- נתיבי metadata (CSS, scripts) + +### לא נבדק (אין קבצי טסט בפרויקט) +- **אין בדיקות יחידה (unit tests)** לקוד PHP +- **אין בדיקות אינטגרציה** ל-API endpoints +- **אין בדיקות E2E** לממשק הצ'אט +- **אין CI/CD pipeline** (אין GitHub Actions / Gitea Actions) + +--- + +## 5. דרישות קדם לפריסה בפיתוח + +| דרישה | סטטוס | פירוט | +|--------|--------|--------| +| EspoCRM >= 8.0.0 | לאמת | לוודא גרסה בסביבת dev | +| PHP >= 8.1 | לאמת | לוודא גרסה בשרת | +| Webhook URL | **נדרש הגדרה** | יש להגדיר n8n workflow שיקבל את הפניות | +| API Key | אופציונלי | לאימות webhook | +| AssistantConversation entity | לאמת | נדרש שהאנטיטי קיים | +| WebDAV/NextCloud | אופציונלי | רק לפיצ'ר ניתוח מסמכים | + +--- + +## 6. מה נשאר לעשות + +### קריטי לפני פריסה +| # | משימה | עדיפות | +|---|--------|---------| +| 1 | **הגדרת n8n workflow** לקבלת webhook מהעוזר (chat endpoint) | קריטי | +| 2 | **בדיקת תאימות** עם גרסת EspoCRM בסביבת dev | קריטי | +| 3 | **לוודא שאין שאריות** של מודולים ישנים בסביבת dev | קריטי | +| 4 | **הגדרת Integration** — webhookUrl + apiKey ב-Admin > Integrations | קריטי | +| 5 | **בדיקה שאנטיטי AssistantConversation קיים** או שצריך ליצור אותו | קריטי | + +### חשוב אחרי פריסה +| # | משימה | עדיפות | +|---|--------|---------| +| 6 | **בדיקות ידניות מקיפות** — צ'אט במצב משרד ומצב תיק | גבוהה | +| 7 | **בדיקת פעולות** — create_task, add_note, schedule_hearing, change_status | גבוהה | +| 8 | **בדיקת hooks** — שינוי סטטוס תיק → זיכרון אוטומטי | גבוהה | +| 9 | **בדיקת התראות** — navbar badge + דשלט | בינונית | +| 10 | **בדיקת היסטוריה** — שמירה ואחזור שיחות, חיפוש | בינונית | + +### שיפורים עתידיים +| # | משימה | עדיפות | +|---|--------|---------| +| 11 | כתיבת בדיקות יחידה ל-PHP | בינונית | +| 12 | הוספת CI/CD pipeline (Gitea Actions) | בינונית | +| 13 | הוספת תרגום עברי (he_IL) — כרגע en_US + fa_IR בלבד | בינונית | +| 14 | Rate limiting בצד client (כרגע רק בצד server) | נמוכה | +| 15 | הצפנת שיחות | נמוכה | + +--- + +## 7. תיעוד מפורט של הקוד והקבצים + +### 7.1 ארכיטקטורה כללית + +``` +┌─────────────────────────────────────────────────┐ +│ Frontend (JS) │ +│ floating-chat.js ←→ navbar.js ←→ dashlet.js │ +│ │ │ │ │ +│ [צ'אט צף] [התראות navbar] [דשלט דשבורד] │ +└───────────────────────┬─────────────────────────┘ + │ REST API (10 endpoints) +┌───────────────────────┴─────────────────────────┐ +│ Controller/SmartAssistant.php │ +│ chat | execute | summary | alerts | history ... │ +└───────────────────────┬─────────────────────────┘ + │ +┌───────────────────────┴─────────────────────────┐ +│ SmartAssistantService.php │ +│ תזמור: הקשר → webhook → פעולות → שמירה │ +├──────────┬──────────┬──────────┬─────────────────┤ +│ Context │ Action │ Memory │ Conversation │ +│ Builders │ Executor │ Service │ Repository │ +├──────────┴──────────┴──────────┴─────────────────┤ +│ CaseContext │ OfficeContext │ AlertCalculator │ +│ Builder │ Builder │ │ +└───────────────┴──────────────┴───────────────────┘ + │ + ┌─────────┴──────────┐ + │ External n8n │ + │ Webhook (AI) │ + └────────────────────┘ +``` + +### 7.2 זרימת צ'אט (Chat Flow) + +``` +1. משתמש שולח הודעה ← floating-chat.js +2. POST /SmartAssistant/action/chat { message, caseId?, conversationId } +3. Controller → SmartAssistantService::chat() +4. בניית הקשר: + ├─ מצב תיק → CaseContextBuilder (נתוני תיק + אנשי קשר + משימות + דיונים + זיכרון) + └─ מצב משרד → OfficeContextBuilder (סטטיסטיקות + התראות) +5. קריאת webhook חיצוני (n8n) עם: message + context + history +6. קבלת תשובה: { text, actions[] } +7. פעולות מיידיות (list_documents, save_memory) → ביצוע אוטומטי +8. פעולות הדורשות אישור → שמירה + החזרה למשתמש +9. שמירת שיחה ב-ConversationRepository +10. שמירת הודעות ב-Stream (smart-request + smart-response notes) +``` + +### 7.3 פירוט קבצי Backend + +#### `Controllers/SmartAssistant.php` (168 שורות) +- **actionChat()** — מקבל message, caseId, conversationId. בודק ACL ל-Case. קורא ל-SmartAssistantService::chat() +- **actionExecute()** — מקבל actionId, conversationId. מבצע פעולה שאושרה +- **actionSummary()** — מחזיר סיכום משרדי + התראות +- **actionAlerts()** — רשימת התראות מלאה +- **actionHistory()** — היסטוריית שיחות (לפי caseId או אחרונה) +- **actionConversations()** — רשימת שיחות אחרונות +- **actionConversationMessages()** — הודעות שיחה ספציפית +- **actionSearchHistory()** — חיפוש חופשי בשיחות +- **actionCaseMemory()** — זיכרון תיק לפי קטגוריה +- **actionSaveMemory()** — שמירת זיכרון ידנית + +#### `Services/SmartAssistantService.php` (~500 שורות) +הקובץ המרכזי ביותר. אחראי על: +- **chat()** — הזרימה המלאה: בניית הקשר, קריאת webhook, עיבוד פעולות, שמירת שיחה +- **callWebhook()** — קריאת CURL ל-n8n עם timeout, headers (X-Api-Key), JSON payload +- **processActions()** — מיון פעולות: מיידיות vs. דורשות אישור +- **executeAction()** — ביצוע פעולה שאושרה דרך ActionExecutor +- **getSummary()** / **getAlerts()** — מצב משרד +- **getConversations()** / **getHistory()** / **searchHistory()** — ניהול שיחות + +#### `Services/CaseContextBuilder.php` (~150 שורות) +בונה הקשר עשיר לתיק: +```php +[ + 'case' => [...], // שדות תיק מרכזיים + 'contacts' => [...], // אנשי קשר מקושרים + 'openTasks' => [...], // משימות פתוחות (עד 10) + 'upcomingMeetings' => [...], // דיונים קרובים (עד 5) + 'recentNotes' => [...], // פתקים אחרונים (עד 10) + 'memories' => [...], // זיכרון מוצמד + חשוב + 'stats' => [...] // מספרי סיכום +] +``` + +#### `Services/OfficeContextBuilder.php` (~80 שורות) +בונה סיכום משרדי: +```php +[ + 'totalActiveCases' => int, + 'casesByStatus' => [...], + 'overdueTasks' => int, + 'upcomingHearings' => int, + 'userWorkload' => [...], // עומס לפי משתמש + 'alerts' => [...] +] +``` + +#### `Services/ActionExecutor.php` (~250 שורות) +מבצע 8 סוגי פעולות: + +| כלי | פרמטרים | פעולה | +|------|----------|--------| +| `create_task` | name, dateEnd, priority, description | יצירת Task מקושר לתיק | +| `add_note` | text | הוספת Post ב-Stream של התיק | +| `change_status` | status | שינוי סטטוס (עם validation מול enum) | +| `create_meeting` | name, dateStart, dateEnd, description | יצירת Meeting | +| `schedule_hearing` | date, description | עדכון cNextHearing + יצירת Meeting | +| `list_documents` | — | רשימת מסמכים (read-only, ללא אישור) | +| `analyze_document` | documentId | ניתוח מסמך דרך DocumentAnalyzer | +| `save_memory` | name, content, category, importance | שמירת CaseMemory (ללא אישור) | +| `rename_document` | documentId, newName | שינוי שם קובץ | + +#### `Services/AlertCalculator.php` (~200 שורות) +6 סוגי התראות: + +| סוג | לוגיקה | חומרה | +|------|--------|--------| +| תיק לא פעיל (אזהרה) | modifiedAt < now - 14 יום | warning | +| תיק לא פעיל (קריטי) | modifiedAt < now - 30 יום | critical | +| משימה באיחור | dateEnd < now, status != Completed | critical | +| דיון קרוב | dateStart < now + 7 ימים | warning | +| תיק ללא שיוך | status = New, assignedUserId = null | warning | +| משימה בעדיפות גבוהה | priority = Urgent, dateEnd < now + 5 ימים | warning | + +#### `Services/CaseMemoryService.php` (106 שורות) +CRUD פשוט: +- **getMemories()** — לפי caseId, עם סינון אופציונלי לפי category +- **saveMemory()** — יצירת רשומת CaseMemory +- **updateMemory()** — עדכון +- **deleteMemory()** — מחיקה רכה + +#### `Services/CaseMemoryContextProvider.php` +מזריק זיכרון להקשר AI: +- זיכרון מוצמד (isPinned = true) +- זיכרון בחשיבות high/critical +- ממוין לפי importance DESC, modifiedAt DESC + +#### `Services/ConversationRepository.php` (~120 שורות) +- **save()** — שמירת שיחה באנטיטי AssistantConversation +- **getHistory()** — אחזור לפי caseId או אחרון +- **getConversations()** — רשימה ממוינת (עד limit) +- **getMessages()** — הודעות שיחה ספציפית +- **search()** — חיפוש חופשי בתוכן + +#### Hooks +- **CaseFieldChangeMemory** — afterSave hook על Case. בודק אם שדות key השתנו (status, cJudge, cCourt, cNextHearing). אם כן, יוצר CaseMemory אוטומטי מסוג `auto` בקטגוריה המתאימה. +- **HearingScheduledMemory** — afterSave hook על Meeting. אם סוג Meeting = "Hearing", יוצר CaseMemory בקטגוריה timeline. + +### 7.4 פירוט קבצי Frontend + +#### `floating-chat.js` (~1500 שורות) +הקובץ הגדול ביותר. View יחיד שמנהל: +- **תצוגת צ'אט** — קלט הודעה, בועות הודעות (משתמש/עוזר), פעולות בהמתנה +- **תצוגת היסטוריה** — רשימת שיחות קודמות, טעינת שיחה +- **תצוגת זיכרון** — tabs לפי קטגוריה, הוספה/מחיקה/הצמדה +- **RTL layout** — כל ה-CSS מותאם לעברית +- **עיצוב Material Design** — צבע ראשי #5c6bc0 (אינדיגו), אנימציות slide-up +- **רספונסיבי** — breakpoint ב-480px למובייל +- **Inline CSS** — כל הסגנונות מוטמעים בקובץ (לא CSS חיצוני) + +#### `site/navbar.js` +- מרחיב את navbar הרגיל של EspoCRM +- מוסיף אייקון התראות עם badge מספרי +- קורא ל-GET /SmartAssistant/action/alerts ומציג ספירה +- רענון אוטומטי כל X דקות + +#### `dashlets/smart-assistant.js` +- דשלט לדשבורד הראשי +- מציג: סה"כ תיקים פעילים, משימות באיחור, דיונים קרובים +- רשימת 5 התראות אחרונות +- ACL scope = Case + +#### Stream Notes (3 קבצים) +- **smart-request.js** — מציג הודעת משתמש עם אייקון שאלה +- **smart-response.js** — מציג תשובת עוזר עם markdown rendering +- **smart-action.js** — מציג פעולה שבוצעה עם סטטוס (approved/rejected/executed) + +#### `case/modals/add-memory.js` +- מודל Espo.Views.Modal סטנדרטי +- שדות: name, category (dropdown), content (textarea), importance (dropdown) +- POST ל-/SmartAssistant/action/saveMemory + +### 7.5 אנטיטי CaseMemory — מבנה מלא + +``` +שדות: +├── name (varchar, required) — כותרת הזיכרון +├── case (link → Case, required) — תיק משויך +├── category (enum) — key_facts | strategy | decisions | contacts_notes | timeline | documents_notes | billing_notes +├── content (text, required) — תוכן מלא +├── source (enum, readOnly) — manual | assistant | auto +├── importance (enum) — low | normal | high | critical +├── isPinned (bool) — הצמדה לגישה מהירה +├── isArchived (bool) — הסתרת רשומות ישנות +├── sourceEntityType (varchar, readOnly) — סוג מקור (למעקב) +├── sourceEntityId (varchar, readOnly) — ID מקור +├── assignedUser (link → User) +├── teams (linkMultiple → Team) +├── createdAt, modifiedAt (datetime) +└── createdBy, modifiedBy (link → User) + +אינדקסים: +├── caseId + deleted +├── caseId + category + deleted +├── caseId + isPinned + deleted +└── importance + deleted +``` + +### 7.6 הגדרות אינטגרציה + +**Admin > Integrations > Smart Assistant:** + +| שדה | סוג | ברירת מחדל | תיאור | +|------|------|------------|--------| +| webhookUrl | url | — | כתובת webhook (n8n) | +| apiKey | varchar(255) | — | מפתח אימות, נשלח כ-X-Api-Key header | +| maxMessagesPerHour | int | 30 | הגבלת קצב | +| inactivityWarningDays | int | 14 | סף אזהרה לחוסר פעילות | +| inactivityCriticalDays | int | 30 | סף קריטי | +| upcomingHearingDays | int | 7 | חלון דיונים קרובים | + +### 7.7 פורמט Webhook + +**Request (נשלח ל-n8n):** +```json +{ + "message": "מה המצב של תיק כהן?", + "context": { + "case": { "name": "כהן נ' לוי", "status": "Active", ... }, + "contacts": [...], + "openTasks": [...], + "memories": [...] + }, + "conversationId": "conv_abc123", + "conversationHistory": [ + { "role": "user", "content": "..." }, + { "role": "assistant", "content": "..." } + ], + "mode": "case" +} +``` + +**Response (נדרש מ-n8n):** +```json +{ + "text": "תיק כהן פעיל. יש 3 משימות פתוחות ודיון ב-15 באפריל.", + "actions": [ + { + "tool": "create_task", + "params": { "name": "הכנת סיכומים לדיון", "dateEnd": "2026-04-14" }, + "actionId": "action_xyz789", + "displayText": "יצירת משימה: הכנת סיכומים לדיון" + } + ] +} +``` + +--- + +## 8. סיכום מוכנות לפריסה + +| קריטריון | סטטוס | הערות | +|-----------|--------|--------| +| קוד backend | מוכן | 16 קבצי PHP, ארכיטקטורה נקייה | +| קוד frontend | מוכן | 9 קבצי JS, עיצוב RTL | +| מטא-נתונים | מוכן | תוקן ב-v1.0.1-1.0.3 | +| תרגומים | חלקי | en_US + fa_IR, חסר he_IL ייעודי | +| קובץ התקנה | מוכן | SmartAssistant-1.0.3.zip | +| n8n workflow | **חסר** | צריך לבנות workflow שיטפל ב-chat | +| בדיקות אוטומטיות | **אין** | אין unit/integration/E2E tests | +| CI/CD | **אין** | אין pipeline | +| תיעוד | מוכן | README מקיף בעברית | + +**המלצה:** המודול מוכן טכנית לפריסה בסביבת פיתוח. יש להגדיר webhook URL (n8n workflow) לפני שהצ'אט יהיה פונקציונלי. מומלץ לבצע בדיקות ידניות מקיפות לאחר ההתקנה. diff --git a/README.md b/README.md index fea8b1f..06bc268 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SmartAssistant - עוזר חכם -**גרסה:** 1.1.7 | **מחבר:** klear | **EspoCRM:** >= 8.0.0 +**גרסה:** 2.0.0 | **מחבר:** klear | **EspoCRM:** >= 8.0.0 ## תיאור עוזר AI מאוחד למשרד עורכי דין. מספק ממשק צ'אט צף עם שני מצבי עבודה: **מצב משרד** (סקירה כללית, התראות, סטטיסטיקות) ו**מצב תיק** (סיוע מעמיק בתיק ספציפי). כולל מערכת זיכרון תיק מובנית, ביצוע פעולות באישור המשתמש, ואינטגרציה עם Stream של EspoCRM. diff --git a/SmartAssistant-1.0.5.zip b/SmartAssistant-1.0.5.zip new file mode 100644 index 0000000..484308b Binary files /dev/null and b/SmartAssistant-1.0.5.zip differ diff --git a/SmartAssistant-1.0.6.zip b/SmartAssistant-1.0.6.zip new file mode 100644 index 0000000..608967c Binary files /dev/null and b/SmartAssistant-1.0.6.zip differ diff --git a/SmartAssistant-1.0.7.zip b/SmartAssistant-1.0.7.zip new file mode 100644 index 0000000..e33b7fb Binary files /dev/null and b/SmartAssistant-1.0.7.zip differ diff --git a/SmartAssistant-1.0.8.zip b/SmartAssistant-1.0.8.zip new file mode 100644 index 0000000..935bb95 Binary files /dev/null and b/SmartAssistant-1.0.8.zip differ diff --git a/SmartAssistant-1.0.9.zip b/SmartAssistant-1.0.9.zip new file mode 100644 index 0000000..2980cd1 Binary files /dev/null and b/SmartAssistant-1.0.9.zip differ diff --git a/SmartAssistant-1.1.0.zip b/SmartAssistant-1.1.0.zip new file mode 100644 index 0000000..5224229 Binary files /dev/null and b/SmartAssistant-1.1.0.zip differ diff --git a/SmartAssistant-1.1.1.zip b/SmartAssistant-1.1.1.zip new file mode 100644 index 0000000..2cb79d1 Binary files /dev/null and b/SmartAssistant-1.1.1.zip differ diff --git a/SmartAssistant-1.1.2.zip b/SmartAssistant-1.1.2.zip new file mode 100644 index 0000000..26a159d Binary files /dev/null and b/SmartAssistant-1.1.2.zip differ diff --git a/SmartAssistant-1.1.3.zip b/SmartAssistant-1.1.3.zip new file mode 100644 index 0000000..c980b0d Binary files /dev/null and b/SmartAssistant-1.1.3.zip differ diff --git a/SmartAssistant-1.1.4.zip b/SmartAssistant-1.1.4.zip new file mode 100644 index 0000000..1cc6861 Binary files /dev/null and b/SmartAssistant-1.1.4.zip differ diff --git a/SmartAssistant-1.1.5.zip b/SmartAssistant-1.1.5.zip new file mode 100644 index 0000000..ba82401 Binary files /dev/null and b/SmartAssistant-1.1.5.zip differ diff --git a/SmartAssistant-1.1.6.zip b/SmartAssistant-1.1.6.zip new file mode 100644 index 0000000..48ebd4e Binary files /dev/null and b/SmartAssistant-1.1.6.zip differ diff --git a/SmartAssistant-1.1.7.zip b/SmartAssistant-1.1.7.zip new file mode 100644 index 0000000..a6785a6 Binary files /dev/null and b/SmartAssistant-1.1.7.zip differ diff --git a/SmartAssistant-2.0.0.zip b/SmartAssistant-2.0.0.zip new file mode 100644 index 0000000..d472740 Binary files /dev/null and b/SmartAssistant-2.0.0.zip differ diff --git a/SmartAssistant-2.1.0.zip b/SmartAssistant-2.1.0.zip new file mode 100644 index 0000000..623a2bf Binary files /dev/null and b/SmartAssistant-2.1.0.zip differ diff --git a/SmartAssistant-2.1.1.zip b/SmartAssistant-2.1.1.zip new file mode 100644 index 0000000..3513043 Binary files /dev/null and b/SmartAssistant-2.1.1.zip differ diff --git a/SmartAssistant-2.1.2.zip b/SmartAssistant-2.1.2.zip new file mode 100644 index 0000000..89822c7 Binary files /dev/null and b/SmartAssistant-2.1.2.zip differ diff --git a/SmartAssistant-2.1.3.zip b/SmartAssistant-2.1.3.zip new file mode 100644 index 0000000..02b1f60 Binary files /dev/null and b/SmartAssistant-2.1.3.zip differ diff --git a/SmartAssistant-2.2.0.zip b/SmartAssistant-2.2.0.zip new file mode 100644 index 0000000..39b2587 Binary files /dev/null and b/SmartAssistant-2.2.0.zip differ diff --git a/SmartAssistant-2.3.0.zip b/SmartAssistant-2.3.0.zip new file mode 100644 index 0000000..cd76ee7 Binary files /dev/null and b/SmartAssistant-2.3.0.zip differ diff --git a/SmartAssistant-2.4.0.zip b/SmartAssistant-2.4.0.zip new file mode 100644 index 0000000..8ea5735 Binary files /dev/null and b/SmartAssistant-2.4.0.zip differ diff --git a/SmartAssistant-2.5.0.zip b/SmartAssistant-2.5.0.zip new file mode 100644 index 0000000..89f1b52 Binary files /dev/null and b/SmartAssistant-2.5.0.zip differ diff --git a/SmartAssistant-2.5.1.zip b/SmartAssistant-2.5.1.zip new file mode 100644 index 0000000..9a69280 Binary files /dev/null and b/SmartAssistant-2.5.1.zip differ diff --git a/SmartAssistant-2.5.2.zip b/SmartAssistant-2.5.2.zip new file mode 100644 index 0000000..c6a9760 Binary files /dev/null and b/SmartAssistant-2.5.2.zip differ diff --git a/bidi-table/bidi-table.md b/bidi-table/bidi-table.md new file mode 100644 index 0000000..c6ca132 --- /dev/null +++ b/bidi-table/bidi-table.md @@ -0,0 +1,31 @@ +יצירת טבלה מעוצבת עם תמיכה מלאה בעברית ואנגלית מעורבת. + +כאשר המשתמש מבקש טבלה בכל הקשר — תכנית עבודה, סיכום, השוואה, רשימה — השתמש בפונקציה `bidi_table()` מ-`scripts/bidi_table.py`. + +## הוראות + +1. **תמיד** השתמש ב-Bash כדי להריץ את הסקריפט — אל תנסה לייצר טבלת box-drawing ידנית כי ה-BiDi ישבור אותה. + +2. הרץ כך: +```bash +python3 -c " +import sys; sys.path.insert(0, '/home/chaim/legal-ai') +from scripts.bidi_table import bidi_table +print(bidi_table( + ['Header1', 'Header2', 'Header3'], + [ + ['value1', 'ערך בעברית', 'mixed ערבוב'], + ['value2', 'ערך נוסף', 'עוד שורה'], + ], +)) +" +``` + +3. כותרות עמודות — עדיף באנגלית (כי שורת הכותרת הכי רגישה ל-BiDi). + +4. תוכן בעברית, באנגלית, או מעורב — הכל עובד בגוף הטבלה. + +5. אם המשתמש מבקש טבלה כחלק ממסמך MD שנכתב לקובץ (לא לטרמינל) — אפשר להשתמש ב-markdown רגיל כי קוראי MD מטפלים ב-RTL בעצמם. + +## $ARGUMENTS +תוכן הטבלה — כותרות ושורות. אם לא צוין, שאל את המשתמש מה להציג. diff --git a/bidi-table/bidi_table.py b/bidi-table/bidi_table.py new file mode 100644 index 0000000..89f7a80 --- /dev/null +++ b/bidi-table/bidi_table.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""BiDi-safe box-drawing table renderer for mixed Hebrew/English terminal output. + +Uses LRM (Left-to-Right Mark, U+200E) before box-drawing characters to prevent +the BiDi algorithm from breaking table alignment when Hebrew text is present. + +Usage as module: + from scripts.bidi_table import bidi_table + print(bidi_table(['Col1', 'Col2'], [['val1', 'ערך2']])) + +Usage from CLI: + python3 scripts/bidi_table.py +""" + +from __future__ import annotations + +LRM = "\u200E" # Left-to-Right Mark — invisible, prevents BiDi reordering + + +def bidi_table(headers: list[str], rows: list[list[str]]) -> str: + """Render a box-drawing table safe for mixed RTL/LTR terminal display.""" + ncols = len(headers) + + # Calculate column widths + col_widths = [len(h) for h in headers] + for row in rows: + for i, cell in enumerate(row[:ncols]): + col_widths[i] = max(col_widths[i], len(cell)) + + def hline(left: str, mid: str, right: str) -> str: + return left + mid.join("─" * (w + 2) for w in col_widths) + right + + def dataline(cells: list[str]) -> str: + parts = [] + for i in range(ncols): + cell = cells[i] if i < len(cells) else "" + padded = cell + " " * max(0, col_widths[i] - len(cell)) + parts.append(" " + padded + " ") + return LRM + "│" + (LRM + "│").join(parts) + LRM + "│" + + lines = [hline("┌", "┬", "┐")] + lines.append(dataline(headers)) + lines.append(hline("├", "┼", "┤")) + for row in rows: + lines.append(dataline(row)) + lines.append(hline("└", "┴", "┘")) + return "\n".join(lines) + + +if __name__ == "__main__": + table = bidi_table( + ["File", "Description", "Model", "Step"], + [ + ["claims_extractor.py", "חילוץ טענות מכתבי טענות", "Sonnet", "שלב 3 — הבא בתור"], + ["brainstorm.py", "סיעור מוחות — כיווני נימוק", "Sonnet", "שלב 4"], + ["block_writer.py", "כתיבת בלוקים של החלטה", "Sonnet/Opus", "שלב 5"], + ["qa_validator.py", "בדיקת איכות QA", "Sonnet", "שלב 6"], + ["style_analyzer.py", "ניתוח סגנון דפנה", "Opus", "חד-פעמי"], + ["learning_loop.py", "למידה מהחלטה סופית", "Sonnet", "סוף תהליך"], + ], + ) + print(table) diff --git a/files/client/custom/modules/smart-assistant/src/views/floating-chat.js b/files/client/custom/modules/smart-assistant/src/views/floating-chat.js index 397256d..f862357 100644 --- a/files/client/custom/modules/smart-assistant/src/views/floating-chat.js +++ b/files/client/custom/modules/smart-assistant/src/views/floating-chat.js @@ -474,7 +474,7 @@ define('modules/smart-assistant/views/floating-chat', ['view'], function (View) payload.caseId = this.currentCaseId; } - Espo.Ajax.postRequest('SmartAssistant/action/chat', payload).then(function (response) { + Espo.Ajax.postRequest('SmartAssistant/action/chat', payload, {timeout: 180000}).then(function (response) { self.conversationId = response.conversationId; $loading.remove(); diff --git a/files/custom/Espo/Modules/SmartAssistant/Services/SmartAssistantService.php b/files/custom/Espo/Modules/SmartAssistant/Services/SmartAssistantService.php index 23b416a..9cb912a 100644 --- a/files/custom/Espo/Modules/SmartAssistant/Services/SmartAssistantService.php +++ b/files/custom/Espo/Modules/SmartAssistant/Services/SmartAssistantService.php @@ -406,7 +406,7 @@ class SmartAssistantService CURLOPT_POSTFIELDS => $payload, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headers, - CURLOPT_TIMEOUT => 120, + CURLOPT_TIMEOUT => 180, CURLOPT_CONNECTTIMEOUT => 10, ]); diff --git a/files/shira.png b/files/shira.png new file mode 100644 index 0000000..8f3a8a3 Binary files /dev/null and b/files/shira.png differ diff --git a/manifest.json b/manifest.json index 236786c..c6fbbf8 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "module": "SmartAssistant", "description": "Unified AI Assistant for Legal CRM — floating chat with case memory, office alerts, and AI Gateway integration", "author": "klear", - "version": "2.5.2", + "version": "2.5.3", "acceptableVersions": [ ">=8.0.0" ],