iobroker.eos-admin 7.9.92 → 7.9.93

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 (33) hide show
  1. package/INSTALL_TEST_V7.9.93.md +12 -0
  2. package/NEXOWATT_EOS_BUILD_INFO.json +18 -19
  3. package/{PUBLISH_STABLE_V7.9.92.md → PUBLISH_STABLE_V7.9.93.md} +4 -4
  4. package/README_STABILITY_V7.9.93.md +15 -0
  5. package/RELEASE_ACCEPTANCE_V7.9.93.md +15 -0
  6. package/RELEASE_NOTES_V7.9.93.md +10 -0
  7. package/adminWww/assets/Adapters-B5_jQ7DE-v84.js +1 -1
  8. package/adminWww/css/nexowatt-native-shell.css +154 -2
  9. package/adminWww/index.html +11 -11
  10. package/adminWww/js/eos-account-management.js +1 -1
  11. package/adminWww/js/eos-assistant.js +487 -55
  12. package/adminWww/js/eos-basic-settings.js +1 -1
  13. package/adminWww/js/eos-branding-sanitizer.js +3 -1
  14. package/adminWww/js/eos-native-security.js +1 -1
  15. package/adminWww/js/eos-policy-client.js +1 -1
  16. package/adminWww/js/eos-role-bootstrap.js +2 -2
  17. package/adminWww/js/eos-role-ui.js +1 -1
  18. package/adminWww/js/nexowatt-native-shell.js +1 -1
  19. package/build/lib/chat/assistantKnowledge.js +21 -6
  20. package/build/lib/chat/chatOrchestrator.js +33 -38
  21. package/build/lib/chat/mcpClientManager.js +1 -1
  22. package/build/main.js +307 -1
  23. package/io-package.json +13 -8
  24. package/package.json +9 -9
  25. package/tools/nexowatt-account-management-selftest.cjs +1 -1
  26. package/tools/nexowatt-internal-reserve-selftest.cjs +3 -1
  27. package/tools/nexowatt-login-layout-selftest.cjs +19 -38
  28. package/tools/nexowatt-modern-ui-selftest.cjs +1 -1
  29. package/tools/nexowatt-validate-package.cjs +5 -5
  30. package/INSTALL_TEST_V7.9.92.md +0 -18
  31. package/README_STABILITY_V7.9.92.md +0 -14
  32. package/RELEASE_ACCEPTANCE_V7.9.92.md +0 -12
  33. package/RELEASE_NOTES_V7.9.92.md +0 -17
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iobroker.eos-admin",
3
- "description": "NexoWatt EOS Admin stable product release with compact login, role-safe services and self-healing sales defaults",
4
- "version": "7.9.92",
3
+ "description": "NexoWatt EOS Admin test candidate with compact login, visible NexoWatt publisher and live role-aware EOS Assist",
4
+ "version": "7.9.93",
5
5
  "contributors": [
6
6
  "bluefox <dogafox@gmail.com>",
7
7
  "apollon77",
@@ -111,14 +111,14 @@
111
111
  "tools/nexowatt-account-management-selftest.cjs",
112
112
  "tools/nexowatt-modern-ui-selftest.cjs",
113
113
  "tools/nexowatt-login-layout-selftest.cjs",
114
- "README_STABILITY_V7.9.92.md",
115
- "RELEASE_NOTES_V7.9.92.md",
116
- "PUBLISH_STABLE_V7.9.92.md",
117
- "INSTALL_TEST_V7.9.92.md",
118
- "RELEASE_ACCEPTANCE_V7.9.92.md",
119
114
  "tools/nexowatt-internal-reserve-selftest.cjs",
120
115
  "tools/nexowatt-ensure-release-defaults.cjs",
121
- "tools/nexowatt-release-defaults-selftest.cjs"
116
+ "tools/nexowatt-release-defaults-selftest.cjs",
117
+ "README_STABILITY_V7.9.93.md",
118
+ "RELEASE_NOTES_V7.9.93.md",
119
+ "PUBLISH_STABLE_V7.9.93.md",
120
+ "INSTALL_TEST_V7.9.93.md",
121
+ "RELEASE_ACCEPTANCE_V7.9.93.md"
122
122
  ],
