pinokiod 7.3.9 → 7.3.11

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 (52) hide show
  1. package/kernel/bin/brew.js +12 -2
  2. package/kernel/bin/caddy.js +24 -20
  3. package/kernel/bin/huggingface.js +2 -2
  4. package/kernel/bin/setup.js +2 -3
  5. package/kernel/bin/uv.js +13 -6
  6. package/kernel/connect/index.js +5 -1
  7. package/kernel/connect/providers/huggingface/index.js +213 -75
  8. package/kernel/environment.js +16 -1
  9. package/kernel/router/localhost_home_router.js +7 -0
  10. package/kernel/shell.js +1 -5
  11. package/kernel/util.js +1 -0
  12. package/package.json +1 -1
  13. package/server/index.js +75 -33
  14. package/server/public/common.js +52 -88
  15. package/server/public/install.js +20 -2
  16. package/server/public/layout.js +1 -1
  17. package/server/public/nav.js +3 -1
  18. package/server/public/style.css +1455 -521
  19. package/server/public/tab-link-popover.css +162 -18
  20. package/server/public/tab-link-popover.js +230 -21
  21. package/server/public/task-launcher.css +182 -91
  22. package/server/public/terminal-settings.js +227 -50
  23. package/server/public/universal-launcher.css +42 -33
  24. package/server/public/urldropdown.css +284 -0
  25. package/server/views/app.ejs +1718 -352
  26. package/server/views/autolaunch.ejs +4 -5
  27. package/server/views/checkpoints.ejs +223 -50
  28. package/server/views/connect/huggingface.ejs +406 -325
  29. package/server/views/connect.ejs +0 -1
  30. package/server/views/github.ejs +277 -324
  31. package/server/views/index.ejs +65 -8
  32. package/server/views/install.ejs +134 -65
  33. package/server/views/logs.ejs +9 -8
  34. package/server/views/net.ejs +341 -64
  35. package/server/views/network.ejs +85 -63
  36. package/server/views/partials/main_sidebar.ejs +249 -24
  37. package/server/views/plugins.ejs +141 -3
  38. package/server/views/settings.ejs +103 -7
  39. package/server/views/setup.ejs +0 -5
  40. package/server/views/skills.ejs +0 -1
  41. package/server/views/task_list.ejs +0 -1
  42. package/server/views/terminal.ejs +285 -60
  43. package/server/views/terminals.ejs +346 -6
  44. package/server/views/tools.ejs +828 -1691
  45. package/test/caddy-install.test.js +53 -0
  46. package/test/connect-setup.test.js +16 -0
  47. package/test/github-connection.test.js +1 -1
  48. package/test/huggingface-bin.test.js +4 -4
  49. package/test/huggingface-connect.test.js +73 -0
  50. package/test/main-sidebar.test.js +31 -0
  51. package/test/shell-run-template.test.js +5 -1
  52. package/test/uv-bin.test.js +29 -0
