newmark-agent 0.6.0 → 0.6.2
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.
- package/dist/conversation-utility-host.bundle.cjs +91 -13
- package/dist/core/agent.d.ts +4 -0
- package/dist/core/agent.js +43 -8
- package/dist/core/agentKernelRunner.js +1 -0
- package/dist/core/browserPdf.d.ts +10 -0
- package/dist/core/browserPdf.js +56 -0
- package/dist/core/browserUse.d.ts +27 -0
- package/dist/core/browserUse.js +33 -5
- package/dist/core/browserUsePageAdapter.d.ts +13 -0
- package/dist/core/browserUsePageAdapter.js +45 -9
- package/dist/core/electronBrowserUseHost.d.ts +4 -0
- package/dist/core/electronBrowserUseHost.js +104 -15
- package/dist/core/searchMcpPool.d.ts +1 -0
- package/dist/core/searchMcpPool.js +20 -7
- package/dist/main.js +19 -4
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.js +25 -2
- package/dist/ui/index.html +174 -73
- package/dist/wsl-agent-host.bundle.cjs +91 -13
- package/package.json +2 -1
package/dist/ui/index.html
CHANGED
|
@@ -212,6 +212,10 @@ try {
|
|
|
212
212
|
|
|
213
213
|
/* Light theme */
|
|
214
214
|
[data-theme="light"] {
|
|
215
|
+
--accent: #405bd2;
|
|
216
|
+
--accent2: #147d59;
|
|
217
|
+
--nm-state-warning: #8a5b00;
|
|
218
|
+
--nm-state-danger: #c73545;
|
|
215
219
|
--bg: #f0f2f8;
|
|
216
220
|
--bg2: #e4e8f0;
|
|
217
221
|
--bg3: #d8dce8;
|
|
@@ -367,7 +371,7 @@ html, body {
|
|
|
367
371
|
50% { transform: scale(1.04); filter: saturate(1.25); }
|
|
368
372
|
}
|
|
369
373
|
|
|
370
|
-
::selection { background: rgba(91,120,255,0.35); color:
|
|
374
|
+
::selection { background: rgba(91,120,255,0.35); color: var(--text-bright); }
|
|
371
375
|
|
|
372
376
|
/* Open-source icon system: lucide-static sprite is copied into dist/ui at build time. */
|
|
373
377
|
.nm-icon {
|
|
@@ -515,9 +519,9 @@ button { border-radius: var(--radius-full) !important; }
|
|
|
515
519
|
transition: background var(--duration-fast) var(--ease-out-expo), color var(--duration-fast) var(--ease-out-expo);
|
|
516
520
|
}
|
|
517
521
|
|
|
518
|
-
.top-btn:hover { background:
|
|
522
|
+
.top-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
519
523
|
.top-btn:active { transform: scale(0.92) translateZ(0); }
|
|
520
|
-
.top-btn.close-btn:hover { background: rgba(255,68,68,0.2); color:
|
|
524
|
+
.top-btn.close-btn:hover { background: rgba(255,68,68,0.2); color: var(--nm-state-danger); }
|
|
521
525
|
|
|
522
526
|
/* ============================================================
|
|
523
527
|
LAYER 3 - Main Layout
|
|
@@ -724,7 +728,7 @@ button.left-nav-icon { width: calc(100% - 12px); }
|
|
|
724
728
|
white-space: nowrap;
|
|
725
729
|
}
|
|
726
730
|
|
|
727
|
-
.left-nav-icon:hover { background:
|
|
731
|
+
.left-nav-icon:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
728
732
|
.left-nav-icon:active { transform: scale(0.96) translateZ(0); }
|
|
729
733
|
.left-nav-icon .icon { width: 24px; height: 20px; text-align: center; flex-shrink: 0; font-size: 0; }
|
|
730
734
|
.left-nav-icon span:not(.icon) {
|
|
@@ -917,7 +921,7 @@ button.left-ws-item {
|
|
|
917
921
|
|
|
918
922
|
.ws-pin-btn:hover,
|
|
919
923
|
.ws-pin-btn.active {
|
|
920
|
-
background:
|
|
924
|
+
background: var(--control-hover-bg);
|
|
921
925
|
color: var(--text-bright);
|
|
922
926
|
border-color: var(--accent);
|
|
923
927
|
}
|
|
@@ -985,7 +989,7 @@ button.left-ws-item {
|
|
|
985
989
|
border-top: 1px solid var(--glass-border-1);
|
|
986
990
|
}
|
|
987
991
|
|
|
988
|
-
.left-collapse-btn:hover { background:
|
|
992
|
+
.left-collapse-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
989
993
|
.left-collapse-btn:active { transform: scale(0.92) translateZ(0); }
|
|
990
994
|
|
|
991
995
|
/* ============================================================
|
|
@@ -1102,7 +1106,7 @@ button.left-ws-item {
|
|
|
1102
1106
|
}
|
|
1103
1107
|
|
|
1104
1108
|
.conv-archive-btn:hover,
|
|
1105
|
-
.conv-rename-btn:hover { background:
|
|
1109
|
+
.conv-rename-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
1106
1110
|
|
|
1107
1111
|
.conv-archive-btn.archiving { cursor: default; border-color: var(--accent); }
|
|
1108
1112
|
.conv-archive-spinner {
|
|
@@ -1198,7 +1202,7 @@ button.left-ws-item {
|
|
|
1198
1202
|
|
|
1199
1203
|
.conv-pin-btn:hover,
|
|
1200
1204
|
.conv-pin-btn.active {
|
|
1201
|
-
background:
|
|
1205
|
+
background: var(--control-hover-bg);
|
|
1202
1206
|
color: var(--text-bright);
|
|
1203
1207
|
border-color: var(--accent);
|
|
1204
1208
|
}
|
|
@@ -1378,7 +1382,7 @@ button.left-ws-item {
|
|
|
1378
1382
|
position: relative;
|
|
1379
1383
|
}
|
|
1380
1384
|
|
|
1381
|
-
.tab-btn:hover { background:
|
|
1385
|
+
.tab-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
1382
1386
|
.tab-btn.active { background: rgba(91,120,255,0.12); color: var(--accent); border-color: rgba(91,120,255,0.2); }
|
|
1383
1387
|
.tab-btn:active { transform: scale(0.92) translateZ(0); }
|
|
1384
1388
|
.tab-btn .label { display: none; }
|
|
@@ -1474,7 +1478,7 @@ button.left-ws-item {
|
|
|
1474
1478
|
transition: background var(--duration-fast) var(--ease-out-expo);
|
|
1475
1479
|
}
|
|
1476
1480
|
|
|
1477
|
-
.et-btn:hover { background:
|
|
1481
|
+
.et-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
1478
1482
|
.et-btn.active { background:rgba(91,120,255,.16); color:var(--accent2); border-color:rgba(91,120,255,.55); }
|
|
1479
1483
|
.et-btn .nm-icon { width:15px; height:15px; }
|
|
1480
1484
|
.et-btn.primary { background: var(--accent); color: #fff; border-color: var(--accent); }
|
|
@@ -1518,6 +1522,7 @@ button.left-ws-item {
|
|
|
1518
1522
|
|
|
1519
1523
|
.browser-url-input {
|
|
1520
1524
|
flex: 1;
|
|
1525
|
+
min-width: 0;
|
|
1521
1526
|
padding: 5px 10px;
|
|
1522
1527
|
border: 1px solid var(--border);
|
|
1523
1528
|
border-radius: var(--radius-md);
|
|
@@ -1535,7 +1540,7 @@ button.left-ws-item {
|
|
|
1535
1540
|
min-height: 280px;
|
|
1536
1541
|
border: 1px solid var(--border);
|
|
1537
1542
|
border-radius: var(--radius-md);
|
|
1538
|
-
background:
|
|
1543
|
+
background: var(--bg);
|
|
1539
1544
|
overflow: hidden;
|
|
1540
1545
|
}
|
|
1541
1546
|
|
|
@@ -1578,15 +1583,21 @@ button.left-ws-item {
|
|
|
1578
1583
|
.md-rendered pre {
|
|
1579
1584
|
position: relative;
|
|
1580
1585
|
margin: 8px 0;
|
|
1581
|
-
padding:
|
|
1582
|
-
|
|
1586
|
+
padding: 0;
|
|
1587
|
+
max-width: 100%;
|
|
1588
|
+
min-width: 0;
|
|
1589
|
+
overflow: hidden;
|
|
1590
|
+
text-align: left;
|
|
1591
|
+
white-space: normal;
|
|
1583
1592
|
border: 1px solid var(--glass-border-1);
|
|
1584
1593
|
border-radius: var(--radius-sm);
|
|
1585
|
-
background:
|
|
1594
|
+
background: var(--glass-bg-3);
|
|
1586
1595
|
}
|
|
1587
1596
|
.md-rendered pre code {
|
|
1588
1597
|
display: block;
|
|
1589
|
-
padding:
|
|
1598
|
+
padding: 10px 12px;
|
|
1599
|
+
max-width: 100%;
|
|
1600
|
+
overflow-x: auto;
|
|
1590
1601
|
border: 0;
|
|
1591
1602
|
background: transparent;
|
|
1592
1603
|
white-space: pre;
|
|
@@ -1847,7 +1858,7 @@ button.left-ws-item {
|
|
|
1847
1858
|
|
|
1848
1859
|
.plan-status-btn.in-progress {
|
|
1849
1860
|
border-color: rgba(240,173,78,0.7);
|
|
1850
|
-
color:
|
|
1861
|
+
color: var(--nm-state-warning);
|
|
1851
1862
|
}
|
|
1852
1863
|
|
|
1853
1864
|
.plan-status-btn.done {
|
|
@@ -1978,7 +1989,7 @@ button.left-ws-item {
|
|
|
1978
1989
|
line-height: 1;
|
|
1979
1990
|
}
|
|
1980
1991
|
|
|
1981
|
-
.terminal-tab .close-tab:hover { background: rgba(255,80,80,0.3); color:
|
|
1992
|
+
.terminal-tab .close-tab:hover { background: rgba(255,80,80,0.3); color: var(--nm-state-danger); }
|
|
1982
1993
|
|
|
1983
1994
|
#terminal-body {
|
|
1984
1995
|
flex: 1;
|
|
@@ -2105,7 +2116,7 @@ button.left-ws-item {
|
|
|
2105
2116
|
transition: background var(--duration-fast) var(--ease-out-expo), color var(--duration-fast) var(--ease-out-expo);
|
|
2106
2117
|
}
|
|
2107
2118
|
|
|
2108
|
-
.shell-btn:hover { background:
|
|
2119
|
+
.shell-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
2109
2120
|
.shell-btn:active { transform: scale(0.95) translateZ(0); }
|
|
2110
2121
|
|
|
2111
2122
|
.shell-toggle-btn {
|
|
@@ -2171,9 +2182,7 @@ button.left-ws-item {
|
|
|
2171
2182
|
background-color: var(--chat-canvas);
|
|
2172
2183
|
}
|
|
2173
2184
|
.md-code-copy {
|
|
2174
|
-
|
|
2175
|
-
top: 6px;
|
|
2176
|
-
right: 7px;
|
|
2185
|
+
flex-shrink: 0;
|
|
2177
2186
|
border: 1px solid var(--glass-border-1);
|
|
2178
2187
|
border-radius: 4px;
|
|
2179
2188
|
background: var(--glass-bg-2);
|
|
@@ -2183,6 +2192,10 @@ button.left-ws-item {
|
|
|
2183
2192
|
cursor: pointer;
|
|
2184
2193
|
}
|
|
2185
2194
|
.md-code-copy:hover { color: var(--text); }
|
|
2195
|
+
.md-code-toolbar { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:6px 10px; border-bottom:1px solid var(--glass-border-1); color:var(--text-dim); font:11px var(--font-ui); }
|
|
2196
|
+
.md-code-toolbar > span { min-width:0; overflow:hidden; text-overflow:ellipsis; }
|
|
2197
|
+
.chat-msg.assistant > .msg-body { padding-right:28px; min-width:0; }
|
|
2198
|
+
.chat-msg.user > .msg-body { padding-left:28px; min-width:0; }
|
|
2186
2199
|
|
|
2187
2200
|
#chat-area {
|
|
2188
2201
|
flex: 1;
|
|
@@ -2372,10 +2385,10 @@ button.left-ws-item {
|
|
|
2372
2385
|
}
|
|
2373
2386
|
|
|
2374
2387
|
.chat-msg.error {
|
|
2375
|
-
color:
|
|
2388
|
+
color: var(--nm-state-danger);
|
|
2376
2389
|
}
|
|
2377
2390
|
|
|
2378
|
-
.chat-msg.guide-rejected::after { border-color:
|
|
2391
|
+
.chat-msg.guide-rejected::after { border-color: var(--nm-state-danger); }
|
|
2379
2392
|
|
|
2380
2393
|
.guide-receipt-status {
|
|
2381
2394
|
display: inline-flex;
|
|
@@ -2390,9 +2403,9 @@ button.left-ws-item {
|
|
|
2390
2403
|
opacity: 0.86;
|
|
2391
2404
|
}
|
|
2392
2405
|
|
|
2393
|
-
.guide-receipt-status.deferred { color:
|
|
2406
|
+
.guide-receipt-status.deferred { color: var(--nm-state-warning); border-color: rgba(255, 210, 122, 0.28); }
|
|
2394
2407
|
.guide-receipt-status.applied { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 30%, transparent); }
|
|
2395
|
-
.guide-receipt-status.rejected { color:
|
|
2408
|
+
.guide-receipt-status.rejected { color: var(--nm-state-danger); border-color: rgba(255, 136, 136, 0.34); }
|
|
2396
2409
|
|
|
2397
2410
|
.chat-msg .meta {
|
|
2398
2411
|
display: flex;
|
|
@@ -2413,7 +2426,7 @@ button.left-ws-item {
|
|
|
2413
2426
|
.chat-msg.user .msg-role { color: var(--accent); }
|
|
2414
2427
|
.chat-msg.assistant .msg-role { color: var(--accent2); }
|
|
2415
2428
|
.chat-msg.workflow .msg-role { color: var(--accent); }
|
|
2416
|
-
.chat-msg.error .msg-role { color:
|
|
2429
|
+
.chat-msg.error .msg-role { color: var(--nm-state-danger); }
|
|
2417
2430
|
.chat-msg.user .meta { justify-content: flex-end; text-align: right; }
|
|
2418
2431
|
.chat-msg.user .msg-body { text-align: right; }
|
|
2419
2432
|
.chat-msg.user .msg-actions { margin-left: 4px; }
|
|
@@ -2473,7 +2486,7 @@ button.left-ws-item {
|
|
|
2473
2486
|
.message-edit-submit { border-color: color-mix(in srgb, var(--accent) 55%, var(--glass-border-2)); color: var(--accent); }
|
|
2474
2487
|
.conversation-branch-pager { display:flex; justify-content:flex-end; align-items:center; gap:0; margin-top:7px; color:var(--text-dim); font-size:11px; }
|
|
2475
2488
|
.branch-page-arrow { cursor:pointer; color:var(--text-dim); padding:1px 3px; transition:color var(--duration-fast) var(--ease-out-expo), background var(--duration-fast) var(--ease-out-expo); border-radius:var(--radius-sm); }
|
|
2476
|
-
.branch-page-arrow:hover { color:var(--text-bright); background:
|
|
2489
|
+
.branch-page-arrow:hover { color:var(--text-bright); background:var(--control-hover-bg); }
|
|
2477
2490
|
.branch-page-arrow:active { transform:scale(0.92) translateZ(0); }
|
|
2478
2491
|
|
|
2479
2492
|
.chat-msg .msg-body .md-rendered {
|
|
@@ -2633,8 +2646,8 @@ button.left-ws-item {
|
|
|
2633
2646
|
.conversation-work-run-title { flex: 1; min-width: 0; }
|
|
2634
2647
|
.conversation-work-run-status { color: var(--text-dim); font: 10px var(--font-mono); }
|
|
2635
2648
|
.conversation-work-change-badge { display:inline-flex; align-items:center; gap:8px; margin-left:auto; padding:5px 10px; border:1px solid var(--border); border-radius:999px; background:var(--panel); color:var(--text-dim); font-size:11px; white-space:nowrap; }
|
|
2636
|
-
.conversation-work-change-badge .add { color
|
|
2637
|
-
.conversation-work-change-badge .del { color
|
|
2649
|
+
.conversation-work-change-badge .add { color:var(--nm-state-success); }
|
|
2650
|
+
.conversation-work-change-badge .del { color:var(--nm-state-danger); }
|
|
2638
2651
|
.conversation-work-run-body { border: 0; padding: 4px var(--work-run-right-safe) 8px 0; }
|
|
2639
2652
|
.conversation-work-run.collapsed .conversation-work-run-body { display: none; }
|
|
2640
2653
|
.work-run-collapsed-guides { display: none; }
|
|
@@ -2646,7 +2659,7 @@ button.left-ws-item {
|
|
|
2646
2659
|
.conversation-work-event { display: grid; grid-template-columns: 17px minmax(0,1fr); gap: 7px; align-items: start; color: var(--text-dim); font-size: 11px; line-height: 1.5; }
|
|
2647
2660
|
.conversation-work-event .nm-icon { margin-top: 1px; color: var(--text-dim); }
|
|
2648
2661
|
.conversation-work-event.guide { color: var(--text); padding: 3px 0; }
|
|
2649
|
-
.conversation-work-event.error { color:
|
|
2662
|
+
.conversation-work-event.error { color: var(--nm-state-danger); }
|
|
2650
2663
|
.conversation-work-event-content { min-width: 0; white-space: pre-wrap; word-break: break-word; }
|
|
2651
2664
|
.conversation-work-event.narrative { display: block; color: var(--text); font-size: 13px; line-height: 1.65; padding: 3px 1px 7px; }
|
|
2652
2665
|
.conversation-work-event.activity-summary { font-size: 11px; font-weight: 400; color: var(--text-dim); padding: 2px 0; }
|
|
@@ -2708,7 +2721,7 @@ button.left-ws-item {
|
|
|
2708
2721
|
.conversation-work-file-inline { margin: 1px 0; border: none; border-radius: 0; background: transparent; }
|
|
2709
2722
|
.conversation-work-file.conversation-work-file-inline > summary { display: grid; grid-template-columns: 17px minmax(0,max-content) auto 10px; gap: 7px; align-items: center; justify-content: start; width: fit-content; max-width: 100%; min-height: 24px; padding: 0; border-radius: var(--radius-sm); color: var(--text-dim); font: 400 11px/1.5 var(--font-ui); transition: background var(--duration-fast) var(--ease-out-expo); list-style: none; cursor: pointer; }
|
|
2710
2723
|
.conversation-work-file-inline > summary::-webkit-details-marker { display: none; }
|
|
2711
|
-
.conversation-work-file-inline > summary:hover { background:
|
|
2724
|
+
.conversation-work-file-inline > summary:hover { background: var(--control-hover-bg); }
|
|
2712
2725
|
.conversation-work-file-inline > summary .nm-icon { margin-top: 2px; color: var(--text-dim); }
|
|
2713
2726
|
.conversation-work-file-inline .conversation-work-file-name { font: inherit; }
|
|
2714
2727
|
.conversation-work-file-inline .conversation-work-file-stats { font: 10px/1.5 var(--font-mono); }
|
|
@@ -2717,13 +2730,13 @@ button.left-ws-item {
|
|
|
2717
2730
|
.conversation-work-file-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 12px var(--font-mono); }
|
|
2718
2731
|
.conversation-work-file-stats { display: inline-flex; gap: 7px; font: 11px var(--font-mono); }
|
|
2719
2732
|
.conversation-work-file-add { color: var(--accent2); }
|
|
2720
|
-
.conversation-work-file-del { color:
|
|
2733
|
+
.conversation-work-file-del { color: var(--nm-state-danger); }
|
|
2721
2734
|
.conversation-work-file-diff { max-height: 340px; overflow: auto; border-top: 1px solid var(--glass-border-1); background: rgba(0,0,0,.14); font: 11px/1.55 var(--font-mono); }
|
|
2722
2735
|
.conversation-work-file-line { display: grid; grid-template-columns: 42px minmax(0,1fr); min-height: 22px; white-space: pre; }
|
|
2723
2736
|
.conversation-work-file-line-number { padding: 2px 8px; color: var(--text-dim); text-align: right; user-select: none; border-right: 1px solid var(--glass-border-1); }
|
|
2724
2737
|
.conversation-work-file-line-code { padding: 2px 10px; overflow-wrap: normal; }
|
|
2725
|
-
.conversation-work-file-line.del { color:
|
|
2726
|
-
.conversation-work-file-line.add { color:
|
|
2738
|
+
.conversation-work-file-line.del { color: var(--nm-state-danger); background: rgba(255,68,68,.14); }
|
|
2739
|
+
.conversation-work-file-line.add { color: var(--nm-state-success); background: rgba(56,212,160,.13); }
|
|
2727
2740
|
.conversation-work-file-line.empty { color: var(--text-dim); }
|
|
2728
2741
|
.conversation-work-empty { color: var(--text-dim); font-size: 11px; }
|
|
2729
2742
|
|
|
@@ -2822,7 +2835,7 @@ button.left-ws-item {
|
|
|
2822
2835
|
transition: background var(--duration-fast) var(--ease-out-expo);
|
|
2823
2836
|
}
|
|
2824
2837
|
|
|
2825
|
-
.shell-block-header:hover { background:
|
|
2838
|
+
.shell-block-header:hover { background: var(--control-hover-bg); }
|
|
2826
2839
|
.shell-block-header .arrow { transition: transform var(--duration-fast) var(--ease-out-expo); font-size: 9px; }
|
|
2827
2840
|
.shell-block.collapsed .shell-block-header .arrow { transform: rotate(-90deg); }
|
|
2828
2841
|
.shell-block-body {
|
|
@@ -2858,7 +2871,7 @@ button.left-ws-item {
|
|
|
2858
2871
|
transition: background var(--duration-fast) var(--ease-out-expo);
|
|
2859
2872
|
}
|
|
2860
2873
|
|
|
2861
|
-
.diff-block-header:hover { background:
|
|
2874
|
+
.diff-block-header:hover { background: var(--control-hover-bg); }
|
|
2862
2875
|
.diff-block.collapsed .diff-block-body { display: none; }
|
|
2863
2876
|
.diff-block-header .arrow { transition: transform var(--duration-fast) var(--ease-out-expo); font-size: 9px; }
|
|
2864
2877
|
.diff-block.collapsed .diff-block-header .arrow { transform: rotate(-90deg); }
|
|
@@ -2882,7 +2895,7 @@ button.todo-item { background: transparent; }
|
|
|
2882
2895
|
|
|
2883
2896
|
.diff-stat { display: flex; gap: 8px; margin-left: auto; }
|
|
2884
2897
|
.diff-add { color: var(--accent2); font-size: 11px; }
|
|
2885
|
-
.diff-del { color:
|
|
2898
|
+
.diff-del { color: var(--nm-state-danger); font-size: 11px; }
|
|
2886
2899
|
.diff-block-body {
|
|
2887
2900
|
padding: 0;
|
|
2888
2901
|
font-family: var(--font-mono);
|
|
@@ -2898,7 +2911,7 @@ button.todo-item { background: transparent; }
|
|
|
2898
2911
|
}
|
|
2899
2912
|
|
|
2900
2913
|
.diff-line.add { background: rgba(56,212,160,0.1); color: var(--accent2); }
|
|
2901
|
-
.diff-line.del { background: rgba(255,68,68,0.1); color:
|
|
2914
|
+
.diff-line.del { background: rgba(255,68,68,0.1); color: var(--nm-state-danger); }
|
|
2902
2915
|
.diff-line.ctx { color: var(--text-dim); }
|
|
2903
2916
|
|
|
2904
2917
|
/* Option feedback */
|
|
@@ -3089,7 +3102,7 @@ button.todo-item { background: transparent; }
|
|
|
3089
3102
|
}
|
|
3090
3103
|
|
|
3091
3104
|
.stack-icon-btn:hover {
|
|
3092
|
-
background:
|
|
3105
|
+
background: var(--control-hover-bg);
|
|
3093
3106
|
color: var(--text-bright);
|
|
3094
3107
|
border-color: var(--glass-border-1);
|
|
3095
3108
|
}
|
|
@@ -3099,8 +3112,8 @@ button.todo-item { background: transparent; }
|
|
|
3099
3112
|
}
|
|
3100
3113
|
|
|
3101
3114
|
.stack-icon-btn:active { transform: scale(0.94); }
|
|
3102
|
-
.stack-icon-btn.warn { color:
|
|
3103
|
-
.stack-icon-btn.danger { color:
|
|
3115
|
+
.stack-icon-btn.warn { color: var(--nm-state-warning); }
|
|
3116
|
+
.stack-icon-btn.danger { color: var(--nm-state-danger); }
|
|
3104
3117
|
.stack-icon-btn:focus-visible {
|
|
3105
3118
|
border-color: var(--accent);
|
|
3106
3119
|
box-shadow: 0 0 0 3px var(--accent-glow);
|
|
@@ -3415,9 +3428,9 @@ button.todo-item { background: transparent; }
|
|
|
3415
3428
|
|
|
3416
3429
|
.conv-runtime-badge.running { color: var(--accent2); }
|
|
3417
3430
|
.conv-runtime-badge.stopping,
|
|
3418
|
-
.conv-runtime-badge.force_restarting { color:
|
|
3431
|
+
.conv-runtime-badge.force_restarting { color: var(--nm-state-warning); }
|
|
3419
3432
|
.conv-runtime-badge.error,
|
|
3420
|
-
.conv-runtime-badge.force_interrupted { color:
|
|
3433
|
+
.conv-runtime-badge.force_interrupted { color: var(--nm-state-danger); }
|
|
3421
3434
|
|
|
3422
3435
|
.queue-edit:focus {
|
|
3423
3436
|
color: var(--text-bright);
|
|
@@ -4109,7 +4122,7 @@ button.todo-item { background: transparent; }
|
|
|
4109
4122
|
}
|
|
4110
4123
|
|
|
4111
4124
|
#scroll-bottom-btn.visible { display: flex; }
|
|
4112
|
-
#scroll-bottom-btn:hover { background:
|
|
4125
|
+
#scroll-bottom-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); box-shadow: var(--shadow-lg); }
|
|
4113
4126
|
|
|
4114
4127
|
/* ============================================================
|
|
4115
4128
|
MARQUEE BORDER
|
|
@@ -4390,8 +4403,8 @@ button.todo-item { background: transparent; }
|
|
|
4390
4403
|
transition: background var(--duration-fast) var(--ease-out-expo), color var(--duration-fast) var(--ease-out-expo);
|
|
4391
4404
|
}
|
|
4392
4405
|
|
|
4393
|
-
.sub-win-close:hover { background: rgba(255,68,68,0.15); color:
|
|
4394
|
-
.sub-win-close:focus-visible { outline:none; color
|
|
4406
|
+
.sub-win-close:hover { background: rgba(255,68,68,0.15); color: var(--nm-state-danger); }
|
|
4407
|
+
.sub-win-close:focus-visible { outline:none; color:var(--nm-state-danger); box-shadow:inset 0 0 0 2px currentColor; }
|
|
4395
4408
|
|
|
4396
4409
|
.sub-win-body {
|
|
4397
4410
|
flex: 1;
|
|
@@ -4596,7 +4609,7 @@ textarea.mcp-input { min-height:76px; resize:vertical; font-family:var(--font-mo
|
|
|
4596
4609
|
.remote-touch-status:hover { background: transparent !important; }
|
|
4597
4610
|
.remote-touch-status.listening { color: var(--accent2); }
|
|
4598
4611
|
.remote-touch-status.error,
|
|
4599
|
-
.remote-touch-status.checking { color:
|
|
4612
|
+
.remote-touch-status.checking { color: var(--nm-state-warning); }
|
|
4600
4613
|
.remote-touch-status.off { color: var(--notice-error-text); }
|
|
4601
4614
|
.remote-touch-status[aria-busy="true"] { cursor: wait; }
|
|
4602
4615
|
|
|
@@ -4825,8 +4838,8 @@ textarea.mcp-input { min-height:76px; resize:vertical; font-family:var(--font-mo
|
|
|
4825
4838
|
.github-repo-select-icon { position:absolute; right:11px; top:50%; width:14px; height:14px; transform:translateY(-50%); color:var(--text-dim); pointer-events:none; display:inline-flex; align-items:center; justify-content:center; }
|
|
4826
4839
|
.model-eval-line { display:block; margin-top:4px; font-size:10px; color:var(--text-dim); }
|
|
4827
4840
|
.model-eval-ok { color: var(--accent2); }
|
|
4828
|
-
.model-eval-bad { color:
|
|
4829
|
-
.model-eval-pending { color:
|
|
4841
|
+
.model-eval-bad { color: var(--nm-state-danger); }
|
|
4842
|
+
.model-eval-pending { color: var(--nm-state-warning); }
|
|
4830
4843
|
|
|
4831
4844
|
/* Memory Lab tag graph */
|
|
4832
4845
|
.memory-lab-panel {
|
|
@@ -5436,7 +5449,7 @@ html.newmark-memory-overview-viewer body {
|
|
|
5436
5449
|
transition: color var(--duration-fast) var(--ease-out-expo);
|
|
5437
5450
|
}
|
|
5438
5451
|
|
|
5439
|
-
.model-chip .remove:hover { color:
|
|
5452
|
+
.model-chip .remove:hover { color: var(--nm-state-danger); }
|
|
5440
5453
|
|
|
5441
5454
|
.model-eval-results {
|
|
5442
5455
|
margin-top: 10px;
|
|
@@ -5534,8 +5547,8 @@ html.newmark-memory-overview-viewer body {
|
|
|
5534
5547
|
transition: background var(--duration-fast) var(--ease-out-expo);
|
|
5535
5548
|
}
|
|
5536
5549
|
|
|
5537
|
-
.archive-action-btn:hover { background:
|
|
5538
|
-
.archive-action-btn.danger:hover { background: rgba(255,68,68,0.15); color:
|
|
5550
|
+
.archive-action-btn:hover { background: var(--control-hover-bg); color: var(--text-bright); }
|
|
5551
|
+
.archive-action-btn.danger:hover { background: rgba(255,68,68,0.15); color: var(--nm-state-danger); }
|
|
5539
5552
|
|
|
5540
5553
|
/* ============================================================
|
|
5541
5554
|
AUTOMATION WINDOW
|
|
@@ -6243,11 +6256,12 @@ input[type="checkbox"]::before {
|
|
|
6243
6256
|
width: 18px;
|
|
6244
6257
|
height: 18px;
|
|
6245
6258
|
border-radius: 50%;
|
|
6246
|
-
background: var(--text
|
|
6259
|
+
background: var(--text);
|
|
6247
6260
|
box-shadow: 0 2px 5px rgba(0,0,0,.28);
|
|
6248
6261
|
transform: translateX(var(--liquid-switch-x)) scale(1);
|
|
6249
6262
|
transition: transform 160ms var(--ease-out-expo), box-shadow 100ms var(--ease-out-expo), background 100ms var(--ease-out-expo);
|
|
6250
6263
|
}
|
|
6264
|
+
input[type="checkbox"]:checked::before { background: #fff; }
|
|
6251
6265
|
input[type="checkbox"].liquid-switch-dragging::before {
|
|
6252
6266
|
left: 1px;
|
|
6253
6267
|
width: 22px;
|
|
@@ -9207,7 +9221,7 @@ function renderMarkdownBlocks(text) {
|
|
|
9207
9221
|
var code = codeLines.join('\n');
|
|
9208
9222
|
var normalizedLanguage = lang ? normalizeCodeLanguage(lang) : 'text';
|
|
9209
9223
|
var highlighted = normalizedLanguage === 'text' ? esc(code) : highlightCodeByLanguage(code, normalizedLanguage);
|
|
9210
|
-
html += '<pre><button class="md-code-copy" type="button" title="' + escAttr(t('common.copy')) + '" data-code="' + escAttr(code) + '" onclick="window.copyMarkdownCode(this)">' + esc(t('common.copy')) + '</button><code' + (lang ? ' data-lang="' + escAttr(lang) + '"' : '') + ' class="md-code-block language-' + escAttr(normalizedLanguage) + '">' + highlighted + '</code></pre>';
|
|
9224
|
+
html += '<pre><div class="md-code-toolbar"><span>' + esc(lang || 'text') + '</span><button class="md-code-copy" type="button" aria-label="' + escAttr(currentLang() === 'zh' ? '复制代码' : 'Copy code') + '" title="' + escAttr(t('common.copy')) + '" data-code="' + escAttr(code) + '" onclick="window.copyMarkdownCode(this)">' + esc(t('common.copy')) + '</button></div><code' + (lang ? ' data-lang="' + escAttr(lang) + '"' : '') + ' class="md-code-block language-' + escAttr(normalizedLanguage) + '">' + highlighted + '</code></pre>';
|
|
9211
9225
|
continue;
|
|
9212
9226
|
}
|
|
9213
9227
|
if (trimmed === '$$' || trimmed === '\\[') {
|
|
@@ -11924,9 +11938,11 @@ function updateConversationWorkRunElement(run, element) {
|
|
|
11924
11938
|
}
|
|
11925
11939
|
var running = ['running', 'stopping', 'force_restarting'].indexOf(String(run.status || '')) >= 0;
|
|
11926
11940
|
var expanded = !!run.expanded;
|
|
11927
|
-
|
|
11928
|
-
element.
|
|
11929
|
-
element.
|
|
11941
|
+
var nextClassName = 'conversation-work-run ' + (running ? 'running ' : '') + (expanded ? 'expanded' : 'collapsed');
|
|
11942
|
+
if (element.className !== nextClassName) element.className = nextClassName;
|
|
11943
|
+
if (element.getAttribute('data-run-id') !== String(run.runId)) element.setAttribute('data-run-id', run.runId);
|
|
11944
|
+
var nextRuntimeKey = runtimeKeyFor(run.target && run.target.workspaceId, run.target && run.target.conversationId);
|
|
11945
|
+
if (element.getAttribute('data-runtime-key') !== nextRuntimeKey) element.setAttribute('data-runtime-key', nextRuntimeKey);
|
|
11930
11946
|
var head = element.querySelector ? element.querySelector('.conversation-work-run-head') : null;
|
|
11931
11947
|
if (!head) {
|
|
11932
11948
|
element.innerHTML = '<button class="conversation-work-run-head" type="button" onclick="window.toggleConversationWorkRun(this)">' +
|
|
@@ -12004,7 +12020,9 @@ function updateConversationWorkRunElement(run, element) {
|
|
|
12004
12020
|
var refreshedParentKey = String(refreshedParent && refreshedParent.getAttribute('data-activity-key') || '');
|
|
12005
12021
|
var refreshedDetailKey = String(refreshedActivities[refreshedIndex].getAttribute('data-work-detail-key') || 'activity');
|
|
12006
12022
|
var refreshedKey = refreshedParentKey ? refreshedParentKey + '::' + refreshedDetailKey : '';
|
|
12007
|
-
if (activityOpenStates[refreshedKey] !== undefined
|
|
12023
|
+
if (activityOpenStates[refreshedKey] !== undefined && refreshedActivities[refreshedIndex].open !== activityOpenStates[refreshedKey]) {
|
|
12024
|
+
refreshedActivities[refreshedIndex].open = activityOpenStates[refreshedKey];
|
|
12025
|
+
}
|
|
12008
12026
|
}
|
|
12009
12027
|
if (chatEl) {
|
|
12010
12028
|
if (wasAtBottom) {
|
|
@@ -14009,6 +14027,19 @@ function positionContextInspector() {
|
|
|
14009
14027
|
panel.style.maxHeight = Math.max(0, Math.floor(ring.getBoundingClientRect().top - visibleTop - 20)) + 'px';
|
|
14010
14028
|
panel.style.overflowY = 'auto';
|
|
14011
14029
|
panel.style.overscrollBehavior = 'contain';
|
|
14030
|
+
// The chat column clips its descendants. Clamp to that column rather than
|
|
14031
|
+
// the desktop viewport so a narrow composer cannot hide half the inspector.
|
|
14032
|
+
var column = document.getElementById('center');
|
|
14033
|
+
var parent = panel.offsetParent;
|
|
14034
|
+
if (column && parent) {
|
|
14035
|
+
var bounds = column.getBoundingClientRect();
|
|
14036
|
+
var origin = parent.getBoundingClientRect();
|
|
14037
|
+
var width = Math.min(320, Math.max(0, bounds.width - 24));
|
|
14038
|
+
var left = Math.max(bounds.left + 12, Math.min(origin.right + 8 - width, bounds.right - 12 - width));
|
|
14039
|
+
panel.style.width = width + 'px';
|
|
14040
|
+
panel.style.left = (left - origin.left) + 'px';
|
|
14041
|
+
panel.style.right = 'auto';
|
|
14042
|
+
}
|
|
14012
14043
|
}
|
|
14013
14044
|
|
|
14014
14045
|
window.renderContextInspector = function() {
|
|
@@ -14109,6 +14140,10 @@ window.closeContextInspector = function() {
|
|
|
14109
14140
|
|
|
14110
14141
|
(function() {
|
|
14111
14142
|
window.addEventListener('resize', positionContextInspector);
|
|
14143
|
+
if (typeof ResizeObserver === 'function') {
|
|
14144
|
+
var contextColumn = document.getElementById('center');
|
|
14145
|
+
if (contextColumn) new ResizeObserver(positionContextInspector).observe(contextColumn);
|
|
14146
|
+
}
|
|
14112
14147
|
document.addEventListener('click', function(event) {
|
|
14113
14148
|
if (!state.contextInspectorOpen) return;
|
|
14114
14149
|
var ring = document.getElementById('context-token-ring');
|
|
@@ -15829,6 +15864,15 @@ function wireDirectLiquidMenuInteractionsV2(menu) {
|
|
|
15829
15864
|
ensureBlock();
|
|
15830
15865
|
}
|
|
15831
15866
|
|
|
15867
|
+
function cancelLiquidPopupExit(popup) {
|
|
15868
|
+
if (!popup) return;
|
|
15869
|
+
if (popup._liquidExitTimer) clearTimeout(popup._liquidExitTimer);
|
|
15870
|
+
popup._liquidExitTimer = 0;
|
|
15871
|
+
popup.classList.remove('liquid-popup-exit');
|
|
15872
|
+
popup.style.removeProperty('--liquid-popup-origin-x');
|
|
15873
|
+
popup.style.removeProperty('--liquid-popup-origin-y');
|
|
15874
|
+
}
|
|
15875
|
+
|
|
15832
15876
|
window.animateLiquidPopupExit = function(popup, anchor, done) {
|
|
15833
15877
|
if (!popup) { if (done) done(); return; }
|
|
15834
15878
|
clearLiquidPopupOutset(popup, true);
|
|
@@ -19843,9 +19887,13 @@ function trapNewmarkDialogFocus(event, container) {
|
|
|
19843
19887
|
}
|
|
19844
19888
|
|
|
19845
19889
|
window.openSubWin = function(title, html) {
|
|
19890
|
+
// A replacement can open during the outgoing glass's 210ms exit. Retire
|
|
19891
|
+
// that exit before it can hide the newly mounted content or restore focus.
|
|
19892
|
+
var replacingExitingWindow = !!els['sub-win']._liquidExitTimer;
|
|
19893
|
+
cancelLiquidPopupExit(els['sub-win']);
|
|
19846
19894
|
var overlayOpen = els['sub-win-overlay'].classList.contains('open');
|
|
19847
19895
|
if (!overlayOpen && document.activeElement && typeof document.activeElement.focus === 'function') subWindowOriginFocus = document.activeElement;
|
|
19848
|
-
if (overlayOpen && !state.restoringSubWindow && state.activeSubWindowView) {
|
|
19896
|
+
if (overlayOpen && !replacingExitingWindow && !state.restoringSubWindow && state.activeSubWindowView) {
|
|
19849
19897
|
if (!state.subWindowStack) state.subWindowStack = [];
|
|
19850
19898
|
state.subWindowStack.push({
|
|
19851
19899
|
view: Object.assign({}, state.activeSubWindowView),
|
|
@@ -20504,6 +20552,7 @@ function applyUiAppearance() {
|
|
|
20504
20552
|
}
|
|
20505
20553
|
applyGlassPresentation(glassPresentationForOpacity(state.glassLevel));
|
|
20506
20554
|
window.refreshTitlebarThemeIcon();
|
|
20555
|
+
document.querySelectorAll('webview[data-newmark-browser-runtime-key]').forEach(syncBlankBrowserGuestTheme);
|
|
20507
20556
|
}
|
|
20508
20557
|
|
|
20509
20558
|
window.setTheme = function(value) {
|
|
@@ -21207,7 +21256,7 @@ window.validateAllModels = function() {
|
|
|
21207
21256
|
return state.modelValidationResults;
|
|
21208
21257
|
}).catch(function(err) {
|
|
21209
21258
|
document.body.classList.remove('model-evaluating');
|
|
21210
|
-
var failedHtml = '<div style="color
|
|
21259
|
+
var failedHtml = '<div style="color:var(--nm-state-danger);font-size:12px;">' + esc(t('model.validationFailed')) + ': ' + esc(err.message) + '</div>';
|
|
21211
21260
|
var body = document.getElementById('sub-win-body');
|
|
21212
21261
|
if (body && document.getElementById('model-validation-progress') && els['sub-win-overlay'].classList.contains('open')) {
|
|
21213
21262
|
body.innerHTML = failedHtml;
|
|
@@ -21483,7 +21532,7 @@ window.showAutomationWindow = function() {
|
|
|
21483
21532
|
'<div style="display:flex;align-items:center;gap:6px;margin-bottom:4px;">' +
|
|
21484
21533
|
'<span style="font-size:11px;flex:1;color:var(--text);">' + esc(a.prompt) + '</span>' +
|
|
21485
21534
|
'<button class="sec-btn" style="font-size:9px;padding:2px 8px;" onclick="window.toggleAutomation(' + ai + ')">' + (a.active ? esc(t('automation.active')) : esc(t('automation.paused'))) + '</button>' +
|
|
21486
|
-
'<button class="sec-btn" style="font-size:0;padding:2px 8px;color
|
|
21535
|
+
'<button class="sec-btn" style="font-size:0;padding:2px 8px;color:var(--nm-state-danger);" onclick="window.deleteAutomation(' + ai + ')" title="' + escAttr(t('common.delete')) + '">' + iconSvg('trash', t('common.delete'), 'tiny') + '</button>' +
|
|
21487
21536
|
'</div>' +
|
|
21488
21537
|
'<div style="font-size:10px;color:var(--text-dim);">' + esc(t('message.model')) + ': ' + esc(a.model) + ' | ' + esc(t('automation.condition')) + ': ' + a.condition + '</div>' +
|
|
21489
21538
|
'</div>';
|
|
@@ -21563,7 +21612,7 @@ window.showAutomationWindow = async function() {
|
|
|
21563
21612
|
var wakeHtml = '';
|
|
21564
21613
|
if (wake) {
|
|
21565
21614
|
wakeHtml = '<div id="automation-wake-status" style="padding:8px 10px;margin-bottom:8px;border-radius:8px;background:var(--glass-bg-1);border:1px solid var(--glass-border-1);font-size:10px;color:var(--text-dim);">' +
|
|
21566
|
-
'<div style="color:var(--text);font-size:11px;margin-bottom:3px;">' + esc(t('automation.osWake')) + ': ' + (wake.registered ? '<span style="color:var(--accent2);">' + esc(t('automation.registered')) + '</span>' : (wake.active ? '<span style="color
|
|
21615
|
+
'<div style="color:var(--text);font-size:11px;margin-bottom:3px;">' + esc(t('automation.osWake')) + ': ' + (wake.registered ? '<span style="color:var(--accent2);">' + esc(t('automation.registered')) + '</span>' : (wake.active ? '<span style="color:var(--nm-state-warning);">' + esc(t('automation.pending')) + '</span>' : '<span>' + esc(t('automation.inactive')) + '</span>')) + '</div>' +
|
|
21567
21616
|
'<div>' + esc(t('automation.task')) + ': ' + esc(wake.taskName || '-') + '</div>' +
|
|
21568
21617
|
'<div>' + esc(t('automation.next')) + ': ' + esc(wake.nextRunAt ? new Date(wake.nextRunAt).toLocaleString(uiLocale()) : '-') + '</div>' +
|
|
21569
21618
|
(wake.skippedReason ? '<div>' + esc(wake.skippedReason) + '</div>' : '') +
|
|
@@ -21583,12 +21632,12 @@ window.showAutomationWindow = async function() {
|
|
|
21583
21632
|
'<div style="display:flex;align-items:center;gap:6px;margin-bottom:5px;">' +
|
|
21584
21633
|
'<span style="font-size:11px;flex:1;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;" title="' + esc(a.prompt || '') + '">' + esc(a.prompt || '') + '</span>' +
|
|
21585
21634
|
'<button class="sec-btn" style="font-size:9px;padding:2px 8px;' + (a.active ? 'Active' : 'Paused') + '" onclick="window.toggleAutomationById(' + JSON.stringify(a.id).replace(/"/g, '"') + ')">' + (a.active ? esc(t('automation.active')) : esc(t('automation.paused'))) + '</button>' +
|
|
21586
|
-
'<button class="sec-btn" style="font-size:9px;padding:2px 8px;color
|
|
21635
|
+
'<button class="sec-btn" style="font-size:9px;padding:2px 8px;color:var(--nm-state-danger);" onclick="window.deleteAutomationById(' + JSON.stringify(a.id).replace(/"/g, '"') + ')">' + esc(t('common.delete')) + '</button>' +
|
|
21587
21636
|
'</div>' +
|
|
21588
21637
|
'<div style="font-size:10px;color:var(--text-dim);">' + esc(t('automation.workspace')) + ': ' + esc(a.workspaceName || a.workspaceId || '-') + ' | ' + esc(t('automation.conversation')) + ': ' + esc(a.conversationMode === 'existing' ? (a.conversationId || '-') : t('automation.newConversation')) + '</div>' +
|
|
21589
21638
|
'<div style="font-size:10px;color:var(--text-dim);">' + esc(t('message.model')) + ': ' + esc(a.model || t('common.current')) + ' | ' + esc(t('automation.type')) + ': ' + esc(a.condition || 'once') + ' | ' + esc(t('automation.status')) + ': ' + status + ' | ' + esc(t('automation.runs')) + ': ' + (a.runCount || 0) + '</div>' +
|
|
21590
21639
|
'<div style="font-size:10px;color:var(--text-dim);">' + esc(t('automation.next')) + ': ' + esc(next) + ' | ' + esc(t('automation.last')) + ': ' + esc(last) + '</div>' +
|
|
21591
|
-
(lastLine ? '<div style="font-size:10px;color:' + (a.lastError ? '
|
|
21640
|
+
(lastLine ? '<div style="font-size:10px;color:' + (a.lastError ? 'var(--nm-state-danger)' : 'var(--text-dim)') + ';margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">' + esc(lastLine) + '</div>' : '') +
|
|
21592
21641
|
'</div>';
|
|
21593
21642
|
}
|
|
21594
21643
|
}
|
|
@@ -21748,7 +21797,7 @@ function renderFlowItem(work, idx, expanded) {
|
|
|
21748
21797
|
'<button class="sec-btn" style="flex:1;font-size:10px;" onclick="window.addFlowComp(' + idx + ',\'logic\')">+ ' + esc(t('flow.logic')) + '</button>' +
|
|
21749
21798
|
'<button class="sec-btn primary" style="flex:0;padding:6px 8px;font-size:10px;" onclick="window.runFlowWork(' + idx + ')" title="' + escAttr(t('flow.run')) + '">' + esc(t('flow.run')) + '</button>' +
|
|
21750
21799
|
'<button class="sec-btn" style="flex:0;padding:6px 8px;font-size:10px;" onclick="window.saveFlowToDisk(' + idx + ')" title="' + escAttr(t('flow.save')) + '">' + esc(t('flow.save')) + '</button>' +
|
|
21751
|
-
'<button class="sec-btn" style="flex:0;padding:6px 8px;font-size:0;color
|
|
21800
|
+
'<button class="sec-btn" style="flex:0;padding:6px 8px;font-size:0;color:var(--nm-state-danger);" onclick="window.deleteFlowWork(' + idx + ')" title="' + escAttr(t('flow.deleteWorkflow')) + '">' + iconSvg('trash', t('flow.deleteWorkflow'), 'tiny') + '</button>' +
|
|
21752
21801
|
'</div>' + componentsHtml +
|
|
21753
21802
|
'</div></div>';
|
|
21754
21803
|
}
|
|
@@ -23495,6 +23544,29 @@ function createBrowserGuestElement(target) {
|
|
|
23495
23544
|
return view;
|
|
23496
23545
|
}
|
|
23497
23546
|
|
|
23547
|
+
window.setBrowserViewport = function(contentsId, viewport) {
|
|
23548
|
+
var views = document.querySelectorAll('webview[data-newmark-browser-runtime-key]');
|
|
23549
|
+
var view = Array.from(views).find(function(candidate) { try { return candidate.getWebContentsId() === contentsId; } catch (_) { return false; } });
|
|
23550
|
+
if (!view || !view.parentElement) return false;
|
|
23551
|
+
var frame = view.parentElement;
|
|
23552
|
+
view._newmarkViewport = viewport;
|
|
23553
|
+
frame.style.position = 'relative';
|
|
23554
|
+
frame.style.overflow = 'hidden';
|
|
23555
|
+
view.style.position = 'absolute';
|
|
23556
|
+
view.style.left = '0'; view.style.top = '0'; view.style.flex = 'none';
|
|
23557
|
+
var fit = function() {
|
|
23558
|
+
if (!view.isConnected) { view._newmarkViewportObserver?.disconnect(); return; }
|
|
23559
|
+
var size = view._newmarkViewport;
|
|
23560
|
+
view.style.width = size.width + 'px'; view.style.height = size.height + 'px';
|
|
23561
|
+
view.style.transformOrigin = 'top left';
|
|
23562
|
+
var scale = Math.min(1, (frame.clientWidth || size.width) / size.width, (frame.clientHeight || size.height) / size.height);
|
|
23563
|
+
view.style.transform = 'scale(' + scale + ')';
|
|
23564
|
+
};
|
|
23565
|
+
if (!view._newmarkViewportObserver) { view._newmarkViewportObserver = new ResizeObserver(fit); view._newmarkViewportObserver.observe(frame); }
|
|
23566
|
+
fit();
|
|
23567
|
+
return true;
|
|
23568
|
+
};
|
|
23569
|
+
|
|
23498
23570
|
function restoreBrowserPlaceholder() {
|
|
23499
23571
|
var frame = els['browser-frame'] || document.getElementById('browser-frame');
|
|
23500
23572
|
if (!frame || document.getElementById('browser-guest-placeholder')) return;
|
|
@@ -23551,12 +23623,28 @@ function navigateBrowserView(view, url) {
|
|
|
23551
23623
|
}
|
|
23552
23624
|
}
|
|
23553
23625
|
|
|
23626
|
+
window.normalizeBrowserAddress = function(raw) {
|
|
23627
|
+
var value = String(raw || '').trim().replace(/^files:\/\//i, 'file://');
|
|
23628
|
+
if (!value || /[\x00-\x1f]/.test(value)) throw new Error('Invalid browser address');
|
|
23629
|
+
if (/^[a-z]:[\\/]/i.test(value) || value.startsWith('/')) {
|
|
23630
|
+
var localPath = value.replace(/\\/g, '/');
|
|
23631
|
+
value = 'file://' + (localPath.startsWith('/') ? '' : '/') + localPath.split('/').map(function(part, index) {
|
|
23632
|
+
return index === 0 && /^[a-z]:$/i.test(part) ? part : encodeURIComponent(part);
|
|
23633
|
+
}).join('/');
|
|
23634
|
+
}
|
|
23635
|
+
if (!/^[a-z][a-z0-9+.-]*:/i.test(value) || /^[^/:]+:\d+(?:\/|$)/.test(value)) value = 'https://' + value;
|
|
23636
|
+
var parsed = new URL(value);
|
|
23637
|
+
if (parsed.protocol === 'file:') {
|
|
23638
|
+
if (parsed.hostname && parsed.hostname !== 'localhost') throw new Error('Use a local file path');
|
|
23639
|
+
} else if (!['http:', 'https:', 'newmark-preview:'].includes(parsed.protocol) && value !== 'about:blank') {
|
|
23640
|
+
throw new Error('Unsupported browser address');
|
|
23641
|
+
}
|
|
23642
|
+
return parsed.href;
|
|
23643
|
+
};
|
|
23644
|
+
|
|
23554
23645
|
window.navigateBrowser = function(url) {
|
|
23555
23646
|
var target = currentConversationTarget();
|
|
23556
|
-
url =
|
|
23557
|
-
if (!/^(?:https?:\/\/|about:blank$|newmark-preview:\/\/)/i.test(url)) {
|
|
23558
|
-
url = 'https://' + url;
|
|
23559
|
-
}
|
|
23647
|
+
url = window.normalizeBrowserAddress(url);
|
|
23560
23648
|
if (state.browserPreviewToken && url !== state.browserPreviewUrl) window.revokeBrowserPreviewCapability();
|
|
23561
23649
|
rememberBrowserUrl(url, true, target);
|
|
23562
23650
|
var input = els['browser-url'];
|
|
@@ -23590,6 +23678,19 @@ window.browserReload = function() {
|
|
|
23590
23678
|
if (view && view.reload) view.reload();
|
|
23591
23679
|
};
|
|
23592
23680
|
|
|
23681
|
+
// The local empty browser canvas belongs to the app theme. Visited pages
|
|
23682
|
+
// retain their own styling; recheck the URL inside the guest after navigation.
|
|
23683
|
+
function syncBlankBrowserGuestTheme(view) {
|
|
23684
|
+
try {
|
|
23685
|
+
if (!view._newmarkDomReady || view.getURL() !== 'about:blank') return;
|
|
23686
|
+
var palette = getComputedStyle(document.documentElement);
|
|
23687
|
+
var bg = palette.getPropertyValue('--bg').trim();
|
|
23688
|
+
var fg = palette.getPropertyValue('--text').trim();
|
|
23689
|
+
var script = 'if(location.href === "about:blank"){document.documentElement.style.background=' + JSON.stringify(bg) + ';document.documentElement.style.color=' + JSON.stringify(fg) + ';}';
|
|
23690
|
+
view.executeJavaScript(script).catch(function() {});
|
|
23691
|
+
} catch {}
|
|
23692
|
+
}
|
|
23693
|
+
|
|
23593
23694
|
function initializeBrowserGuest(view) {
|
|
23594
23695
|
var target = arguments.length > 1 && arguments[1] ? arguments[1] : currentConversationTarget();
|
|
23595
23696
|
var targetKey = browserTargetKey(target);
|
|
@@ -23608,6 +23709,7 @@ function initializeBrowserGuest(view) {
|
|
|
23608
23709
|
currentUrl = view.getURL ? view.getURL() : '';
|
|
23609
23710
|
if (input && currentUrl && currentUrl !== 'about:blank') input.value = currentUrl;
|
|
23610
23711
|
} catch {}
|
|
23712
|
+
syncBlankBrowserGuestTheme(view);
|
|
23611
23713
|
rememberBrowserUrl(currentUrl, false, target);
|
|
23612
23714
|
if (view._newmarkReadySettled) return;
|
|
23613
23715
|
var registration = Promise.resolve({ accepted: true });
|
|
@@ -23676,7 +23778,7 @@ function initializeBrowserGuest(view) {
|
|
|
23676
23778
|
// reload control, so a popup page could not be refreshed in-place.
|
|
23677
23779
|
view.addEventListener('new-window', function(e) {
|
|
23678
23780
|
var popupUrl = String(e && e.url || '').trim();
|
|
23679
|
-
if (!popupUrl || !/^(?:https?:|about:blank|newmark-preview:)/i.test(popupUrl)) return;
|
|
23781
|
+
if (!popupUrl || !/^(?:https?:|file:|about:blank|newmark-preview:)/i.test(popupUrl)) return;
|
|
23680
23782
|
if (e && typeof e.preventDefault === 'function') e.preventDefault();
|
|
23681
23783
|
rememberBrowserUrl(popupUrl, true, target);
|
|
23682
23784
|
var input = els['browser-url'];
|
|
@@ -24805,7 +24907,7 @@ window.loadMemoryLabVisualization = function(reason, options) {
|
|
|
24805
24907
|
return result;
|
|
24806
24908
|
}).catch(function(err) {
|
|
24807
24909
|
var target = document.getElementById('memory-lab-panel');
|
|
24808
|
-
if (target) target.innerHTML = '<div style="color
|
|
24910
|
+
if (target) target.innerHTML = '<div style="color:var(--nm-state-danger);font-size:12px;">' + esc(err.message || String(err)) + '</div>';
|
|
24809
24911
|
throw err;
|
|
24810
24912
|
}).finally(function() {
|
|
24811
24913
|
if (generation === state.memoryLabVisualizationGeneration) state.memoryLabVisualizationLoading = false;
|
|
@@ -26961,7 +27063,7 @@ window.openWsSettings = function() {
|
|
|
26961
27063
|
'</select></div>' +
|
|
26962
27064
|
'<div style="display:flex;gap:6px;margin-top:8px;">' +
|
|
26963
27065
|
'<button class="sec-btn" style="flex:1;" onclick="window.showNewWorkspaceDialog()">+ ' + esc(t('left.new')) + '</button>' +
|
|
26964
|
-
'<button class="sec-btn" style="flex:1;color
|
|
27066
|
+
'<button class="sec-btn" style="flex:1;color:var(--nm-state-danger);" onclick="window.deleteCurrentWorkspace()">' + esc(t('common.delete')) + '</button>' +
|
|
26965
27067
|
'</div>';
|
|
26966
27068
|
window.openSubWin(t('workspace.settingsTitle') + ' - ' + esc(wsName), html);
|
|
26967
27069
|
|
|
@@ -28313,4 +28415,3 @@ function schedulePostStartupUiRendering() {
|
|
|
28313
28415
|
</body>
|
|
28314
28416
|
</html>
|
|
28315
28417
|
|
|
28316
|
-
|