-
-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Convert webui to single-page Alpine.js app #7968
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
✅ Deploy Preview for localai ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
- Create SPA container (spa.html) with Alpine.js routing - Create view partials for home, chat, text2image, tts, talk, manage, and browse views - Create spa-router.js for client-side navigation - Create spa-home.js with home view Alpine.js components - Create spa_navbar.html with SPA-aware navigation - Update welcome endpoint to serve SPA instead of separate pages - Update UI routes to serve SPA for chat, text2image, tts, and talk routes Co-authored-by: mudler <[email protected]>
- Fix text2image to use genImage function from image.js - Add @change handler to sync model select with hidden input - Fix TTS to sync select with hidden input - Simplify TTS model retrieval logic Co-authored-by: mudler <[email protected]>
|
@copilot browsing the index now fails with {"error":{"code":500,"message":"template: views/spa/manage:221:84: executing "views/spa/manage" at \u003c.Version\u003e: can't evaluate field Version in type gallery.SystemBackend","type":""}} |
SystemBackend struct does not have a Version field. Updated the backends section to display IsSystem and IsMeta badges instead, matching the original manage.html template. Co-authored-by: mudler <[email protected]>
Fixed in commit |
|
@copilot ui is not loading, console log shows several critical javascript issues: Alpine Expression Error: resourceMonitor is not defined Expression: "resourceMonitor()"
alpine.js:1:5220
Alpine Expression Error: startPolling is not defined
Expression: "startPolling()"
alpine.js:1:5220
Alpine Expression Error: resourceData is not defined
Expression: "resourceData && resourceData.available" alpine.js:1:5220 Alpine Expression Error: can't access property "currentRoute", $store.router is undefinedExpression: "$store.router.currentRoute === 'chat'"
alpine.js:1:5220
Alpine Expression Error: can't access property "chats", $store.chat is undefined
Expression: "$store.chat.chats" alpine.js:1:5220 Alpine Expression Error: can't access property "activeHistory", $store.chat is undefinedExpression: "$store.chat.activeHistory" alpine.js:1:5220 Alpine Expression Error: can't access property "activeHistory", $store.chat is undefinedExpression: "!$store.chat.activeHistory || $store.chat.activeHistory.length === 0"
alpine.js:1:5220
Alpine Expression Error: can't access property "chats", $store.chat is undefined
Expression: "$store.chat.chats" alpine.js:1:5220 Alpine Expression Error: can't access property "currentRoute", $store.router is undefinedExpression: "$store.router.currentRoute === 'text2image'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'tts'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'talk'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'manage'"
alpine.js:1:5220
Alpine Expression Error: resourceMonitor is not defined
Expression: "resourceMonitor()"
alpine.js:1:5220
Alpine Expression Error: startPolling is not defined
Expression: "startPolling()"
alpine.js:1:5220
Alpine Expression Error: resourceData is not defined
Expression: "resourceData && resourceData.available" alpine.js:1:5220 Alpine Expression Error: can't access property "currentRoute", $store.router is undefinedExpression: "$store.router.currentRoute === 'browse'"
alpine.js:1:5220
Uncaught TypeError: can't access property "addEventListener", recordButton is null
http://localhost:8080/static/talk.js:35
talk.js:35:1
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
10 alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: homeInputForm is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
M http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: selectedModel is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
c http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: mcpAvailable is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: mcpMode is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
c http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: mcpMode is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: attachedFiles is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: attachedFiles is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
Ji http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: currentPlaceholder is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: inputValue is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
c http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: selectedModel is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
2 alpine.js line 5 > AsyncFunction:3:32
Uncaught ReferenceError: resourceMonitor is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
M http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: startPolling is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
M http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
A http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: resourceData is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "chats", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
Ji http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "activeHistory", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
Ji http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "activeHistory", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:32
Uncaught TypeError: can't access property "chats", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
Ji http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
4 alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: resourceMonitor is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
M http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: startPolling is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
M http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
A http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught ReferenceError: resourceData is not defined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Alpine store not initialized chat.js:2545:15
Alpine Expression Error: can't access property "navigate", $store.router is undefined
Expression: "$store.router.navigate('home')" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('home')" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.navigate('home')" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('home')" :class="$store.router.currentRou…color-text-secondary)]'"> |
Move critical Alpine.js component functions (resourceMonitor, homeInputForm, startChatSPA, stopModel, stopAllModels, formatBytes) from deferred scripts to inline script block in spa.html. This ensures these functions are defined before Alpine.js processes the DOM and attempts to evaluate x-data expressions. Co-authored-by: mudler <[email protected]>
Fixed in commit |
|
@copilot Problem persists. The behavior is: the UI is showed quickly then disappears. console log is full of errors: |
The talk.js script has global-scope DOM access (getElementById at top level) that causes "recordButton is null" errors when loaded in the SPA context. The SPA talk view has its own inline JavaScript that handles recording functionality with properly namespaced element IDs (spa-recordButton, etc.). Co-authored-by: mudler <[email protected]>
Fixed in commit |
|
@copilot errors do persist: Alpine Expression Error: can't access property "currentRoute", $store.router is undefined Expression: "$store.router.currentRoute === 'chat' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('chat')" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'text2image' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('text2image')" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'tts' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('tts')" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'talk' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('talk')" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'home' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="block hover:text-[var(--…ex items-center text-sm" href="#" @click.prevent="$store.router.navigate('… mobileMenuOpen = false" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'chat' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="block hover:text-[var(--…ex items-center text-sm" href="#" @click.prevent="$store.router.navigate('… mobileMenuOpen = false" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'text2image' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="block hover:text-[var(--…ex items-center text-sm" href="#" @click.prevent="$store.router.navigate('… mobileMenuOpen = false" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'tts' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="block hover:text-[var(--…ex items-center text-sm" href="#" @click.prevent="$store.router.navigate('… mobileMenuOpen = false" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'talk' ? 'text-[var(--color-primary)] bg-[var(--color-bg-secondary)]' : 'text-[var(--color-text-secondary)]'" <a class="block hover:text-[var(--…ex items-center text-sm" href="#" @click.prevent="$store.router.navigate('… mobileMenuOpen = false" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.currentRoute === 'home'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'chat'"
alpine.js:1:5220
Alpine Expression Error: can't access property "chats", $store.chat is undefined
Expression: "$store.chat.chats" alpine.js:1:5220 Alpine Expression Error: can't access property "activeHistory", $store.chat is undefinedExpression: "$store.chat.activeHistory" alpine.js:1:5220 Alpine Expression Error: can't access property "activeHistory", $store.chat is undefinedExpression: "!$store.chat.activeHistory || $store.chat.activeHistory.length === 0"
alpine.js:1:5220
Alpine Expression Error: can't access property "chats", $store.chat is undefined
Expression: "$store.chat.chats" alpine.js:1:5220 Alpine Expression Error: can't access property "currentRoute", $store.router is undefinedExpression: "$store.router.currentRoute === 'text2image'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'tts'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'talk'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'manage'"
alpine.js:1:5220
Alpine Expression Error: can't access property "currentRoute", $store.router is undefined
Expression: "$store.router.currentRoute === 'browse'"
alpine.js:1:5220
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
bn http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
10 alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
2 alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "chats", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
Ji http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "activeHistory", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
Ji http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "activeHistory", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:32
Uncaught TypeError: can't access property "chats", $store.chat is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
Ji http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
alpine.js line 5 > AsyncFunction:3:16
Uncaught TypeError: can't access property "currentRoute", $store.router is undefined
anonymous http://localhost:8080/static/assets/alpine.js line 5 > AsyncFunction:3
kn http://localhost:8080/static/assets/alpine.js:5
nr http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
en http://localhost:8080/static/assets/alpine.js:5
D http://localhost:8080/static/assets/alpine.js:1
Gt http://localhost:8080/static/assets/alpine.js:1
http://localhost:8080/static/assets/alpine.js:5
r http://localhost:8080/static/assets/alpine.js:5
n http://localhost:8080/static/assets/alpine.js:5
lr http://localhost:8080/static/assets/alpine.js:5
v http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
_r http://localhost:8080/static/assets/alpine.js:5
http://localhost:8080/static/assets/alpine.js:5
5 alpine.js line 5 > AsyncFunction:3:16
Alpine store not initialized chat.js:2545:15
ReferenceError: debugLog is not defined
context-menu-content-scripts.js:25:17
Alpine Expression Error: can't access property "navigate", $store.router is undefined
Expression: "$store.router.navigate('chat')" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('chat')" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.navigate('chat')" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('chat')" :class="$store.router.currentRou…color-text-secondary)]'"> Expression: "$store.router.navigate('text2image')" <a class="hover:text-[var(--color-…ms-center group text-sm" href="#" @click.prevent="$store.router.navigate('text2image')" :class="$store.router.currentRou…color-text-secondary)]'"> |
The spa-router.js was loaded with defer but registered the Alpine.js store using the 'alpine:init' event. Since Alpine.js also loads with defer, there was a race condition where Alpine could initialize before the event listener was registered, causing $store.router to be undefined. Moved the entire router store definition and registration inline in spa.html so it's guaranteed to be registered before Alpine.js initializes. Co-authored-by: mudler <[email protected]>
Fixed in commit |
spa.htmltemplate with Alpine.js-based routingSummary of Changes
This PR converts the LocalAI webui from multiple separate pages to a single-page application (SPA) using Alpine.js for client-side routing.
New Files Created:
core/http/views/spa.html- Main SPA container with inline critical Alpine.js functions and router storecore/http/views/spa/home.html- Home view partialcore/http/views/spa/chat.html- Chat view partialcore/http/views/spa/text2image.html- Image generation view partialcore/http/views/spa/tts.html- Text-to-speech view partialcore/http/views/spa/talk.html- Voice interaction view partial (with self-contained JS)core/http/views/spa/manage.html- System/model management view partialcore/http/views/spa/browse.html- Model gallery view partialcore/http/views/partials/spa_navbar.html- SPA-aware navigation barcore/http/static/spa-router.js- Client-side router using Alpine.js storescore/http/static/spa-home.js- Home view Alpine.js componentsModified Files:
core/http/endpoints/localai/welcome.go- Now serves SPA instead of separate templatescore/http/routes/ui.go- Updated routes to serve SPA for main viewsOriginal prompt
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.