pinokiod 7.3.5 → 7.3.8

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 (38) hide show
  1. package/kernel/api/index.js +3 -2
  2. package/kernel/api/script/index.js +1 -0
  3. package/kernel/resource_usage/gpu.js +1078 -270
  4. package/kernel/resource_usage/index.js +9 -4
  5. package/package.json +2 -1
  6. package/server/index.js +14 -2
  7. package/server/public/nav.js +1 -1
  8. package/server/public/style.css +298 -191
  9. package/server/public/task-launcher.css +16 -20
  10. package/server/public/universal-launcher.css +0 -113
  11. package/server/public/universal-launcher.js +1 -1
  12. package/server/views/app.ejs +592 -298
  13. package/server/views/autolaunch.ejs +1 -1
  14. package/server/views/checkpoints.ejs +2 -6
  15. package/server/views/connect.ejs +1 -1
  16. package/server/views/explore.ejs +2 -1
  17. package/server/views/index.ejs +89 -60
  18. package/server/views/install.ejs +5 -7
  19. package/server/views/invalid_content.ejs +1 -1
  20. package/server/views/layout.ejs +8 -2
  21. package/server/views/logs.ejs +5 -27
  22. package/server/views/net.ejs +1 -1
  23. package/server/views/network.ejs +1 -1
  24. package/server/views/partials/fs_status.ejs +0 -8
  25. package/server/views/partials/main_sidebar.ejs +108 -44
  26. package/server/views/plugin_detail.ejs +1 -1
  27. package/server/views/plugins.ejs +1 -28
  28. package/server/views/screenshots.ejs +1 -1
  29. package/server/views/settings.ejs +2 -1
  30. package/server/views/setup.ejs +15 -1
  31. package/server/views/skills.ejs +1 -1
  32. package/server/views/task_builder.ejs +1 -1
  33. package/server/views/task_install.ejs +1 -1
  34. package/server/views/task_launch.ejs +1 -1
  35. package/server/views/task_list.ejs +1 -1
  36. package/server/views/tools.ejs +1 -1
  37. package/test/resource-usage-gpu.test.js +320 -70
  38. package/test/script-api.test.js +90 -0
@@ -2,7 +2,6 @@
2
2
  const sidebarSelected = (typeof selected !== "undefined" && selected) ? String(selected) : "";
3
3
  const sidebarList = (typeof list !== "undefined" && Array.isArray(list)) ? list : [];
4
4
  const sidebarCurrentHost = (typeof current_host !== "undefined" && current_host) ? current_host : "";
5
- const sidebarHelpUrl = (typeof portal !== "undefined" && portal) ? portal : "https://beta.pinokio.co";
6
5
  const sidebarSelectedNetName = (typeof selectedNetName !== "undefined" && selectedNetName) ? String(selectedNetName) : "";
7
6
  const sidebarShowPeerAccess = typeof showPeerAccess === "boolean" ? showPeerAccess : true;
8
7
  const brands = { win32: "windows", darwin: "apple", linux: "Linux" };
@@ -11,64 +10,129 @@
11
10
  <i class="fa-solid fa-bars" aria-hidden="true"></i>
12
11
  </button>
13
12
  <button type="button" class="main-sidebar-mobile-backdrop" data-main-sidebar-backdrop aria-label="Close navigation" hidden></button>
