Skip to content

Commit 010e6d2

Browse files
committed
chore: bump version to 4.24.1
1 parent afe9995 commit 010e6d2

9 files changed

Lines changed: 240 additions & 29 deletions

File tree

astrbot/cli/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "4.24.0"
1+
__version__ = "4.24.1"

astrbot/core/config/default.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from astrbot.core.computer.booters.cua_defaults import CUA_DEFAULT_CONFIG
66
from astrbot.core.utils.astrbot_path import get_astrbot_data_path
77

8-
VERSION = "4.24.0"
8+
VERSION = "4.24.1"
99
DB_PATH = os.path.join(get_astrbot_data_path(), "data_v4.db")
1010
PERSONAL_WECHAT_CONFIG_METADATA = {
1111
"weixin_oc_base_url": {
File renamed without changes.

dashboard/src/main.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,25 @@ import VueApexCharts from 'vue3-apexcharts';
1010

1111
import print from 'vue3-print-nb';
1212
import { loader } from '@guolao/vue-monaco-editor'
13-
import * as monaco from 'monaco-editor';
13+
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
14+
import 'monaco-editor/esm/vs/basic-languages/dockerfile/dockerfile.contribution';
15+
import 'monaco-editor/esm/vs/basic-languages/ini/ini.contribution';
16+
import 'monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution';
17+
import 'monaco-editor/esm/vs/basic-languages/markdown/markdown.contribution';
18+
import 'monaco-editor/esm/vs/basic-languages/powershell/powershell.contribution';
19+
import 'monaco-editor/esm/vs/basic-languages/python/python.contribution';
20+
import 'monaco-editor/esm/vs/basic-languages/shell/shell.contribution';
21+
import 'monaco-editor/esm/vs/basic-languages/sql/sql.contribution';
22+
import 'monaco-editor/esm/vs/basic-languages/typescript/typescript.contribution';
23+
import 'monaco-editor/esm/vs/basic-languages/xml/xml.contribution';
24+
import 'monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution';
25+
import 'monaco-editor/esm/vs/language/css/monaco.contribution';
26+
import 'monaco-editor/esm/vs/language/html/monaco.contribution';
27+
import 'monaco-editor/esm/vs/language/json/monaco.contribution';
1428
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
1529
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
1630
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
1731
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
18-
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
1932
import axios from 'axios';
2033
import { waitForRouterReadyInBackground } from './utils/routerReadiness.mjs';
2134

@@ -30,9 +43,6 @@ import { waitForRouterReadyInBackground } from './utils/routerReadiness.mjs';
3043
if (label === 'html' || label === 'handlebars' || label === 'razor') {
3144
return new htmlWorker();
3245
}
33-
if (label === 'typescript' || label === 'javascript') {
34-
return new tsWorker();
35-
}
3646
return new editorWorker();
3747
},
3848
};

dashboard/src/utils/shiki.js

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { getSingletonHighlighter } from "shiki";
1+
import {
2+
createHighlighter,
3+
normalizeLimitedShikiLanguage,
4+
} from "./shikiLimitedBundle";
25

