Release Lumi 1.2.0

This commit is contained in:
Franz Rolfsvaag 2026-07-18 03:06:58 +02:00
parent abc1760df7
commit c91761500e
42 changed files with 293 additions and 47 deletions

11
CHANGELOG.md Normal file
View File

@ -0,0 +1,11 @@
# Lumi changelog
## 1.2.0
- Added the OBS overlay management and Browser Source system, including scenes, live updates, visual editing, multimedia, external web sources, and OBS bridge extension points.
- Added the role-gated Open Knowledge Foundation plugin with file-backed community/correction knowledge, generated reference material, administration workflows, and Lumi AI retrieval.
- Made Lumi AI OKF-first, improved conversational grounding and fast replies, hardened read-only web-search sourcing, and expanded controller, diagnostics, feedback, and runtime management behavior.
- Added shared placeholder, upload-security, WebUI authentication, destructive-confirmation, safe-file, feedback, and user-lookup capabilities reused across core and plugins.
- Improved update safety with compressed snapshots, model/runtime exclusions, retention controls, transactional replacement, rollback recovery, and preserved local data.
- Added the OBS, OKF, command-list, update, settings, feedback, and repository-wide responsive UI/UX improvements included in this release.
- Added focused verification for WebUI, authentication, feedback, placeholders, uploads, updates, OKF, Lumi AI, destructive actions, overlays, and webhooks.

View File

@ -679,6 +679,7 @@ This section is for Lumi chat answer feedback and AI Improvement Center work, no
### 2026-07-18 ### 2026-07-18
- 2026-07-18: Published Lumi Core 1.2.0 release metadata with a safe compatibility bridge from 0.1.9, patch-bumped all changed plugin/tool packages, added core and package-specific changelogs, synchronized generated OKF version references, and added release-metadata verification.
- 2026-07-18: Fixed community OKF discovery end-to-end: Community Knowledge now lists and opens visible file-backed community entries alongside general entries, keeps admin-only files role-filtered, tolerates a single-character name typo such as `jejee`/`Jejeee`, and carries the earlier user subject into explicit OKF follow-ups without treating previous assistant text as evidence. - 2026-07-18: Fixed community OKF discovery end-to-end: Community Knowledge now lists and opens visible file-backed community entries alongside general entries, keeps admin-only files role-filtered, tolerates a single-character name typo such as `jejee`/`Jejeee`, and carries the earlier user subject into explicit OKF follow-ups without treating previous assistant text as evidence.
- 2026-07-18: Made Lumi AI OKF-first: role-filtered OKF retrieval now precedes normal gate routing, the fast model can answer sufficient local facts, verified link questions return exact OKF URLs, early context is reused instead of searched twice, and Web Search is unavailable whenever the fast gate confirms OKF is sufficient. - 2026-07-18: Made Lumi AI OKF-first: role-filtered OKF retrieval now precedes normal gate routing, the fast model can answer sufficient local facts, verified link questions return exact OKF URLs, early context is reused instead of searched twice, and Web Search is unavailable whenever the fast gate confirms OKF is sufficient.
- 2026-07-18: Improved fast OKF reply quality: compact evidence now preserves useful roles, relationships, aliases, activities, and channel names; one-word or incomplete identity replies are rejected; grounded terse drafts receive one bounded fast-model rewrite; and relationship follow-ups must explicitly answer the requested relationship before bypassing the main model. - 2026-07-18: Improved fast OKF reply quality: compact evidence now preserves useful roles, relationships, aliases, activities, and channel names; one-word or incomplete identity replies are rejected; grounded terse drafts receive one bounded fast-model rewrite; and relationship follow-ups must explicitly answer the requested relationship before bypassing the main model.

View File