@@ -805,7 +805,6 @@ body.dark .profile td {
805
805
  <section class='task-shell connect-shell'>
806
806
  <header class='task-shell-header'>
807
807
  <div class='task-shell-header-main'>
808
- <p class='task-eyebrow'>Login</p>
809
808
  <h1 class='task-title'>Connected services</h1>
810
809
  <p class='task-description'>Log into localhost apps with third-party services.</p>
811
810
  </div>
@@ -1,333 +1,286 @@
1
- <html>
1
+ <!doctype html>
2
+ <html lang="en">
2
3
  <head>
3
- <meta charset="UTF-8">
4
- <meta name="viewport" content="width=device-width, initial-scale=1" />
5
- <link href="/xterm.min.css" rel="stylesheet" />
6
- <link href="/css/fontawesome.min.css" rel="stylesheet">
7
- <link href="/css/solid.min.css" rel="stylesheet">
8
- <link href="/css/regular.min.css" rel="stylesheet">
9
- <link href="/css/brands.min.css" rel="stylesheet">
10
- <link href="/markdown.css" rel="stylesheet"/>
11
- <link href="/noty.css" rel="stylesheet"/>
12
- <link href="/style.css" rel="stylesheet"/>
13
- <% if (agent === "electron") { %>
14
- <link href="/electron.css" rel="stylesheet"/>
15
- <% } %>
16
- <style>
17
- html {
18
- scroll-behavior: smooth;
19
- height: 100%;
20
- overflow: hidden;
21
- }
22
- body {
23
- height: 100%;
24
- overflow: auto;
25
- display: flex;
26
- flex-direction: column;
27
- }
28
- .line2 {
29
- display: flex;
30
- align-items: center;
31
- cursor: pointer;
32
- background: rgba(0,0,100,0.04);
33
- }
34
- .line2 a {
35
- text-decoration: none;
36
- color: black;
37
- }
38
- .status {
39
- padding: 10px;
40
- margin: 10px;
41
- border-radius: 10px;
42
- }
43
- .status.offline {
44
- background: silver;
45
- }
46
- .status.online {
47
- background: yellowgreen;
48
- }
49
- .switch {
50
- padding: 10px;
51
- margin: 10px 0;
52
- }
53
- .switch[data-online=true] {
54
- color: yellowgreen;
55
- }
56
- .button {
57
- padding: 10px;
58
- }
59
- .on, .off {
60
- display: flex;
61
- align-items: center;
62
- }
63
- .btn {
64
- text-align: center;
65
- padding: 10px;
66
- background: black;
67
- color: white;
68
- text-decoration: none;
69
- font-weight: normal;
70
- }
71
- .item {
72
- display: flex;
73
- align-items: flex-start;
74
- margin: 10px;
75
- background: rgba(0,0,0,0.04);
76
- }
77
- .item img {
78
- width: 100px;
79
- }
80
- .item .title {
81
- text-decoration: none;
82
- color: royalblue;
83
- }
84
- .item .col {
85
- padding: 10px;
86
- }
87
- .item .col > * {
88
- margin: 5px 0;
89
- }
90
- .item .stat {
91
- color: rgba(0,0,0,0.8);
92
- display: flex;
93
- }
94
- .item .stat > * {
95
- margin-right: 15px;
96
- }
97
- .timestamp {
98
- color: rgba(0,0,0,0.5);
99
- }
100
- main {
101
- flex-grow: 1;
102
- display: flex;
103
- flex-direction: column;
104
- }
105
- .setup-items {
106
- display: flex;
107
- justify-content: center;
108
- margin: 0 auto;
109
- /*
110
- max-width: 800px;
111
- */
112
- width: 100%;
113
- align-items: center;
114
- }
115
- .setup-items .gitconfig .field input {
116
- padding: 10px;
117
- box-sizing: border-box;
118
- border: 1px solid silver;
119
- width: 100%;
120
-
121
- }
122
- .setup-items .gitconfig .field {
123
- padding-bottom: 15px;
124
- }
125
- .setup-items .gitconfig label {
126
- display: block;
127
- margin-bottom: 5px;
128
- }
129
- .setup-items .gitconfig-footer {
130
- text-align: center;
131
- }
132
- .setup-items .btn {
133
- width: 100%;
134
- margin-bottom: 10px;
135
- }
136
- .setup-items .gitconfig {
137
- flex-grow: 1;
138
- margin-bottom: 20px;
139
- }
140
- body.dark .setup-items pre, body.dark .setup-items .pre {
141
- background: rgba(255,255,255,0.04) !important;
142
- }
143
- .setup-items pre, .setup-items .pre {
144
- box-sizing: border-box;
145
- margin: 10px 0;
146
- width: 100%;
147
- padding: 20px;
148
- background: rgba(0,0,0,0.04) !important;
149
- }
150
- .head {
151
- padding: 30px;
152
- text-align: center;
153
- }
154
- .head .desc {
155
- opacity: 0.7;
156
- padding: 10px;
157
- }
158
- .head h3 {
159
- font-size: 20px;
160
- text-transform: uppercase;
161
- margin: 0;
162
- }
163
- .head h3 i {
164
- font-size: 80px;
165
- }
166
- body.dark .card {
167
- color: white;
168
- }
169
- .card {
170
- text-decoration: none;
171
- width: 200px;
172
- color: rgba(0,0,0,0.9);
173
- text-align: center;
174
- margin: 20px;
175
- }
176
- .card:hover {
177
- color: royalblue !important;
178
- }
179
- .card .desc {
180
- opacity: 0.7;
181
- }
182
- .card h3 {
183
- font-size: 30px;
184
- letter-spacing: -1px;
185
- }
186
- .card i {
187
- font-size: 50px;
188
- }
189
- a {
190
- color: royalblue;
191
- }
192
- body.dark hr {
193
- background: rgba(255,255,255,0.05);
194
- }
195
- hr {
196
- background: rgba(0,0,0,0.05);
197
- height: 4px;
198
- border: none;
199
- margin: 40px 0;
200
- }
201
- #readme {
202
- flex-grow: 1;
203
- }
204
- .cols {
205
- max-width: 1000px;
206
- margin: 0 auto;
207
- display: flex;
208
- }
209
- body.dark .column {
210
- background: rgba(0,0,0,0.1);
211
- }
212
- .column {
213
- background: rgba(0,0,0,0.04);
214
- margin: 10px;
215
- width: 50%;
216
- padding: 20px;
217
- box-sizing: border-box;
218
- }
219
- .column h1 {
220
- padding: 5px;
221
- letter-spacing: -1px;
222
- }
223
- ol {
224
- padding-inline-start: 20px;
225
- }
226
- </style>
227
- <script src="/popper.min.js"></script>
228
- <script src="/tippy-bundle.umd.min.js"></script>
229
- <script src="/hotkeys.min.js"></script>
230
- <script src="/sweetalert2.js"></script>
231
- <script src="/common.js"></script>
232
- <script src="/opener.js"></script>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Configure Git</title>
7
+ <link href="/css/fontawesome.min.css" rel="stylesheet">
8
+ <link href="/css/solid.min.css" rel="stylesheet">
9
+ <link href="/css/regular.min.css" rel="stylesheet">
10
+ <link href="/css/brands.min.css" rel="stylesheet">
11
+ <link href="/markdown.css" rel="stylesheet">
12
+ <link href="/noty.css" rel="stylesheet">
13
+ <link href="/style.css" rel="stylesheet">
14
+ <link href="/task-launcher.css" rel="stylesheet">
15
+ <% if (agent === "electron") { %>
16
+ <link href="/electron.css" rel="stylesheet"/>
17
+ <% } %>
18
+ <style>
19
+ .github-login-shell {
20
+ max-width: 980px;
21
+ }
22
+ .github-section-grid {
23
+ display: grid;
24
+ grid-template-columns: minmax(0, 1fr) minmax(280px, 0.72fr);
25
+ gap: 24px;
26
+ align-items: start;
27
+ }
28
+ .github-state-panel {
29
+ display: flex;
30
+ align-items: flex-start;
31
+ gap: 14px;
32
+ min-width: 0;
33
+ }
34
+ .github-state-icon {
35
+ width: 36px;
36
+ height: 36px;
37
+ border-radius: 8px;
38
+ display: inline-flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ flex: 0 0 auto;
42
+ background: var(--task-chip-bg, var(--task-soft));
43
+ border: 1px solid var(--task-border);
44
+ color: var(--task-text);
45
+ }
46
+ .github-state-copy {
47
+ min-width: 0;
48
+ display: grid;
49
+ gap: 10px;
50
+ }
51
+ .github-state-title {
52
+ margin: 0;
53
+ color: var(--task-text);
54
+ font-size: 18px;
55
+ font-weight: 800;
56
+ line-height: 1.25;
57
+ letter-spacing: 0;
58
+ }
59
+ .github-state-detail {
60
+ margin: 0;
61
+ color: var(--task-muted);
62
+ font-size: 14px;
63
+ line-height: 1.55;
64
+ }
65
+ .github-action-row {
66
+ display: flex;
67
+ flex-wrap: wrap;
68
+ gap: 10px;
69
+ margin-top: 2px;
70
+ }
71
+ .github-account-box {
72
+ box-sizing: border-box;
73
+ max-width: 520px;
74
+ width: 100%;
75
+ margin: 2px 0 0;
76
+ padding: 12px 14px;
77
+ border: 1px solid var(--task-border);
78
+ border-radius: 8px;
79
+ background: var(--task-panel);
80
+ color: var(--task-text);
81
+ font: 13px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
82
+ white-space: pre-wrap;
83
+ overflow-wrap: anywhere;
84
+ }
85
+ .github-readme {
86
+ display: grid;
87
+ gap: 10px;
88
+ color: var(--task-muted);
89
+ font-size: 13px;
90
+ line-height: 1.5;
91
+ }
92
+ .github-readme :first-child {
93
+ margin-top: 0;
94
+ }
95
+ .github-readme :last-child {
96
+ margin-bottom: 0;
97
+ }
98
+ .github-readme p {
99
+ margin: 0;
100
+ }
101
+ .github-readme ol {
102
+ margin: 0;
103
+ padding-left: 20px;
104
+ }
105
+ .github-readme code {
106
+ color: var(--task-text);
107
+ }
108
+ .github-config-form {
109
+ display: grid;
110
+ gap: 14px;
111
+ margin: 0;
112
+ }
113
+ .github-config-fields {
114
+ display: grid;
115
+ gap: 13px;
116
+ max-width: 520px;
117
+ }
118
+ .github-config-actions {
119
+ display: flex;
120
+ flex-wrap: wrap;
121
+ gap: 10px;
122
+ align-items: center;
123
+ }
124
+ .github-config-submit {
125
+ min-width: 112px;
126
+ }
127
+ .github-config-path {
128
+ color: var(--task-muted);
129
+ font-size: 12px;
130
+ line-height: 1.45;
131
+ }
132
+ .github-config-feedback {
133
+ margin: 0;
134
+ }
135
+ .github-config-feedback.success {
136
+ border-color: color-mix(in srgb, #16a34a 22%, transparent);
137
+ background: color-mix(in srgb, #16a34a 10%, var(--task-panel));
138
+ color: #166534;
139
+ }
140
+ body.dark .github-config-feedback.success {
141
+ border-color: color-mix(in srgb, #86efac 28%, transparent);
142
+ background: rgba(34, 197, 94, 0.12);
143
+ color: #86efac;
144
+ }
145
+ @media (max-width: 820px) {
146
+ .github-section-grid {
147
+ grid-template-columns: 1fr;
148
+ }
149
+ }
150
+ </style>
233
151
  </head>
234
- <body class='<%=theme%>' data-agent="<%=agent%>">
235
- <header class='navheader grabbable'>
236
- <h1>
237
- <a class='home' href="/home"><img class='icon' src="/pinokio-black.png"></a>
238
- <button class='btn2' id='minimize-header' data-tippy-content="fullscreen" title='fullscreen'>
239
- <div><i class="fa-solid fa-expand"></i></div>
240
- </button>
241
- <button class='btn2' id='back' data-tippy-content="back"><div><i class="fa-solid fa-chevron-left"></i></div></button>
242
- <button class='btn2' id='forward' data-tippy-content="forward"><div><i class="fa-solid fa-chevron-right"></i></div></button>
243
- <button class='btn2' id='refresh-page' data-tippy-content="refresh"><div><i class="fa-solid fa-rotate-right"></i></div></button>
244
- <button class='btn2' id='screenshot' data-tippy-content="screen capture"><i class="fa-solid fa-camera"></i></button>
245
- <button class='btn2' id='inspector' data-tippy-content="X-ray mode"><i class="fa-solid fa-eye"></i></button>
246
- <div class='flexible'></div>
247
- <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
248
- <div><i class="fa-solid fa-table-columns"></i></div>
249
- </a>
250
- <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
251
- <div><i class="fa-solid fa-table-columns fa-rotate-270"></i></div>
252
- </a>
253
- <button class='btn2' id='new-window' data-tippy-content="open a new window" title='open a new window' data-agent="<%=agent%>">
254
- <div><i class="fa-solid fa-plus"></i></div>
255
- </button>
256
- <button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
257
- <div><i class="fa-solid fa-xmark"></i></div>
258
- </button>
259
- </h1>
260
- </header>
261
- <main>
262
- <div class='head'>
263
- <h3><i class="fa-brands fa-git-alt"></i><br><br>Configure Git</h3>
264
- </div>
265
- <div class='cols'>
266
- <div class='column'>
267
- <h1><i class="fa-brands fa-github"></i> GitHub</h1>
268
- <div>Connect with GitHub to publish projects to GitHub.</div>
269
- <div class='setup-items'>
270
- <% if (hosts.length > 0) { %>
271
- <pre><%=hosts%></pre>
272
- <% } else { %>
273
- <pre>not logged in</pre>
274
- <% } %>
275
- </div>
276
- <div class='setup-items'>
277
- <% items.forEach((item) => { %>
278
- <a class='btn' href="<%=item.url%>">
279
- <i class="<%=item.icon%>"></i> <%=item.title%>
280
- </a>
281
- <% }) %>
282
- </div>
283
- <div class='setup-items'>
284
- <div id='readme'><%-readme%></div>
285
- </div>
286
- </div>
287
- <div class='column'>
288
- <h1><i class="fa-brands fa-square-git"></i> Git Config</h1>
289
- <div>These credentials will show up on every commit.</div>
290
- <div class='setup-items'>
291
- <form class='gitconfig'>
292
- <div class='pre'>
293
- <div class='field'>
294
- <label>username</label>
295
- <input id='username' type='text' value="<%=gitconfig.user && gitconfig.user.name ? gitconfig.user.name : ''%>">
152
+ <%
153
+ const selected = "connect";
154
+ const isGithubConnected = typeof hosts === "string" && hosts.trim().length > 0;
155
+ const connectionLabel = isGithubConnected ? "Connected" : "Not connected";
156
+ const connectionIcon = isGithubConnected ? "fa-solid fa-circle-check" : "fa-regular fa-circle";
157
+ const connectionDetail = isGithubConnected
158
+ ? "Git Credential Manager is ready for GitHub operations inside Pinokio."
159
+ : "Connect GitHub to clone private repositories and publish from Pinokio.";
160
+ %>
161
+ <body class="<%= theme %> main-sidebar-page task-launcher-page task-page setup-page github-page" data-agent="<%= agent %>" data-page="github-config">
162
+ <%- include('partials/app_navheader', { agent }) %>
163
+ <main>
164
+ <div class="task-container">
165
+ <section class="task-shell github-login-shell">
166
+ <header class="task-shell-header">
167
+ <div class="task-shell-header-main">
168
+ <div class="task-shell-topline">
169
+ <p class="task-eyebrow">Login / GitHub</p>
296
170
  </div>
297
- <div class='field'>
298
- <label>email</label>
299
- <input id='email' type='text' value="<%=gitconfig.user && gitconfig.user.email ? gitconfig.user.email : ''%>">
171
+ <h1 class="task-title">Configure Git</h1>
172
+ <p class="task-description">Connect GitHub for private repositories and publishing, then set the identity Git writes on commits.</p>
173
+ <div class="task-badge-row task-header-badges">
174
+ <span class="task-badge <%= isGithubConnected ? 'task-badge-accent' : 'task-badge-neutral' %>"><%= connectionLabel %></span>
175
+ <span class="task-badge task-badge-neutral">Git Credential Manager</span>
176
+ <span class="task-badge task-badge-neutral">~/pinokio/gitconfig</span>
300
177
  </div>
301
178
  </div>
302
- <div class='gitconfig-footer'>
303
- <button class='btn'><i class="fa-solid fa-check"></i> Update</button>
304
- <div>gitconfig stored in ~/pinokio/gitconfig file </div>
305
- </div>
306
- </form>
307
- </div>
179
+ </header>
180
+
181
+ <div class="task-shell-body">
182
+ <section class="task-section task-section-subtle">
183
+ <div class="github-section-grid">
184
+ <div class="github-state-panel">
185
+ <div class="github-state-icon" aria-hidden="true">
186
+ <i class="<%= connectionIcon %>"></i>
187
+ </div>
188
+ <div class="github-state-copy">
189
+ <h2 class="github-state-title">GitHub <%= connectionLabel.toLowerCase() %></h2>
190
+ <p class="github-state-detail"><%= connectionDetail %></p>
191
+ <pre class="github-account-box"><%= isGithubConnected ? hosts : 'not logged in' %></pre>
192
+ <div class="github-action-row">
193
+ <% items.forEach((item) => { %>
194
+ <a class="task-button <%= item.title === 'Login' ? 'primary' : 'danger' %>" href="<%= item.url %>">
195
+ <i class="<%= item.icon %>" aria-hidden="true"></i>
196
+ <span><%= item.title %></span>
197
+ </a>
198
+ <% }) %>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ <div class="github-readme">
203
+ <%- readme %>
204
+ </div>
205
+ </div>
206
+ </section>
207
+
208
+ <section class="task-section">
209
+ <div class="task-section-head">
210
+ <div>
211
+ <h2 class="task-section-title">Git identity</h2>
212
+ <p class="task-section-subcopy">These values appear as the author on commits created from Pinokio shells.</p>
213
+ </div>
214
+ <div class="task-section-note">gitconfig</div>
215
+ </div>
216
+
217
+ <form class="github-config-form" data-github-config-form>
218
+ <div class="github-config-fields">
219
+ <label class="task-field">
220
+ <span class="task-label">Username</span>
221
+ <input class="task-input" id="username" type="text" autocomplete="name" value="<%= gitconfig.user && gitconfig.user.name ? gitconfig.user.name : '' %>">
222
+ </label>
223
+ <label class="task-field">
224
+ <span class="task-label">Email</span>
225
+ <input class="task-input" id="email" type="email" autocomplete="email" value="<%= gitconfig.user && gitconfig.user.email ? gitconfig.user.email : '' %>">
226
+ </label>
227
+ </div>
228
+ <div class="github-config-actions">
229
+ <button class="task-button primary task-run-button github-config-submit" type="submit">
230
+ <i class="fa-solid fa-check" aria-hidden="true"></i>
231
+ <span>Update</span>
232
+ </button>
233
+ <span class="github-config-path">Stored in ~/pinokio/gitconfig.</span>
234
+ </div>
235
+ <div class="task-status github-config-feedback hidden" data-github-config-feedback></div>
236
+ </form>
237
+ </section>
238
+ </div>
239
+ </section>
308
240
  </div>
309
- </div>
310
- </main>
311
- <script>
312
- document.querySelector("form.gitconfig").addEventListener("submit", (e) => {
313
- e.preventDefault()
314
- e.stopPropagation()
315
- fetch("/github/config", {
316
- method: "POST",
317
- headers: {
318
- "Content-Type": "application/json"
319
- },
320
- body: JSON.stringify({
321
- "user.name": document.querySelector("#username").value,
322
- "user.email": document.querySelector("#email").value
241
+ <%- include('partials/main_sidebar', { selected }) %>
242
+ </main>
243
+
244
+ <script>
245
+ const configForm = document.querySelector("[data-github-config-form]")
246
+ const feedback = document.querySelector("[data-github-config-feedback]")
247
+ const submitButton = configForm.querySelector(".github-config-submit")
248
+
249
+ function showFeedback(message, type) {
250
+ feedback.textContent = message
251
+ feedback.classList.remove("hidden", "success", "error")
252
+ feedback.classList.add(type)
253
+ }
254
+
255
+ configForm.addEventListener("submit", async (event) => {
256
+ event.preventDefault()
257
+ event.stopPropagation()
258
+ submitButton.disabled = true
259
+ submitButton.classList.add("is-busy")
260
+ try {
261
+ const res = await fetch("/github/config", {
262
+ method: "POST",
263
+ headers: {
264
+ "Content-Type": "application/json"
265
+ },
266
+ body: JSON.stringify({
267
+ "user.name": document.querySelector("#username").value,
268
+ "user.email": document.querySelector("#email").value
269
+ })
270
+ })
271
+ const json = await res.json()
272
+ if (json.error) {
273
+ throw new Error(json.error)
274
+ }
275
+ showFeedback("Git identity updated.", "success")
276
+ } catch (error) {
277
+ showFeedback(error.message || "Git identity could not be updated.", "error")
278
+ } finally {
279
+ submitButton.disabled = false
280
+ submitButton.classList.remove("is-busy")
281
+ }
323
282
  })
324
- }).then((res) => {
325
- return res.json()
326
- }).then((res) => {
327
- alert("Updated")
328
- location.href = location.href
329
- })
330
- })
331
- </script>
283
+ </script>
284
+ <%- include('partials/app_common_scripts') %>
332
285
  </body>
333
286
  </html>