36
export const SHIKI_THEMES = {
47
light: "github-light",
@@ -8,8 +11,7 @@ export const SHIKI_THEMES = {
811
let highlighterPromise;
912

1013
function normalizeLanguage(language) {
11-
const normalized = (language || "text").trim().split(/\s+/, 1)[0].toLowerCase();
12-
return normalized || "text";
14+
return normalizeLimitedShikiLanguage(language);
1315
}
1416

1517
export function escapeHtml(value = "") {
@@ -23,28 +25,16 @@ export function escapeHtml(value = "") {
2325

2426
export async function getShikiHighlighter() {
2527
if (!highlighterPromise) {
26-
highlighterPromise = getSingletonHighlighter({
28+
highlighterPromise = createHighlighter({
2729
themes: Object.values(SHIKI_THEMES),
28-
langs: ["text"],
2930
});
3031
}
3132

3233
return highlighterPromise;
3334
}
3435

35-
export async function ensureShikiLanguages(languages = []) {
36+
export async function ensureShikiLanguages() {
3637
const highlighter = await getShikiHighlighter();
37-
const languagesToLoad = [...new Set(languages.map(normalizeLanguage))].filter(
38-
(language) => language !== "text",
39-
);
40-
41-
await Promise.all(
42-
languagesToLoad.map((language) =>
43-
highlighter.loadLanguage(language).catch((err) => {
44-
console.warn(`Failed to load Shiki language "${language}".`, err);
45-
}),
46-
),
47-
);
4838

4939
return highlighter;
5040
}
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
import { createHighlighterCore } from "shiki/core";
2+
import { createJavaScriptRegexEngine } from "shiki/engine/javascript";
3+
import bash from "shiki/langs/bash.mjs";
4+
import css from "shiki/langs/css.mjs";
5+
import diff from "shiki/langs/diff.mjs";
6+
import dockerfile from "shiki/langs/dockerfile.mjs";
7+
import html from "shiki/langs/html.mjs";
8+
import ini from "shiki/langs/ini.mjs";
9+
import java from "shiki/langs/java.mjs";
10+
import javascript from "shiki/langs/javascript.mjs";
11+
import json from "shiki/langs/json.mjs";
12+
import jsx from "shiki/langs/jsx.mjs";
13+
import markdown from "shiki/langs/markdown.mjs";
14+
import powershell from "shiki/langs/powershell.mjs";
15+
import python from "shiki/langs/python.mjs";
16+
import sql from "shiki/langs/sql.mjs";
17+
import tsx from "shiki/langs/tsx.mjs";
18+
import typescript from "shiki/langs/typescript.mjs";
19+
import vue from "shiki/langs/vue.mjs";
20+
import xml from "shiki/langs/xml.mjs";
21+
import yaml from "shiki/langs/yaml.mjs";
22+
import githubDark from "shiki/themes/github-dark.mjs";
23+
import githubLight from "shiki/themes/github-light.mjs";
24+
import vitesseDark from "shiki/themes/vitesse-dark.mjs";
25+
import vitesseLight from "shiki/themes/vitesse-light.mjs";
26+
27+
export const LIMITED_SHIKI_LANGUAGES = [
28+
...bash,
29+
...css,
30+
...diff,
31+
...dockerfile,
32+
...html,
33+
...ini,
34+
...java,
35+
...javascript,
36+
...json,
37+
...jsx,
38+
...markdown,
39+
...powershell,
40+
...python,
41+
...sql,
42+
...tsx,
43+
...typescript,
44+
...vue,
45+
...xml,
46+
...yaml,
47+
];
48+
49+
const THEME_BY_NAME = {
50+
"github-dark": githubDark,
51+
"github-light": githubLight,
52+
"vitesse-dark": vitesseDark,
53+
"vitesse-light": vitesseLight,
54+
};
55+
56+
const BUILT_IN_LANGUAGES = ["text", "plaintext", "plain"];
57+
58+
export const LIMITED_SHIKI_LANGUAGE_ALIASES = {
59+
bat: "powershell",
60+
cjs: "javascript",
61+
console: "bash",
62+
cts: "typescript",
63+
docker: "dockerfile",
64+
htm: "html",
65+
js: "javascript",
66+
md: "markdown",
67+
mjs: "javascript",
68+
mts: "typescript",
69+
plain: "text",
70+
plaintext: "text",
71+
ps1: "powershell",
72+
pwsh: "powershell",
73+
py: "python",
74+
shell: "bash",
75+
shellscript: "bash",
76+
sh: "bash",
77+
svg: "xml",
78+
text: "text",
79+
ts: "typescript",
80+
txt: "text",
81+
xhtml: "html",
82+
yml: "yaml",
83+
zsh: "bash",
84+
};
85+
86+
export const LIMITED_SHIKI_SUPPORTED_LANGUAGES = new Set([
87+
...BUILT_IN_LANGUAGES,
88+
...LIMITED_SHIKI_LANGUAGES.flatMap((language) => [
89+
language.name,
90+
...(language.aliases || []),
91+
]),
92+
]);
93+
94+
function getThemeName(theme) {
95+
return typeof theme === "string" ? theme : theme?.name;
96+
}
97+
98+
function resolveTheme(theme) {
99+
if (!theme) return null;
100+
if (typeof theme !== "string") return theme;
101+
return THEME_BY_NAME[theme] || null;
102+
}
103+
104+
function uniqueThemes(themes) {
105+
const seen = new Set();
106+
const result = [];
107+
108+
for (const theme of themes) {
109+
const resolved = resolveTheme(theme);
110+
const name = getThemeName(resolved);
111+
if (!resolved || !name || seen.has(name)) continue;
112+
seen.add(name);
113+
result.push(resolved);
114+
}
115+
116+
return result;
117+
}
118+
119+
export function normalizeLimitedShikiLanguage(language) {
120+
const normalized = String(language || "text")
121+
.trim()
122+
.split(/\s+/, 1)[0]
123+
.toLowerCase();
124+
125+
if (!normalized) return "text";
126+
if (normalized in LIMITED_SHIKI_LANGUAGE_ALIASES) {
127+
return LIMITED_SHIKI_LANGUAGE_ALIASES[normalized];
128+
}
129+
130+
return LIMITED_SHIKI_SUPPORTED_LANGUAGES.has(normalized) ? normalized : "text";
131+
}
132+
133+
function normalizeCodeOptions(options) {
134+
if (!options || typeof options !== "object") return options;
135+
return {
136+
...options,
137+
lang: normalizeLimitedShikiLanguage(options.lang),
138+
};
139+
}
140+
141+
function wrapLimitedHighlighter(highlighter) {
142+
const codeToHtml = highlighter.codeToHtml.bind(highlighter);
143+
const codeToTokens = highlighter.codeToTokens.bind(highlighter);
144+
const codeToHast = highlighter.codeToHast.bind(highlighter);
145+
const getLanguage = highlighter.getLanguage.bind(highlighter);
146+
const getLoadedLanguages = highlighter.getLoadedLanguages.bind(highlighter);
147+
const loadThemeSync = highlighter.loadThemeSync?.bind(highlighter);
148+
const loadTheme = highlighter.loadTheme?.bind(highlighter);
149+
150+
return {
151+
...highlighter,
152+
codeToHast(code, options) {
153+
return codeToHast(code, normalizeCodeOptions(options));
154+
},
155+
codeToHtml(code, options) {
156+
return codeToHtml(code, normalizeCodeOptions(options));
157+
},
158+
codeToTokens(code, options) {
159+
return codeToTokens(code, normalizeCodeOptions(options));
160+
},
161+
getLanguage(language) {
162+
return getLanguage(normalizeLimitedShikiLanguage(language));
163+
},
164+
getLoadedLanguages() {
165+
return [...new Set([...getLoadedLanguages(), ...BUILT_IN_LANGUAGES])];
166+
},
167+
loadLanguage() {
168+
return Promise.resolve();
169+
},
170+
loadLanguageSync() {},
171+
async loadTheme(...themes) {
172+
const resolved = uniqueThemes(themes.flat());
173+
if (resolved.length && loadTheme) await loadTheme(...resolved);
174+
},
175+
loadThemeSync(...themes) {
176+
const resolved = uniqueThemes(themes.flat());
177+
if (resolved.length && loadThemeSync) loadThemeSync(...resolved);
178+
},
179+
};
180+
}
181+
182+
export async function createHighlighter(options = {}) {
183+
const themes = uniqueThemes([
184+
...(Array.isArray(options.themes) ? options.themes : []),
185+
...Object.values(THEME_BY_NAME),
186+
]);
187+
188+
const highlighter = await createHighlighterCore({
189+
...options,
190+
engine: options.engine || createJavaScriptRegexEngine(),
191+
langs: LIMITED_SHIKI_LANGUAGES,
192+
themes,
193+
});
194+
195+
return wrapLimitedHighlighter(highlighter);
196+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
throw new Error("stream-monaco is disabled in the dashboard bundle.");

dashboard/vite.config.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,24 @@ export default defineConfig(({ command }) => ({
7474
webfontDl()
7575
],
7676
resolve: {
77-
alias: {
78-
mermaid: 'mermaid/dist/mermaid.js',
79-
'@': fileURLToPath(new URL('./src', import.meta.url))
80-
}
77+
alias: [
78+
{
79+
find: /^shiki$/,
80+
replacement: fileURLToPath(new URL('./src/utils/shikiLimitedBundle.js', import.meta.url))
81+
},
82+
{
83+
find: /^stream-monaco$/,
84+
replacement: fileURLToPath(new URL('./src/utils/streamMonacoDisabled.js', import.meta.url))
85+
},
86+
{
87+
find: 'mermaid',
88+
replacement: 'mermaid/dist/mermaid.js'
89+
},
90+
{
91+
find: '@',
92+
replacement: fileURLToPath(new URL('./src', import.meta.url))
93+
}
94+
]
8195
},
8296
css: {
8397
preprocessorOptions: {

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "AstrBot"
3-
version = "4.24.0"
3+
version = "4.24.1"
44
description = "Easy-to-use multi-platform LLM chatbot and development framework"
55
readme = "README.md"
66
license = { text = "AGPL-3.0-or-later" }

0 commit comments

Comments
 (0)