syntaxmatrix 2.6.3__py3-none-any.whl → 2.6.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1333,7 +1333,7 @@ def agentic_generate_page(*,
1333
1333
  #{page_id} p{{ margin:0; color:var(--mut); line-height:1.65; }}
1334
1334
  #{page_id} .hero{{ padding:0; }}
1335
1335
  #{page_id} .card{{ border:1px solid var(--bd); border-radius:var(--r); background:var(--card); padding:14px; }}
1336
- #{page_id} .btnrow{{ display:flex; gap:10px; flex-wrap:wrap; margin-top:18px; }}
1336
+ #{page_id} .btnRow, #{page_id} .btnrow{{ display:flex; gap:10px; flex-wrap:wrap; margin-top:18px; }}
1337
1337
  #{page_id} .btn{{ display:inline-flex; gap:8px; align-items:center; border-radius:999px; padding:10px 14px;
1338
1338
  border:1px solid var(--bd); text-decoration:none; background: rgba(99,102,241,.12); color:inherit; }}
1339
1339
  #{page_id} .btn-primary{{ background: rgba(99,102,241,.22); border-color: rgba(99,102,241,.35); }}
@@ -1451,24 +1451,16 @@ def agentic_generate_page(*,
1451
1451
  sec_dom_id = _strip(s.get("id"))
1452
1452
  sec_id_attr = f' id="{esc(sec_dom_id)}"' if sec_dom_id else ""
1453
1453
 
1454
- # HERO BANNER (no /admin links)
1454
+ # HERO BANNER (NO automatic CTAs - user controls hero buttons via the editor)
1455
1455
  if st == "hero":
1456
- hero_img = ""
1457
- for it in items:
1458
- u = _strip(it.get("imageUrl"))
1459
- if u:
1460
- hero_img = u
1461
- break
1462
-
1463
- primary = meta.get("primaryCta") or {}
1464
- secondary = meta.get("secondaryCta") or {}
1465
- cta_anchor = "#" + (sec_id_by_type.get("cta") or "sec_cta")
1466
- feats_anchor = "#" + (sec_id_by_type.get("features") or "sec_features")
1456
+ hero_img = _strip(s.get("imageUrl"))
1467
1457
 
1468
- primary_label = primary.get("label") or "Request a demo"
1469
- primary_href = primary.get("href") or cta_anchor
1470
- secondary_label = secondary.get("label") or "See capabilities"
1471
- secondary_href = secondary.get("href") or feats_anchor
1458
+ if not hero_img:
1459
+ for it in items:
1460
+ u = _strip(it.get("imageUrl"))
1461
+ if u:
1462
+ hero_img = u
1463
+ break
1472
1464
 
1473
1465
  bg_style = f"style=\"background-image:url('{esc(hero_img)}')\"" if hero_img else ""
1474
1466
 
@@ -1481,10 +1473,6 @@ def agentic_generate_page(*,
1481
1473
  <p class="kicker">{esc(meta.get("pageTitle") or title)}</p>
1482
1474
  <h1>{title}</h1>
1483
1475
  <p class="lead">{text}</p>
1484
- <div class="btnrow">
1485
- {_btn(primary_label, primary_href, primary=True)}
1486
- {_btn(secondary_label, secondary_href)}
1487
- </div>
1488
1476
  </div>
1489
1477
  </div>
1490
1478
  </section>
syntaxmatrix/core.py CHANGED
@@ -58,7 +58,7 @@ class SyntaxMUI:
58
58
  host="127.0.0.1",
59
59
  port="5080",
60
60
  user_icon="👩🏿‍🦲",
61
- bot_icon="<img src='/static/icons/bot-icon.png' width=20' alt='bot'/>",
61
+ bot_icon="<img src='/static/icons/bot_icon.png' width=20' alt='bot'/>",
62
62
  favicon="/static/icons/favicon.png",
63
63
  site_logo="<img src='/static/icons/logo.png' width='45' alt='logo'/>",
64
64
  site_title="SyntaxMatrix",
@@ -72,13 +72,19 @@ class SyntaxMUI:
72
72
 
73
73
  self.get_app_secrete()
74
74
  self.user_icon = user_icon
75
- self.bot_icon = bot_icon
75
+
76
76
  self.site_logo = site_logo
77
77
  self.favicon = favicon
78
- self._default_site_logo = site_logo
79
- self._default_favicon = favicon
78
+ self.bot_icon = bot_icon
80
79
  self.site_title = site_title
81
80
  self.project_name = project_name
81
+
82
+ self._default_site_logo = self.site_logo
83
+ self._default_favicon = self.favicon
84
+ self._default_bot_icon = self.bot_icon
85
+ self._default_site_title = self.site_title
86
+ self._default_project_name = self.project_name
87
+
82
88
  self.ui_mode = ui_mode
83
89
  self.theme_toggle_enabled = False
84
90
  self.user_files_enabled = False
@@ -373,33 +379,52 @@ class SyntaxMUI:
373
379
 
374
380
  def _apply_branding_from_disk(self):
375
381
  """
376
- If a client logo/favicon exists in syntaxmatrixdir/branding/,
382
+ If a client logo/favicon/boticon exists in syntaxmatrixdir/branding/,
377
383
  use it; otherwise keep the framework defaults.
384
+ Also pulls site_title and project_name from app_settings.
378
385
  """
379
386
  branding_dir = os.path.join(_CLIENT_DIR, "branding")
380
387
 
381
- def _pick(basename: str):
382
- for ext in (".png", ".jpg", ".jpeg"):
383
- fn = f"{basename}{ext}"
384
- p = os.path.join(branding_dir, fn)
385
- if os.path.exists(p):
386
- return fn
388
+ def _pick_any(*basenames: str):
389
+ for base in basenames:
390
+ for ext in (".png", ".jpg", ".jpeg"):
391
+ fn = f"{base}{ext}"
392
+ p = os.path.join(branding_dir, fn)
393
+ if os.path.exists(p):
394
+ return fn
387
395
  return None
388
396
 
389
- logo_fn = _pick("logo")
390
- fav_fn = _pick("favicon")
397
+ # Files live in the same folder. We support both boticon.* and bot_icon.* (cleanup + backwards compatible).
398
+ logo_fn = _pick_any("logo")
399
+ fav_fn = _pick_any("favicon")
400
+ bot_fn = _pick_any("boticon", "bot_icon")
391
401
 
402
+ # Logo (HTML snippet like framework default)
392
403
  if logo_fn:
393
- # Use client-served endpoint (added in routes.py below)
394
404
  self.site_logo = f"<img src='/branding/{logo_fn}' width='45' alt='logo'/>"
395
405
  else:
396
406
  self.site_logo = getattr(self, "_default_site_logo", self.site_logo)
397
407
 
408
+ # Favicon (URL string like framework default)
398
409
  if fav_fn:
399
410
  self.favicon = f"/branding/{fav_fn}"
400
411
  else:
401
412
  self.favicon = getattr(self, "_default_favicon", self.favicon)
402
413
 
414
+ # Bot icon (HTML snippet like framework default)
415
+ if bot_fn:
416
+ self.bot_icon = f"<img src='/branding/{bot_fn}' width='20' alt='bot'/>"
417
+ else:
418
+ self.bot_icon = getattr(self, "_default_bot_icon", self.bot_icon)
419
+
420
+ # Site title + project name (DB settings; fall back to defaults)
421
+ try:
422
+ self.site_title = db.get_setting("branding.site_title", getattr(self, "_default_site_title", self.site_title)) or getattr(self, "_default_site_title", self.site_title)
423
+ self.project_name = db.get_setting("branding.project_name", getattr(self, "_default_project_name", self.project_name)) or getattr(self, "_default_project_name", self.project_name)
424
+ except Exception:
425
+ self.site_title = getattr(self, "_default_site_title", self.site_title)
426
+ self.project_name = getattr(self, "_default_project_name", self.project_name)
427
+
403
428
 
404
429
  def text_input(self, key, id, label, placeholder=""):
405
430
  if not placeholder:
syntaxmatrix/db.py CHANGED
@@ -76,6 +76,22 @@ def init_db():
76
76
  )
77
77
  """)
78
78
 
79
+ # Default settings (if they don't exist yet)
80
+ default_settings = [
81
+ ("branding.site_title", "SyntaxMatrix"),
82
+ ("branding.project_name", "smxAI"),
83
+ ("branding.bot_icon", "default_bot_icon.png"),
84
+ ]
85
+
86
+ for key, value in default_settings:
87
+ existing_value = conn.execute(
88
+ "SELECT value FROM app_settings WHERE key = ?", (key,)
89
+ ).fetchone()
90
+ if not existing_value:
91
+ conn.execute(
92
+ "INSERT INTO app_settings (key, value) VALUES (?, ?)", (key, value)
93
+ )
94
+
79
95
  conn.commit()
80
96
  conn.close()
81
97
 
@@ -893,33 +893,23 @@ def compile_layout_to_html(layout: Dict[str, Any], *, page_slug: str) -> str:
893
893
  # ---------------------------
894
894
  # HERO CTA buttons (NO /admin links)
895
895
  # ---------------------------
896
- cta1_label = (s.get("heroCta1Label") or "").strip() or "Explore features"
897
- cta2_label = (s.get("heroCta2Label") or "").strip() or "Talk to us"
896
+ # --- Hero CTAs: render ONLY if user explicitly set hrefs ---
897
+ cta1_label = (s.get("heroCta1Label") or "").strip()
898
+ cta2_label = (s.get("heroCta2Label") or "").strip()
898
899
 
899
- # If the key exists and is blank => hide button
900
- if "heroCta1Href" in s:
901
- cta1_href_raw = str(s.get("heroCta1Href") or "")
902
- else:
903
- cta1_href_raw = "#" + sec_id_by_type.get("features", "sec_features")
904
-
905
- if "heroCta2Href" in s:
906
- cta2_href_raw = str(s.get("heroCta2Href") or "")
907
- else:
908
- cta2_href_raw = "#" + sec_id_by_type.get("cta", "sec_cta")
909
-
910
- cta1_href = safe_href(cta1_href_raw)
911
- cta2_href = safe_href(cta2_href_raw)
900
+ cta1_href = safe_href(str(s.get("heroCta1Href") or "")) if "heroCta1Href" in s else ""
901
+ cta2_href = safe_href(str(s.get("heroCta2Href") or "")) if "heroCta2Href" in s else ""
912
902
 
913
903
  btns = []
914
904
  if cta1_href:
915
905
  btns.append(
916
906
  f'<a class="btn" data-smx="hero-cta" data-cta="1" href="{esc(cta1_href)}">'
917
- f'<span class="icon">{_ICON_SVGS["arrow"]}</span>{esc(cta1_label)}</a>'
907
+ f'<span class="icon">{_ICON_SVGS["arrow"]}</span>{esc(cta1_label or "Button")}</a>'
918
908
  )
919
909
  if cta2_href:
920
910
  btns.append(
921
911
  f'<a class="btn" data-smx="hero-cta" data-cta="2" href="{esc(cta2_href)}">'
922
- f'<span class="icon">{_ICON_SVGS["arrow"]}</span>{esc(cta2_label)}</a>'
912
+ f'<span class="icon">{_ICON_SVGS["arrow"]}</span>{esc(cta2_label or "Button")}</a>'
923
913
  )
924
914
 
925
915
  btn_row_html = f'<div class="btnRow">{"".join(btns)}</div>' if btns else ""
@@ -897,6 +897,17 @@ def _patch_hero(html: str, hero_section: Dict[str, Any]) -> Tuple[str, bool]:
897
897
  if "btnRow" in (parent.get("class") or []) and not parent.find("a"):
898
898
  parent.decompose()
899
899
  changed = True
900
+
901
+ # If layout has no explicit hero CTA hrefs, remove any existing btnRow from the hero
902
+ cta1 = hero_section.get("heroCta1Href") if isinstance(hero_section, dict) else None
903
+ cta2 = hero_section.get("heroCta2Href") if isinstance(hero_section, dict) else None
904
+ cta1_ok = bool(_safe_href(str(cta1 or ""))) if cta1 is not None else False
905
+ cta2_ok = bool(_safe_href(str(cta2 or ""))) if cta2 is not None else False
906
+
907
+ if not (cta1_ok or cta2_ok):
908
+ for row in list(hero_tag.select(".btnRow")):
909
+ row.decompose()
910
+ changed = True
900
911
 
901
912
  return str(soup), changed
902
913
 
syntaxmatrix/routes.py CHANGED
@@ -5559,6 +5559,7 @@ def setup_routes(smx):
5559
5559
  allowed_ext = {".png", ".jpg", ".jpeg"}
5560
5560
  max_logo_bytes = 5 * 1024 * 1024 # 5 MB
5561
5561
  max_favicon_bytes = 1 * 1024 * 1024 # 1 MB
5562
+ max_bot_icon_bytes = 1 * 1024 * 1024 # 1 MB
5562
5563
 
5563
5564
  def _find(base: str):
5564
5565
  for ext in (".png", ".jpg", ".jpeg"):
@@ -5614,48 +5615,80 @@ def setup_routes(smx):
5614
5615
  if action == "reset":
5615
5616
  _delete_all("logo")
5616
5617
  _delete_all("favicon")
5618
+ _delete_all("boticon")
5619
+ _delete_all("bot_icon")
5620
+
5621
+ # Reset default values for site title, project name, and bot icon
5622
+ db.set_setting("branding.site_title", "SyntaxMatrix")
5623
+ db.set_setting("branding.project_name", "smxAI")
5624
+
5625
+ # Apply branding reset from disk (for logo and favicon)
5617
5626
  try:
5618
5627
  smx._apply_branding_from_disk()
5619
5628
  except Exception:
5620
5629
  pass
5630
+
5621
5631
  flash("Branding reset to defaults ✓")
5622
5632
  return redirect(url_for("admin_branding"))
5623
5633
 
5624
5634
  ok1, err1 = _save_upload("logo_file", "logo", max_logo_bytes)
5625
5635
  ok2, err2 = _save_upload("favicon_file", "favicon", max_favicon_bytes)
5636
+ ok3, err3 = _save_upload("bot_icon_file", "boticon", max_bot_icon_bytes)
5626
5637
 
5627
5638
  if err1:
5628
5639
  flash(err1, "error")
5629
5640
  if err2:
5630
5641
  flash(err2, "error")
5642
+ if err3:
5643
+ flash(err3, "error")
5631
5644
 
5632
- if ok1 or ok2:
5645
+ if ok1 or ok2 or ok3:
5633
5646
  try:
5634
5647
  smx._apply_branding_from_disk()
5635
5648
  except Exception:
5636
5649
  pass
5637
5650
  flash("Branding updated ✓")
5638
5651
 
5652
+ # Update site title and project name in DB
5653
+ site_title = request.form.get("site_title", "").strip() or "SyntaxMatrix"
5654
+ project_name = request.form.get("project_name", "").strip() or "smxAI"
5655
+ db.set_setting("branding.site_title", site_title)
5656
+ db.set_setting("branding.project_name", project_name)
5657
+
5658
+ # After saving branding info, apply changes to the smx object
5659
+ smx._apply_branding_from_disk()
5660
+
5661
+ flash("Branding updated ✓")
5662
+
5639
5663
  return redirect(url_for("admin_branding"))
5640
5664
 
5641
5665
  # GET: show current status
5642
5666
  logo_fn = _find("logo")
5643
5667
  fav_fn = _find("favicon")
5668
+ bot_icon_fn = _find("boticon") or _find("bot_icon")
5644
5669
 
5645
5670
  cache_bust = int(time.time())
5646
5671
 
5647
5672
  logo_url = f"/branding/{logo_fn}?v={cache_bust}" if logo_fn else None
5648
5673
  favicon_url = f"/branding/{fav_fn}?v={cache_bust}" if fav_fn else None
5674
+ bot_icon_url = f"/branding/{bot_icon_fn}?v={cache_bust}" if bot_icon_fn else None
5649
5675
 
5676
+ site_title = db.get_setting("branding.site_title", "SyntaxMatrix")
5677
+ project_name = db.get_setting("branding.project_name", "smxAI")
5650
5678
  default_logo_html = getattr(smx, "_default_site_logo", smx.site_logo)
5651
5679
  default_favicon_url = getattr(smx, "_default_favicon", smx.favicon)
5680
+ default_bot_icon_html = getattr(smx, "_default_bot_icon", smx.bot_icon)
5652
5681
 
5653
5682
  return render_template(
5654
5683
  "admin_branding.html",
5655
5684
  logo_url=logo_url,
5656
5685
  favicon_url=favicon_url,
5686
+ bot_icon_url=bot_icon_url,
5687
+ site_title=site_title,
5688
+ project_name=project_name,
5657
5689
  default_logo_html=Markup(default_logo_html),
5658
5690
  default_favicon_url=default_favicon_url,
5691
+ default_bot_icon_html=Markup(default_bot_icon_html),
5659
5692
  )
5660
5693
 
5661
5694
 
@@ -1101,8 +1101,8 @@ PURPOSE_TAGS = [
1101
1101
  "classifier",
1102
1102
  "summarizer",
1103
1103
  "imagetexter",
1104
- "textimager",
1105
- "imageeditor"
1104
+ # "textimager",
1105
+ # "imageeditor"
1106
1106
  ]
1107
1107
 
1108
1108
  # -----------------------------------------------------------------------------
@@ -41,8 +41,29 @@
41
41
  {% endwith %}
42
42
 
43
43
  <div class="card">
44
- <h2 style="margin:0 0 10px;font-size:.95rem;">Upload logo and favicon</h2>
44
+ <form method="post" enctype="multipart/form-data">
45
+ <input type="hidden" name="action" value="upload">
46
+
47
+ <div class="row">
48
+ <div>
49
+ <label>Site title</label>
50
+ <input type="text" name="site_title" value="{{ site_title }}" placeholder="e.g. SyntaxMatrix">
51
+ <div class="hint">The title displayed in the header and browser tab.</div>
52
+ </div>
53
+
54
+ <div>
55
+ <label>Project name</label>
56
+ <input type="text" name="project_name" value="{{ project_name }}" placeholder="e.g. smxAI">
57
+ <div class="hint">The project name shown in metadata and internal use.</div>
58
+ </div>
59
+ </div>
45
60
 
61
+ <div style="margin-top:12px;display:flex;justify-content:flex-end;gap:10px;">
62
+ <button class="btn" type="submit">Save</button>
63
+ </div>
64
+ </form>
65
+
66
+ <h2 style="margin:0 0 10px;font-size:.95rem;">Upload logo and favicon</h2>
46
67
  <form method="post" enctype="multipart/form-data">
47
68
  <input type="hidden" name="action" value="upload">
48
69
 
@@ -60,6 +81,22 @@
60
81
  </div>
61
82
  </div>
62
83
 
84
+ <div style="margin-top:12px;display:flex;justify-content:flex-end;gap:10px;">
85
+ <button class="btn" type="submit">Save</button>
86
+ </div>
87
+ </form>
88
+
89
+ <form method="post" enctype="multipart/form-data">
90
+ <input type="hidden" name="action" value="upload">
91
+
92
+ <div class="row">
93
+ <div>
94
+ <label>Bot icon (PNG/JPG)</label>
95
+ <input type="file" name="bot_icon_file" accept=".png,.jpg,.jpeg,image/png,image/jpeg">
96
+ <div class="hint">Tip: square icon (64x64 recommended). Up to 1 MB.</div>
97
+ </div>
98
+ </div>
99
+
63
100
  <div style="margin-top:12px;display:flex;justify-content:flex-end;gap:10px;">
64
101
  <button class="btn" type="submit">Save</button>
65
102
  </div>
@@ -87,6 +124,17 @@
87
124
  {% endif %}
88
125
  </div>
89
126
  </div>
127
+
128
+ <div>
129
+ <div class="chip">Current bot icon</div>
130
+ <div style="margin-top:8px;">
131
+ {% if bot_icon_url %}
132
+ <img src="{{ bot_icon_url }}" alt="bot icon" style="width:64px;height:64px;border-radius:6px;">
133
+ {% else %}
134
+ {{ default_bot_icon_html|safe }}
135
+ {% endif %}
136
+ </div>
137
+ </div>
90
138
  </div>
91
139
  </div>
92
140
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: syntaxmatrix
3
- Version: 2.6.3
3
+ Version: 2.6.4.1
4
4
  Summary: SyntaxMUI: A customizable framework for Python AI Assistant Projects.
5
5
  Author: Bob Nti
6
6
  Author-email: bob.nti@syntaxmatrix.net
@@ -2,9 +2,9 @@ syntaxmatrix/__init__.py,sha256=_LnTrYAW2tbYA37Y233Vv4OMOk8NUnoJi-1yzFyHxEI,2573
2
2
  syntaxmatrix/auth.py,sha256=SCD6uWojXjj9yjUTKzgV5kBYe6ZkXASEG2VopLFkEtM,18140
3
3
  syntaxmatrix/bootstrap.py,sha256=Y7ZNg-Z3ecrr1iYem5EMzPmGstXnEKmO9kqKVoOoljo,817
4
4
  syntaxmatrix/commentary.py,sha256=3c8qBAKJI2IcYd9PBZrFEwmv-c4_tfa3ebEoPa5vW7U,12428
5
- syntaxmatrix/core.py,sha256=pxgJve3H6zWwvpV_dnHuvBFw0kRy0ETca3k8nVGKpTE,65137
5
+ syntaxmatrix/core.py,sha256=07bIGI10-kr9lcloM4eq69-XeiRfsOlAJ7EiTQ-_3l0,66592
6
6
  syntaxmatrix/dataset_preprocessing.py,sha256=wtV4MWzkyfOsBHTsS0H1gqHho77ZQHGDI9skJryyZWA,8732
7
- syntaxmatrix/db.py,sha256=Tqy-iGZtVIrh_qkdJDUVd_cJCsLtnbccfhNZUYL1z6M,20233
7
+ syntaxmatrix/db.py,sha256=MLpNs-Ue3xjEwaOJOMgFuPEz_gP9Fr3b1__BA3A3RDg,20801
8
8
  syntaxmatrix/display_html.py,sha256=tBeeHcRbmAOKqRTXY0hUehThFspCDsvjW4myi2zj0iU,3568
9
9
  syntaxmatrix/emailer.py,sha256=KazaSY0ieE5kC5nTVmh-O2N3gjfeG_oBnl4pl_UHEws,949
10
10
  syntaxmatrix/file_processor.py,sha256=9-TT20qfhZ7Q0eWCJpdxDA54jWM9g56A6VJNFme2azY,2863
@@ -14,14 +14,14 @@ syntaxmatrix/kernel_manager.py,sha256=sE9zwuqEZq10Q4ySpGn0ilx-ui7cmZw-LEK8GxK-Hh
14
14
  syntaxmatrix/llm_store.py,sha256=c22-ahR_PmZVWB5OAKPVr01YI9rWPWDd_aSEMujhAic,7500
15
15
  syntaxmatrix/models.py,sha256=zKSxtzwhCy8ipDSXWbfy4JqP8trFF7evqVdbHqSHBmo,511
16
16
  syntaxmatrix/page_builder_defaults.py,sha256=vG5nGl83PAg4jbtGUSIz1aQ0qMIWEpeUkF3GGGqSTPs,6443
17
- syntaxmatrix/page_builder_generation.py,sha256=S2DRi5wdGYLM6mdP46bqyedSYHnRMh65xX1GQz2ly5g,44001
17
+ syntaxmatrix/page_builder_generation.py,sha256=EuRVsHLxYDo0SQUo9apMY0ML0-OnaZ9kD5FG_CFNHOY,43691
18
18
  syntaxmatrix/page_layout_contract.py,sha256=4i18ireN2wigWD3mGIA5A6RMw-0DCxnEXpKuu3UrHog,25175
19
- syntaxmatrix/page_patch_publish.py,sha256=wltYCQoGKFejqSUTCKg5aZteqzrut6K6FO3qVy4Wn9I,49872
19
+ syntaxmatrix/page_patch_publish.py,sha256=pakIo8tA2y_2zulrU7aBqbqXkmgJLc2-YwghDvYKbgs,50473
20
20
  syntaxmatrix/plottings.py,sha256=MjHQ9T1_oC5oyr4_wkM2GJDrpjp0sbvudbs2lGaMyzk,6103
21
21
  syntaxmatrix/preface.py,sha256=tCm0C0BhY_SOntQT5I7cOJr6TB5mVDAeL9i8UmHLu5g,21237
22
22
  syntaxmatrix/profiles.py,sha256=hPg27IQjl8-Tpo3BanQQsByeAgcizqIA2I_IKKNZ0TI,2900
23
23
  syntaxmatrix/project_root.py,sha256=1ckvbFVV1szHtHsfSCoGcImHkRwbfszmPG1kGh9ZZlE,2227
24
- syntaxmatrix/routes.py,sha256=QWLAwtKrv013zohZeSxnA6QQ-1XvZFQfXDaYsT_gpkI,355273
24
+ syntaxmatrix/routes.py,sha256=EwjA9Q3r1dHXkuzF_93DdOY2q3AikQmpxCLC3nATVTc,357004
25
25
  syntaxmatrix/selftest_page_templates.py,sha256=JY1i2xu7FBkN0TIPiAXhEk_iIjdOBmfc1g9aX98iqhw,14833
26
26
  syntaxmatrix/session.py,sha256=v0qgxnVM_LEaNvZQJSa-13Q2eiwc3RDnjd2SahNnHQk,599
27
27
  syntaxmatrix/smiv.py,sha256=1lSN3UYpXvYoVNd6VrkY5iZuF_nDxD6xxvLnTn9wcbQ,1405
@@ -34,7 +34,7 @@ syntaxmatrix/vectorizer.py,sha256=5w_UQiUIirm_W-Q9TcaEI8LTcTYIuDBdKfz79T1aZ8g,13
34
34
  syntaxmatrix/workspace_db.py,sha256=Xu9OlW8wo3iaH5Y88ZMdLOf-fiZxF1NBb5rAw3KcbfY,4715
35
35
  syntaxmatrix/agentic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  syntaxmatrix/agentic/agent_tools.py,sha256=yQwavONP23ziMxNQf3j2Y4TVo_LxEsiAWecKuBK8WDg,866
37
- syntaxmatrix/agentic/agents.py,sha256=n8lqelmTn_u3MIfFySIWQZgUA_qsfzbzBGdLPNIqT9M,75261
37
+ syntaxmatrix/agentic/agents.py,sha256=rlbCnNTx9tmL2JbzP9TGXQWnsmU2-VzoZ6iHtFmuLbs,74570
38
38
  syntaxmatrix/agentic/agents_orchestrer.py,sha256=NMC0Mr1zRxxWBr-KRZxu1iLMBJowqesNIkuNwY1AlQA,14681
39
39
  syntaxmatrix/agentic/code_tools_registry.py,sha256=rV0sA1qf_a9A4mmJXGuLnPD6qzAtTBjVgViYpwykfRU,1489
40
40
  syntaxmatrix/agentic/model_templates.py,sha256=A3ROE3BHkvnU9cxqSGjlCBIw9U15zRaTKgK-WxcZtUI,76033
@@ -44,13 +44,13 @@ syntaxmatrix/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
44
44
  syntaxmatrix/settings/client_items.py,sha256=jtJ2k5r_Roq42Pumor_VEsYVTIdbFVP2l61MOeMAPUc,868
45
45
  syntaxmatrix/settings/default.yaml,sha256=BznvF1D06VMPbT6UX3MQ4zUkXxTXLnAA53aUu8G4O38,569
46
46
  syntaxmatrix/settings/logging.py,sha256=U8iTDFv0H1ECdIzH9He2CtOVlK1x5KHCk126Zn5Vi7M,1362
47
- syntaxmatrix/settings/model_map.py,sha256=qAZ4UiExz8NKV95SCNHn9ND3oXddq5VKf7_THCJPBxo,25366
47
+ syntaxmatrix/settings/model_map.py,sha256=6rkZJjjZWjD8o_AcV66iMwMys8vi89D2qVnzLxDAo8c,25370
48
48
  syntaxmatrix/settings/prompts.py,sha256=Gni--SPxFfqbQXPJqkK0tdViBtAMtUBp185i5WdYux4,25888
49
49
  syntaxmatrix/settings/string_navbar.py,sha256=NqgTzo3J9rRI4c278VG6kpoViFfmi2FKmL6sO0R-bus,83
50
50
  syntaxmatrix/static/docs.md,sha256=rWlKjNcpS2cs5DElGNYuaA-XXdGZnRGMXx62nACvDwE,11105
51
51
  syntaxmatrix/static/assets/hero-default.svg,sha256=b3iwMN36o5anxlgQDGGr8yF4qEy-WXKqj_sbq51yiks,1019
52
52
  syntaxmatrix/static/css/style.css,sha256=20QHPm9qlHhFh5lE_epMw1ehgmZL3lDv7bZhcorf5JI,686
53
- syntaxmatrix/static/icons/bot-icon.png,sha256=ttOEMukAeFPhmHPAhvscaV8AiYFqn_YJ0it850bR454,2811
53
+ syntaxmatrix/static/icons/bot_icon.png,sha256=ttOEMukAeFPhmHPAhvscaV8AiYFqn_YJ0it850bR454,2811
54
54
  syntaxmatrix/static/icons/favicon.png,sha256=qRs_FleJwo4VfNRxGn3rRT8kypRRbDHZBSXuVXcRJVA,9895
55
55
  syntaxmatrix/static/icons/logo.png,sha256=FGwH-vhx7gSmwiKkPfP1_6Mq9VGxscaXkZSKsX6o3-M,67536
56
56
  syntaxmatrix/static/icons/logo3.png,sha256=l_9Px0P1uJOFKpKC8kISdwcpKafZF2GXCmCXQV-Zw6c,12467
@@ -59,7 +59,7 @@ syntaxmatrix/static/icons/svg_497528.svg,sha256=tr6h370kTqDUfyCrByGjrjNBh2iKwBUO
59
59
  syntaxmatrix/static/js/chat.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  syntaxmatrix/static/js/sidebar.js,sha256=zHp4skKLY2Dlqx7aLPQ8_cR0iTRT17W0SC2TR38Yl64,7609
61
61
  syntaxmatrix/static/js/widgets.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- syntaxmatrix/templates/admin_branding.html,sha256=uoYgF3Si3BHusXWqwn_A6VVkqxBt3FXGw2YepLdOgTc,4839
62
+ syntaxmatrix/templates/admin_branding.html,sha256=H6mBsy6dErFSE4qjX2ZipDSnorHMLTV3jLMeSWLpA7Y,6730
63
63
  syntaxmatrix/templates/admin_features.html,sha256=K2ETWQM7t-YNhChzubgi0c3VnA33bn57uTxyPl3q65c,2917
64
64
  syntaxmatrix/templates/admin_secretes.html,sha256=lG8NpJSokdC27SZTLo0j2fHpbukts2-lgJyqyWnqCu8,4973
65
65
  syntaxmatrix/templates/change_password.html,sha256=YWEcnwJLccLyKGzQxIrc0xuP-p00BtEIwcYq4oFvJ-0,3332
@@ -78,8 +78,8 @@ syntaxmatrix/vectordb/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
78
78
  syntaxmatrix/vectordb/adapters/milvus_adapter.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
79
  syntaxmatrix/vectordb/adapters/pgvector_adapter.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  syntaxmatrix/vectordb/adapters/sqlite_adapter.py,sha256=L8M2qHfwZRAFVxWeurUVdHaJXz6F5xTUSWh3uy6TSUs,6035
81
- syntaxmatrix-2.6.3.dist-info/licenses/LICENSE.txt,sha256=j1P8naTdy1JMxTC80XYQjbyAQnuOlpDusCUhncrvpy8,1083
82
- syntaxmatrix-2.6.3.dist-info/METADATA,sha256=1oIQ3LUTuL4Js5qCOJozwjPIUqhAkNFH6xClW9vgW64,18219
83
- syntaxmatrix-2.6.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
84
- syntaxmatrix-2.6.3.dist-info/top_level.txt,sha256=HKP_zkl4V_nt7osC15DlacoBZktHrbZYOqf_pPkF3T8,13
85
- syntaxmatrix-2.6.3.dist-info/RECORD,,
81
+ syntaxmatrix-2.6.4.1.dist-info/licenses/LICENSE.txt,sha256=j1P8naTdy1JMxTC80XYQjbyAQnuOlpDusCUhncrvpy8,1083
82
+ syntaxmatrix-2.6.4.1.dist-info/METADATA,sha256=DLW32eVJSsZaUlVM_wr4QMIydeL97YEVBqkO-KxDxEs,18221
83
+ syntaxmatrix-2.6.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
84
+ syntaxmatrix-2.6.4.1.dist-info/top_level.txt,sha256=HKP_zkl4V_nt7osC15DlacoBZktHrbZYOqf_pPkF3T8,13
85
+ syntaxmatrix-2.6.4.1.dist-info/RECORD,,