@sleep2agi/agent-network-dashboard 0.5.3-preview.186 → 0.5.3-preview.188

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 (143) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +5 -5
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/admin.html +1 -1
  21. package/.next/server/app/admin.rsc +1 -1
  22. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  28. package/.next/server/app/index.html +2 -2
  29. package/.next/server/app/index.rsc +2 -2
  30. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/login.html +2 -2
  37. package/.next/server/app/login.rsc +2 -2
  38. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  44. package/.next/server/app/logs.html +1 -1
  45. package/.next/server/app/logs.rsc +1 -1
  46. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  52. package/.next/server/app/messages.html +1 -1
  53. package/.next/server/app/messages.rsc +1 -1
  54. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  60. package/.next/server/app/node.html +1 -1
  61. package/.next/server/app/node.rsc +1 -1
  62. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  68. package/.next/server/app/nodes.html +1 -1
  69. package/.next/server/app/nodes.rsc +1 -1
  70. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  76. package/.next/server/app/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/server-logs.html +1 -1
  78. package/.next/server/app/server-logs.rsc +1 -1
  79. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  85. package/.next/server/app/settings/networks.html +1 -1
  86. package/.next/server/app/settings/networks.rsc +1 -1
  87. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  94. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/settings/tokens.html +1 -1
  96. package/.next/server/app/settings/tokens.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  104. package/.next/server/app/settings.html +2 -2
  105. package/.next/server/app/settings.rsc +2 -2
  106. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  111. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/tasks.html +1 -1
  113. package/.next/server/app/tasks.rsc +1 -1
  114. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  120. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  121. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  123. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  126. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  127. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  128. package/.next/server/middleware-build-manifest.js +3 -3
  129. package/.next/server/pages/404.html +1 -1
  130. package/.next/server/pages/500.html +1 -1
  131. package/.next/static/chunks/{07py_zy_er3i~.js → 0..6a1jzwijd5.js} +3 -3
  132. package/.next/static/chunks/{0s9~nswsqvevm.js → 01f8g_ktr-98g.js} +1 -1
  133. package/.next/static/chunks/{0sxiu57k8epp7.js → 08equ99sf9htj.js} +1 -1
  134. package/.next/static/chunks/{0slaeid2yti61.js → 148q~v23p6v23.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +66 -4
  138. package/package.json +1 -1
  139. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  140. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  141. /package/.next/static/{RFt0RLWCI45qxmhQraHjM → XoMSWuAAT14npNaWjLHA9}/_buildManifest.js +0 -0
  142. /package/.next/static/{RFt0RLWCI45qxmhQraHjM → XoMSWuAAT14npNaWjLHA9}/_clientMiddlewareManifest.js +0 -0
  143. /package/.next/static/{RFt0RLWCI45qxmhQraHjM → XoMSWuAAT14npNaWjLHA9}/_ssgManifest.js +0 -0
@@ -0,0 +1,95 @@
1
+ /* Round 674 — chrome Layout Ring/Grid toggle pair gain multi-layer
2
+ * halo on hover via new hoveredLayout state ('ring'|'grid'|null).
3
+ * Pre-R674 these buttons had only Tailwind hover:brightness-[1.15]
4
+ * (R597). Post-R674 inline filter uses the same 2+4 stride at pal.
5
+ * legendAccent tint as R667/R668/R673 chrome-control siblings,
6
+ * completing the chrome toggle-controls family closure.
7
+ *
8
+ * 33rd anchor in multi-layer halo family (paired sibling extension).
9
+ *
10
+ * Source assertions:
11
+ * - useState<'ring'|'grid'|null>
12
+ * - both buttons' onMouseEnter/Leave wired with value-typed setter
13
+ * - both inline filters use pal.legendAccent 2+4 stride alpha 80/40
14
+ * - data-topo-chrome-layout-{ring,grid}-halo-layers attrs toggle '2'/'0'
15
+ *
16
+ * Runtime assertions:
17
+ * - both buttons present in DOM
18
+ * - rest state: halo-layers='0' on both
19
+ */
20
+ import { chromium } from 'playwright';
21
+ import { readFileSync } from 'node:fs';
22
+
23
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
24
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
25
+
26
+ const browser = await chromium.launch({ headless: true });
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try {
31
+ localStorage.setItem('anet-theme', 'cyber');
32
+ localStorage.setItem('anet-topo-layout', 'ring');
33
+ sessionStorage.setItem('anet_v3_auth', '1');
34
+ } catch {}
35
+ });
36
+ await ctx.route('**/api/hub/status*', async (route) => {
37
+ const r = await route.fetch();
38
+ const b = await r.json();
39
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
40
+ const mk = (alias) => ({
41
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
42
+ network_id: nid, project_dir: null,
43
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
44
+ });
45
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
46
+ });
47
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
48
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
49
+ const page = await ctx.newPage();
50
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
51
+ await page.waitForSelector('[data-topo-chrome-layout-ring-halo-layers]', { timeout: 15000, state: 'attached' });
52
+ await page.waitForTimeout(500);
53
+
54
+ const restState = await page.evaluate(() => {
55
+ const ring = document.querySelector('[data-topo-chrome-layout="ring"]');
56
+ const grid = document.querySelector('[data-topo-chrome-layout="grid"]');
57
+ return {
58
+ ring_present: !!ring,
59
+ grid_present: !!grid,
60
+ ring_layers: ring?.getAttribute('data-topo-chrome-layout-ring-halo-layers'),
61
+ grid_layers: grid?.getAttribute('data-topo-chrome-layout-grid-halo-layers'),
62
+ };
63
+ });
64
+
65
+ await browser.close();
66
+
67
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
68
+ const sourceState = /const \[hoveredLayout, setHoveredLayout\] = useState<'ring' \| 'grid' \| null>\(null\);/.test(src);
69
+ const sourceRingHandler = /onMouseEnter=\{\(\) => setHoveredLayout\('ring'\)\}/.test(src) &&
70
+ /onMouseLeave=\{\(\) => setHoveredLayout\(\(prev\) => prev === 'ring' \? null : prev\)\}/.test(src);
71
+ const sourceGridHandler = /onMouseEnter=\{\(\) => setHoveredLayout\('grid'\)\}/.test(src) &&
72
+ /onMouseLeave=\{\(\) => setHoveredLayout\(\(prev\) => prev === 'grid' \? null : prev\)\}/.test(src);
73
+ const sourceRingFilter = /filter: hoveredLayout === 'ring' \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
74
+ const sourceGridFilter = /filter: hoveredLayout === 'grid' \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
75
+ const sourceRingAttr = /data-topo-chrome-layout-ring-halo-layers=\{hoveredLayout === 'ring' \? '2' : '0'\}/.test(src);
76
+ const sourceGridAttr = /data-topo-chrome-layout-grid-halo-layers=\{hoveredLayout === 'grid' \? '2' : '0'\}/.test(src);
77
+
78
+ const results = {
79
+ ring_present: restState.ring_present,
80
+ grid_present: restState.grid_present,
81
+ rest_ring_layers_0: restState.ring_layers === '0',
82
+ rest_grid_layers_0: restState.grid_layers === '0',
83
+ source_state: sourceState,
84
+ source_ring_handler: sourceRingHandler,
85
+ source_grid_handler: sourceGridHandler,
86
+ source_ring_filter: sourceRingFilter,
87
+ source_grid_filter: sourceGridFilter,
88
+ source_ring_attr: sourceRingAttr,
89
+ source_grid_attr: sourceGridAttr,
90
+ };
91
+ const ok = Object.values(results).every(Boolean);
92
+ console.log(`${ok ? '✅' : '❌'} R674 chrome Layout ring/grid toggle multi-layer halo:`,
93
+ JSON.stringify(results, null, 2),
94
+ `\n rest: ${JSON.stringify(restState)}`);
95
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,97 @@
1
+ /* Round 673 — chrome zoom-in + zoom-out buttons gain multi-layer
2
+ * halo on hover via new hoveredZoomIn / hoveredZoomOut state. Pre-
3
+ * R673 these buttons had only Tailwind hover:brightness-[1.15] (R596)
4
+ * — a single-axis paint lift. Post-R673 inline filter uses the same
5
+ * 2+4 stride at pal.legendAccent tint as R667 reset+fullscreen and
6
+ * R668 zoom-level pill. The chrome zoom-strip (zoom-out + zoom-level
7
+ * + zoom-in) is now FULLY halo-extended at all 3 controls.
8
+ *
9
+ * 32nd anchor in multi-layer halo family (paired sibling extension).
10
+ *
11
+ * Source assertions:
12
+ * - useState pair for hoveredZoomIn / hoveredZoomOut
13
+ * - both buttons' onMouseEnter/Leave wired
14
+ * - both inline filters use pal.legendAccent 2+4 stride alpha 80/40
15
+ * - data-topo-chrome-zoom-{in,out}-halo-layers attrs toggle '2'/'0'
16
+ *
17
+ * Runtime assertions:
18
+ * - both buttons present in DOM
19
+ * - rest state: halo-layers='0' on both
20
+ */
21
+ import { chromium } from 'playwright';
22
+ import { readFileSync } from 'node:fs';
23
+
24
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
25
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
26
+
27
+ const browser = await chromium.launch({ headless: true });
28
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
29
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
30
+ await ctx.addInitScript(() => {
31
+ try {
32
+ localStorage.setItem('anet-theme', 'cyber');
33
+ localStorage.setItem('anet-topo-layout', 'ring');
34
+ sessionStorage.setItem('anet_v3_auth', '1');
35
+ } catch {}
36
+ });
37
+ await ctx.route('**/api/hub/status*', async (route) => {
38
+ const r = await route.fetch();
39
+ const b = await r.json();
40
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
41
+ const mk = (alias) => ({
42
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
43
+ network_id: nid, project_dir: null,
44
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
45
+ });
46
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
47
+ });
48
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
52
+ await page.waitForSelector('[data-topo-chrome-zoom-in-halo-layers]', { timeout: 15000, state: 'attached' });
53
+ await page.waitForTimeout(500);
54
+
55
+ const restState = await page.evaluate(() => {
56
+ const zin = document.querySelector('[data-topo-chrome-zoom-in-halo-layers]');
57
+ const zout = document.querySelector('[data-topo-chrome-zoom-out-halo-layers]');
58
+ return {
59
+ zin_present: !!zin,
60
+ zout_present: !!zout,
61
+ zin_layers: zin?.getAttribute('data-topo-chrome-zoom-in-halo-layers'),
62
+ zout_layers: zout?.getAttribute('data-topo-chrome-zoom-out-halo-layers'),
63
+ };
64
+ });
65
+
66
+ await browser.close();
67
+
68
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
69
+ const sourceState = /const \[hoveredZoomIn, setHoveredZoomIn\] = useState\(false\);/.test(src) &&
70
+ /const \[hoveredZoomOut, setHoveredZoomOut\] = useState\(false\);/.test(src);
71
+ const sourceZinHandler = /onMouseEnter=\{\(\) => setHoveredZoomIn\(true\)\}/.test(src) &&
72
+ /onMouseLeave=\{\(\) => setHoveredZoomIn\(false\)\}/.test(src);
73
+ const sourceZoutHandler = /onMouseEnter=\{\(\) => setHoveredZoomOut\(true\)\}/.test(src) &&
74
+ /onMouseLeave=\{\(\) => setHoveredZoomOut\(false\)\}/.test(src);
75
+ const sourceZinFilter = /filter: hoveredZoomIn \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
76
+ const sourceZoutFilter = /filter: hoveredZoomOut \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
77
+ const sourceZinAttr = /data-topo-chrome-zoom-in-halo-layers=\{hoveredZoomIn \? '2' : '0'\}/.test(src);
78
+ const sourceZoutAttr = /data-topo-chrome-zoom-out-halo-layers=\{hoveredZoomOut \? '2' : '0'\}/.test(src);
79
+
80
+ const results = {
81
+ zin_present: restState.zin_present,
82
+ zout_present: restState.zout_present,
83
+ rest_zin_layers_0: restState.zin_layers === '0',
84
+ rest_zout_layers_0: restState.zout_layers === '0',
85
+ source_state: sourceState,
86
+ source_zin_handler: sourceZinHandler,
87
+ source_zout_handler:sourceZoutHandler,
88
+ source_zin_filter: sourceZinFilter,
89
+ source_zout_filter: sourceZoutFilter,
90
+ source_zin_attr: sourceZinAttr,
91
+ source_zout_attr: sourceZoutAttr,
92
+ };
93
+ const ok = Object.values(results).every(Boolean);
94
+ console.log(`${ok ? '✅' : '❌'} R673 chrome zoom-in/-out multi-layer halo (completes chrome zoom-strip trio):`,
95
+ JSON.stringify(results, null, 2),
96
+ `\n rest: ${JSON.stringify(restState)}`);
97
+ process.exit(ok ? 0 : 1);