openlearn-next 0.7.13 → 0.7.16

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.
Files changed (111) hide show
  1. package/README.md +1 -1
  2. package/cli-data.mjs +2 -2
  3. package/cli-doctor.mjs +2 -1
  4. package/dist/assets/{AcademicYearFilter-Dm3no4Nb.js → AcademicYearFilter-pCzZgimU.js} +1 -1
  5. package/dist/assets/ActivityWorkspaceWidget-KJQdLnvf.js +1 -0
  6. package/dist/assets/AdminDirectoryView-DDxX8RO2.js +5 -0
  7. package/dist/assets/AssessmentCenter-D5cVUqvy.js +1 -0
  8. package/dist/assets/{AssignmentFilePreview-7fHtUuUL.js → AssignmentFilePreview-DK29gdpQ.js} +2 -2
  9. package/dist/assets/BatchPickerModal-Cw4OZqOJ.js +1 -0
  10. package/dist/assets/ClassesView-Czx7hU2V.js +32 -0
  11. package/dist/assets/ClassroomCountdownWidget-BeAM37Cq.js +2 -0
  12. package/dist/assets/CloudDriveModal-GNZzWVCP.js +1 -0
  13. package/dist/assets/ComputerLabView-C_0c7sjz.js +1 -0
  14. package/dist/assets/CourseManagement-DzLB0Xmp.js +1 -0
  15. package/dist/assets/CourseWizardModal-DmQu237c.js +3 -0
  16. package/dist/assets/CoursewareHubPanel-Xn5WbXg9.js +1 -0
  17. package/dist/assets/Dashboard-CX83FUeF.js +8 -0
  18. package/dist/assets/ExportWeightModal-C0SuUhHM.js +1 -0
  19. package/dist/assets/HelpTour-D8hVFA6N.js +1 -0
  20. package/dist/assets/HelpView-C0PP_51D.js +204 -0
  21. package/dist/assets/ImportLessonsModal-p8Uc1U_h.js +1 -0
  22. package/dist/assets/{ImportModal-CYU3aMYY.js → ImportModal-DNaPHV0I.js} +2 -2
  23. package/dist/assets/InteractiveCoursewareViewer-D9YTgasv.js +1 -0
  24. package/dist/assets/InteractiveWhiteboard-CHYQfRjR.js +19 -0
  25. package/dist/assets/LazyCourseware-dtuOSiyR.js +2 -0
  26. package/dist/assets/LazyWhiteboard-DuBKAh4-.js +2 -0
  27. package/dist/assets/LessonEditorView-BgI7C_FK.js +1 -0
  28. package/dist/assets/LiveClassroomView-CJK_WMqD.js +67 -0
  29. package/dist/assets/NotificationDetailModal-BVYuS4uR.js +1 -0
  30. package/dist/assets/PluginView-CpWjy0Xf.js +66 -0
  31. package/dist/assets/ProcessLogsModal-D-Ez_YZA.js +1 -0
  32. package/dist/assets/QuizGeneratorModal-Lf5QMvkq.js +1 -0
  33. package/dist/assets/RevealPresentationWrapper-Dnf4v72i.js +48 -0
  34. package/dist/assets/StudentAssignmentEvalPanel-C-7YSfEQ.js +1 -0
  35. package/dist/assets/StudentAssignmentView-LuMaNpq8.js +1 -0
  36. package/dist/assets/StudentLessonView-DUG8I1Zy.js +1 -0
  37. package/dist/assets/StudentView-mMwGPiiF.js +2 -0
  38. package/dist/assets/SystemResourceLibraryModal-LUDNOwgW.js +1 -0
  39. package/dist/assets/TeacherView-ofB-3SEJ.js +2 -0
  40. package/dist/assets/TimetableView-DrZbyCOQ.js +6 -0
  41. package/dist/assets/{UTIF-u3Ct70K4.js → UTIF-DbcUtUKZ.js} +1 -1
  42. package/dist/assets/index-CG-g_9my.css +1 -0
  43. package/dist/assets/index-CLtQGl25.js +169 -0
  44. package/dist/assets/{index.es-CcQ2kcDj.js → index.es-D1mLdmCj.js} +1 -1
  45. package/dist/assets/keyboard-Rs007iOv.js +1 -0
  46. package/dist/assets/{pluginParsers-BN3lQ7PJ.js → pluginParsers-C46aCYkl.js} +1 -1
  47. package/dist/assets/student-workspace-BFPfR77J.js +1 -0
  48. package/dist/assets/{vendor-charts-skggaP9D.js → vendor-charts-CK-CU_m7.js} +1 -1
  49. package/dist/assets/{vendor-icons-CqLdl4B_.js → vendor-icons-__JLt-CP.js} +2 -2
  50. package/dist/assets/{vendor-konva-BOuJWFuE.js → vendor-konva-DGELdczq.js} +1 -1
  51. package/dist/assets/{vendor-motion-BFAPOs-b.js → vendor-motion-DtyD8eRQ.js} +1 -1
  52. package/dist/assets/{vendor-pdf-BMEc_Clb.js → vendor-pdf-DNexfcCO.js} +3 -3
  53. package/dist/assets/{vendor-pptx-C0qaOH5T.js → vendor-pptx-ByQkJ0Xi.js} +4 -4
  54. package/dist/assets/{vendor-react-DHoBZpn2.js → vendor-react-lfWn1oGs.js} +1 -1
  55. package/dist/assets/{vendor-utils-BxOuk3id.js → vendor-utils-CsoI4M9x.js} +1 -1
  56. package/dist/cli-migrator.cjs +23 -7
  57. package/dist/index.html +10 -6
  58. package/dist/server.cjs +11139 -4094
  59. package/docs_plugin_guide.md +1023 -0
  60. package/migrations/046_logout_clear_site_data.sql +9 -0
  61. package/migrations/047_third_party_theme_system.sql +55 -0
  62. package/migrations/048_file_storage_extension.sql +63 -0
  63. package/migrations/049_ai_personas.sql +25 -0
  64. package/migrations/050_ai_persona_governance.sql +11 -0
  65. package/migrations/051_community_registry_url.sql +9 -0
  66. package/migrations/052_community_install_enabled.sql +12 -0
  67. package/migrations/053_runtime_admin_policies.sql +28 -0
  68. package/migrations/054_user_onboarding_tour_status.sql +10 -0
  69. package/migrations/055_classroom_collab_whiteboard.sql +27 -0
  70. package/migrations/056_public_student_lookup.sql +9 -0
  71. package/migrations/README.md +59 -48
  72. package/migrations/schema-golden.json +98 -2
  73. package/package.json +7 -6
  74. package/scripts/assert-node-runtime.mjs +4 -3
  75. package/dist/assets/ActivityWorkspaceWidget-9DeXkxGk.js +0 -1
  76. package/dist/assets/AdminDirectoryView-5gupeGAR.js +0 -5
  77. package/dist/assets/AssessmentCenter-CPaqy0Xa.js +0 -1
  78. package/dist/assets/BatchPickerModal-0yIe1DXi.js +0 -1
  79. package/dist/assets/ClassesView-CGpoW0IC.js +0 -32
  80. package/dist/assets/ClassroomCountdownWidget-B_5--dn_.js +0 -2
  81. package/dist/assets/CloudDriveModal-4Ts5Duh5.js +0 -1
  82. package/dist/assets/ComputerLabView-DAEaKTBj.js +0 -1
  83. package/dist/assets/CourseManagement-CxIBH7lA.js +0 -1
  84. package/dist/assets/CourseWizardModal-R0xpa_Aw.js +0 -3
  85. package/dist/assets/CoursewareHubPanel-CpHptmSa.js +0 -1
  86. package/dist/assets/Dashboard-DeBfP_Nc.js +0 -8
  87. package/dist/assets/ExportWeightModal-DlnCOBlL.js +0 -1
  88. package/dist/assets/HelpTour-Cztpqw_J.js +0 -1
  89. package/dist/assets/HelpView-LPLAY9bq.js +0 -204
  90. package/dist/assets/ImportLessonsModal-BopEHmU_.js +0 -1
  91. package/dist/assets/InteractiveCoursewareViewer-CGc3P4HF.js +0 -1
  92. package/dist/assets/InteractiveWhiteboard-DiyHrIGn.js +0 -19
  93. package/dist/assets/LazyCourseware-Bj1jm0nC.js +0 -2
  94. package/dist/assets/LazyWhiteboard-NPD1EoyO.js +0 -2
  95. package/dist/assets/LessonEditorView-DqreBtFx.js +0 -1
  96. package/dist/assets/LiveClassroomView-eTc6Fb9g.js +0 -64
  97. package/dist/assets/NotificationDetailModal-B7G7ra9a.js +0 -1
  98. package/dist/assets/PluginView-DP6s-L70.js +0 -77
  99. package/dist/assets/ProcessLogsModal-Dq5C4s7j.js +0 -1
  100. package/dist/assets/QuizGeneratorModal-CoX9f8Wp.js +0 -1
  101. package/dist/assets/RevealPresentationWrapper-wwlcfNWB.js +0 -48
  102. package/dist/assets/StudentAssignmentEvalPanel-DHb-asHQ.js +0 -1
  103. package/dist/assets/StudentAssignmentView-AJpjQK3f.js +0 -1
  104. package/dist/assets/StudentLessonView-Djd1T1QF.js +0 -1
  105. package/dist/assets/StudentView-D41z7GY5.js +0 -2
  106. package/dist/assets/SystemResourceLibraryModal-CxmQh1HA.js +0 -1
  107. package/dist/assets/TeacherView-DqSWaNuI.js +0 -2
  108. package/dist/assets/TimetableView-DrFs_xgc.js +0 -6
  109. package/dist/assets/index-7CK1B0tE.js +0 -131
  110. package/dist/assets/index-BaGZmpr6.css +0 -1
  111. package/dist/assets/student-workspace-DkTkcAGK.js +0 -1
