syntaxmatrix 2.6.2__py3-none-any.whl → 2.6.4__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.
- syntaxmatrix/agentic/agents.py +14 -27
- syntaxmatrix/core.py +39 -14
- syntaxmatrix/db.py +16 -0
- syntaxmatrix/page_builder_generation.py +7 -17
- syntaxmatrix/page_patch_publish.py +11 -0
- syntaxmatrix/routes.py +35 -2
- syntaxmatrix/templates/admin_branding.html +49 -1
- {syntaxmatrix-2.6.2.dist-info → syntaxmatrix-2.6.4.dist-info}/METADATA +1 -1
- {syntaxmatrix-2.6.2.dist-info → syntaxmatrix-2.6.4.dist-info}/RECORD +13 -13
- /syntaxmatrix/static/icons/{bot-icon.png → bot_icon.png} +0 -0
- {syntaxmatrix-2.6.2.dist-info → syntaxmatrix-2.6.4.dist-info}/WHEEL +0 -0
- {syntaxmatrix-2.6.2.dist-info → syntaxmatrix-2.6.4.dist-info}/licenses/LICENSE.txt +0 -0
- {syntaxmatrix-2.6.2.dist-info → syntaxmatrix-2.6.4.dist-info}/top_level.txt +0 -0
syntaxmatrix/agentic/agents.py
CHANGED
|
@@ -757,17 +757,16 @@ def agentic_generate_page(*,
|
|
|
757
757
|
|
|
758
758
|
if provider == "openai":
|
|
759
759
|
if int(model.split("gpt-")[1][0])>=5:
|
|
760
|
+
|
|
760
761
|
response = client.responses.create(
|
|
761
|
-
model=model,
|
|
762
|
-
instructions=system_prompt,
|
|
762
|
+
model=model,
|
|
763
|
+
instructions=system_prompt,
|
|
763
764
|
input=[
|
|
764
765
|
{"role": "user", "content": user_prompt}
|
|
765
766
|
],
|
|
766
767
|
reasoning={"effort": "medium"},
|
|
767
|
-
text
|
|
768
|
-
|
|
769
|
-
{"format": {"type": "json_object"}}
|
|
770
|
-
],
|
|
768
|
+
# IMPORTANT: 'text' must be an object (not a list)
|
|
769
|
+
text={"format": {"type": "json_object"}},
|
|
771
770
|
)
|
|
772
771
|
|
|
773
772
|
txt = (response.output_text or "")
|
|
@@ -1334,7 +1333,7 @@ def agentic_generate_page(*,
|
|
|
1334
1333
|
#{page_id} p{{ margin:0; color:var(--mut); line-height:1.65; }}
|
|
1335
1334
|
#{page_id} .hero{{ padding:0; }}
|
|
1336
1335
|
#{page_id} .card{{ border:1px solid var(--bd); border-radius:var(--r); background:var(--card); padding:14px; }}
|
|
1337
|
-
#{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; }}
|
|
1338
1337
|
#{page_id} .btn{{ display:inline-flex; gap:8px; align-items:center; border-radius:999px; padding:10px 14px;
|
|
1339
1338
|
border:1px solid var(--bd); text-decoration:none; background: rgba(99,102,241,.12); color:inherit; }}
|
|
1340
1339
|
#{page_id} .btn-primary{{ background: rgba(99,102,241,.22); border-color: rgba(99,102,241,.35); }}
|
|
@@ -1452,24 +1451,16 @@ def agentic_generate_page(*,
|
|
|
1452
1451
|
sec_dom_id = _strip(s.get("id"))
|
|
1453
1452
|
sec_id_attr = f' id="{esc(sec_dom_id)}"' if sec_dom_id else ""
|
|
1454
1453
|
|
|
1455
|
-
# HERO BANNER (
|
|
1454
|
+
# HERO BANNER (NO automatic CTAs - user controls hero buttons via the editor)
|
|
1456
1455
|
if st == "hero":
|
|
1457
|
-
hero_img = ""
|
|
1458
|
-
for it in items:
|
|
1459
|
-
u = _strip(it.get("imageUrl"))
|
|
1460
|
-
if u:
|
|
1461
|
-
hero_img = u
|
|
1462
|
-
break
|
|
1463
|
-
|
|
1464
|
-
primary = meta.get("primaryCta") or {}
|
|
1465
|
-
secondary = meta.get("secondaryCta") or {}
|
|
1466
|
-
cta_anchor = "#" + (sec_id_by_type.get("cta") or "sec_cta")
|
|
1467
|
-
feats_anchor = "#" + (sec_id_by_type.get("features") or "sec_features")
|
|
1456
|
+
hero_img = _strip(s.get("imageUrl"))
|
|
1468
1457
|
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
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
|
|
1473
1464
|
|
|
1474
1465
|
bg_style = f"style=\"background-image:url('{esc(hero_img)}')\"" if hero_img else ""
|
|
1475
1466
|
|
|
@@ -1482,10 +1473,6 @@ def agentic_generate_page(*,
|
|
|
1482
1473
|
<p class="kicker">{esc(meta.get("pageTitle") or title)}</p>
|
|
1483
1474
|
<h1>{title}</h1>
|
|
1484
1475
|
<p class="lead">{text}</p>
|
|
1485
|
-
<div class="btnrow">
|
|
1486
|
-
{_btn(primary_label, primary_href, primary=True)}
|
|
1487
|
-
{_btn(secondary_label, secondary_href)}
|
|
1488
|
-
</div>
|
|
1489
1476
|
</div>
|
|
1490
1477
|
</div>
|
|
1491
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/
|
|
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
|
-
|
|
75
|
+
|
|
76
76
|
self.site_logo = site_logo
|
|
77
77
|
self.favicon = favicon
|
|
78
|
-
self.
|
|
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
|
|
382
|
-
for
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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
|
-
|
|
390
|
-
|
|
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
|
-
|
|
897
|
-
|
|
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
|
-
|
|
900
|
-
if "
|
|
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
|
@@ -3389,7 +3389,7 @@ def setup_routes(smx):
|
|
|
3389
3389
|
|
|
3390
3390
|
@smx.app.route("/admin", methods=["GET", "POST"])
|
|
3391
3391
|
# @superadmin_required
|
|
3392
|
-
@admin_required
|
|
3392
|
+
# @admin_required
|
|
3393
3393
|
def admin_panel():
|
|
3394
3394
|
bp = Blueprint("admin", __name__)
|
|
3395
3395
|
|
|
@@ -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
|
|
|
@@ -41,8 +41,29 @@
|
|
|
41
41
|
{% endwith %}
|
|
42
42
|
|
|
43
43
|
<div class="card">
|
|
44
|
-
<
|
|
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
|
|
|
@@ -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=
|
|
5
|
+
syntaxmatrix/core.py,sha256=07bIGI10-kr9lcloM4eq69-XeiRfsOlAJ7EiTQ-_3l0,66592
|
|
6
6
|
syntaxmatrix/dataset_preprocessing.py,sha256=wtV4MWzkyfOsBHTsS0H1gqHho77ZQHGDI9skJryyZWA,8732
|
|
7
|
-
syntaxmatrix/db.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
@@ -50,7 +50,7 @@ syntaxmatrix/settings/string_navbar.py,sha256=NqgTzo3J9rRI4c278VG6kpoViFfmi2FKmL
|
|
|
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/
|
|
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=
|
|
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.
|
|
82
|
-
syntaxmatrix-2.6.
|
|
83
|
-
syntaxmatrix-2.6.
|
|
84
|
-
syntaxmatrix-2.6.
|
|
85
|
-
syntaxmatrix-2.6.
|
|
81
|
+
syntaxmatrix-2.6.4.dist-info/licenses/LICENSE.txt,sha256=j1P8naTdy1JMxTC80XYQjbyAQnuOlpDusCUhncrvpy8,1083
|
|
82
|
+
syntaxmatrix-2.6.4.dist-info/METADATA,sha256=dRo1l7v6L9VT5zn3CBPXpyIuYkalXyL4TgYx0sTqwRM,18219
|
|
83
|
+
syntaxmatrix-2.6.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
84
|
+
syntaxmatrix-2.6.4.dist-info/top_level.txt,sha256=HKP_zkl4V_nt7osC15DlacoBZktHrbZYOqf_pPkF3T8,13
|
|
85
|
+
syntaxmatrix-2.6.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|