• chaim released this 2026-06-21 14:17:27 +03:00 | 0 commits to main since this release

    שיוך מסמכי AI לתיקיית CaseFiles

    מסמכים שנוצרים (מתבנית או חופשי) משויכים לתיקיית "מסמכים" של התיק כאשר CaseFilesCore מותקן.

    התקנה

    הורד את SmartAssistant-2.11.0.zip והתקן דרך Administration → Extensions.

    Downloads
  • chaim released this 2026-06-03 11:14:20 +03:00 | 2 commits to main since this release

    מה תוקן בגרסה הזו

    איחוד מתן השמות למסמכים שנוצרים דרך שירה, וריסון מלא של שמות שה-AI בוחר.

    שינוי

    • מסמך חופשי ומסמך מתבנית מקבלים שם לפי הנושא בלבד (בלי תאריך, בלי שם איש קשר, בלי מקף רחב). השם מתואם בין ה-CRM, הקובץ המצורף והקובץ בתיקיית הרשת.
    • המסמך נשמר לתיקיית התיק הנכונה (קודם לעיתים נשמר לתיקיית ברירת מחדל כללית).
    • כל שם שה-AI בוחר (קובץ, תיקייה, שינוי שם, העברה) עובר ניקוי בצד השרת, עם טיפול אוטומטי בכפילויות. ה-AI כבר לא יכול לקבוע שם קובץ גולמי.

    התקנה

    דורש NetworkStorageIntegration בגרסה 5.9.0 ומעלה.
    הורד את SmartAssistant-2.10.5.zip והתקן דרך Administration → Extensions, ואז בצע Rebuild.

    Downloads
  • chaim released this 2026-05-27 13:12:35 +03:00 | 3 commits to main since this release

    תיקון משלים ל-2.10.3

    ה-AssistantRule היה חסר clientDefs/AssistantRule.json (אותו gap שתיקנתי ל-CaseMemory ב-2.10.3). תוצאה: לחיצה על /#AssistantRule בנאב גרמה ל-404 בקונסול:

    /client/custom/modules/smart-assistant/src/controllers/assistant-rule.js
    Failed to load resource: 404
    

    (זה ה-EspoCRM frontend convention probe — מנסה לטעון JS controller ספציפי, וכשלא נמצא נופל ל-404 נראה בקונסול.)

    תיקון

    הוספת Resources/metadata/clientDefs/AssistantRule.json עם:

    {
        "controller": "controllers/record",
        "color": "#5e8c61",
        "iconClass": "fas fa-list-check",
        ...
    }
    

    עכשיו ה-frontend משתמש ב-default record controller של EspoCRM ולא מנסה לטעון קובץ JS שלא קיים.

    אימות

    לאחר ההתקנה, גישה ל-/#AssistantRule תציג רשימה רגילה ללא 404 בקונסול. דף /#CaseMemory כבר תוקן ב-2.10.3.

    התקנה

    הורד SmartAssistant-2.10.4.zip והתקן דרך Administration → Extensions. אחרי ההתקנה: Clear Cache + Ctrl+Shift+F5.

    Downloads
  • chaim released this 2026-05-27 12:52:34 +03:00 | 4 commits to main since this release

    תיקונים שמשלימים את 2.10.0/2.10.1/2.10.2

    המשתמש לא ראה את ה-entities של שירה ב-Admin → Layout Manager, וקיבל 404 בקונסול על case-memory.js. שני באגים נפרדים:

    1. AssistantRule לא הופיע ב-Layout Manager

    scopes/AssistantRule.json היה חסר customizable: true. EspoCRM מסתיר entities שאינם customizable מ-Admin → Entity Manager → Layouts. ארבע ה-entities האחרים של שירה (AssistantPrompt, AssistantSkill, UserProfile, CaseMemory) כבר היו עם הדגל הזה — רק AssistantRule לא.

    2. CaseMemory מחזיר 404 על JS controller

    clientDefs/CaseMemory.json לא היה קיים בכלל. ה-API החזיר אובייקט ריק ב-Metadata, וה-frontend נפל ל-convention default שמנסה לטעון client/custom/modules/smart-assistant/src/controllers/case-memory.js (קובץ שלא יצרנו). זה גרם ל-404 ב-browser console.

    הוספת Resources/metadata/clientDefs/CaseMemory.json עם controller: controllers/record (ה-default של EspoCRM) פותרת ללא JS מותאם.

    אימות בפרודקשן

    • GET /api/v1/Metadata?key=scopes.AssistantRule.customizabletrue
    • GET /api/v1/Metadata?key=clientDefs.CaseMemory → אובייקט מלא עם controller, icon, filters

    התקנה

    הורד SmartAssistant-2.10.3.zip והתקן דרך Administration → Extensions. אחרי ההתקנה: Clear Cache + Ctrl+Shift+F5.

    Downloads
  • chaim released this 2026-05-27 12:37:02 +03:00 | 5 commits to main since this release

    תיקון קריטי — התקנה דרך Admin → Extensions נכשלה

    ניסיון להעלות את SmartAssistant-2.10.0.zip או 2.10.1.zip דרך Admin → Extensions החזיר HTTP 500: Class "AfterInstall" not found.

    הסיבה

    ה-installer של EspoCRM (application/Espo/Core/Upgrades/Actions/Base.php:397) טוען את scripts/AfterInstall.php בעזרת require_once ואז קורא new AfterInstall()בלי namespace. ה-class חייב להיות class טופ-לבל, לא תחת namespace.

    הגרסאות 2.10.0/2.10.1 שלי הכריזו:

    namespace Espo\Modules\SmartAssistant\Scripts;
    class AfterInstall { ... }
    

    אז new AfterInstall() חיפש את ה-class בroot ולא מצא. ההתקנה התרסקה אחרי שכבר העתיק קבצים.

    התיקון

    הסרת ה-namespace. ה-class עכשיו מבני באותו pattern כמו GoogleIntegration/scripts/AfterInstall.php שמותקן בהצלחה זה חודשים:

    use Espo\Core\Container;
    
    class AfterInstall
    {
        public function run(Container $container, $params = null): void { ... }
    }
    

    התקנה

    הורד SmartAssistant-2.10.2.zip והתקן דרך Administration → Extensions. הפעם ההתקנה תרוץ ב-completion ויזרעו 7 ה-AssistantPrompt rows אוטומטית (אם כבר קיימים — דילוג).

    Downloads
  • chaim released this 2026-05-27 12:13:12 +03:00 | 6 commits to main since this release

    תיקוני UI לגרסה 2.10.0

    לאחר התקנת 2.10.0 בפרודקשן התגלו שתי בעיות תצוגה:

    1. CaseMemory מחזיר 404 בנאב

    הפנייה ל-/#CaseMemory החזירה שגיאה כי ה-entity לא היה לו Controller class. הוא היה זמין רק דרך relation panels של Case ודרך actions של SmartAssistant — מעולם לא כ-CRUD ישיר. הוספת קובץ אחד Controllers/CaseMemory.php (יורש מ-Record) פותרת.

    זה אותו תיקון של AssistantRule בגרסה 2.9.2.

    2. רשימות מציגות רק עמודה אחת

    ה-layouts נשמרו בנתיב Resources/metadata/layouts/... במקום ב-Resources/layouts/.... EspoCRM לא מצא אותם ונפל ל-default generic. תוצאה: 5 ה-entities (AssistantPrompt, AssistantRule, AssistantSkill, CaseMemory, UserProfile) הציגו רק עמודת שם.

    הועברו 12 קובצי layout למיקום הנכון.

    אימות אחר התיקון

    • GET /api/v1/{Entity}/layout/list מחזיר 200 עם כל העמודות לכל אחת מ-5 ה-entities.
    • GET /api/v1/CaseMemory?maxSize=5 מחזיר 200 עם 65 רשומות.

    התקנה

    הורד SmartAssistant-2.10.1.zip והתקן דרך Administration → Extensions. אחרי ההתקנה: Clear Cache + רענון מלא של הדפדפן (Ctrl+Shift+F5).

    Downloads
  • chaim released this 2026-05-27 11:35:03 +03:00 | 8 commits to main since this release

    גרסה חדשה — ניהול מלא של שירה דרך ה-UI של EspoCRM

    הגרסה הזו פותחת אזור חדש בממשק הניהול: ניהול שירה. כל הטקסט שמרכיב את ה-system prompt של שירה (פרסונה, חוקי כלים, סגנון כתיבה, חוקי התנהגות, מיומנויות, פרופילי משתמשים, זיכרון תיקים) ניתן עכשיו לצפייה ועריכה ישירות מ-EspoCRM, בלי צורך ב-deploy של קוד.

    ארכיטקטורה: Layered Defaults

    EspoCRM DB (admin עורך)
        ↓
    ContextProvider PHP (כל request)
        ↓
    context['assistantPrompts', 'userProfile', 'availableSkills', 'assistantRules']
        ↓
    shira-hermes prompt_builder.py
        ↓ (אם DB row חסר/לא פעיל → fallback ל-default מובנה בקוד)
    

    עיקרון בטיחות: מחיקת כל הרשומות ב-UI לא מבריקה את שירה. ה-defaults תמיד שם.

    מה חדש

    ישויות חדשות:

    • AssistantPrompt — סעיפי ה-system prompt של שירה (7 רשומות נזרעות בהתקנה).
    • AssistantSkill — מיומנויות (workflows) של שירה.
    • UserProfile — פרופיל אישי לכל עורך/ת דין.

    שינויי ממשק:

    • AssistantRule כעת ב-navbar (היה נסתר עם tab: false).
    • CaseMemory כעת ב-navbar עם גישת חיפוש כללית.
    • אזור Admin חדש "ניהול שירה" שמרכז את כל החמש: פרומפטים, כללים, מיומנויות, פרופילים, זיכרון תיקים.

    עורך מותאם:

    • שדה ה-content של פרומפטים/מיומנויות/פרופילים מציג textarea ב-monospace עם dir=auto (RTL/LTR מותאם אוטומטית) ו-min-height 500px. נוח לעבודה בעברית, אנגלית, ו-JSON snippets מעורבים.

    תיקונים תלויים

    • save_memory bug: גרסת 2.9.x של shira-hermes יצרה Notes עם prefix "🧠" במקום רשומות CaseMemory. תיקנו ל-route דרך SmartAssistant/action/executeTool שמכוון נכון ל-CaseMemoryService. מיגרציה של Notes לגאסיים זמינה ב-shira-hermes/scripts/migrate_legacy_memory_notes.py.

    • שמירת חוקים: בנוסף לתיקון v2.9.2 (Controller class), עכשיו AssistantRule מופיע גם ב-navbar הרגיל.

    תיקון תלוי ב-shira-hermes

    הגרסה הזו פועלת לצד commit 72f08e5 של shira-hermes שמשנה את prompt_builder.py לקרוא מ-context לפי key, עם fallback ל-defaults. עדכון ה-image של shira-hermes נדרש.

    התקנה

    הורד את SmartAssistant-2.10.0.zip והתקן דרך Administration → Extensions. ה-AfterInstall hook יזרע אוטומטית את 7 ברירות המחדל של ה-prompts. אחרי ההתקנה: Clear Cache ורענון UI.

    זמינות

    ניהול שירה > פרומפטים → ערוך את tool_rules להוסיף משפט. ה-chat הבא ישתמש בערך החדש.

    מיגרציית Notes לגאסיים: דאקר אקסק ל-shira-hermes prod והרץ:

    python3 scripts/migrate_legacy_memory_notes.py --dry-run   # בדוק
    python3 scripts/migrate_legacy_memory_notes.py             # רץ
    
    Downloads
  • v2.9.2 e40f3d4534

    chaim released this 2026-05-27 09:50:44 +03:00 | 9 commits to main since this release

    תיקון — endpoint של AssistantRule לא היה חשוף

    הגרסה הזו פותרת תקלה שגרמה לשירה לומר " כלל חדש נשמר" כשבפועל הכלל לא נשמר.

    הבעיה

    save_rule של שירה קורא ל-POST /api/v1/AssistantRule. למרות שה-entity הוגדר כראוי ב-scopes/AssistantRule.json (entity=true, object=true, acl=true), EspoCRM החזיר HTTP 404 בלוג: Controller 'AssistantRule' does not exist.

    הסיבה: ל-EspoCRM נדרשת מחלקת Controller כדי לחשוף entity דרך ה-API הסטנדרטי. אם המחלקה לא קיימת, גם אם ה-metadata תקין, ה-endpoint לא יעבוד.

    התיקון

    קובץ חדש: Controllers/AssistantRule.php שמורש מ-Espo\Core\Controllers\Record. שורה אחת, חושפת את כל ה-CRUD הסטנדרטי (GET/POST/PUT/DELETE) עם אכיפת ACL.

    נבדק בפרודקשן אחר התיקון:

    • GET /api/v1/AssistantRule returns 200 וברשימה
    • POST /api/v1/AssistantRule יוצר רשומה ומחזיר 200
    • שני הכללים שהמשתמש ביקש לשמור (חיפוש בתת-תיקיות, איסור em-dash) נשמרו בהצלחה ב-DB

    תיקון משלים ב-shira-hermes

    נמסר ב-commit 06b27e9: הוסף ל-system prompt כלל VERIFY TOOL RESULT שמחייב לקרוא את תוצאת הכלי לפני דיווח הצלחה למשתמש. כך אם save_rule (או כל כלי אחר) יחזיר שגיאה, המודל יודיע על הכישלון במקום לשקר.

    התקנה

    הורד את SmartAssistant-2.9.2.zip והתקן דרך Administration → Extensions. לאחר ההתקנה: Clear Cache.

    Downloads
  • v2.9.1 89b3f5844e

    chaim released this 2026-05-26 17:02:30 +03:00 | 10 commits to main since this release

    תיקון קריטי — קריאת מסמכי DOCX לאסיסטנט AI

    הגרסה הזו פותרת תקלה קריטית שהתגלתה בפרודקשן: שירה (האסיסטנט AI) המציאה לחלוטין את תוכן כתב הערעור של תיק לקוח אמיתי, וכתבה את הפרטים הפיקטיביים ל-CRM (משימה, פגישה, זיכרון תיק) — כי המנגנון לקריאת DOCX שתק והחזיר NULL במקום להציג שגיאה.

    הבעיה

    DocumentAnalyzer::extractFromDocx הסתמך על הספרייה PhpOffice\PhpWord. בקונטיינר הפרודקשן של EspoCRM, קבצי הספרייה אכן קיימים תחת vendor/, אבל המחלקה לא רשומה ב-PSR-4 autoload של composer. כתוצאה מכך, class_exists() החזיר שקרית באופן שקט, השיטה החזירה NULL, ה-OCR fallback רץ רק על תמונת החתימה במסמך — והמודל המציא ערעור פיקטיבי על "פגיעת ברך" במקום הערעור האמיתי על תסמונת תעלה קרפלית (CTS).

    התיקון

    נטילת התלות ב-PHPWord. הפונקציה כעת קוראת ישירות את word/document.xml מתוך ה-zip של ה-DOCX באמצעות ZipArchive ו-regex פשוט. גישה זו:

    • לא תלויה ב-composer/PHPWord — לא מסתכנת עוד בכשל שקט
    • חזקה יותר — מטפלת בטבלאות, הערות שוליים, hyperlinks (PHPWord פיספסה אותם כי ה-element walker שלה רק ברמה אחת)
    • נבדקה על המסמך המקורי בפרודקשן — חילצה 80 פסקאות / 16,633 תווים נקיים (לעומת 0 לפני התיקון)

    תיקון משלים ב-shira-hermes

    הוא משוחרר במקביל (commit 7b517e1) ומוסיף הגנה כפולה: גם ה-OCR fallback מצידו קורא כעת את word/document.xml, וגם הוא מסרב לעבד תוצאת OCR ריקה ולא מאפשר למודל להמציא תוכן.

    התקנה

    הורד את SmartAssistant-2.9.1.zip והתקן דרך Administration → Extensions. לאחר ההתקנה — Clear Cache + Rebuild.

    Downloads
  • v2.9.0 37a8b67b95

    chaim released this 2026-05-14 16:18:04 +03:00 | 11 commits to main since this release

    מה חדש בגרסה הזו

    שירה כבר לא נתקעת כשמבקשים ממנה ליצור מסמך. גם אם אין תבנית מתאימה
    לתיק — היא מנסחת מכתב לבד, שומרת בתיק, ומעתיקה לתיקיית הרשת.
    בנוסף, שירה קיבלה הרשאות מלאות לנהל את תיקיית הרשת של הלקוח —
    אבל מבלי הרשאה למחוק קבצים פיזית.

    יצירת מסמכים חופשיים (כלי חדש: create_document)

    • שירה מנסחת DOCX עברי RTL מלא תוכן (כותרת, נמען, גוף).
    • תומך ב-markdown קל: #/##/### לכותרות, **מודגש**, *נטוי*, רשימות עם - .
    • המסמך נשמר כ-Document בתיק וגם כקובץ בתיקיית הרשת (/var/www/html/data/network-storage/<התיק>/).
    • שם הקובץ: YYYY-MM-DD - <הכותרת>.docx. תאריך עברי באמצע (לדוגמה: "14 במאי 2026").

    ניהול תיקיית הרשת של התיק (5 כלים חדשים)

    שירה יכולה לבצע רק בתוך תיקיית התיק הנוכחי:

    • create_subfolder — יוצרת תיקיית משנה (תומך בנתיב עמוק כמו חוזים/2026/).
    • rename_item — שינוי שם של קובץ או תיקייה.
    • move_item — העברת קובץ בין תיקיות משנה.
    • write_document_to_folder — כתיבת קובץ גולמי (base64) לתיקייה.
    • mark_document_for_deletion — סימון למחיקה (לא מוחק פיזית!).

    פרוטוקול ה-soft-delete: שירה לא מוחקת קבצים. כשמבקשים ממנה למחוק, היא מעבירה את הקובץ
    לתיקייה מסמכים למחיקה/ בתוך התיק עם הקידומת למחיקה - . עורך הדין רואה את הקבצים האלה
    ומוחק ידנית את מה שצריך. בנוסף, ב-CRM נשמרים שדות markedForDeletionAt ו-markedForDeletionBy
    לצורכי ביקורת.

    תיקון: התראות אי-פעילות שגויות

    עד עכשיו תיק עם סטטוס "ממתין לדיון" או "ממתין להחלטה" קיבל התראה של "X ימים ללא פעילות"
    — גם אם אין מה לעשות בתיק כי מחכים לבית המשפט. עכשיו:

    • ממתין להחלטה — לא מתריע אף פעם.
    • ממתין לדיון — לא מתריע אם יש תאריך דיון עתידי. אם הסטטוס כן ממתין לדיון אבל אין דיון מתוזמן —
      זה תיק תקוע ועדיין יתריע (זה מה שאנחנו רוצים).

    תיקים 32 ו-16 בפרודקשן היו דוגמא לבאג הזה.

    תיקון: תבניות בתיק שלא הופיעו

    הסיבה ש-Shira הציגה את הקטע TEMPLATES ריק לחלוטין הייתה באג בשאילתה ב-CaseContextBuilder:
    היא חיפשה בעמודה entityType במקום targetEntityType. עכשיו תבניות פעילות (isActive=true)
    מוצגות נכון, יחד עם קטגוריה ותיאור — שירה יכולה לבחור את התבנית הנכונה לפי הקונטקסט.

    התקנה

    הורד את SmartAssistant-2.9.0.zip והתקן דרך Administration → Extensions.

    אחרי ההתקנה: שום פעולה ידנית נדרשת. תוסף ה-Document יקבל אוטומטית את השדות החדשים
    (markedForDeletionAt, markedForDeletionBy) בריבילד שירוץ עם ההתקנה.

    תלות זוגית: הפעולות החדשות דורשות את shira-hermes 0.4+ (פורסם במקביל) כדי שהכלים החדשים יופיעו לשירה.
    ב-dev/prod הוא נפרס אוטומטית דרך CI/CD כשהקוד נדחף לראשי.

    Downloads