123
123
  "scripts": {
124
124
  "npm": "npm i -f && cd src-admin && npm i -f",
@@ -184,6 +184,6 @@
184
184
  },
185
185
  "nexowattReleasePolicy": {
186
186
  "distTag": "latest",
187
- "purpose": "accepted stable NexoWatt EOS sales-product release 7.9.92"
187
+ "purpose": "test candidate for accepted stable NexoWatt EOS sales-product release 7.9.93"
188
188
  }
189
189
  }
@@ -41,7 +41,7 @@ for (const code of [webSource, webBuilt]) {
41
41
  }
42
42
 
43
43
  for (const marker of [
44
- 'v91-account-management-under-access-rights', "['admin', 'installer']", 'nexowatt/account/manage',
44
+ 'v93-account-management-under-access-rights', "['admin', 'installer']", 'nexowatt/account/manage',
45
45
  'nexowatt/account/reset', 'X-NexoWatt-EOS-Account-Reset', 'data.canResetInstaller === true',
46
46
  "account.role === 'enduser'", 'Admin/Service', 'Installateure', 'NEXOWATT_EOS_ACCOUNT_MANAGEMENT',
47
47
  'ensureEntrySurface', "currentRoute() !== 'tab-users'", 'eos-account-management-entry',
@@ -16,6 +16,7 @@ const role = read('adminWww/js/eos-role-ui.js');
16
16
  const boot = read('adminWww/js/eos-role-bootstrap.js');
17
17
  const drawer = read('src-admin/src/components/Drawer.tsx');
18
18
  const assist = read('adminWww/js/eos-assistant.js');
19
+ const knowledge = read('src/lib/chat/assistantKnowledge.ts');
19
20
  const io = json('io-package.json');
20
21
 
21
22
  for (const code of [mainSource, mainBuilt]) {
@@ -44,7 +45,8 @@ for (const marker of ['isOfficialReserveTab', 'isCustomerBackupTab', 'backitup',
44
45
  for (const marker of ['System-Notfallsicherung', 'NexoWatt Sicherung', '^tab-backitup', 'nexowatt-backup|eos-backup']) {
45
46
  if (!drawer.includes(marker)) fail(`Drawer reserve marker missing: ${marker}`);
46
47
  }
47
- if (!assist.includes('NexoWatt Sicherung') || !assist.includes('System-Notfallsicherung')) fail('EOS Assist backup explanation is incomplete');
48
+ if (!assist.includes('NexoWatt Backup') && !assist.includes('Sicherungsstatus')) fail('EOS Assist runtime lacks backup-system context');
49
+ if (!knowledge.includes('NexoWatt Backup') || !knowledge.includes('Admin/Service')) fail('EOS Assist knowledge lacks role-aware backup context');
48
50
  if (io.native?.eosHideLegacyBackupFromNonAdmins !== true) fail('eosHideLegacyBackupFromNonAdmins must default to true');
49
51
  if (io.native?.nexowattHideLegacyBackupFromNonAdmins !== true) fail('nexowattHideLegacyBackupFromNonAdmins must default to true');
50
52
  const reserve = (io.native?.eosProtectedAdapters || []).find(entry => entry.adapter === 'backitup');
@@ -22,33 +22,23 @@ const shellTag = String(buildInfo.shellCacheTag || buildInfo.shellCacheVersion |
22
22
 
23
23
  if (css !== sourceCss) fail('login CSS source/build drift');
24
24
  if (!css.includes('outer frame is decorative only')) fail('decorative compact-frame contract is missing');
25
- if (css.includes('html.eos-login .MuiPaper-root:has(#username)')) {
26
- fail('broad :has selector still styles the outer login Paper');
27
- }
25
+ if (css.includes('html.eos-login .MuiPaper-root:has(#username)')) fail('broad :has selector still styles the outer login Paper');
28
26
 
29
27
  const outer = css.match(/html\.eos-login main\.MuiPaper-root\s*\{([\s\S]*?)\n\}/)?.[1] || '';
30
- for (const marker of [
31
- 'position: relative',
32
- 'width: 100%',
33
- 'min-height: 100vh',
34
- 'place-items: center',
35
- 'background: transparent !important',
36
- 'box-shadow: none !important',
37
- ]) {
28
+ for (const marker of ['position: relative', 'width: 100%', 'min-height: 100vh', 'place-items: center', 'background: transparent !important', 'box-shadow: none !important']) {
38
29
  if (!outer.includes(marker)) fail(`transparent viewport host rule missing: ${marker}`);
39
30
  }
40
-
41
31
  const decorative = css.match(/html\.eos-login main\.MuiPaper-root::before\s*\{([\s\S]*?)\n\}/)?.[1] || '';
42
- for (const marker of [
43
- "content: ''",
44
- 'width: min(390px, calc(100vw - 24px))',
45
- 'height: min(480px, calc(100vh - 24px))',
46
- 'transform: translate(-50%, -50%)',
47
- 'pointer-events: none',
48
- ]) {
32
+ for (const marker of ["content: ''", 'width: min(390px, calc(100vw - 24px))', 'height: min(480px, calc(100vh - 24px))', 'transform: translate(-50%, -50%)', 'pointer-events: none']) {
49
33
  if (!decorative.includes(marker)) fail(`decorative rear frame rule missing: ${marker}`);
50
34
  }
51
-
35
+ const compactBlocks = [...css.matchAll(/html\.eos-login[^\{]*eos-login-card-modern[^\{]*\{([\s\S]*?)\n\}/g)].map(match => match[1]);
36
+ if (!compactBlocks.length) fail('compact login card CSS block missing');
37
+ for (const block of compactBlocks) {
38
+ if (/overflow\s*:\s*auto\s*!important/.test(block) || /overflow-y\s*:\s*(?:auto|scroll)/.test(block)) {
39
+ fail('compact login card still creates an internal scrollbar');
40
+ }
41
+ }
52
42
  for (const marker of [
53
43
  'html.eos-login main.MuiPaper-root > .eos-login-card-modern',
54
44
  'html.eos-login main.MuiPaper-root > .MuiPaper-root:has(#username)',
@@ -56,26 +46,17 @@ for (const marker of [
56
46
  'width: min(334px, calc(100vw - 56px)) !important',
57
47
  'height: min(424px, calc(100vh - 56px)) !important',
58
48
  'max-height: none !important',
59
- ]) {
60
- if (!css.includes(marker)) fail(`inner compact card rule missing: ${marker}`);
61
- }
62
- if (!css.includes('.eos-login-first-status:empty { display: none; min-height: 0; margin: 0; }')) {
63
- fail('empty first-login status still reserves vertical space');
64
- }
65
-
49
+ 'overflow: hidden !important',
50
+ 'scrollbar-width: none !important',
51
+ '::-webkit-scrollbar',
52
+ ]) if (!css.includes(marker)) fail(`inner compact card rule missing: ${marker}`);
53
+ if (!css.includes('.eos-login-first-status:empty { display: none; min-height: 0; margin: 0; }')) fail('empty first-login status still reserves vertical space');
66
54
  if (!login.includes('Keep the familiar compact login page')) fail('native Login source lacks compact-page contract');
67
- if (login.includes('eos-login-role-selector-native') || login.includes('data-eos-account=')) {
68
- fail('native Login source still renders role-selector buttons');
69
- }
55
+ if (!login.includes("overflowY: 'hidden'")) fail('native Login paper still enables vertical scrolling');
56
+ if (login.includes('eos-login-role-selector-native') || login.includes('data-eos-account=')) fail('native Login source still renders role-selector buttons');
70
57
  if (!bootstrap.includes('compact normal-login first activation')) fail('runtime compact first-login contract missing');
71
- if (!bootstrap.includes("card.querySelectorAll('.eos-login-role-selector').forEach(element => element.remove())")) {
72
- fail('runtime does not remove stale role-selector surfaces');
73
- }
58
+ if (!bootstrap.includes("card.querySelectorAll('.eos-login-role-selector').forEach(element => element.remove())")) fail('runtime does not remove stale role-selector surfaces');
74
59
  if (/data-eos-account=|selector\.innerHTML/.test(bootstrap)) fail('runtime still injects a second role-selector panel');
75
-
76
- if (!shellTag || !index.includes(`nexowatt-native-shell.css?v=${shellTag}`)) {
77
- fail('login CSS cache key is not aligned with build information');
78
- }
79
-
60
+ if (!shellTag || !index.includes(`nexowatt-native-shell.css?v=${shellTag}`)) fail('login CSS cache key is not aligned with build information');
80
61
  if (bad) process.exit(1);
81
62
  console.log('[NexoWatt EOS login layout] OK');
@@ -29,7 +29,7 @@ for (const marker of ['eos-account-management.js','nexowatt-native-shell.css','e
29
29
  for (const marker of ['NexoWatt EOS', 'Zugänge & Rollen', 'Endkunden-Zugänge', 'ensureEntrySurface']) {
30
30
  if (!accountUi.includes(marker)) fail(`modern account surface missing label: ${marker}`);
31
31
  }
32
- for (const marker of ['installIntegratedFirstLogin','v91 compact normal-login first activation','eos-passwordless-card','Idempotent writes are essential here']) {
32
+ for (const marker of ['installIntegratedFirstLogin','v93 compact normal-login first activation','eos-passwordless-card','Idempotent writes are essential here']) {
33
33
  if (!bootstrap.includes(marker)) fail(`integrated first-activation surface missing: ${marker}`);
34
34
  }
35
35
  if (/data-eos-account=|selector\.innerHTML/.test(bootstrap)) fail('compact login still injects role buttons or a second panel');
@@ -103,10 +103,10 @@ for (const file of [
103
103
  'LICENSE',
104
104
  'NEXOWATT_PROPRIETARY_LICENSE.md',
105
105
  'THIRD_PARTY_NOTICES.md',
106
- 'README_STABILITY_V7.9.92.md',
107
- 'PUBLISH_STABLE_V7.9.92.md',
108
- 'INSTALL_TEST_V7.9.92.md',
109
- 'RELEASE_ACCEPTANCE_V7.9.92.md',
106
+ 'README_STABILITY_V7.9.93.md',
107
+ 'PUBLISH_STABLE_V7.9.93.md',
108
+ 'INSTALL_TEST_V7.9.93.md',
109
+ 'RELEASE_ACCEPTANCE_V7.9.93.md',
110
110
  'tools/nexowatt-patch-built-frontend.cjs',
111
111
  'tools/nexowatt-native-shell-selftest.cjs',
112
112
  'tools/nexowatt-clean-legacy-runtime.cjs',
@@ -203,7 +203,7 @@ if (accountManagement.includes("launcher.className = 'eos-account-management-lau
203
203
  if (accountManagement.includes('new MutationObserver')) fail('account-management runtime adds a second broad DOM observer');
204
204
  if (read('src-admin/public/js/eos-account-management.js') !== accountManagement) fail('account-management source/build drift');
205
205
  const roleBootstrap = read('adminWww/js/eos-role-bootstrap.js');
206
- if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('v91 compact normal-login first activation')) fail('compact integrated first-login is incomplete');
206
+ if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('v93 compact normal-login first activation')) fail('compact integrated first-login is incomplete');
207
207
  if (/data-eos-account=|selector\.innerHTML/.test(roleBootstrap)) fail('login role buttons must not enlarge the normal login card');
208
208
  if (!roleBootstrap.includes('nexowatt/account/passwordless-status') || !roleBootstrap.includes('eligibility.allowed')) fail('server-checked first-login eligibility is incomplete');
209
209
  if (roleBootstrap.includes('installPasswordlessFirstLoginLauncher')) fail('old first-login launcher remains active');
@@ -1,18 +0,0 @@
1
- # Installation und Test 7.9.92
2
-
3
- ```bash
4
- cd /opt/iobroker
5
- iobroker backup
6
- iobroker stop eos-admin.0
7
- npm install --no-save --omit=dev iobroker.eos-admin@latest
8
- iobroker upload eos-admin
9
- iobroker restart eos-admin.0
10
- ```
11
-
12
- Version prüfen:
13
-
14
- ```bash
15
- node -p "require('/opt/iobroker/node_modules/iobroker.eos-admin/package.json').version"
16
- ```
17
-
18
- Erwartet: `7.9.92`.
@@ -1,14 +0,0 @@
1
- # NexoWatt EOS Admin 7.9.92
2
-
3
- Stable Verkaufsprodukt-Version. Diese Version übernimmt die Bedien-, Rollen- und Login-Korrekturen aus 7.9.91 und härtet die Release-Vorbereitung.
4
-
5
- Vor Paketprüfung und Veröffentlichung werden folgende verbindliche Standardwerte automatisch gesetzt:
6
-
7
- - Authentifizierung aktiv
8
- - EOS Admin Standardport 8081
9
- - interner Admin nur für Admin/Service
10
- - interne BackItUp-Notfallreserve nur für Admin/Service
11
- - NexoWatt-Backup-Sichtbarkeitskompatibilität aktiv
12
- - Erstpasswort-Pflicht aktiv
13
-
14
- Die Normalisierung verändert keine bestehenden Kundendaten auf einem installierten System; sie betrifft die Paketmetadaten des zu veröffentlichenden Adapters.
@@ -1,12 +0,0 @@
1
- # Release-Abnahme 7.9.92
2
-
3
- - [ ] `npm run check:eos-publish-channel` erfolgreich
4
- - [ ] `npm run check:eos-package` erfolgreich
5
- - [ ] `npm run check:eos-stability` erfolgreich
6
- - [ ] `npm publish --dry-run --tag latest` erfolgreich
7
- - [ ] Admin/Service sieht `admin.0` und `backitup.0`
8
- - [ ] Installateur und Endkunde sehen `admin.0` und `backitup.0` nicht
9
- - [ ] NexoWatt Backup bleibt rollenabhängig erreichbar
10
- - [ ] Login und Erstanmeldung funktionieren
11
- - [ ] Standardport 8081
12
- - [ ] Reboot- und Rollbacktest erfolgreich
@@ -1,17 +0,0 @@
1
- # Release Notes – NexoWatt EOS Admin 7.9.92
2
-
3
- ## Behoben
4
-
5
- - Der npm-Publish konnte in einem älteren oder unvollständig aktualisierten Arbeitsordner mit `internal backup reserve must default to Admin/Service visibility` abbrechen.
6
- - Ein neuer Release-Default-Schritt stellt die beiden Backup-Reserve-Flags vor allen relevanten Prüfungen automatisch auf den verbindlichen sicheren Wert `true`.
7
- - Eine eigene Regression prüft fehlende, falsche und bereits korrekte Werte.
8
-
9
- ## Unverändert
10
-
11
- - Standardport 8081
12
- - npm-Dist-Tag `latest`
13
- - Admin-/BackItUp-Notfallreserve nur für Admin/Service
14
- - NexoWatt Sicherung entsprechend Rollenfreigabe
15
- - kompakte Anmeldung und Erstaktivierung
16
- - klickbare Installer-/Endkundenübersicht
17
- - EOS Assist im Header