@ -41,6 +41,13 @@ Useful metadata fields include `version`, `channel`, `compatible_from`,
`migration_kind`, `migration_notes`, `rollback_safe`, `requirements`, `size`, `migration_kind`, `migration_notes`, `rollback_safe`, `requirements`, `size`,
and changelog entries. Missing changelog data is shown as a warning. and changelog entries. Missing changelog data is shown as a warning.
Stable core releases keep `package.json`, `package-lock.json`,
`update-manifest.json`, and the matching `CHANGELOG.md` heading synchronized.
Changed plugins use their `plugin.json` version and a matching plugin
`CHANGELOG.md`; Lumi AI tools use `tool_info.json` and their own changelog.
`scripts/verify-release-metadata.js` checks those relationships, compatibility
metadata, and generated OKF version references before publication.
Stable checks read `main` by default. The newest `experimental-*` branch is used Stable checks read `main` by default. The newest `experimental-*` branch is used
only when explicitly selected on the updates page. only when explicitly selected on the updates page.

View File

@ -14,7 +14,7 @@ editable: false
Lumi is the core web UI and bot runtime. Lumi is the core web UI and bot runtime.
## Runtime ## Runtime
Package: lumi-bot Package: lumi-bot
Version: 0.1.9 Version: 1.2.0
## Routes ## Routes
- GET /api/events - GET /api/events
- POST /api/destructive-confirmations - POST /api/destructive-confirmations

View File

@ -14,7 +14,7 @@ editable: false
Auto-create managed voice channels from lobby rooms. Auto-create managed voice channels from lobby rooms.
## Metadata ## Metadata
Plugin ID: auto-vc Plugin ID: auto-vc
Version: 0.1.5 Version: 0.1.6
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/auto-vc - /plugins/auto-vc

View File

@ -14,7 +14,7 @@ editable: false
Birthday profiles, announcements, lookup commands, and optional birthday currency gifts. Birthday profiles, announcements, lookup commands, and optional birthday currency gifts.
## Metadata ## Metadata
Plugin ID: birthday Plugin ID: birthday
Version: 0.1.2 Version: 0.1.3
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/birthday - /plugins/birthday

View File

@ -14,7 +14,7 @@ editable: false
Cross-platform currency framework with shared balances and extensible hooks. Cross-platform currency framework with shared balances and extensible hooks.
## Metadata ## Metadata
Plugin ID: economy-framework Plugin ID: economy-framework
Version: 0.2.9 Version: 0.2.10
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/economy-framework - /plugins/economy-framework

View File

@ -14,7 +14,7 @@ editable: false
Express yourself through interactions with other users, such as hugging, bonking, comforting, etc Express yourself through interactions with other users, such as hugging, bonking, comforting, etc
## Metadata ## Metadata
Plugin ID: expression-interaction Plugin ID: expression-interaction
Version: 0.2.0 Version: 0.2.1
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/expression-interaction - /plugins/expression-interaction

View File

@ -14,7 +14,7 @@ editable: false
Managed local AI provider and scoped WebUI assistant for Lumi. Managed local AI provider and scoped WebUI assistant for Lumi.
## Metadata ## Metadata
Plugin ID: lumi_ai Plugin ID: lumi_ai
Version: 0.8.1 Version: 0.8.2
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/lumi_ai - /plugins/lumi_ai

View File

@ -14,7 +14,7 @@ editable: false
Cross-platform moderation actions, notes, and sanctions. Cross-platform moderation actions, notes, and sanctions.
## Metadata ## Metadata
Plugin ID: moderation Plugin ID: moderation
Version: 0.1.4 Version: 0.1.5
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/moderation - /plugins/moderation

View File

@ -14,7 +14,7 @@ editable: false
Role-gated knowledge, facts, and Q&A entries for Lumi communities. Role-gated knowledge, facts, and Q&A entries for Lumi communities.
## Metadata ## Metadata
Plugin ID: okf Plugin ID: okf
Version: 0.1.0 Version: 0.1.1
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/okf - /plugins/okf

View File

@ -14,7 +14,7 @@ editable: false
Store, search, and manage community quotes. Store, search, and manage community quotes.
## Metadata ## Metadata
Plugin ID: quotes Plugin ID: quotes
Version: 0.1.1 Version: 0.1.2
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/quotes - /plugins/quotes

View File

@ -14,7 +14,7 @@ editable: false
Throne wishlist webhook integration with verified payloads, debug viewer, and cross-platform event messages. Throne wishlist webhook integration with verified payloads, debug viewer, and cross-platform event messages.
## Metadata ## Metadata
Plugin ID: throne_wishlist Plugin ID: throne_wishlist
Version: 0.1.1 Version: 0.1.2
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/throne_wishlist - /plugins/throne_wishlist