14
- <aside class="main-sidebar">
15
- <div class='btn-tab quick-actions universal-quick-actions'>
16
- <a class='btn' id='explore' href="/home?mode=explore"><i class="fa-solid fa-globe quick-action-leading-icon"></i><div class='caption'>Explore</div></a>
17
- <details class="universal-create-menu">
18
- <summary class="btn" aria-label="Create options"><i class="fa-solid fa-plus quick-action-leading-icon"></i><div class='caption'>Create</div><i class="fa-solid fa-chevron-down universal-create-caret" aria-hidden="true"></i></summary>
19
- <div class="universal-create-dropdown">
20
- <button type="button" data-universal-launcher-open="create_app">Create app</button>
21
- <button type="button" data-universal-launcher-open="create_plugin">Create plugin</button>
22
- </div>
23
- </details>
24
- <button type="button" class="btn" data-universal-launcher-open="ask" aria-label="Ask Pinokio">
25
- <span class="quick-action-icon quick-action-leading-icon ask-pinokio-icon" aria-hidden="true"></span>
26
- <div class='caption'>Ask Pinokio</div>
27
- </button>
28
- </div>
29
- <a href="/home" class="tab <%= sidebarSelected === 'home' ? 'selected' : '' %>" data-tippy-content="This machine"><i class='fas fa-laptop-code'></i><div class='caption'>This machine</div></a>
30
- <a href="/network" class="tab <%= sidebarSelected === 'network' ? 'selected' : '' %>" data-tippy-content="Local network"><i class="fa-solid fa-wifi"></i><div class='caption'>Local network</div></a>
31
- <% if (sidebarList.length > 0) { %>
32
- <% sidebarList.forEach(({ host, name, platform }) => { %>
33
- <% const selectedNet = sidebarSelectedNetName && String(name || "") === sidebarSelectedNetName; %>
34
- <a href="/net/<%=name%>" class="submenu tab <%= selectedNet ? 'selected' : '' %>" data-tippy-content="<%=name%> (<%=sidebarCurrentHost === host ? 'this machine' : host%>)"><i class="fa-brands fa-<%=brands[platform]%>"></i><div class='caption'><%=name%> (<%=sidebarCurrentHost === host ? 'this machine' : host%>)</div></a>
35
- <% }) %>
36
- <% } %>
37
- <a href="/connect" class="tab <%= sidebarSelected === 'connect' ? 'selected' : '' %>" data-tippy-content="Login"><i class="fa-solid fa-plug"></i><div class='caption'>Login</div></a>
38
- <a class='tab' href="<%=sidebarHelpUrl%>" target="_blank" data-tippy-content="Help"><i class="fa-solid fa-question"></i><div class='caption'>Help</div></a>
39
- <a class="tab <%= sidebarSelected === 'logs' ? 'selected' : '' %>" id='genlog' href="/logs" data-tippy-content="Logs"><i class="fa-solid fa-laptop-code"></i><div class='caption'>Logs</div></a>
40
- <a class="tab <%= sidebarSelected === 'autolaunch' ? 'selected' : '' %>" href="/autolaunch" data-tippy-content="Autolaunch"><i class="fa-solid fa-power-off"></i><div class='caption'>Autolaunch</div></a>
41
- <a class="tab <%= sidebarSelected === 'checkpoints' ? 'selected' : '' %>" href="/checkpoints" data-tippy-content="Checkpoints"><i class="fa-solid fa-clock-rotate-left"></i><div class='caption'>Checkpoints</div></a>
42
- <a class="tab <%= sidebarSelected === 'screenshots' ? 'selected' : '' %>" href="/screenshots" data-tippy-content="Screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
43
- <a class="tab <%= sidebarSelected === 'tools' ? 'selected' : '' %>" href="/tools" data-tippy-content="Installed Tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
44
- <a class="tab <%= sidebarSelected === 'plugins' ? 'selected' : '' %>" href="/plugins" data-tippy-content="Plugins"><i class="fa-solid fa-plug-circle-bolt"></i><div class='caption'>Plugins</div></a>
45
- <a class="tab <%= sidebarSelected === 'tasks' ? 'selected' : '' %>" href="/tasks" data-tippy-content="Tasks"><i class="fa-solid fa-list-check"></i><div class='caption'>Tasks</div></a>
46
- <a class="tab <%= sidebarSelected === 'skills' ? 'selected' : '' %>" href="/skills" data-tippy-content="Skills"><i class="fa-solid fa-wand-magic-sparkles"></i><div class='caption'>Skills</div></a>
47
- <a class="tab <%= sidebarSelected === 'settings' ? 'selected' : '' %>" href="/home?mode=settings" data-tippy-content="Settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
13
+ <aside class="main-sidebar" id="main-sidebar" aria-label="Primary navigation">
14
+ <nav class="main-sidebar-nav" aria-label="Pinokio navigation">
15
+ <div class='main-sidebar-section main-sidebar-section-actions' aria-label="Actions">
16
+ <a class='tab main-sidebar-action <%= sidebarSelected === 'explore' ? 'selected' : '' %>' id='explore' href="/home?mode=explore"><i class="fa-solid fa-globe main-sidebar-action-icon"></i><div class='caption'>Explore</div></a>
17
+ <details class="universal-create-menu">
18
+ <summary class="tab main-sidebar-action" aria-label="Create options"><i class="fa-solid fa-plus main-sidebar-action-icon"></i><div class='caption'>Create</div></summary>
19
+ <div class="universal-create-dropdown">
20
+ <button type="button" data-universal-launcher-open="create_app">Create app</button>
21
+ <button type="button" data-universal-launcher-open="create_plugin">Create plugin</button>
22
+ </div>
23
+ </details>
24
+ <button type="button" class="tab main-sidebar-action" data-universal-launcher-open="ask" aria-label="Ask Pinokio">
25
+ <span class="main-sidebar-action-icon ask-pinokio-icon" aria-hidden="true"></span>
26
+ <div class='caption'>Ask</div>
27
+ </button>
28
+ </div>
29
+
30
+ <div class='main-sidebar-section' aria-label="Computer">
31
+ <div class="main-sidebar-section-title">Computer</div>
32
+ <a href="/home" class="tab <%= sidebarSelected === 'home' ? 'selected' : '' %>" data-tippy-content="This machine"><i class='fas fa-laptop-code'></i><div class='caption'>This machine</div></a>
33
+ <a href="/network" class="tab <%= sidebarSelected === 'network' ? 'selected' : '' %>" data-tippy-content="Local network"><i class="fa-solid fa-wifi"></i><div class='caption'>Local network</div></a>
34
+ <% if (sidebarList.length > 0) { %>
35
+ <% sidebarList.forEach(({ host, name, platform }) => { %>
36
+ <% const selectedNet = sidebarSelectedNetName && String(name || "") === sidebarSelectedNetName; %>
37
+ <a href="/net/<%=name%>" class="submenu tab <%= selectedNet ? 'selected' : '' %>" data-tippy-content="<%=name%> (<%=sidebarCurrentHost === host ? 'this machine' : host%>)"><i class="fa-brands fa-<%=brands[platform]%>"></i><div class='caption'><%=name%> (<%=sidebarCurrentHost === host ? 'this machine' : host%>)</div></a>
38
+ <% }) %>
39
+ <% } %>
40
+ </div>
41
+
42
+ <div class='main-sidebar-section' aria-label="Manage">
43
+ <div class="main-sidebar-section-title">Manage</div>
44
+ <a class="tab <%= sidebarSelected === 'checkpoints' ? 'selected' : '' %>" href="/checkpoints" data-tippy-content="Checkpoints"><i class="fa-solid fa-clock-rotate-left"></i><div class='caption'>Checkpoints</div></a>
45
+ <a class="tab <%= sidebarSelected === 'tools' ? 'selected' : '' %>" href="/tools" data-tippy-content="Installed Tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Tools</div></a>
46
+ <a class="tab <%= sidebarSelected === 'plugins' ? 'selected' : '' %>" href="/plugins" data-tippy-content="Plugins"><i class="fa-solid fa-plug-circle-bolt"></i><div class='caption'>Plugins</div></a>
47
+ <a class="tab <%= sidebarSelected === 'tasks' ? 'selected' : '' %>" href="/tasks" data-tippy-content="Tasks"><i class="fa-solid fa-list-check"></i><div class='caption'>Tasks</div></a>
48
+ <a class="tab <%= sidebarSelected === 'skills' ? 'selected' : '' %>" href="/skills" data-tippy-content="Skills"><i class="fa-solid fa-wand-magic-sparkles"></i><div class='caption'>Skills</div></a>
49
+ <a class="tab <%= sidebarSelected === 'logs' ? 'selected' : '' %>" id='genlog' href="/logs" data-tippy-content="Logs"><i class="fa-solid fa-laptop-code"></i><div class='caption'>Logs</div></a>
50
+ </div>
51
+
52
+ <div class='main-sidebar-section' aria-label="Configure">
53
+ <div class="main-sidebar-section-title">Configure</div>
54
+ <a class="tab <%= sidebarSelected === 'autolaunch' ? 'selected' : '' %>" href="/autolaunch" data-tippy-content="Autolaunch"><i class="fa-solid fa-power-off"></i><div class='caption'>Autolaunch</div></a>
55
+ <a href="/connect" class="tab <%= sidebarSelected === 'connect' ? 'selected' : '' %>" data-tippy-content="Login"><i class="fa-solid fa-plug"></i><div class='caption'>Login</div></a>
56
+ <a class="tab <%= sidebarSelected === 'settings' ? 'selected' : '' %>" href="/home?mode=settings" data-tippy-content="Settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
57
+ </div>
58
+ </nav>
59
+
48
60
  <% if (sidebarShowPeerAccess) { %>
49
- <%- include('peer_access_points', {
50
- peer_access_points: (typeof peer_access_points !== "undefined" ? peer_access_points : null),
51
- peer_url: (typeof peer_url !== "undefined" ? peer_url : null),
52
- peer_qr: (typeof peer_qr !== "undefined" ? peer_qr : null),
53
- }) %>
61
+ <div class='main-sidebar-peer'>
62
+ <%- include('peer_access_points', {
63
+ peer_access_points: (typeof peer_access_points !== "undefined" ? peer_access_points : null),
64
+ peer_url: (typeof peer_url !== "undefined" ? peer_url : null),
65
+ peer_qr: (typeof peer_qr !== "undefined" ? peer_qr : null),
66
+ }) %>
67
+ </div>
54
68
  <% } %>
