pinokiod 7.5.7 → 7.5.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.
@@ -5055,21 +5055,42 @@ body.dark .logs-icon-button:focus-visible {
5055
5055
  .logs-community-footer {
5056
5056
  flex: 0 0 auto;
5057
5057
  min-width: 0;
5058
+ position: relative;
5058
5059
  display: grid;
5059
- grid-template-columns: minmax(360px, 0.32fr) minmax(320px, 1fr) auto;
5060
+ grid-template-columns: minmax(240px, 0.3fr) minmax(320px, 1fr) auto;
5060
5061
  align-items: center;
5061
- gap: 16px;
5062
- min-height: 68px;
5063
- padding: 14px 20px;
5062
+ gap: 12px;
5063
+ min-height: 64px;
5064
+ padding: 12px 20px;
5064
5065
  border: 0;
5065
- border-top: 1px solid rgba(186, 133, 28, 0.2);
5066
+ border-top: 1px solid rgba(78, 111, 176, 0.22);
5066
5067
  border-radius: 0;
5067
- background: rgba(186, 133, 28, 0.07);
5068
- box-shadow: none;
5068
+ background:
5069
+ linear-gradient(90deg, rgba(236, 243, 255, 0.96), rgba(248, 250, 252, 0.96));
5070
+ box-shadow:
5071
+ inset 0 1px 0 rgba(255, 255, 255, 0.82),
5072
+ 0 -1px 0 rgba(78, 111, 176, 0.06);
5073
+ }
5074
+ .logs-community-footer::before {
5075
+ content: "";
5076
+ position: absolute;
5077
+ left: 0;
5078
+ top: 10px;
5079
+ bottom: 10px;
5080
+ width: 3px;
5081
+ border-radius: 0 3px 3px 0;
5082
+ background: #4568b2;
5069
5083
  }
5070
5084
  body.dark .logs-community-footer {
5071
- border-top-color: rgba(245, 189, 75, 0.22);
5072
- background: rgba(245, 189, 75, 0.075);
5085
+ border-top-color: rgba(139, 171, 235, 0.18);
5086
+ background:
5087
+ linear-gradient(90deg, rgba(45, 65, 110, 0.34), rgba(255, 255, 255, 0.045));
5088
+ box-shadow:
5089
+ inset 0 1px 0 rgba(255, 255, 255, 0.05),
5090
+ 0 -1px 0 rgba(0, 0, 0, 0.18);
5091
+ }
5092
+ body.dark .logs-community-footer::before {
5093
+ background: #8daeff;
5073
5094
  }
5074
5095
  .logs-community-copy {
5075
5096
  min-width: 0;
@@ -5078,25 +5099,31 @@ body.dark .logs-community-footer {
5078
5099
  display: inline-flex;
5079
5100
  align-items: center;
5080
5101
  gap: 8px;
5081
- color: #9a6508;
5102
+ color: #172033;
5082
5103
  font-size: 13px;
5083
5104
  line-height: 1.2;
5084
5105
  font-weight: 800;
5085
5106
  }
5086
5107
  .logs-community-heading i {
5087
- color: currentColor;
5108
+ color: #345aa2;
5088
5109
  font-size: 13px;
5089
5110
  }
5090
5111
  body.dark .logs-community-heading {
5091
- color: #e1b261;
5112
+ color: rgba(248, 250, 252, 0.9);
5113
+ }
5114
+ body.dark .logs-community-heading i {
5115
+ color: #a7c0ff;
5092
5116
  }
5093
5117
  .logs-community-subtitle {
5094
5118
  margin-top: 3px;
5095
- color: var(--logs-muted);
5119
+ color: #536079;
5096
5120
  font-size: 12px;
5097
5121
  line-height: 1.25;
5098
5122
  font-weight: 500;
5099
5123
  }
5124
+ body.dark .logs-community-subtitle {
5125
+ color: rgba(224, 232, 255, 0.7);
5126
+ }
5100
5127
  .logs-community-title-field {
5101
5128
  min-width: 0;
5102
5129
  display: grid;
@@ -5107,17 +5134,18 @@ body.dark .logs-community-heading {
5107
5134
  .logs-community-title-control {
5108
5135
  min-width: 0;
5109
5136
  width: 100%;
5110
- height: 34px;
5137
+ height: 38px;
5111
5138
  display: flex;
5112
5139
  align-items: center;
5113
- border: 1px solid var(--logs-border-strong);
5140
+ border: 1px solid rgba(78, 111, 176, 0.26);
5114
5141
  border-radius: 7px;
5115
5142
  padding: 0;
5116
- background: rgba(255, 255, 255, 0.78);
5143
+ background: rgba(255, 255, 255, 0.82);
5117
5144
  overflow: hidden;
5118
5145
  }
5119
5146
  body.dark .logs-community-title-control {
5120
- background: rgba(255, 255, 255, 0.04);
5147
+ border-color: rgba(167, 192, 255, 0.2);
5148
+ background: rgba(255, 255, 255, 0.045);
5121
5149
  }
5122
5150
  .logs-community-title-prefix {
5123
5151
  flex: 0 0 auto;
@@ -5125,16 +5153,18 @@ body.dark .logs-community-title-control {
5125
5153
  display: inline-flex;
5126
5154
  align-items: center;
5127
5155
  padding: 0 11px;
5128
- border-right: 1px solid var(--logs-border);
5129
- color: var(--logs-muted);
5156
+ border-right: 1px solid rgba(78, 111, 176, 0.16);
5157
+ color: #69758d;
5130
5158
  font-size: 10px;
5131
5159
  line-height: 1;
5132
5160
  font-weight: 760;
5133
5161
  text-transform: uppercase;
5134
5162
  white-space: nowrap;
5135
- background: rgba(15, 23, 42, 0.025);
5163
+ background: rgba(78, 111, 176, 0.06);
5136
5164
  }
5137
5165
  body.dark .logs-community-title-prefix {
5166
+ border-right-color: rgba(167, 192, 255, 0.12);
5167
+ color: rgba(224, 232, 255, 0.58);
5138
5168
  background: rgba(255, 255, 255, 0.035);
5139
5169
  }
5140
5170
  .logs-community-title-input {
@@ -5148,17 +5178,91 @@ body.dark .logs-community-title-prefix {
5148
5178
  color: var(--logs-text);
5149
5179
  font-size: 12px;
5150
5180
  font-weight: 650;
5151
- line-height: 34px;
5181
+ line-height: 38px;
5152
5182
  outline: none;
5153
5183
  }
5154
5184
  .logs-community-title-control:focus-within {
5155
- border-color: var(--logs-border-strong);
5156
- box-shadow: 0 0 0 2px var(--logs-soft-hover);
5185
+ border-color: rgba(78, 111, 176, 0.48);
5186
+ box-shadow: 0 0 0 2px rgba(78, 111, 176, 0.13);
5157
5187
  }
5158
5188
  .logs-community-title-input:disabled {
5159
5189
  opacity: 0.62;
5160
5190
  cursor: not-allowed;
5161
5191
  }
5192
+ .logs-help-actions {
5193
+ min-width: 0;
5194
+ display: inline-flex;
5195
+ align-items: center;
5196
+ justify-content: flex-end;
5197
+ gap: 8px;
5198
+ }
5199
+ .logs-help-action {
5200
+ border: 1px solid rgba(78, 111, 176, 0.24);
5201
+ border-radius: 7px;
5202
+ min-width: 126px;
5203
+ min-height: 38px;
5204
+ padding: 0 14px;
5205
+ display: inline-flex;
5206
+ align-items: center;
5207
+ justify-content: center;
5208
+ gap: 7px;
5209
+ color: #172033;
5210
+ background: rgba(255, 255, 255, 0.82);
5211
+ font-size: 13px;
5212
+ line-height: 1;
5213
+ font-weight: 820;
5214
+ cursor: pointer;
5215
+ white-space: nowrap;
5216
+ transition: background 140ms ease, border-color 140ms ease, color 140ms ease, transform 140ms ease;
5217
+ }
5218
+ .logs-help-action:hover,
5219
+ .logs-help-action:focus-visible {
5220
+ outline: none;
5221
+ border-color: rgba(78, 111, 176, 0.36);
5222
+ background: rgba(255, 255, 255, 0.96);
5223
+ }
5224
+ .logs-help-action:active {
5225
+ transform: translateY(1px);
5226
+ }
5227
+ .logs-help-action:disabled {
5228
+ opacity: 0.58;
5229
+ cursor: not-allowed;
5230
+ transform: none;
5231
+ }
5232
+ .logs-help-action--ai {
5233
+ border-color: #172033;
5234
+ background: #172033;
5235
+ color: #fff;
5236
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.18);
5237
+ }
5238
+ .logs-help-action--ai:hover,
5239
+ .logs-help-action--ai:focus-visible {
5240
+ border-color: #0f1625;
5241
+ background: #0f1625;
5242
+ color: #fff;
5243
+ }
5244
+ body.dark .logs-help-action--community {
5245
+ border-color: rgba(167, 192, 255, 0.2);
5246
+ }
5247
+ body.dark .logs-help-action {
5248
+ background: rgba(255, 255, 255, 0.045);
5249
+ color: rgba(248, 250, 252, 0.9);
5250
+ }
5251
+ body.dark .logs-help-action:hover,
5252
+ body.dark .logs-help-action:focus-visible {
5253
+ background: rgba(255, 255, 255, 0.075);
5254
+ }
5255
+ body.dark .logs-help-action--ai {
5256
+ border-color: rgba(248, 250, 252, 0.88);
5257
+ background: rgba(248, 250, 252, 0.9);
5258
+ color: #111827;
5259
+ }
5260
+ body.dark .logs-help-action--ai:hover,
5261
+ body.dark .logs-help-action--ai:focus-visible {
5262
+ border-color: #fff;
5263
+ background: #fff;
5264
+ color: #111827;
5265
+ }
5162
5266
  .logs-community-title-note {
5163
5267
  display: none;
5164
5268
  max-width: 130px;
@@ -5173,13 +5277,60 @@ body.dark .logs-community-title-prefix {
5173
5277
  .logs-community-title-note:not(:empty) {
5174
5278
  display: inline;
5175
5279
  }
5176
- .logs-community-submit {
5177
- min-width: 154px;
5178
- min-height: 34px;
5179
- padding: 0 16px;
5180
- font-size: 13px;
5181
- font-weight: 850;
5182
- box-shadow: 0 1px 2px rgba(15, 23, 42, 0.16);
5280
+ .logs-ask-ai-launcher-panel {
5281
+ width: min(620px, calc(100vw - 28px));
5282
+ }
5283
+ .logs-ask-ai-launcher-body {
5284
+ min-height: 270px;
5285
+ }
5286
+ .logs-ask-ai-launcher-textarea {
5287
+ min-height: 96px;
5288
+ }
5289
+ .logs-ask-ai-launcher-footer {
5290
+ min-height: 66px;
5291
+ }
5292
+ .logs-ask-ai-launcher-tool-section {
5293
+ flex: 0 1 440px;
5294
+ min-width: min(440px, 58vw);
5295
+ }
5296
+ .logs-ask-ai-tool-picker {
5297
+ position: relative;
5298
+ width: 100%;
5299
+ }
5300
+ .logs-ask-ai-tool-trigger {
5301
+ pointer-events: none;
5302
+ }
5303
+ .logs-ask-ai-tool-picker:focus-within .logs-ask-ai-tool-trigger {
5304
+ border-color: var(--universal-launcher-border-strong);
5305
+ background: var(--universal-launcher-control-surface);
5306
+ outline: none;
5307
+ }
5308
+ .logs-ask-ai-tool-select {
5309
+ position: absolute;
5310
+ inset: 0;
5311
+ width: 100%;
5312
+ height: 100%;
5313
+ appearance: none;
5314
+ border: 0;
5315
+ opacity: 0;
5316
+ cursor: pointer;
5317
+ }
5318
+ .logs-ask-ai-tool-select:disabled {
5319
+ cursor: default;
5320
+ }
5321
+ .logs-ask-ai-tool-trigger-icon {
5322
+ display: inline-flex;
5323
+ align-items: center;
5324
+ justify-content: center;
5325
+ color: var(--universal-launcher-text);
5326
+ font-size: 14px;
5327
+ }
5328
+ .logs-ask-ai-tool-trigger-image {
5329
+ display: block;
5330
+ width: 20px;
5331
+ height: 20px;
5332
+ object-fit: contain;
5333
+ border-radius: 4px;
5183
5334
  }
5184
5335
  .logs-report-pane,
5185
5336
  .logs-redaction-pane {
@@ -5871,13 +6022,6 @@ body.dark .logs-zip-status.is-error {
5871
6022
  background: var(--logs-soft);
5872
6023
  outline: none;
5873
6024
  }
5874
- .logs-primary-button.logs-community-submit {
5875
- min-width: 154px;
5876
- min-height: 38px;
5877
- padding: 0 16px;
5878
- font-size: 13px;
5879
- font-weight: 850;
5880
- }
5881
6025
  .logs-flat-button.is-busy::after {
5882
6026
  content: '\f110';
5883
6027
  font-family: 'Font Awesome 6 Free';
@@ -6205,9 +6349,9 @@ body.dark .logs-resizer:hover .logs-resizer-toggle {
6205
6349
  .logs-community-title-field {
6206
6350
  grid-column: 1;
6207
6351
  }
6208
- .logs-community-submit {
6352
+ .logs-help-actions {
6209
6353
  grid-column: 2;
6210
- height: 38px;
6354
+ justify-content: flex-end;
6211
6355
  }
6212
6356
  }
6213
6357
  @media (max-width: 720px) {
@@ -6224,7 +6368,7 @@ body.dark .logs-resizer:hover .logs-resizer-toggle {
6224
6368
  }
6225
6369
  .logs-community-copy,
6226
6370
  .logs-community-title-field,
6227
- .logs-community-submit {
6371
+ .logs-help-actions {
6228
6372
  grid-column: 1;
6229
6373
  }
6230
6374
  .logs-community-title-field {
@@ -6234,8 +6378,25 @@ body.dark .logs-resizer:hover .logs-resizer-toggle {
6234
6378
  grid-column: 1;
6235
6379
  max-width: none;
6236
6380
  }
6237
- .logs-community-submit {
6238
- grid-row: auto;
6381
+ .logs-help-actions {
6382
+ display: grid;
6383
+ grid-template-columns: 1fr 1fr;
6384
+ width: 100%;
6385
+ }
6386
+ .logs-help-action {
6387
+ width: 100%;
6388
+ }
6389
+ .logs-ask-ai-launcher-footer {
6390
+ align-items: stretch;
6391
+ flex-direction: column;
6392
+ }
6393
+ .logs-ask-ai-launcher-tool-section {
6394
+ flex-basis: auto;
6395
+ min-width: 0;
6396
+ width: 100%;
6397
+ }
6398
+ .logs-ask-ai-launcher-footer .universal-launcher-footer-actions,
6399
+ .logs-ask-ai-launcher-footer .universal-launcher-button {
6239
6400
  width: 100%;
6240
6401
  }
6241
6402
  }
@@ -1504,19 +1504,9 @@ body.dark .ask-ai-drawer-location-input {
1504
1504
  body.dark .ask-ai-drawer-empty {
1505
1505
  color: rgba(255,255,255,0.7);
1506
1506
  }
1507
- .ask-ai-drawer-empty-title {
1508
- font-size: 14px;
1509
- font-weight: 600;
1510
- line-height: 1.25;
1511
- color: rgba(15, 23, 42, 0.92);
1512
- }
1513
- body.dark .ask-ai-drawer-empty-title {
1514
- color: rgba(248, 250, 252, 0.95);
1515
- }
1516
1507
  .ask-ai-drawer-empty-subtitle {
1517
1508
  font-size: 12px;
1518
1509
  line-height: 1.4;
1519
- margin-top: -6px;
1520
1510
  color: rgba(75, 85, 99, 0.78);
1521
1511
  }
1522
1512
  body.dark .ask-ai-drawer-empty-subtitle {
@@ -1592,6 +1582,12 @@ body.dark .ask-ai-drawer-search-input::placeholder {
1592
1582
  opacity: 0.58;
1593
1583
  padding: 0 2px 3px;
1594
1584
  }
1585
+ .ask-ai-drawer-picker-group-description {
1586
+ font-size: 11px;
1587
+ line-height: 1.35;
1588
+ opacity: 0.62;
1589
+ padding: 0 2px 5px;
1590
+ }
1595
1591
  .ask-ai-drawer-picker-option {
1596
1592
  appearance: none;
1597
1593
  -webkit-appearance: none;
@@ -7875,10 +7871,10 @@ body.dark .pinokio-custom-terminal-header {
7875
7871
  </div>
7876
7872
  </div>
7877
7873
  <div class='mobile-drawer-actions' aria-label="App actions">
7878
- <button type='button' class='btn header-item mobile-nav-logs' data-mobile-proxy="#logs-toggle" data-mobile-panel="logs" data-mobile-close-menu="true" aria-pressed="false" aria-label="Report Issue">
7874
+ <button type='button' class='btn header-item mobile-nav-logs' data-mobile-proxy="#logs-toggle" data-mobile-panel="logs" data-mobile-close-menu="true" aria-pressed="false" aria-label="Get Help">
7879
7875
  <div class='tab'>
7880
- <i class="fa-solid fa-circle-exclamation menu-action-leading-icon"></i>
7881
- <div class='display'>Report Issue</div>
7876
+ <i class="fa-solid fa-circle-question menu-action-leading-icon"></i>
7877
+ <div class='display'>Get Help</div>
7882
7878
  <div class='flexible'></div>
7883
7879
  </div>
7884
7880
  </button>
@@ -7912,10 +7908,10 @@ body.dark .pinokio-custom-terminal-header {
7912
7908
  <% if (type === 'browse') { %>
7913
7909
  <%- include('./partials/fs_status') %>
7914
7910
  <% } %>
7915
- <button type='button' id='logs-toggle' class="btn header-item" data-tippy-content="Report issue with logs" aria-expanded="false" aria-controls="app-logs-drawer">
7911
+ <button type='button' id='logs-toggle' class="btn header-item" data-tippy-content="Get help with logs" aria-expanded="false" aria-controls="app-logs-drawer">
7916
7912
  <div class='tab'>
7917
- <i class="fa-solid fa-circle-exclamation menu-action-leading-icon"></i>
7918
- <div class='display'>Report Issue</div>
7913
+ <i class="fa-solid fa-circle-question menu-action-leading-icon"></i>
7914
+ <div class='display'>Get Help</div>
7919
7915
  <div class='flexible'></div>
7920
7916
  <span class='logs-new-badge hidden' id='logs-new-badge'>New</span>
7921
7917
  </div>
@@ -8077,14 +8073,13 @@ body.dark .pinokio-custom-terminal-header {
8077
8073
  </div>
8078
8074
  <div class='ask-ai-drawer-body'>
8079
8075
  <div class='ask-ai-drawer-empty'>
8076
+ <div class='ask-ai-drawer-empty-subtitle'>Ask questions, debug errors, fix bugs, or edit files. Agents can read this project's code, scripts, environment, and recent logs.</div>
8080
8077
  <div class='ask-ai-drawer-search'>
8081
8078
  <i class="fa-solid fa-magnifying-glass" aria-hidden="true"></i>
8082
- <input class='ask-ai-drawer-search-input' type='search' placeholder="Search shells and plugins" autocomplete="off" spellcheck="false" aria-label="Search shells and plugins">
8079
+ <input class='ask-ai-drawer-search-input' type='search' placeholder="Search agents and shells" autocomplete="off" spellcheck="false" aria-label="Search agents and shells">
8083
8080
  </div>
8084
- <div class='ask-ai-drawer-empty-title'>Ask an AI agent about this project</div>
8085
- <div class='ask-ai-drawer-empty-subtitle'>Choose the shell or plugin the agent should use.</div>
8086
- <div class='ask-ai-drawer-picker-list' role="list" aria-label="Ask AI shells and plugins"></div>
8087
- <div class='ask-ai-drawer-picker-status muted'>Choose a shell or plugin to start an agent.</div>
8081
+ <div class='ask-ai-drawer-picker-list' role="list" aria-label="Ask AI agents and shells"></div>
8082
+ <div class='ask-ai-drawer-picker-status muted'>Choose an agent to start, or open a project shell.</div>
8088
8083
  </div>
8089
8084
  <iframe class='ask-ai-frame hidden' title="Panel" allow="fullscreen *;" allowfullscreen></iframe>
8090
8085
  </div>
@@ -10732,7 +10727,7 @@ const rerenderMenuSection = (container, html) => {
10732
10727
  }
10733
10728
  if (mobileLogsButton) {
10734
10729
  mobileLogsButton.classList.toggle("has-new", show)
10735
- mobileLogsButton.setAttribute("aria-label", show ? "Report Issue, new report available" : "Report Issue")
10730
+ mobileLogsButton.setAttribute("aria-label", show ? "Get Help, new report available" : "Get Help")
10736
10731
  }
10737
10732
  try {
10738
10733
  if (show) {
@@ -16434,7 +16429,7 @@ document.addEventListener("DOMContentLoaded", () => {
16434
16429
  }
16435
16430
  }
16436
16431
 
16437
- const normalizeLaunchUrl = (rawUrl, workspaceCwd) => {
16432
+ const normalizeLaunchUrl = (rawUrl, workspaceCwd, prompt) => {
16438
16433
  if (!rawUrl) {
16439
16434
  return null
16440
16435
  }
@@ -16447,6 +16442,8 @@ document.addEventListener("DOMContentLoaded", () => {
16447
16442
  if (parsed.origin !== window.location.origin) {
16448
16443
  return null
16449
16444
  }
16445
+ const hasPromptOverride = typeof prompt === "string"
16446
+ const normalizedPrompt = hasPromptOverride ? prompt.trim() : ""
16450
16447
  if (
16451
16448
  parsed.pathname.startsWith("/run/plugin/")
16452
16449
  || parsed.pathname.startsWith("/pinokio/run/plugin/")
@@ -16457,6 +16454,9 @@ document.addEventListener("DOMContentLoaded", () => {
16457
16454
  }
16458
16455
  parsed.searchParams.set("ask_ai", "1")
16459
16456
  parsed.searchParams.delete("prompt")
16457
+ if (hasPromptOverride && normalizedPrompt) {
16458
+ parsed.searchParams.set("prompt", normalizedPrompt)
16459
+ }
16460
16460
  }
16461
16461
  return `${parsed.pathname}${parsed.search}${parsed.hash}`
16462
16462
  }
@@ -16784,7 +16784,7 @@ document.addEventListener("DOMContentLoaded", () => {
16784
16784
  clearPickerList()
16785
16785
  const sourceTools = Array.isArray(tools) ? tools : []
16786
16786
  if (sourceTools.length === 0) {
16787
- setPickerStatus("No shells or plugins available.")
16787
+ setPickerStatus("No agents or shells available.")
16788
16788
  return
16789
16789
  }
16790
16790
  const normalizedQuery = normalizePickerQuery(query)
@@ -16792,7 +16792,7 @@ document.addEventListener("DOMContentLoaded", () => {
16792
16792
  ? sourceTools.filter((tool) => toolMatchesPickerQuery(tool, normalizedQuery))
16793
16793
  : sourceTools
16794
16794
  if (visibleTools.length === 0) {
16795
- setPickerStatus("No matching shells or plugins.")
16795
+ setPickerStatus("No matching agents or shells.")
16796
16796
  return
16797
16797
  }
16798
16798
  const groups = new Map()
@@ -16803,7 +16803,7 @@ document.addEventListener("DOMContentLoaded", () => {
16803
16803
  }
16804
16804
  groups.get(category).push(tool)
16805
16805
  })
16806
- const ordered = ["SHELL", "CLI", "IDE"].concat(Array.from(groups.keys()).filter((name) => !["SHELL", "CLI", "IDE"].includes(name)))
16806
+ const ordered = ["CLI", "IDE", "SHELL"].concat(Array.from(groups.keys()).filter((name) => !["SHELL", "CLI", "IDE"].includes(name)))
16807
16807
  let renderedCount = 0
16808
16808
  ordered.forEach((category) => {
16809
16809
  const items = (groups.get(category) || []).slice().sort((a, b) =>
@@ -16817,14 +16817,20 @@ document.addEventListener("DOMContentLoaded", () => {
16817
16817
  return
16818
16818
  }
16819
16819
  const displayCategory = category === "SHELL"
16820
- ? "Project Shell"
16821
- : (category === "IDE" ? "Desktop Plugins" : (category === "CLI" ? "Terminal Plugins" : category))
16820
+ ? "Project Shells"
16821
+ : (category === "IDE" ? "Desktop Agents" : (category === "CLI" ? "Terminal Agents" : category))
16822
16822
  const group = document.createElement("div")
16823
16823
  group.className = "ask-ai-drawer-picker-group"
16824
16824
  const label = document.createElement("div")
16825
16825
  label.className = "ask-ai-drawer-picker-group-label"
16826
16826
  label.textContent = displayCategory
16827
16827
  group.appendChild(label)
16828
+ if (category === "SHELL") {
16829
+ const description = document.createElement("div")
16830
+ description.className = "ask-ai-drawer-picker-group-description"
16831
+ description.textContent = "Open a shell in this project without starting an AI agent."
16832
+ group.appendChild(description)
16833
+ }
16828
16834
  items.forEach((tool) => {
16829
16835
  group.appendChild(createPickerOption(tool, workspaceCwd))
16830
16836
  renderedCount += 1
@@ -16834,7 +16840,7 @@ document.addEventListener("DOMContentLoaded", () => {
16834
16840
  }
16835
16841
  })
16836
16842
  if (!renderedCount) {
16837
- setPickerStatus("No shells or plugins available.")
16843
+ setPickerStatus("No agents or shells available.")
16838
16844
  return
16839
16845
  }
16840
16846
  setPickerStatus("")
@@ -16843,7 +16849,8 @@ document.addEventListener("DOMContentLoaded", () => {
16843
16849
  const openWithUrl = (rawUrl, opts = {}) => {
16844
16850
  const workspaceCwd = opts && typeof opts.workspaceCwd === "string" ? opts.workspaceCwd : ""
16845
16851
  const frameName = opts && typeof opts.frameName === "string" ? opts.frameName.trim() : ""
16846
- const normalized = normalizeLaunchUrl(rawUrl, workspaceCwd)
16852
+ const prompt = opts && typeof opts.prompt === "string" ? opts.prompt : undefined
16853
+ const normalized = normalizeLaunchUrl(rawUrl, workspaceCwd, prompt)
16847
16854
  if (!normalized) {
16848
16855
  return false
16849
16856
  }
@@ -16871,7 +16878,8 @@ document.addEventListener("DOMContentLoaded", () => {
16871
16878
  return false
16872
16879
  }
16873
16880
  return openWithUrl(payload.agentHref, {
16874
- workspaceCwd: resolveWorkspaceCwd(payload)
16881
+ workspaceCwd: resolveWorkspaceCwd(payload),
16882
+ prompt: typeof payload.prompt === "string" ? payload.prompt : undefined
16875
16883
  })
16876
16884
  }
16877
16885
 
@@ -633,6 +633,7 @@ document.addEventListener("DOMContentLoaded", async () => {
633
633
  if (packet.data.type) {
634
634
  payload.type = packet.data.type
635
635
  }
636
+ payload.silent = packet.data.silent
636
637
  payload.callbacks = {
637
638
  onClick: () => {
638
639
  let params = packet.data
@@ -904,6 +904,7 @@ document.addEventListener("DOMContentLoaded", async () => {
904
904
  if (packet.data.type) {
905
905
  payload.type = packet.data.type
906
906
  }
907
+ payload.silent = packet.data.silent
907
908
  n.Noty(payload)
908
909
  }
909
910
  } else if (packet.type === "input") {
@@ -11,6 +11,7 @@
11
11
  <link href="/markdown.css" rel="stylesheet"/>
12
12
  <link href="/noty.css" rel="stylesheet"/>
13
13
  <link href="/style.css" rel="stylesheet"/>
14
+ <link href="/universal-launcher.css" rel="stylesheet"/>
14
15
  <% if (agent === "electron") { %>
15
16
  <link href="/electron.css" rel="stylesheet"/>
16
17
  <% } %>
@@ -128,10 +129,10 @@
128
129
  </div>
129
130
  </aside>
130
131
  </div>
131
- <footer class="logs-community-footer" aria-label="Ask Community">
132
+ <footer class="logs-community-footer logs-help-footer" aria-label="Get help with this report">
132
133
  <div class="logs-community-copy">
133
- <div class="logs-community-heading"><i class="fa-solid fa-comments" aria-hidden="true"></i><span>Ask Community</span></div>
134
- <div class="logs-community-subtitle">Opens a draft question on pinokio.co with this report attached.</div>
134
+ <div class="logs-community-heading"><i class="fa-solid fa-circle-question" aria-hidden="true"></i><span>Get help</span></div>
135
+ <div class="logs-community-subtitle">Use this report with a local AI agent or post it on Pinokio Community.</div>
135
136
  </div>
136
137
  <div class="logs-community-title-field">
137
138
  <label class="logs-community-title-control" for="logs-draft-title">
@@ -140,7 +141,10 @@
140
141
  </label>
141
142
  <span class="logs-community-title-note" id="logs-draft-title-note" aria-live="polite"></span>
142
143
  </div>
143
- <button type="button" class="logs-primary-button logs-community-submit" id="logs-create-draft" disabled><i class="fa-solid fa-paper-plane"></i><span>Ask Community</span></button>
144
+ <div class="logs-help-actions">
145
+ <button type="button" class="logs-help-action logs-help-action--ai" id="logs-ask-ai" disabled><i class="fa-solid fa-robot"></i><span>Ask AI</span></button>
146
+ <button type="button" class="logs-help-action logs-help-action--community" id="logs-create-draft" disabled><i class="fa-solid fa-paper-plane"></i><span>Ask Community</span></button>
147
+ </div>
144
148
  </footer>
145
149
  </section>
146
150
 
@@ -207,7 +211,7 @@
207
211
  <% } %>
208
212
  </main>
209
213
  <script>
210
- window.LOGS_PAGE_DATA = <%- JSON.stringify({ rootDisplay: logsRootDisplay || '', downloadUrl: logsDownloadUrl || '/pinokio/logs.zip', workspace: logsWorkspace || '', workspaceTitle: logsTitle || '', reportUrl: logsReportUrl || '', draftUrl: typeof logsDraftUrl !== 'undefined' ? logsDraftUrl : '', registryBase: 'https://pinokio.co', initialView: logsInitialView || 'raw', embedded: !!logsEmbedded }) %>
214
+ window.LOGS_PAGE_DATA = <%- JSON.stringify({ rootDisplay: logsRootDisplay || '', downloadUrl: logsDownloadUrl || '/pinokio/logs.zip', workspace: logsWorkspace || '', workspaceTitle: logsTitle || '', workspaceCwd: typeof logsWorkspaceCwd !== 'undefined' ? logsWorkspaceCwd : '', reportUrl: logsReportUrl || '', draftUrl: typeof logsDraftUrl !== 'undefined' ? logsDraftUrl : '', registryBase: 'https://pinokio.co', initialView: logsInitialView || 'raw', embedded: !!logsEmbedded }) %>
211
215
  </script>
212
216
  <script src="/logs.js"></script>
213
217
  </body>
@@ -1639,6 +1639,8 @@ document.addEventListener("DOMContentLoaded", async () => {
1639
1639
  this.currentId = baseScriptId
1640
1640
  this.latestLogFallbackActive = false
1641
1641
  this.pendingInput = []
1642
+ this.pendingTerminalWrite = ""
1643
+ this.pendingTerminalWriteFrame = null
1642
1644
  this.inputBuffer = ""
1643
1645
  this.inputTracker = window.TerminalInputTracker ? new window.TerminalInputTracker({
1644
1646
  getFrameName: () => window.name || null,
@@ -1723,6 +1725,32 @@ document.addEventListener("DOMContentLoaded", async () => {
1723
1725
  }
1724
1726
  this.dirty = true
1725
1727
  }
1728
+ flushPendingTerminalWrite() {
1729
+ if (!this.pendingTerminalWrite) {
1730
+ this.pendingTerminalWriteFrame = null
1731
+ return
1732
+ }
1733
+ const text = this.pendingTerminalWrite
1734
+ this.pendingTerminalWrite = ""
1735
+ this.pendingTerminalWriteFrame = null
1736
+ this.write(text)
1737
+ }
1738
+ writeBatched(text) {
1739
+ if (text === "\u0007" || typeof text !== "string" || text.length === 0) {
1740
+ return
1741
+ }
1742
+ this.pendingTerminalWrite += text
1743
+ this.dirty = true
1744
+ if (this.pendingTerminalWriteFrame !== null) {
1745
+ return
1746
+ }
1747
+ const flush = () => this.flushPendingTerminalWrite()
1748
+ if (typeof window.requestAnimationFrame === "function") {
1749
+ this.pendingTerminalWriteFrame = window.requestAnimationFrame(flush)
1750
+ } else {
1751
+ this.pendingTerminalWriteFrame = window.setTimeout(flush, 16)
1752
+ }
1753
+ }
1726
1754
  finished() {
1727
1755
  /*
1728
1756
  n.Noty({
@@ -1921,13 +1949,13 @@ document.addEventListener("DOMContentLoaded", async () => {
1921
1949
  this.resizeSync.sendInitial()
1922
1950
  }
1923
1951
  if (packet.data.raw) {
1924
- this.write(packet.data.raw)
1952
+ this.writeBatched(packet.data.raw)
1925
1953
  } else if (packet.data.json) {
1926
- this.write(JSON.stringify(packet.data.json).replace(/\n/g, "\r\n"))
1927
- this.write("\r\n")
1954
+ this.writeBatched(JSON.stringify(packet.data.json).replace(/\n/g, "\r\n"))
1955
+ this.writeBatched("\r\n")
1928
1956
  } else if (packet.data.json2) {
1929
- this.write(JSON.stringify(packet.data.json2, null, 2).replace(/\n/g, "\r\n"))
1930
- this.write("\r\n")
1957
+ this.writeBatched(JSON.stringify(packet.data.json2, null, 2).replace(/\n/g, "\r\n"))
1958
+ this.writeBatched("\r\n")
1931
1959
  }
1932
1960
  if (packet.data.type === "emit2") {
1933
1961
  // long text => still posting to the shell => show progress
@@ -1945,6 +1973,7 @@ document.addEventListener("DOMContentLoaded", async () => {
1945
1973
  refreshParent(packet)
1946
1974
  pluginTerminalDiscoveryRefresher.clear()
1947
1975
  reloadMemory()
1976
+ this.flushPendingTerminalWrite()
1948
1977
  this.term.write("\r\nDisconnected...\r\n")
1949
1978
  document.querySelector("#status-window").innerHTML = "<b>Ready</b>"
1950
1979
  this.socket.close()