View File

@ -14,7 +14,7 @@ editable: false
Randomized Discord welcome and welcome-back messages with safe pronoun preferences. Randomized Discord welcome and welcome-back messages with safe pronoun preferences.
## Metadata ## Metadata
Plugin ID: welcome_messages Plugin ID: welcome_messages
Version: 0.1.0 Version: 0.1.1
Default state: enabled Default state: enabled
## Web Routes ## Web Routes
- /plugins/welcome_messages - /plugins/welcome_messages

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "lumi-bot", "name": "lumi-bot",
"version": "0.1.9", "version": "1.2.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "lumi-bot", "name": "lumi-bot",
"version": "0.1.9", "version": "1.2.0",
"dependencies": { "dependencies": {
"adm-zip": "^0.5.12", "adm-zip": "^0.5.12",
"better-sqlite3": "^11.5.0", "better-sqlite3": "^11.5.0",

View File

@ -1,6 +1,6 @@
{ {
"name": "lumi-bot", "name": "lumi-bot",
"version": "0.1.9", "version": "1.2.0",
"private": true, "private": true,
"type": "commonjs", "type": "commonjs",
"scripts": { "scripts": {

View File

@ -0,0 +1,6 @@
# Auto VC changelog
## 0.1.6
- Connected lobby deletion to the shared timed-confirmation flow.
- Improved settings actions and deletion guidance without changing existing lobby data.

View File

@ -1,7 +1,11 @@
{ {
"id": "auto-vc", "id": "auto-vc",
"name": "Auto VC", "name": "Auto VC",
"version": "0.1.5", "version": "0.1.6",
"description": "Auto-create managed voice channels from lobby rooms.", "description": "Auto-create managed voice channels from lobby rooms.",
"main": "index.js" "main": "index.js",
} "channel": "stable",
"compatible_from": "0.1.5",
"migration_notes": "No manual migration is required.",
"rollback_safe": true
}

View File

@ -0,0 +1,6 @@
# Birthday changelog
## 0.1.3
- Clarified gift, leap-day, channel, and date wording in the administration UI.
- Connected birthday and message-template removal to shared confirmation controls and improved action styling.

View File

@ -1,7 +1,11 @@
{ {
"id": "birthday", "id": "birthday",
"name": "Birthday", "name": "Birthday",
"version": "0.1.2", "version": "0.1.3",
"description": "Birthday profiles, announcements, lookup commands, and optional birthday currency gifts.", "description": "Birthday profiles, announcements, lookup commands, and optional birthday currency gifts.",
"main": "index.js" "main": "index.js",
"channel": "stable",
"compatible_from": "0.1.2",
"migration_notes": "No manual migration is required.",
"rollback_safe": true
} }

View File

@ -0,0 +1,7 @@
# Economy Framework changelog
## 0.2.10
- Added shared linked-account user lookup to transfers and administrative balance adjustments.
- Hardened currency-icon uploads with shared type, size, and cleanup validation.
- Connected destructive reward actions to shared confirmation controls and streamlined banking/settings layouts.

View File

@ -1,7 +1,11 @@
{ {
"id": "economy-framework", "id": "economy-framework",
"name": "Economy Framework", "name": "Economy Framework",
"version": "0.2.9", "version": "0.2.10",
"description": "Cross-platform currency framework with shared balances and extensible hooks.", "description": "Cross-platform currency framework with shared balances and extensible hooks.",
"main": "index.js" "main": "index.js",
"channel": "stable",
"compatible_from": "0.2.9",
"migration_notes": "Existing accounts and balances are retained; no manual migration is required.",
"rollback_safe": true
} }

View File

@ -0,0 +1,6 @@
# Expression Interaction changelog
## 0.2.1
- Connected expression archival to the shared confirmation flow.
- Improved action placement and visual consistency with the Lumi WebUI.

View File

@ -1,7 +1,11 @@
{ {
"id": "expression-interaction", "id": "expression-interaction",
"name": "Expression Interaction", "name": "Expression Interaction",
"version": "0.2.0", "version": "0.2.1",
"description": "Express yourself through interactions with other users, such as hugging, bonking, comforting, etc", "description": "Express yourself through interactions with other users, such as hugging, bonking, comforting, etc",
"main": "index.js" "main": "index.js",
} "channel": "stable",
"compatible_from": "0.2.0",
"migration_notes": "No manual migration is required.",
"rollback_safe": true
}

View File

@ -0,0 +1,9 @@
# Lumi AI changelog
## 0.8.2
- Added OKF-first, role-aware retrieval with compact fast-model answers, conversational subject resolution, deterministic verified links, and main-model fallback when local evidence is insufficient.
- Added controller-directed response modes, retrieval depth, output sizing, lifecycle metrics, grouped work history, and richer diagnostics.
- Hardened Web Search tool exposure and source grounding so external lookup is used only when relevant local knowledge is insufficient.
- Improved runtime/model installation, hardware guidance, failure recovery, tool management, feedback/correction workflows, and settings usability.
- Preserved local models, runtimes, settings, metrics, feedback, and tool data during updates and snapshots.

View File

@ -1,7 +1,11 @@
{ {
"id": "lumi_ai", "id": "lumi_ai",
"name": "Lumi AI", "name": "Lumi AI",
"version": "0.8.1", "version": "0.8.2",
"description": "Managed local AI provider and scoped WebUI assistant for Lumi.", "description": "Managed local AI provider and scoped WebUI assistant for Lumi.",
"main": "index.js" "main": "index.js",
"channel": "stable",
"compatible_from": "0.8.1",
"migration_notes": "Existing models, runtimes, settings, feedback, metrics, and tool data are retained. No manual migration is required.",
"rollback_safe": true
} }

View File

@ -0,0 +1,6 @@
# Lumi AI Web Search changelog
## 0.1.1
- Aligned compatibility metadata with Lumi 1.2.0 and Lumi AI 0.8.2.
- Added integration verification for OKF-first tool exposure and grounded source handling.

View File

@ -20,6 +20,9 @@ const { ToolLoader } = require("../../lumi_ai/backend/tool_loader");
const { ToolManager } = require("../../lumi_ai/backend/tool_manager"); const { ToolManager } = require("../../lumi_ai/backend/tool_manager");
const { ToolSettings } = require("../../lumi_ai/backend/tool_settings"); const { ToolSettings } = require("../../lumi_ai/backend/tool_settings");
const { buildPrompt } = require("../../lumi_ai/backend/prompt_builder"); const { buildPrompt } = require("../../lumi_ai/backend/prompt_builder");
const corePackage = require("../../../package.json");
const lumiAiManifest = require("../../lumi_ai/plugin.json");
const toolMetadata = require("../tool_info.json");
const plugin = require("../index"); const plugin = require("../index");
const PUBLIC_DNS = async () => ["93.184.216.34"]; const PUBLIC_DNS = async () => ["93.184.216.34"];
@ -378,8 +381,8 @@ async function verifyLoaderLifecycle() {
installer, installer,
settings: { getSetting: (_key, fallback) => fallback }, settings: { getSetting: (_key, fallback) => fallback },
stateFile: path.join(root, "enabled.json"), stateFile: path.join(root, "enabled.json"),
lumiAiVersion: "0.8.1", lumiAiVersion: lumiAiManifest.version,
lumiVersion: "0.1.0" lumiVersion: corePackage.version
}); });
await loader.loadEnabled(); await loader.loadEnabled();
assert.equal(fs.existsSync(path.join(toolDir, "data", "settings.json")), true); assert.equal(fs.existsSync(path.join(toolDir, "data", "settings.json")), true);
@ -490,8 +493,8 @@ function verifyRegistrationAndPrompt() {
function verifyStaticFiles() { function verifyStaticFiles() {
const root = path.resolve(__dirname, ".."); const root = path.resolve(__dirname, "..");
const metadata = require("../tool_info.json"); const metadata = toolMetadata;
assert.equal(metadata.version, "0.1.0"); assert.equal(metadata.version, "0.1.1");
assert.equal(metadata.settings_schema.provider.default, "lumi_search_broker"); assert.equal(metadata.settings_schema.provider.default, "lumi_search_broker");
assert.equal(metadata.settings_schema.policy_mode.default, "blacklist"); assert.equal(metadata.settings_schema.policy_mode.default, "blacklist");
assert.equal(metadata.default_enabled, true); assert.equal(metadata.default_enabled, true);

View File

@ -3,7 +3,7 @@
"tool_namespace": "web_search", "tool_namespace": "web_search",
"name": "lumi_ai_web_search", "name": "lumi_ai_web_search",
"display_name": "Lumi AI Web Search", "display_name": "Lumi AI Web Search",
"version": "0.1.0", "version": "0.1.1",
"description": "Self-contained, policy-controlled public web search and safe URL extraction for Lumi Assistant. The default provider requires no API key or external service setup.", "description": "Self-contained, policy-controlled public web search and safe URL extraction for Lumi Assistant. The default provider requires no API key or external service setup.",
"scope": { "scope": {
"label": "Assistant public web lookup", "label": "Assistant public web lookup",
@ -75,8 +75,8 @@
], ],
"status_file": "data/status.json", "status_file": "data/status.json",
"dependencies": [], "dependencies": [],
"minimum_lumi_version": "0.1.0", "minimum_lumi_version": "1.2.0",
"minimum_lumi_ai_version": "0.8.1", "minimum_lumi_ai_version": "0.8.2",
"required_plugins": [ "required_plugins": [
"core", "core",
"lumi_ai" "lumi_ai"
@ -93,7 +93,7 @@
"preserve_on_update": [ "preserve_on_update": [
"data" "data"
], ],
"update_notes": "Adds a self-contained no-key search broker plus independent search, fetch URL, and summarize URL capabilities.", "update_notes": "Aligns Web Search with Lumi 1.2.0 and Lumi AI 0.8.2 OKF-first routing, source grounding, and tool-exposure verification.",
"author": "Lumi", "author": "Lumi",
"homepage": "https://git.rolfsvaag.no/Rolfsvaag_Datateknikk/Lumi", "homepage": "https://git.rolfsvaag.no/Rolfsvaag_Datateknikk/Lumi",
"repository_path": "plugins/lumi_ai_web_search", "repository_path": "plugins/lumi_ai_web_search",

View File

@ -0,0 +1,8 @@
# Moderation Center changelog
## 0.1.5
- Added shared linked-account user lookup for moderation targets.
- Hardened evidence uploads with bounded image validation, cleanup, and safe downloads.
- Added administrator note deletion and connected destructive moderation actions to shared confirmation controls.
- Streamlined moderation and sanctions layouts while retaining existing records.

View File

@ -1,7 +1,11 @@
{ {
"id": "moderation", "id": "moderation",
"name": "Moderation Center", "name": "Moderation Center",
"version": "0.1.4", "version": "0.1.5",
"description": "Cross-platform moderation actions, notes, and sanctions.", "description": "Cross-platform moderation actions, notes, and sanctions.",
"main": "index.js" "main": "index.js",
} "channel": "stable",
"compatible_from": "0.1.4",
"migration_notes": "Existing moderation records are retained; no manual migration is required.",
"rollback_safe": true
}

8
plugins/okf/CHANGELOG.md Normal file
View File

@ -0,0 +1,8 @@
# OKF Knowledge changelog
## 0.1.1
- Added role-gated database and Markdown-backed knowledge with user, moderator, and administrator visibility controls.
- Added community and correction files, generated core/plugin references, placeholders, version history, administration workflows, search/filtering, and Markdown preview.
- Added relevance-ranked Lumi AI context, typo-tolerant identity retrieval, combined file/database ranking, and permission-safe community browsing.
- Preserved authored community and correction knowledge during repository and plugin updates.

View File

@ -1,7 +1,11 @@
{ {
"id": "okf", "id": "okf",
"name": "OKF Knowledge", "name": "OKF Knowledge",
"version": "0.1.0", "version": "0.1.1",
"description": "Role-gated knowledge, facts, and Q&A entries for Lumi communities.", "description": "Role-gated knowledge, facts, and Q&A entries for Lumi communities.",
"main": "index.js" "main": "index.js",
"channel": "stable",
"compatible_from": "0.1.0",
"migration_notes": "Published database entries and local community/correction knowledge files are retained. No manual migration is required.",
"rollback_safe": true
} }

View File

@ -0,0 +1,6 @@
# Quotes changelog
## 0.1.2
- Connected quote archival to the shared confirmation flow.
- Aligned quote actions with the shared Lumi WebUI styling.

View File

@ -1,7 +1,11 @@
{ {
"id": "quotes", "id": "quotes",
"name": "Quotes", "name": "Quotes",
"version": "0.1.1", "version": "0.1.2",
"description": "Store, search, and manage community quotes.", "description": "Store, search, and manage community quotes.",
"main": "index.js" "main": "index.js",
} "channel": "stable",
"compatible_from": "0.1.1",
"migration_notes": "Existing quotes are retained; no manual migration is required.",
"rollback_safe": true
}

View File

@ -0,0 +1,7 @@
# Throne Wishlist changelog
## 0.1.2
- Added scoped double-brace placeholders and shared placeholder validation for event messages.
- Preserved legacy single-brace rendering for existing templates while guiding new templates to namespaced placeholders.
- Improved placeholder documentation, template safety, and administration UI consistency.

View File

@ -1,7 +1,11 @@
{ {
"id": "throne_wishlist", "id": "throne_wishlist",
"name": "Throne Wishlist", "name": "Throne Wishlist",
"version": "0.1.1", "version": "0.1.2",
"description": "Throne wishlist webhook integration with verified payloads, debug viewer, and cross-platform event messages.", "description": "Throne wishlist webhook integration with verified payloads, debug viewer, and cross-platform event messages.",
"main": "index.js" "main": "index.js",
"channel": "stable",
"compatible_from": "0.1.1",
"migration_notes": "Existing webhook settings, secrets, and event history are retained. No manual migration is required.",
"rollback_safe": true
} }

View File

@ -0,0 +1,6 @@
# Welcome Messages changelog
## 0.1.1
- Improved welcome-message action placement and visual consistency with shared Lumi controls.
- Retained existing welcome-message configuration and behavior.

View File

@ -1,7 +1,11 @@
{ {
"id": "welcome_messages", "id": "welcome_messages",
"name": "Welcome Messages", "name": "Welcome Messages",
"version": "0.1.0", "version": "0.1.1",
"description": "Randomized Discord welcome and welcome-back messages with safe pronoun preferences.", "description": "Randomized Discord welcome and welcome-back messages with safe pronoun preferences.",
"main": "index.js" "main": "index.js",
} "channel": "stable",
"compatible_from": "0.1.0",
"migration_notes": "Existing welcome-message configuration is retained; no manual migration is required.",
"rollback_safe": true
}

View File

@ -9,6 +9,7 @@ const checks = [
"scripts/verify-web-auth.js", "scripts/verify-web-auth.js",
"scripts/verify-feedback-system.js", "scripts/verify-feedback-system.js",
"scripts/verify-placeholders.js", "scripts/verify-placeholders.js",
"scripts/verify-release-metadata.js",
"scripts/verify-plugin-update-preserves-data.js", "scripts/verify-plugin-update-preserves-data.js",
"scripts/verify-safe-files.js", "scripts/verify-safe-files.js",
"scripts/verify-upload-security.js", "scripts/verify-upload-security.js",

View File

@ -0,0 +1,82 @@
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const { findSafeTarget } = require("../src/services/versioning");
const root = path.join(__dirname, "..");
const releaseVersion = "1.2.0";
const previousCoreVersion = "0.1.9";
const changedPlugins = {
"auto-vc": { from: "0.1.5", to: "0.1.6", knowledge: "auto-vc" },
birthday: { from: "0.1.2", to: "0.1.3", knowledge: "birthday" },
"economy-framework": { from: "0.2.9", to: "0.2.10", knowledge: "economy-framework" },
"expression-interaction": { from: "0.2.0", to: "0.2.1", knowledge: "expression-interaction" },
lumi_ai: { from: "0.8.1", to: "0.8.2", knowledge: "lumi-ai" },
moderation: { from: "0.1.4", to: "0.1.5", knowledge: "moderation" },
okf: { from: "0.1.0", to: "0.1.1", knowledge: "okf" },
quotes: { from: "0.1.1", to: "0.1.2", knowledge: "quotes" },
throne_wishlist: { from: "0.1.1", to: "0.1.2", knowledge: "throne-wishlist" },
welcome_messages: { from: "0.1.0", to: "0.1.1", knowledge: "welcome-messages" }
};
function readJson(relativePath) {
return JSON.parse(fs.readFileSync(path.join(root, relativePath), "utf8"));
}
function readText(relativePath) {
return fs.readFileSync(path.join(root, relativePath), "utf8");
}
function escapeRegex(value) {
return String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function hasVersionHeading(markdown, version) {
return new RegExp(`^#{1,3}\\s+\\[?v?${escapeRegex(version)}\\]?(?:\\s|$)`, "m").test(markdown);
}
const packageJson = readJson("package.json");
const packageLock = readJson("package-lock.json");
const coreManifest = readJson("update-manifest.json");
assert.equal(packageJson.version, releaseVersion);
assert.equal(packageLock.version, releaseVersion);
assert.equal(packageLock.packages?.[""]?.version, releaseVersion);
assert.equal(coreManifest.version, releaseVersion);
assert.equal(coreManifest.channel, "stable");
assert.equal(coreManifest.compatible_from, previousCoreVersion);
assert.equal(coreManifest.rollback_safe, true);
assert.equal(hasVersionHeading(readText("CHANGELOG.md"), releaseVersion), true);
assert.match(readText("knowledge/core/lumi-core.md"), new RegExp(`^Version: ${escapeRegex(releaseVersion)}$`, "m"));
const safeCoreTarget = findSafeTarget(previousCoreVersion, [
...(Array.isArray(coreManifest.versions) ? coreManifest.versions : []),
coreManifest
]);
assert.equal(safeCoreTarget.blocked, false);
assert.equal(safeCoreTarget.target?.version, releaseVersion);
for (const [pluginId, expected] of Object.entries(changedPlugins)) {
const manifest = readJson(`plugins/${pluginId}/plugin.json`);
assert.equal(manifest.version, expected.to, `${pluginId} manifest version`);
assert.equal(manifest.compatible_from, expected.from, `${pluginId} compatible_from`);
assert.equal(manifest.channel, "stable", `${pluginId} release channel`);
assert.equal(manifest.rollback_safe, true, `${pluginId} rollback metadata`);
assert.equal(
hasVersionHeading(readText(`plugins/${pluginId}/CHANGELOG.md`), expected.to),
true,
`${pluginId} changelog heading`
);
assert.match(
readText(`knowledge/plugins/${expected.knowledge}.md`),
new RegExp(`^Version: ${escapeRegex(expected.to)}$`, "m"),
`${pluginId} generated knowledge version`
);
}
const webSearch = readJson("plugins/lumi_ai_web_search/tool_info.json");
assert.equal(webSearch.version, "0.1.1");
assert.equal(webSearch.minimum_lumi_version, releaseVersion);
assert.equal(webSearch.minimum_lumi_ai_version, changedPlugins.lumi_ai.to);
assert.equal(hasVersionHeading(readText("plugins/lumi_ai_web_search/CHANGELOG.md"), webSearch.version), true);
console.log("Release metadata verification passed: core 1.2.0 and 11 changed plugin/tool packages.");

26
update-manifest.json Normal file
View File

@ -0,0 +1,26 @@
{
"name": "Lumi Core",
"version": "1.2.0",
"channel": "stable",
"released_at": "2026-07-18",
"compatible_from": "0.1.9",
"compatibility_bridge": true,
"migration_kind": "compatibility_bridge",
"migration_notes": "Lumi performs required database and generated-knowledge migrations automatically. Local configuration, plugin data, community knowledge, AI models, runtimes, uploads, logs, and secrets remain preserved.",
"rollback_safe": true,
"requirements": [
"Node.js 18 or newer"
],
"versions": [
{
"version": "1.2.0",
"channel": "stable",
"released_at": "2026-07-18",
"compatible_from": "0.1.9",
"compatibility_bridge": true,
"migration_kind": "compatibility_bridge",
"rollback_safe": true,
"migration_notes": "Automatic migrations only; preserved local data is not replaced."
}
]
}