55
69
  </aside>
56
70
  <script>
57
71
  (() => {
72
+ const body = document.body;
73
+
74
+ const headerToggle = document.getElementById("minimize-header");
75
+ const sidebar = document.getElementById("main-sidebar");
76
+ if (body && sidebar && headerToggle && !headerToggle.dataset.mainSidebarHeaderToggle) {
77
+ headerToggle.dataset.mainSidebarHeaderToggle = "true";
78
+ headerToggle.classList.add("sidebar-toggle", "main-sidebar-header-toggle");
79
+ headerToggle.setAttribute("type", "button");
80
+ headerToggle.setAttribute("aria-controls", "main-sidebar");
81
+ headerToggle.innerHTML = `
82
+ <span class="sidebar-toggle-glyph" aria-hidden="true">
83
+ <span class="sidebar-toggle-frame">
84
+ <span class="sidebar-toggle-panel"></span>
85
+ <span class="sidebar-toggle-content"></span>
86
+ </span>
87
+ </span>
88
+ `;
89
+
90
+ const updateToggle = (collapsed) => {
91
+ const expanded = !collapsed;
92
+ const label = expanded ? "Hide sidebar" : "Show sidebar";
93
+ headerToggle.setAttribute("aria-expanded", expanded ? "true" : "false");
94
+ headerToggle.setAttribute("aria-label", label);
95
+ headerToggle.setAttribute("title", label);
96
+ headerToggle.setAttribute("data-tippy-content", label);
97
+ headerToggle.dataset.sidebarState = expanded ? "expanded" : "collapsed";
98
+ if (headerToggle._tippy && typeof headerToggle._tippy.setContent === "function") {
99
+ headerToggle._tippy.setContent(label);
100
+ }
101
+ };
102
+
103
+ const setCollapsed = (collapsed) => {
104
+ const next = !!collapsed;
105
+ body.classList.toggle("main-sidebar-collapsed", next);
106
+ sidebar.setAttribute("aria-hidden", next ? "true" : "false");
107
+ updateToggle(next);
108
+ document.dispatchEvent(new CustomEvent("pinokio:sidebar-state", {
109
+ detail: { collapsed: next, source: "main-sidebar" }
110
+ }));
111
+ };
112
+
113
+ setCollapsed(false);
114
+
115
+ headerToggle.addEventListener("click", (event) => {
116
+ event.preventDefault();
117
+ setCollapsed(!body.classList.contains("main-sidebar-collapsed"));
118
+ });
119
+
120
+ window.PinokioMainSidebar = {
121
+ setCollapsed,
122
+ isCollapsed: () => body.classList.contains("main-sidebar-collapsed")
123
+ };
124
+ }
125
+
58
126
  if (window.__pinokioMainSidebarMobileInit) return;
59
127
  window.__pinokioMainSidebarMobileInit = true;
60
128
 
61
- const body = document.body;
62
129
  const html = document.documentElement;
63
- const sidebar = document.querySelector(".main-sidebar");
64
130
  const toggle = document.querySelector("[data-main-sidebar-toggle]");
65
131
  const backdrop = document.querySelector("[data-main-sidebar-backdrop]");
66
132
  const mobileMq = window.matchMedia("(max-width: 600px)");
67
133
 
68
134
  if (!body || !html || !sidebar || !toggle || !backdrop) return;
69
135
 
70
- body.classList.add("main-sidebar-page");
71
-
72
136
  const sync = () => {
73
137
  const open = body.classList.contains("main-sidebar-mobile-open");
74
138
  toggle.setAttribute("aria-expanded", open ? "true" : "false");
@@ -16,7 +16,7 @@
16
16
  <% } %>
17
17
  <script src="/plugin-detail.js" defer></script>
18
18
  </head>
19
- <body class="<%= theme %> task-launcher-page task-page plugin-page plugin-detail-page" data-agent="<%= agent %>">
19
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page plugin-page plugin-detail-page" data-agent="<%= agent %>">
20
20
  <% const currentPluginCwd = typeof pluginCwd === "string" ? pluginCwd : ""; %>
21
21
  <%- include('partials/app_navheader', { agent }) %>
22
22
  <main>
@@ -17,33 +17,6 @@
17
17
  <link href="/electron.css" rel="stylesheet"/>
18
18
  <% } %>
19
19
  <style>
20
- body.plugin-page main {
21
- display: flex;
22
- }
23
- body.plugin-page aside {
24
- width: 200px;
25
- display: block;
26
- flex-shrink: 0;
27
- }
28
- body.plugin-page aside .tab {
29
- display: flex;
30
- align-items: center;
31
- gap: 5px;
32
- color: inherit;
33
- text-decoration: none;
34
- padding: 10px;
35
- font-size: 12px;
36
- opacity: 0.5;
37
- border-left: 10px solid transparent;
38
- transition: color 0.2s ease, opacity 0.2s ease;
39
- }
40
- body.plugin-page aside .tab.selected {
41
- font-weight: 600;
42
- opacity: 1;
43
- }
44
- body.plugin-page aside .tab i {
45
- text-align: center;
46
- }
47
20
  body.plugin-page .plugin-container {
48
21
  box-sizing: border-box;
49
22
  }
@@ -747,7 +720,7 @@ body.plugin-page .plugin-card .disclosure-indicator {
747
720
  }
748
721
  </style>
749
722
  </head>
750
- <body class='<%=theme%> task-launcher-page task-page plugin-page' data-agent="<%=agent%>">
723
+ <body class='<%=theme%> main-sidebar-page task-launcher-page task-page plugin-page' data-agent="<%=agent%>">
751
724
  <%- include('partials/app_navheader', { agent }) %>
752
725
  <main class='plugin-main'>
753
726
  <div class='task-container plugin-container'>
@@ -861,7 +861,7 @@ document.addEventListener('DOMContentLoaded', function() {
861
861
  </script>
862
862
  <script src="/report.js"></script>
863
863
  </head>
864
- <body class='<%=theme%> task-launcher-page task-page screenshots-page' data-agent="<%=agent%>">
864
+ <body class='<%=theme%> main-sidebar-page task-launcher-page task-page screenshots-page' data-agent="<%=agent%>">
865
865
  <!--
866
866
  <nav>
867
867
  <a class='logo' href="/home">dal</a>
@@ -902,7 +902,7 @@ document.addEventListener('DOMContentLoaded', function() {
902
902
  </script>
903
903
  <script src="/report.js"></script>
904
904
  </head>
905
- <body class='<%=theme%> task-launcher-page task-page settings-page <%= hasHome ? "has-home" : "needs-home-setup" %>' data-agent="<%=agent%>">
905
+ <body class='<%=theme%> main-sidebar-page task-launcher-page task-page settings-page <%= hasHome ? "has-home" : "needs-home-setup" %>' data-agent="<%=agent%>">
906
906
  <!--
907
907
  <nav>
908
908
  <a class='logo' href="/home">dal</a>
@@ -1163,6 +1163,7 @@ document.addEventListener('DOMContentLoaded', function() {
1163
1163
  </div>
1164
1164
  </section>
1165
1165
  </div>
1166
+ <%- include('partials/main_sidebar', { selected: 'settings' }) %>
1166
1167
  </main>
1167
1168
  <script>
1168
1169
  document.addEventListener("DOMContentLoaded", async () => {
@@ -28,8 +28,21 @@
28
28
  const readyDescription = install_required
29
29
  ? "Install or refresh what Pinokio needs before reopening this destination."
30
30
  : "Everything Pinokio needs is already available. Continue to reopen this destination.";
31
+ const setupSidebarSelected = (() => {
32
+ if (setupMode === "network" || targetPath.indexOf("/network") === 0) return "network";
33
+ if (setupMode === "connect" || targetPath.indexOf("/connect") === 0 || targetPath.indexOf("/github") === 0) return "connect";
34
+ if (targetPath.indexOf("/tools") === 0) return "tools";
35
+ if (targetPath.indexOf("/plugins") === 0) return "plugins";
36
+ if (targetPath.indexOf("/tasks") === 0) return "tasks";
37
+ if (targetPath.indexOf("/skills") === 0) return "skills";
38
+ if (targetPath.indexOf("/logs") === 0) return "logs";
39
+ if (targetPath.indexOf("/autolaunch") === 0) return "autolaunch";
40
+ if (targetPath.indexOf("/home?mode=settings") === 0) return "settings";
41
+ if (targetPath.indexOf("/home") === 0) return "home";
42
+ return "";
43
+ })();
31
44
  %>
32
- <body class="<%= theme %> task-launcher-page task-page setup-page" data-agent="<%= agent %>">
45
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page setup-page" data-agent="<%= agent %>">
33
46
  <%- include('partials/app_navheader', { agent }) %>
34
47
  <main>
35
48
  <div class="task-container">
@@ -188,6 +201,7 @@
188
201
  </div>
189
202
  </section>
190
203
  </div>
204
+ <%- include('partials/main_sidebar', { selected: setupSidebarSelected }) %>
191
205
  </main>
192
206
 
193
207
  <script>
@@ -322,7 +322,7 @@
322
322
  };
323
323
  const targetClass = (status) => status === "conflict" ? "conflict" : "";
324
324
  %>
325
- <body class="<%= theme %> task-launcher-page task-page skills-page" data-agent="<%= agent %>">
325
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page skills-page" data-agent="<%= agent %>">
326
326
  <%- include('partials/app_navheader', { agent }) %>
327
327
  <main>
328
328
  <div class="task-container">
@@ -18,7 +18,7 @@
18
18
  <%
19
19
  const displayTarget = defaults.target || 'workspaces'
20
20
  %>
21
- <body class="<%= theme %> task-launcher-page task-page task-builder-page" data-agent="<%= agent %>">
21
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page task-builder-page" data-agent="<%= agent %>">
22
22
  <%- include('partials/app_navheader', { agent }) %>
23
23
  <main>
24
24
  <div class="task-container">
@@ -15,7 +15,7 @@
15
15
  <% } %>
16
16
  <script src="/task-launcher.js" defer></script>
17
17
  </head>
18
- <body class="<%= theme %> task-launcher-page task-page task-install-page" data-agent="<%= agent %>">
18
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page task-install-page" data-agent="<%= agent %>">
19
19
  <%- include('partials/app_navheader', { agent }) %>
20
20
  <main>
21
21
  <div class="task-container">
@@ -32,7 +32,7 @@
32
32
  ? task.config.description
33
33
  : ''
34
34
  %>
35
- <body class="<%= theme %> task-launcher-page task-page task-detail-page" data-agent="<%= agent %>">
35
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page task-detail-page" data-agent="<%= agent %>">
36
36
  <%- include('partials/app_navheader', { agent }) %>
37
37
  <main>
38
38
  <div class="task-container">
@@ -20,7 +20,7 @@
20
20
  return value
21
21
  }
22
22
  %>
23
- <body class="<%= theme %> task-launcher-page task-page task-library-page" data-agent="<%= agent %>">
23
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page task-library-page" data-agent="<%= agent %>">
24
24
  <%- include('partials/app_navheader', { agent }) %>
25
25
  <main>
26
26
  <div class="task-container">
@@ -1361,7 +1361,7 @@ document.addEventListener('DOMContentLoaded', function() {
1361
1361
  </script>
1362
1362
  <script src="/report.js"></script>
1363
1363
  </head>
1364
- <body class='<%=theme%> task-launcher-page task-page tools-page' data-agent="<%=agent%>">
1364
+ <body class='<%=theme%> main-sidebar-page task-launcher-page task-page tools-page' data-agent="<%=agent%>">
1365
1365
  <!--
1366
1366
  <nav>
1367
1367
  <a class='logo' href="/home">dal</a>