@@ -0,0 +1,9 @@
1
+ -- UP
2
+ -- 046_logout_clear_site_data.sql
3
+ -- Issue #487:管理后台可配置登出时是否下发 Clear-Site-Data: "cookies", "storage", "cache"。
4
+ -- 默认值为 0(关闭),由管理员在站点设置中按需启用。
5
+
6
+ ALTER TABLE site_settings ADD COLUMN logout_clear_site_data INTEGER DEFAULT 0;
7
+
8
+ -- DOWN
9
+ ALTER TABLE site_settings DROP COLUMN logout_clear_site_data;
@@ -0,0 +1,55 @@
1
+ -- UP
2
+ -- 047_third_party_theme_system.sql
3
+ -- Issue #484:第三方主题系统 —— 共享主题目录、版本历史、每账号隔离偏好与站点默认主题。
4
+
5
+ CREATE TABLE IF NOT EXISTS themes (
6
+ id TEXT PRIMARY KEY,
7
+ name TEXT NOT NULL,
8
+ description TEXT DEFAULT '',
9
+ author TEXT NOT NULL,
10
+ latest_version TEXT NOT NULL,
11
+ uploader_id TEXT NOT NULL,
12
+ uploader_name TEXT DEFAULT '',
13
+ status TEXT NOT NULL DEFAULT 'active',
14
+ supports_modes TEXT NOT NULL DEFAULT '["light","dark"]',
15
+ platform_min_version TEXT,
16
+ platform_max_version TEXT,
17
+ manifest_json TEXT NOT NULL,
18
+ styles_css TEXT NOT NULL DEFAULT '',
19
+ created_at INTEGER NOT NULL,
20
+ updated_at INTEGER NOT NULL
21
+ );
22
+
23
+ CREATE TABLE IF NOT EXISTS theme_versions (
24
+ theme_id TEXT NOT NULL,
25
+ version TEXT NOT NULL,
26
+ manifest_json TEXT NOT NULL,
27
+ styles_css TEXT NOT NULL DEFAULT '',
28
+ asset_manifest_json TEXT NOT NULL DEFAULT '[]',
29
+ uploader_id TEXT NOT NULL,
30
+ created_at INTEGER NOT NULL,
31
+ PRIMARY KEY (theme_id, version),
32
+ FOREIGN KEY (theme_id) REFERENCES themes(id) ON DELETE CASCADE
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS user_theme_preferences (
36
+ principal_key TEXT PRIMARY KEY,
37
+ theme_id TEXT NOT NULL DEFAULT 'light',
38
+ installed_version TEXT,
39
+ mode TEXT NOT NULL DEFAULT 'auto',
40
+ appearance_json TEXT NOT NULL DEFAULT '{}',
41
+ updated_at INTEGER NOT NULL
42
+ );
43
+
44
+ CREATE INDEX IF NOT EXISTS idx_themes_status ON themes(status, updated_at);
45
+ CREATE INDEX IF NOT EXISTS idx_theme_versions_theme ON theme_versions(theme_id, created_at);
46
+
47
+ ALTER TABLE site_settings ADD COLUMN default_theme_id TEXT DEFAULT 'light';
48
+
49
+ -- DOWN
50
+ DROP INDEX IF EXISTS idx_theme_versions_theme;
51
+ DROP INDEX IF EXISTS idx_themes_status;
52
+ DROP TABLE IF EXISTS user_theme_preferences;
53
+ DROP TABLE IF EXISTS theme_versions;
54
+ DROP TABLE IF EXISTS themes;
55
+ ALTER TABLE site_settings DROP COLUMN default_theme_id;
@@ -0,0 +1,63 @@
1
+ -- File storage extension: split physical blobs (file_blobs), logical assets (file_assets),
2
+ -- and legacy URL aliases (file_aliases), plus admin config column on site_settings and asset linkage on plugin_assignment_files.
3
+
4
+ CREATE TABLE IF NOT EXISTS file_blobs (
5
+ id TEXT PRIMARY KEY,
6
+ backend_id TEXT NOT NULL DEFAULT 'local',
7
+ storage_key TEXT NOT NULL,
8
+ sha256 TEXT NOT NULL,
9
+ size_bytes INTEGER NOT NULL,
10
+ ref_count INTEGER NOT NULL DEFAULT 1,
11
+ created_at TEXT NOT NULL
12
+ );
13
+
14
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_file_blobs_backend_key ON file_blobs(backend_id, storage_key);
15
+ CREATE INDEX IF NOT EXISTS idx_file_blobs_sha256 ON file_blobs(backend_id, sha256);
16
+
17
+ CREATE TABLE IF NOT EXISTS file_assets (
18
+ id TEXT PRIMARY KEY,
19
+ blob_id TEXT NOT NULL REFERENCES file_blobs(id),
20
+ original_name TEXT NOT NULL,
21
+ mime TEXT NOT NULL,
22
+ author_id TEXT,
23
+ course_id TEXT,
24
+ lesson_id TEXT,
25
+ purpose TEXT NOT NULL,
26
+ access_scope TEXT NOT NULL DEFAULT 'authenticated',
27
+ metadata_json TEXT,
28
+ deleted_at TEXT,
29
+ created_at TEXT NOT NULL
30
+ );
31
+
32
+ CREATE INDEX IF NOT EXISTS idx_file_assets_blob ON file_assets(blob_id);
33
+ CREATE INDEX IF NOT EXISTS idx_file_assets_course ON file_assets(course_id);
34
+ CREATE INDEX IF NOT EXISTS idx_file_assets_lesson ON file_assets(lesson_id);
35
+ CREATE INDEX IF NOT EXISTS idx_file_assets_author ON file_assets(author_id);
36
+ CREATE INDEX IF NOT EXISTS idx_file_assets_purpose ON file_assets(purpose, deleted_at);
37
+
38
+ CREATE TABLE IF NOT EXISTS file_aliases (
39
+ alias TEXT PRIMARY KEY,
40
+ asset_id TEXT NOT NULL REFERENCES file_assets(id) ON DELETE CASCADE
41
+ );
42
+
43
+ CREATE INDEX IF NOT EXISTS idx_file_aliases_asset ON file_aliases(asset_id);
44
+
45
+ ALTER TABLE site_settings ADD COLUMN file_storage_config TEXT;
46
+ ALTER TABLE plugin_assignment_files ADD COLUMN asset_id TEXT;
47
+ CREATE INDEX IF NOT EXISTS idx_assignment_files_asset ON plugin_assignment_files(asset_id);
48
+
49
+ -- DOWN
50
+ DROP INDEX IF EXISTS idx_assignment_files_asset;
51
+ ALTER TABLE plugin_assignment_files DROP COLUMN asset_id;
52
+ ALTER TABLE site_settings DROP COLUMN file_storage_config;
53
+ DROP INDEX IF EXISTS idx_file_aliases_asset;
54
+ DROP TABLE IF EXISTS file_aliases;
55
+ DROP INDEX IF EXISTS idx_file_assets_purpose;
56
+ DROP INDEX IF EXISTS idx_file_assets_author;
57
+ DROP INDEX IF EXISTS idx_file_assets_lesson;
58
+ DROP INDEX IF EXISTS idx_file_assets_course;
59
+ DROP INDEX IF EXISTS idx_file_assets_blob;
60
+ DROP TABLE IF EXISTS file_assets;
61
+ DROP INDEX IF EXISTS idx_file_blobs_sha256;
62
+ DROP INDEX IF EXISTS idx_file_blobs_backend_key;
63
+ DROP TABLE IF EXISTS file_blobs;
@@ -0,0 +1,25 @@
1
+ -- UP
2
+ CREATE TABLE IF NOT EXISTS ai_personas (
3
+ id TEXT PRIMARY KEY,
4
+ source TEXT NOT NULL,
5
+ plugin_id TEXT,
6
+ name_zh TEXT NOT NULL,
7
+ name_en TEXT NOT NULL,
8
+ instruction_zh TEXT NOT NULL DEFAULT '',
9
+ instruction_en TEXT NOT NULL DEFAULT '',
10
+ icon TEXT,
11
+ mode TEXT NOT NULL DEFAULT 'overlay',
12
+ base_policy TEXT NOT NULL DEFAULT 'inherit',
13
+ visibility_json TEXT,
14
+ default_for_role_json TEXT,
15
+ tool_policy_json TEXT,
16
+ max_turns INTEGER,
17
+ created_at INTEGER NOT NULL,
18
+ updated_at INTEGER NOT NULL
19
+ );
20
+
21
+ CREATE INDEX IF NOT EXISTS idx_ai_personas_source_plugin ON ai_personas(source, plugin_id);
22
+
23
+ -- DOWN
24
+ DROP INDEX IF EXISTS idx_ai_personas_source_plugin;
25
+ DROP TABLE IF EXISTS ai_personas;
@@ -0,0 +1,11 @@
1
+ -- UP
2
+ CREATE TABLE IF NOT EXISTS ai_persona_governance (
3
+ persona_id TEXT PRIMARY KEY,
4
+ description_zh TEXT NOT NULL DEFAULT '',
5
+ description_en TEXT NOT NULL DEFAULT '',
6
+ enabled INTEGER NOT NULL DEFAULT 1,
7
+ preferred_provider_id TEXT
8
+ );
9
+
10
+ -- DOWN
11
+ DROP TABLE IF EXISTS ai_persona_governance;
@@ -0,0 +1,9 @@
1
+ -- UP
2
+ -- 051_community_registry_url.sql
3
+ -- 支持在插件中心「社区」标签页配置社区插件注册表 JSON 地址;
4
+ -- NULL 表示未在界面显式覆盖,服务端回落到环境变量 PLUGIN_COMMUNITY_REGISTRY_URL。
5
+
6
+ ALTER TABLE site_settings ADD COLUMN community_registry_url TEXT;
7
+
8
+ -- DOWN
9
+ ALTER TABLE site_settings DROP COLUMN community_registry_url;
@@ -0,0 +1,12 @@
1
+ -- UP
2
+ -- 052_community_install_enabled.sql
3
+ -- 支持在插件中心「社区」页由管理员开关「允许从社区注册表安装」;
4
+ -- NULL 表示未在界面显式配置,服务端回落到环境变量 OPENLEARN_COMMUNITY_INSTALL
5
+ -- (仅当值为 1 时开启;未设置则保持历史默认关闭)。
6
+ -- 0 = 界面显式关闭(即使环境变量为 1);1 = 界面显式开启。
7
+ -- 默认必须为 NULL,不能写成 0,否则会掩盖环境变量回退。
8
+
9
+ ALTER TABLE site_settings ADD COLUMN community_install_enabled INTEGER;
10
+
11
+ -- DOWN
12
+ ALTER TABLE site_settings DROP COLUMN community_install_enabled;
@@ -0,0 +1,28 @@
1
+ -- UP
2
+ -- 053_runtime_admin_policies.sql
3
+ -- 管理员可在后台「站点信息设置」中配置三项运行时策略;列默认必须为 NULL(未配置),
4
+ -- 以便回退到环境变量,不能写成 0/默认值,否则会掩盖 ENV 回退并改变既有实际状态。
5
+ --
6
+ -- bridge_hook_telemetry: 课件网络遥测总闸。NULL=未配置;1=显式开启;0=显式关闭。
7
+ -- 未配置时回退 BRIDGE_HOOK_TELEMETRY(仅 off 关闭,其余/未设置默认开启)。
8
+ -- http_access_log_mode: 访问日志策略。NULL=未配置;取值 off / errors / all。
9
+ -- 未配置时回退 HTTP_ACCESS_LOG,再回退 LOG_LEVEL=debug|trace → all,否则默认 errors。
10
+ -- 此项不是布尔开关,勿改成 0/1。
11
+ -- http_access_log_ignore: 逗号分隔的路径前缀静默名单。NULL=未配置,回退 HTTP_ACCESS_LOG_IGNORE。
12
+ -- http_slow_ms: 慢请求阈值(毫秒)。NULL=未配置,回退 HTTP_SLOW_MS(默认 1000)。
13
+ -- allow_unsigned_plugins: 未签名本地插件默认放行。NULL=未配置;1=显式允许默认放行;0=显式收紧为逐次确认。
14
+ -- 未配置时回退 OPENLEARN_ALLOW_UNSIGNED(仅 0/false 收紧,未设置默认放行)。
15
+ -- 此策略不能绕过签名错误、公钥、网络限制、权限或沙箱。
16
+
17
+ ALTER TABLE site_settings ADD COLUMN bridge_hook_telemetry INTEGER;
18
+ ALTER TABLE site_settings ADD COLUMN http_access_log_mode TEXT;
19
+ ALTER TABLE site_settings ADD COLUMN http_access_log_ignore TEXT;
20
+ ALTER TABLE site_settings ADD COLUMN http_slow_ms INTEGER;
21
+ ALTER TABLE site_settings ADD COLUMN allow_unsigned_plugins INTEGER;
22
+
23
+ -- DOWN
24
+ ALTER TABLE site_settings DROP COLUMN allow_unsigned_plugins;
25
+ ALTER TABLE site_settings DROP COLUMN http_slow_ms;
26
+ ALTER TABLE site_settings DROP COLUMN http_access_log_ignore;
27
+ ALTER TABLE site_settings DROP COLUMN http_access_log_mode;
28
+ ALTER TABLE site_settings DROP COLUMN bridge_hook_telemetry;
@@ -0,0 +1,10 @@
1
+ -- UP
2
+ -- 054_user_onboarding_tour_status.sql
3
+ -- Issue #530:按账号持久化管理员新手引导向导(HelpTour)状态,避免跳过/完成后
4
+ -- 在刷新、重登(含开启 Clear-Site-Data)或更换设备后反复强制弹出,同时保证不同账号状态隔离。
5
+ -- tour_status: NULL 表示待引导(pending);'completed' 表示已完成;'skipped' 表示已跳过。
6
+
7
+ ALTER TABLE users ADD COLUMN tour_status TEXT;
8
+
9
+ -- DOWN
10
+ ALTER TABLE users DROP COLUMN tour_status;
@@ -0,0 +1,27 @@
1
+ -- UP
2
+ -- 055_classroom_collab_whiteboard.sql
3
+ -- 持久化随堂小组协作白板与画廊互评数据,按 (lesson_id, class_id) 隔离保存,
4
+ -- 关闭/重开模态窗或刷新页面后仍可恢复分组、驱动题、笔画路径、点赞与思辨标签。
5
+
6
+ CREATE TABLE IF NOT EXISTS classroom_collab_whiteboards (
7
+ id TEXT PRIMARY KEY,
8
+ lesson_id TEXT NOT NULL,
9
+ class_id TEXT NOT NULL DEFAULT '',
10
+ mission_prompt TEXT NOT NULL DEFAULT '',
11
+ grouping_strategy TEXT NOT NULL DEFAULT 'heterogeneous',
12
+ groups_json TEXT NOT NULL DEFAULT '[]',
13
+ strokes_json TEXT NOT NULL DEFAULT '[]',
14
+ likes_json TEXT NOT NULL DEFAULT '{}',
15
+ inquiries_json TEXT NOT NULL DEFAULT '{}',
16
+ spotlight_group_id TEXT,
17
+ updated_by TEXT,
18
+ updated_at INTEGER NOT NULL,
19
+ UNIQUE(lesson_id, class_id)
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_collab_whiteboard_lesson
23
+ ON classroom_collab_whiteboards(lesson_id, class_id);
24
+
25
+ -- DOWN
26
+ DROP INDEX IF EXISTS idx_collab_whiteboard_lesson;
27
+ DROP TABLE IF EXISTS classroom_collab_whiteboards;
@@ -0,0 +1,9 @@
1
+ -- UP
2
+ -- 056_public_student_lookup.sql
3
+ -- Issue #538:site_settings 表增加 allow_public_student_lookup(默认 1 开启),
4
+ -- 控制登录页学生自助端是否允许未登录按姓名/班级公开查询学号。
5
+
6
+ ALTER TABLE site_settings ADD COLUMN allow_public_student_lookup INTEGER DEFAULT 1;
7
+
8
+ -- DOWN
9
+ ALTER TABLE site_settings DROP COLUMN allow_public_student_lookup;
@@ -13,51 +13,62 @@
13
13
 
14
14
  ## 当前迁移列表
15
15
 
16
- | 序号 | 文件 | 描述 |
17
- | ---- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
18
- | 000 | 000_initial_schema.sql | 初始完整 Schema(30+ 表与核心索引) |
19
- | 001 | 001_add_execution_mode.sql | plugins 表添加 execution_mode |
20
- | 002 | 002_add_client_session_expiry.sql | client_sessions 添加 expires_at |
21
- | 003 | 003_classroom_runtime.sql | 课堂工具与 AI 对话记忆表(student_rollcalls, site_settings, agent_conversations) |
22
- | 004 | 004_courseware_score_config.sql | 互动课件成绩归集策略表(courseware_score_config,宿主侧按策略从样本历史算最终分) |
23
- | 005 | 005_assignment_hub.sql | 作业中心(plugin_assignments / plugin_submission_versions / plugin_assignment_files / plugin_peer_review_tasks,并重建 plugin_submissions 支持按作业唯一) |
24
- | 006 | 006_classroom_event_bus.sql | `events` 审计表补课堂维度:`lesson_id` 列与 (type,timestamp) / correlationId / (lesson_id,timestamp) 索引,让课堂事件可按时间窗口、业务流串联与课节重放查询 |
25
- | 007 | 007_interactive_classroom.sql | 互动课堂与课节生命周期(lesson_quiz_submissions / classroom_sessions / classroom_quick_polls / classroom_poll_votes / classroom_buzzers / classroom_exit_tickets / classroom_pacing_signals) |
26
- | 008 | 008_teaching_modes.sql | 教学模式表 teaching_modes 与 classroom_sessions.teaching_mode_id(课堂启动门户的模式选择器数据源) |
27
- | 009 | 009_classroom_peer_review.sql | 课中互评(classroom_peer_review_groups / classroom_peer_review_submissions) |
28
- | 010 | 010_class_groups.sql | 小组(class_groups) |
29
- | 011 | 011_classroom_feed.sql | 课堂动态流(classroom_feed) |
30
- | 012 | 012_auto_record_score.sql | `courseware_score_config` 补自动录入规则列(auto_record_enabled / auto_record_min_completion),把「学生提交数据」页的逐条手动「录入成绩」升级为按规则自动录入 |
31
- | 013 | 013_score_source_strategy.sql | `assignment_submissions` 补 source 列(manual/auto 来源分流,自动路径遇 manual/缺考行受保护)+ `courseware_score_config` 补 auto_record_strategy(latest/highest 更新策略) |
32
- | 014 | 014_performance_indexes.sql | 五个高频查询索引(vfs_nodes.parent_id、plugin_submissions.lesson_id、student_point_logs.student_id、student_rollcalls.class_id/student_id) |
33
- | 015 | 015_demo_data_registry.sql | `demo_data_registry`:演示数据精确登记,清理时只删登记行 |
34
- | 016 | 016_preset_polls_and_passcode_expiry.sql | 课程预设投票 `lesson_preset_polls`、班级口令有效期与点名奖赏字段 |
35
- | 017 | 017_pacing_signals_segment.sql | `classroom_pacing_signals.segment_id` 及会话分段索引 |
36
- | 018 | 018_processes_plugin_owner.sql | `processes.plugin_id`,后台任务可判定归属 |
37
- | 019 | 019_plugins_version.sql | `plugins.version`,版本可在 SQL 层查询 |
38
- | 020 | 020_upload_max_file_mb.sql | `site_settings.upload_max_file_mb`,课件上传上限改为管理员可配置 |
39
- | 021 | 021_class_owner_and_password_gate.sql | `classes.owner_user_id`(教师仅能管理自己的班;空值仅管理员可见)与 `users.must_change_password`。空归属用 `node scripts/backfill-class-owners.mjs --assign <教师用户名>`,或 `UPDATE classes SET owner_user_id = '<教师用户 id>' WHERE owner_user_id IS NULL` |
40
- | 022 | 022_plugin_public_routes.sql | `plugin_public_routes`:管理员显式批准的插件公开路由。`auth: false` 本身不再匿名放行。升级后需重新批准 |
41
- | 023 | 023_encrypt_class_passcodes.sql | 标记班级临时口令改为 AES-256-GCM 密文。启动时 `encryptStoredClassPasscodes()` 把仍是明文的行加密,已带 `olenc1:` 的行跳过 |
42
- | 024 | 024_segment_gates.sql | 教学环节门槛:`segment_visits`(停留)、`segment_gate_overrides`(教师放行)、`lesson_checkins`(无排课时的签到) |
43
- | 025 | 025_assignment_lookup_indexes.sql | `assignment_submissions(student_id)` 与 `assignments(lesson_id)` 索引,供课节进度聚合作业最高分和学生提交查询。可重复执行 |
44
- | 026 | 026_plugin_grants.sql | 第三方插件能力授权与出站网络白名单表(`plugin_capability_grants` / `plugin_network_grants`) |
45
- | 027 | 027_academic_year.sql | 学年维度:为 schedules/assignments/attendance/exams/semester reports 等表增加 `academic_year` 字段与索引;site_settings 增加当前学年配置 |
46
- | 028 | 028_classroom_indexes.sql | 补齐课堂互动与会话高频查询/级联删除索引(`classroom_buzzers`、`classroom_sessions`) |
47
- | 029 | 029_clean_lesson_think_artifacts.sql | 课程大纲模型思维链残留 (<think>...</think>) 清洗标记与启动期幂等清理 |
48
- | 030 | 030_backfill_academic_year.sql | 学年历史数据回填:为老数据库中 NULL 学年的排课/作业/考勤等按日期与父级关联平滑补齐 |
49
- | 031 | 031_assessment_core.sql | 测评子系统核心数据结构(试卷、考试、题库、题目等) |
50
- | 032 | 032_progress_verification.sql | 学习进度区分「学生自报」与「已验证」:新增 `verified` / `verified_progress_percent`,成绩只计入已验证进度;历史进度回填为已验证以保持既有成绩口径 |
51
- | 033 | 033_student_lock_mode.sql | 学生端锁定模式 (lock_mode) 与锁定目标 (lock_target) |
52
- | 034 | 034_plugin_orphan_data.sql | 插件卸载数据语义:孤立插件数据登记表(`plugin_orphan_data`,keep 保留登记 / purge 归档后可清除) |
53
- | 035 | 035_icebreaker_checkins.sql | 课前破冰心情打卡持久化与去重(`icebreaker_checkins` 表与按学生去重唯一索引) |
54
- | 036 | 036_student_read_notifications_created_at.sql | 保留策略:为 `student_read_notifications` 补齐 `created_at` 以便按 30 天窗口清理 |
55
- | 037 | 037_plugin_config_scopes.sql | 插件配置分层:`plugin_config` 表(平台/学校/班级),旧 `plugin_storage` 的 `config:*` 值迁移到平台层 |
56
- | 038 | 038_assessment_ai_grading_suggestion.sql | AI 辅助批改建议:`assessment_answers.ai_suggestion_json` 存「建议分 + 理由 + 置信度」,与正式分数分开 |
57
- | 039 | 039_question_bank_sharing_and_papers.sql | 题库共享与按规则随机抽题(每人一卷):`question_bank_items.visibility` 区分 private / school |
58
- | 040 | 040_assignment_grade_history.sql | 成绩审计与手动分保护:`assignment_grade_history` 记录每次成绩变更的旧/新分数、状态、来源与操作者 |
59
- | 041 | 041_course_package_idempotency.sql | 课程包导入幂等(G-06):同一包重复导入不再产生重复课程 |
60
- | 042 | 042_assignment_grade_resubmit_audit.sql | 学生重交审计:`assignment_grade_history` 补 `old_content`,可追溯「这份分数是针对哪份内容给的」 |
61
- | 043 | 043_mark_sha256_passwords.sql | Issue #227:把仍是无盐 SHA-256 摘要的存量账号标记为 `must_change_password = 1`,强制走既有改密流程(SHA-256 不可逆,无法反推原口令) |
62
- | 044 | 044_students_gender.sql | 学生性别 `students.gender`(male / female / NULL),供课堂专注力监控头像按性别渲染;历史数据为空,由教师新建时补录 |
63
- | 045 | 045_ai_providers_owner_and_scope.sql | Issue #383:AI 提供商账号级隔离与共享范围;`ai_providers` 表增加 `owner_id` 与 `is_shared`(0=私有/1=共享)及索引,历史数据平滑回填管理员私有 |
16
+ | 序号 | 文件 | 描述 |
17
+ | ---- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
18
+ | 000 | 000_initial_schema.sql | 初始完整 Schema(30+ 表与核心索引) |
19
+ | 001 | 001_add_execution_mode.sql | plugins 表添加 execution_mode |
20
+ | 002 | 002_add_client_session_expiry.sql | client_sessions 添加 expires_at |
21
+ | 003 | 003_classroom_runtime.sql | 课堂工具与 AI 对话记忆表(student_rollcalls, site_settings, agent_conversations) |
22
+ | 004 | 004_courseware_score_config.sql | 互动课件成绩归集策略表(courseware_score_config,宿主侧按策略从样本历史算最终分) |
23
+ | 005 | 005_assignment_hub.sql | 作业中心(plugin_assignments / plugin_submission_versions / plugin_assignment_files / plugin_peer_review_tasks,并重建 plugin_submissions 支持按作业唯一) |
24
+ | 006 | 006_classroom_event_bus.sql | `events` 审计表补课堂维度:`lesson_id` 列与 (type,timestamp) / correlationId / (lesson_id,timestamp) 索引,让课堂事件可按时间窗口、业务流串联与课节重放查询 |
25
+ | 007 | 007_interactive_classroom.sql | 互动课堂与课节生命周期(lesson_quiz_submissions / classroom_sessions / classroom_quick_polls / classroom_poll_votes / classroom_buzzers / classroom_exit_tickets / classroom_pacing_signals) |
26
+ | 008 | 008_teaching_modes.sql | 教学模式表 teaching_modes 与 classroom_sessions.teaching_mode_id(课堂启动门户的模式选择器数据源) |
27
+ | 009 | 009_classroom_peer_review.sql | 课中互评(classroom_peer_review_groups / classroom_peer_review_submissions) |
28
+ | 010 | 010_class_groups.sql | 小组(class_groups) |
29
+ | 011 | 011_classroom_feed.sql | 课堂动态流(classroom_feed) |
30
+ | 012 | 012_auto_record_score.sql | `courseware_score_config` 补自动录入规则列(auto_record_enabled / auto_record_min_completion),把「学生提交数据」页的逐条手动「录入成绩」升级为按规则自动录入 |
31
+ | 013 | 013_score_source_strategy.sql | `assignment_submissions` 补 source 列(manual/auto 来源分流,自动路径遇 manual/缺考行受保护)+ `courseware_score_config` 补 auto_record_strategy(latest/highest 更新策略) |
32
+ | 014 | 014_performance_indexes.sql | 五个高频查询索引(vfs_nodes.parent_id、plugin_submissions.lesson_id、student_point_logs.student_id、student_rollcalls.class_id/student_id) |
33
+ | 015 | 015_demo_data_registry.sql | `demo_data_registry`:演示数据精确登记,清理时只删登记行 |
34
+ | 016 | 016_preset_polls_and_passcode_expiry.sql | 课程预设投票 `lesson_preset_polls`、班级口令有效期与点名奖赏字段 |
35
+ | 017 | 017_pacing_signals_segment.sql | `classroom_pacing_signals.segment_id` 及会话分段索引 |
36
+ | 018 | 018_processes_plugin_owner.sql | `processes.plugin_id`,后台任务可判定归属 |
37
+ | 019 | 019_plugins_version.sql | `plugins.version`,版本可在 SQL 层查询 |
38
+ | 020 | 020_upload_max_file_mb.sql | `site_settings.upload_max_file_mb`,课件上传上限改为管理员可配置 |
39
+ | 021 | 021_class_owner_and_password_gate.sql | `classes.owner_user_id`(教师仅能管理自己的班;空值仅管理员可见)与 `users.must_change_password`。空归属用 `node scripts/backfill-class-owners.mjs --assign <教师用户名>`,或 `UPDATE classes SET owner_user_id = '<教师用户 id>' WHERE owner_user_id IS NULL` |
40
+ | 022 | 022_plugin_public_routes.sql | `plugin_public_routes`:管理员显式批准的插件公开路由。`auth: false` 本身不再匿名放行。升级后需重新批准 |
41
+ | 023 | 023_encrypt_class_passcodes.sql | 标记班级临时口令改为 AES-256-GCM 密文。启动时 `encryptStoredClassPasscodes()` 把仍是明文的行加密,已带 `olenc1:` 的行跳过 |
42
+ | 024 | 024_segment_gates.sql | 教学环节门槛:`segment_visits`(停留)、`segment_gate_overrides`(教师放行)、`lesson_checkins`(无排课时的签到) |
43
+ | 025 | 025_assignment_lookup_indexes.sql | `assignment_submissions(student_id)` 与 `assignments(lesson_id)` 索引,供课节进度聚合作业最高分和学生提交查询。可重复执行 |
44
+ | 026 | 026_plugin_grants.sql | 第三方插件能力授权与出站网络白名单表(`plugin_capability_grants` / `plugin_network_grants`) |
45
+ | 027 | 027_academic_year.sql | 学年维度:为 schedules/assignments/attendance/exams/semester reports 等表增加 `academic_year` 字段与索引;site_settings 增加当前学年配置 |
46
+ | 028 | 028_classroom_indexes.sql | 补齐课堂互动与会话高频查询/级联删除索引(`classroom_buzzers`、`classroom_sessions`) |
47
+ | 029 | 029_clean_lesson_think_artifacts.sql | 课程大纲模型思维链残留 (<think>...</think>) 清洗标记与启动期幂等清理 |
48
+ | 030 | 030_backfill_academic_year.sql | 学年历史数据回填:为老数据库中 NULL 学年的排课/作业/考勤等按日期与父级关联平滑补齐 |
49
+ | 031 | 031_assessment_core.sql | 测评子系统核心数据结构(试卷、考试、题库、题目等) |
50
+ | 032 | 032_progress_verification.sql | 学习进度区分「学生自报」与「已验证」:新增 `verified` / `verified_progress_percent`,成绩只计入已验证进度;历史进度回填为已验证以保持既有成绩口径 |
51
+ | 033 | 033_student_lock_mode.sql | 学生端锁定模式 (lock_mode) 与锁定目标 (lock_target) |
52
+ | 034 | 034_plugin_orphan_data.sql | 插件卸载数据语义:孤立插件数据登记表(`plugin_orphan_data`,keep 保留登记 / purge 归档后可清除) |
53
+ | 035 | 035_icebreaker_checkins.sql | 课前破冰心情打卡持久化与去重(`icebreaker_checkins` 表与按学生去重唯一索引) |
54
+ | 036 | 036_student_read_notifications_created_at.sql | 保留策略:为 `student_read_notifications` 补齐 `created_at` 以便按 30 天窗口清理 |
55
+ | 037 | 037_plugin_config_scopes.sql | 插件配置分层:`plugin_config` 表(平台/学校/班级),旧 `plugin_storage` 的 `config:*` 值迁移到平台层 |
56
+ | 038 | 038_assessment_ai_grading_suggestion.sql | AI 辅助批改建议:`assessment_answers.ai_suggestion_json` 存「建议分 + 理由 + 置信度」,与正式分数分开 |
57
+ | 039 | 039_question_bank_sharing_and_papers.sql | 题库共享与按规则随机抽题(每人一卷):`question_bank_items.visibility` 区分 private / school |
58
+ | 040 | 040_assignment_grade_history.sql | 成绩审计与手动分保护:`assignment_grade_history` 记录每次成绩变更的旧/新分数、状态、来源与操作者 |
59
+ | 041 | 041_course_package_idempotency.sql | 课程包导入幂等(G-06):同一包重复导入不再产生重复课程 |
60
+ | 042 | 042_assignment_grade_resubmit_audit.sql | 学生重交审计:`assignment_grade_history` 补 `old_content`,可追溯「这份分数是针对哪份内容给的」 |
61
+ | 043 | 043_mark_sha256_passwords.sql | Issue #227:把仍是无盐 SHA-256 摘要的存量账号标记为 `must_change_password = 1`,强制走既有改密流程(SHA-256 不可逆,无法反推原口令) |
62
+ | 044 | 044_students_gender.sql | 学生性别 `students.gender`(male / female / NULL),供课堂专注力监控头像按性别渲染;历史数据为空,由教师新建时补录 |
63
+ | 045 | 045_ai_providers_owner_and_scope.sql | Issue #383:AI 提供商账号级隔离与共享范围;`ai_providers` 表增加 `owner_id` 与 `is_shared`(0=私有/1=共享)及索引,历史数据平滑回填管理员私有 |
64
+ | 046 | 046_logout_clear_site_data.sql | Issue #487:`site_settings` 表增加 `logout_clear_site_data`(默认 0),支持管理后台按需开启登出时发送 `Clear-Site-Data: "cookies", "storage", "cache"` 响应头 |
65
+ | 047 | 047_third_party_theme_system.sql | Issue #484:第三方主题系统 —— `themes` / `theme_versions` / `user_theme_preferences` 三张表 + `site_settings.default_theme_id`,支撑主题包安装、版本历史、每账号隔离偏好与全站默认主题 |
66
+ | 048 | 048_file_storage_extension.sql | 文件存储扩展架构:`file_blobs`、`file_assets`、`file_aliases` 表,以及 `site_settings.file_storage_config` 与 `plugin_assignment_files.asset_id` 字段 |
67
+ | 049 | 049_ai_personas.sql | AI 助手 Persona 持久化表(`ai_personas`):支持内置与管理员创建的扩展型/替换式角色模板持久化、角色可见性、默认角色绑定、工具策略与最大推理轮次 |
68
+ | 050 | 050_ai_persona_governance.sql | Issue #510:新增 `ai_persona_governance` 扩展表,存储用途说明(`description_zh` / `description_en`)、启停状态(`enabled`)与绑定平台共享 AI 提供商字段(`preferred_provider_id`),支撑后台「AI 配置」全生命周期角色治理 |
69
+ | 051 | 051_community_registry_url.sql | `site_settings` 表增加 `community_registry_url`(默认 NULL),支持在插件中心「社区」标签页动态配置并持久化社区插件注册表 JSON 地址,未设置时回落到环境变量 `PLUGIN_COMMUNITY_REGISTRY_URL` |
70
+ | 052 | 052_community_install_enabled.sql | `site_settings` 表增加 `community_install_enabled`(必须保持 NULL 表示未配置,不可默认写成 0)。管理员可在插件中心「社区」页开关「允许从社区注册表安装」;生效优先级为界面显式 1/0 > 未配置时环境变量 `OPENLEARN_COMMUNITY_INSTALL=1` > 默认关闭。此开关不能绕过签名公钥、权限或网络校验。 |
71
+ | 053 | 053_runtime_admin_policies.sql | `site_settings` 增加 `bridge_hook_telemetry`、`http_access_log_mode`、`http_access_log_ignore`、`http_slow_ms`、`allow_unsigned_plugins`(必须保持 NULL 表示未配置,不可写成默认值)。管理员可在「站点信息设置 → 运行时策略」配置课件网络遥测、HTTP 访问日志(非布尔)与未签名本地插件策略;优先级为界面显式值 > 未配置时环境变量回退 > 历史默认。未签名策略不能绕过签名错误、公钥、网络限制、权限或沙箱。 |
72
+ | 054 | 054_user_onboarding_tour_status.sql | Issue #530:`users` 表增加 `tour_status`(默认 NULL 表示 pending,可选 `'completed'` / `'skipped'`),按账号在服务端持久化新手引导向导完成或跳过状态 |
73
+ | 055 | 055_classroom_collab_whiteboard.sql | 互动课堂小组协作与画廊互评持久化表(`classroom_collab_whiteboards`):按 `lesson_id` 存储各协作小组名单、分组策略、共创 SVG 画布与画廊展示模式状态,支持关闭弹窗与刷新后恢复 |
74
+ | 056 | 056_public_student_lookup.sql | Issue #538:`site_settings` 表增加 `allow_public_student_lookup`(默认 1 开启),控制登录页学生自助端是否允许按姓名/班级公开查询学号(管理员可在站点设置关闭) |
@@ -1,13 +1,32 @@
1
1
  {
2
2
  "_comment": "数据库结构金样(自动生成,勿手改):空库跑完 migrations/ 全部迁移后的表→列快照。启动时 assertSchemaMatchesGolden 以子集校验(实际库缺金样结构即拒绝启动;多出的表/列不报错)。改迁移后请运行 pnpm db:gen-golden 再生成。",
3
- "migrationCount": 46,
4
- "generatedAt": "2026-11-02T16:07:15.878Z",
3
+ "migrationCount": 57,
4
+ "generatedAt": "2026-11-15T12:33:26.414Z",
5
5
  "tables": {
6
6
  "_academic_year_backfill": ["backfilled_at", "id"],
7
7
  "_class_passcode_encryption": ["id", "note"],
8
8
  "_lesson_think_cleanup": ["id", "note"],
9
9
  "_migrations": ["applied_at", "checksum", "name"],
10
10
  "agent_conversations": ["content", "conv_key", "created_at", "id", "role"],
11
+ "ai_persona_governance": ["description_en", "description_zh", "enabled", "persona_id", "preferred_provider_id"],
12
+ "ai_personas": [
13
+ "base_policy",
14
+ "created_at",
15
+ "default_for_role_json",
16
+ "icon",
17
+ "id",
18
+ "instruction_en",
19
+ "instruction_zh",
20
+ "max_turns",
21
+ "mode",
22
+ "name_en",
23
+ "name_zh",
24
+ "plugin_id",
25
+ "source",
26
+ "tool_policy_json",
27
+ "updated_at",
28
+ "visibility_json"
29
+ ],
11
30
  "ai_providers": [
12
31
  "api_key",
13
32
  "api_url",
@@ -167,6 +186,20 @@
167
186
  "winner_student_id",
168
187
  "winner_student_name"
169
188
  ],
189
+ "classroom_collab_whiteboards": [
190
+ "class_id",
191
+ "grouping_strategy",
192
+ "groups_json",
193
+ "id",
194
+ "inquiries_json",
195
+ "lesson_id",
196
+ "likes_json",
197
+ "mission_prompt",
198
+ "spotlight_group_id",
199
+ "strokes_json",
200
+ "updated_at",
201
+ "updated_by"
202
+ ],
170
203
  "classroom_danmaku": [
171
204
  "created_at",
172
205
  "id",
@@ -322,6 +355,22 @@
322
355
  "events": ["correlationId", "id", "lesson_id", "payload", "source", "timestamp", "type"],
323
356
  "exam_scores": ["academic_year", "exam_id", "notes", "recorded_at", "score", "student_id"],
324
357
  "exams": ["academic_year", "class_id", "created_at", "description", "id", "max_score", "title"],
358
+ "file_aliases": ["alias", "asset_id"],
359
+ "file_assets": [
360
+ "access_scope",
361
+ "author_id",
362
+ "blob_id",
363
+ "course_id",
364
+ "created_at",
365
+ "deleted_at",
366
+ "id",
367
+ "lesson_id",
368
+ "metadata_json",
369
+ "mime",
370
+ "original_name",
371
+ "purpose"
372
+ ],
373
+ "file_blobs": ["backend_id", "created_at", "id", "ref_count", "sha256", "size_bytes", "storage_key"],
325
374
  "icebreaker_checkins": [
326
375
  "checkin_date",
327
376
  "class_id",
@@ -374,6 +423,7 @@
374
423
  "mfe_remotes": ["created_at", "entry", "meta", "name", "updated_at"],
375
424
  "pending_commands": ["actor_id", "command_type", "created_at", "id", "payload"],
376
425
  "plugin_assignment_files": [
426
+ "asset_id",
377
427
  "assignment_id",
378
428
  "deleted_at",
379
429
  "id",
@@ -545,9 +595,20 @@
545
595
  "segment_visits": ["entered_at", "id", "left_at", "lesson_id", "segment_id", "student_id"],
546
596
  "site_settings": [
547
597
  "academic_start_month",
598
+ "allow_public_student_lookup",
599
+ "allow_unsigned_plugins",
600
+ "bridge_hook_telemetry",
601
+ "community_install_enabled",
602
+ "community_registry_url",
548
603
  "current_academic_year",
604
+ "default_theme_id",
605
+ "file_storage_config",
606
+ "http_access_log_ignore",
607
+ "http_access_log_mode",
608
+ "http_slow_ms",
549
609
  "id",
550
610
  "logo_url",
611
+ "logout_clear_site_data",
551
612
  "site_name",
552
613
  "slogan",
553
614
  "upload_max_file_mb"
@@ -634,6 +695,40 @@
634
695
  "sort_order",
635
696
  "updated_at"
636
697
  ],
698
+ "theme_versions": [
699
+ "asset_manifest_json",
700
+ "created_at",
701
+ "manifest_json",
702
+ "styles_css",
703
+ "theme_id",
704
+ "uploader_id",
705
+ "version"
706
+ ],
707
+ "themes": [
708
+ "author",
709
+ "created_at",
710
+ "description",
711
+ "id",
712
+ "latest_version",
713
+ "manifest_json",
714
+ "name",
715
+ "platform_max_version",
716
+ "platform_min_version",
717
+ "status",
718
+ "styles_css",
719
+ "supports_modes",
720
+ "updated_at",
721
+ "uploader_id",
722
+ "uploader_name"
723
+ ],
724
+ "user_theme_preferences": [
725
+ "appearance_json",
726
+ "installed_version",
727
+ "mode",
728
+ "principal_key",
729
+ "theme_id",
730
+ "updated_at"
731
+ ],
637
732
  "users": [
638
733
  "avatar",
639
734
  "created_at",
@@ -643,6 +738,7 @@
643
738
  "password_hash",
644
739
  "role",
645
740
  "status",
741
+ "tour_status",
646
742
  "username"
647
743
  ],
648
744
  "vfs_nodes": ["content", "created_at", "id", "name", "parent_id", "type", "updated_at"],