openlearn-next 0.3.8 → 0.3.10
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.
- package/README.md +9 -5
- package/cli-cleaner.mjs +72 -27
- package/cli-data.mjs +10 -0
- package/cli-doctor.mjs +471 -12
- package/cli.mjs +282 -159
- package/dist/assets/{BatchPickerModal-yr3TOeuu.js → BatchPickerModal-BhIFzqMZ.js} +1 -1
- package/dist/assets/{ClassesView-CJBu14nu.js → ClassesView-BWzkFR-C.js} +1 -1
- package/dist/assets/{CloudDriveModal-BYPpuwx4.js → CloudDriveModal-Dy_toaqC.js} +1 -1
- package/dist/assets/{CourseManagement-D7HitLiU.js → CourseManagement-DTIt-D1_.js} +1 -1
- package/dist/assets/{CourseWizardModal-CyMoK1Os.js → CourseWizardModal-DEx5wbVt.js} +1 -1
- package/dist/assets/{Dashboard-DjCWV3Qg.js → Dashboard-DrD2ZUG2.js} +1 -1
- package/dist/assets/{ExportWeightModal-B5Cj-pLX.js → ExportWeightModal-D3bGjA61.js} +1 -1
- package/dist/assets/{HelpView-CxTV4J6V.js → HelpView-DOQ_FtPQ.js} +1 -1
- package/dist/assets/{ImportLessonsModal-CtHd6jIE.js → ImportLessonsModal-R3T0dy5k.js} +1 -1
- package/dist/assets/{InteractiveCoursewareViewer-CiOJP-Y5.js → InteractiveCoursewareViewer-CL1yz-wN.js} +1 -1
- package/dist/assets/{InteractiveWhiteboard-DZy7dsGY.js → InteractiveWhiteboard-Cua0Ksff.js} +1 -1
- package/dist/assets/{LazyCourseware-BpWRWiC9.js → LazyCourseware-CjwoXy7i.js} +1 -1
- package/dist/assets/{LazyWhiteboard-GuLyGVWI.js → LazyWhiteboard-C1kc33rY.js} +1 -1
- package/dist/assets/{LessonEditorView-BPtkbV8_.js → LessonEditorView-K0YB64km.js} +1 -1
- package/dist/assets/{LiveClassroomView-Cx5jD5H8.js → LiveClassroomView-D4IQGl2d.js} +1 -1
- package/dist/assets/{NotificationDetailModal-DTwOttoS.js → NotificationDetailModal-C7n-UNti.js} +1 -1
- package/dist/assets/{PluginView-BB7sIiJf.js → PluginView-4aUL9Ma3.js} +4 -4
- package/dist/assets/{QuizGeneratorModal-YoT3qVTl.js → QuizGeneratorModal-Cwv80A2_.js} +1 -1
- package/dist/assets/{StudentAssignmentView-QIQtCByD.js → StudentAssignmentView-DTFVSpw7.js} +1 -1
- package/dist/assets/{StudentLessonView-ChP3ZGTo.js → StudentLessonView-CETCftTC.js} +1 -1
- package/dist/assets/{StudentPreviewModal-BIfgr0MU.js → StudentPreviewModal-CIQx5-dG.js} +1 -1
- package/dist/assets/{StudentView-Clqr7kxh.js → StudentView-DtWzM17Q.js} +1 -1
- package/dist/assets/{SystemResourceLibraryModal-Cy012GB8.js → SystemResourceLibraryModal-Bv3wwXDH.js} +1 -1
- package/dist/assets/{TeacherView-D-7hKKGD.js → TeacherView-BEXx-Vwl.js} +1 -1
- package/dist/assets/{index-BqJrKVHF.js → index-PM-cSFwO.js} +1 -1
- package/dist/assets/{index-yp4O4BPB.js → index-kqgYec9C.js} +3 -3
- package/dist/index.html +1 -1
- package/dist/server.cjs +47 -7
- package/package.json +2 -2
package/dist/index.html
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
</script>
|
|
18
|
-
<script type="module" crossorigin src="/assets/index-
|
|
18
|
+
<script type="module" crossorigin src="/assets/index-kqgYec9C.js"></script>
|
|
19
19
|
<link rel="stylesheet" crossorigin href="/assets/index-B-YxO39A.css">
|
|
20
20
|
</head>
|
|
21
21
|
<body>
|
package/dist/server.cjs
CHANGED
|
@@ -2720,6 +2720,12 @@ parentPort.on('message', async function(msg) {
|
|
|
2720
2720
|
if (!svc) throw new Error('No provider registered for token: ' + tokenName);
|
|
2721
2721
|
if (tokenName === '@openlearn/core:IDatabase') {
|
|
2722
2722
|
return {
|
|
2723
|
+
// \u4E3B\u4FA7 exec RPC \u5DF2\u8FC7 assertDatabaseAccessAllowed \u5B88\u536B\uFF08DDL \u547D\u540D\u7A7A\u95F4 + \u6838\u5FC3\u8868\u9ED1\u540D\u5355\uFF09\uFF0C
|
|
2724
|
+
// \u8FD9\u91CC\u8865\u9F50\u8F6C\u53D1\uFF0C\u907F\u514D worker \u63D2\u4EF6\u8C03\u7528 exec \u65F6\u62A5 "rawDb.exec is not a function"\u3002
|
|
2725
|
+
// \u6CE8\u610F\u8FD4\u56DE Promise\uFF08\u5F02\u6B65 RPC\uFF09\uFF0C\u4E0E prepare* \u4E00\u81F4\u3002
|
|
2726
|
+
exec: function(sql) {
|
|
2727
|
+
return svc.exec(sql);
|
|
2728
|
+
},
|
|
2723
2729
|
prepare: function(sql) {
|
|
2724
2730
|
return {
|
|
2725
2731
|
run: function() {
|
|
@@ -8256,7 +8262,7 @@ var HotReloadActivationError = class extends HotReloadError {
|
|
|
8256
8262
|
init_interfaces();
|
|
8257
8263
|
|
|
8258
8264
|
// packages/core/version.ts
|
|
8259
|
-
var PLATFORM_VERSION = "0.3.
|
|
8265
|
+
var PLATFORM_VERSION = "0.3.10";
|
|
8260
8266
|
var OPENLEARN_VERSION = PLATFORM_VERSION;
|
|
8261
8267
|
|
|
8262
8268
|
// packages/core/plugin-host/plugin-runtime-composition.ts
|
|
@@ -23727,6 +23733,7 @@ ${examsText}
|
|
|
23727
23733
|
var import_express2 = __toESM(require("express"), 1);
|
|
23728
23734
|
var import_path14 = __toESM(require("path"), 1);
|
|
23729
23735
|
var import_fs13 = __toESM(require("fs"), 1);
|
|
23736
|
+
var import_semver3 = __toESM(require("semver"), 1);
|
|
23730
23737
|
|
|
23731
23738
|
// server/services/version-fetcher.ts
|
|
23732
23739
|
var import_child_process2 = require("child_process");
|
|
@@ -23883,6 +23890,26 @@ async function checkVersion(source, installedVersion) {
|
|
|
23883
23890
|
}
|
|
23884
23891
|
|
|
23885
23892
|
// server/routes/plugins.ts
|
|
23893
|
+
function findLocalPluginSource(manifestId) {
|
|
23894
|
+
const root = import_path14.default.resolve(process.cwd(), "v2_plugins");
|
|
23895
|
+
if (!import_fs13.default.existsSync(root)) return null;
|
|
23896
|
+
let best = null;
|
|
23897
|
+
try {
|
|
23898
|
+
for (const entry of import_fs13.default.readdirSync(root, { withFileTypes: true })) {
|
|
23899
|
+
if (!entry.isDirectory()) continue;
|
|
23900
|
+
const manifestPath = import_path14.default.join(root, entry.name, "manifest.json");
|
|
23901
|
+
if (!import_fs13.default.existsSync(manifestPath)) continue;
|
|
23902
|
+
try {
|
|
23903
|
+
const m = JSON.parse(import_fs13.default.readFileSync(manifestPath, "utf-8"));
|
|
23904
|
+
if (m?.id !== manifestId || !m?.version) continue;
|
|
23905
|
+
if (!best || import_semver3.default.gt(m.version, best.version)) best = { dir: entry.name, version: m.version };
|
|
23906
|
+
} catch {
|
|
23907
|
+
}
|
|
23908
|
+
}
|
|
23909
|
+
} catch {
|
|
23910
|
+
}
|
|
23911
|
+
return best;
|
|
23912
|
+
}
|
|
23886
23913
|
function isSafeExternalUrl(urlStr) {
|
|
23887
23914
|
try {
|
|
23888
23915
|
const parsed = new URL(urlStr);
|
|
@@ -24034,6 +24061,20 @@ function registerPluginsRoutes(ctx) {
|
|
|
24034
24061
|
}
|
|
24035
24062
|
const src = manifest.updateSource;
|
|
24036
24063
|
if (!src?.type || !src?.repo) {
|
|
24064
|
+
const local = findLocalPluginSource(manifest.id);
|
|
24065
|
+
if (local) {
|
|
24066
|
+
const installed = manifest.version || "0.0.0";
|
|
24067
|
+
const hasUpdate = import_semver3.default.gt(local.version, installed);
|
|
24068
|
+
return res.json({
|
|
24069
|
+
success: true,
|
|
24070
|
+
hasUpdate,
|
|
24071
|
+
installedVersion: installed,
|
|
24072
|
+
latestVersion: local.version,
|
|
24073
|
+
downloadUrl: null,
|
|
24074
|
+
updateSource: "local-v2_plugins",
|
|
24075
|
+
changelog: hasUpdate ? `\u672C\u5730\u6E90 v2_plugins/${local.dir} \u63D0\u4F9B\u65B0\u7248\u672C v${local.version}\uFF0C\u8BF7\u91CD\u65B0\u6784\u5EFA ZIP \u540E\u901A\u8FC7\u4E0A\u4F20\u66F4\u65B0` : void 0
|
|
24076
|
+
});
|
|
24077
|
+
}
|
|
24037
24078
|
return res.json({ success: true, hasUpdate: false, message: "\u8BE5\u63D2\u4EF6\u672A\u58F0\u660E\u66F4\u65B0\u6E90" });
|
|
24038
24079
|
}
|
|
24039
24080
|
const result = await checkVersion(src, manifest.version || "0.0.0");
|
|
@@ -24078,12 +24119,11 @@ function registerPluginsRoutes(ctx) {
|
|
|
24078
24119
|
});
|
|
24079
24120
|
}
|
|
24080
24121
|
} else {
|
|
24081
|
-
|
|
24082
|
-
|
|
24083
|
-
|
|
24084
|
-
|
|
24085
|
-
|
|
24086
|
-
}
|
|
24122
|
+
return res.status(400).json({
|
|
24123
|
+
success: false,
|
|
24124
|
+
error: "\u7F3A\u5C11 downloadUrl\uFF1A\u8BF7\u5148\u6267\u884C\u68C0\u67E5\u66F4\u65B0\u83B7\u53D6\u4E0B\u8F7D\u5730\u5740\uFF0C\u6216\u901A\u8FC7 ZIP \u4E0A\u4F20\u66F4\u65B0",
|
|
24125
|
+
fallbackToClient: true
|
|
24126
|
+
});
|
|
24087
24127
|
}
|
|
24088
24128
|
const result = await kernelContainer.pluginDistributionManager.updateFromZip(zipBuffer, {
|
|
24089
24129
|
targetPluginId,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openlearn-next",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A plugin-driven Educational OS / LMS platform with AI agent teaching assistant",
|
|
6
6
|
"keywords": [
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@google/genai": "^2.4.0",
|
|
61
|
-
"@openlearn/plugin-sdk": "
|
|
61
|
+
"@openlearn/plugin-sdk": "3.6.0",
|
|
62
62
|
"@types/reveal.js": "^5.2.2",
|
|
63
63
|
"bcryptjs": "^3.0.3",
|
|
64
64
|
"better-sqlite3": "^12.11.1",
|