@oharness/server 0.10.0 → 0.12.0
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/analytics.d.ts +32 -29
- package/dist/analytics.js +225 -278
- package/dist/analytics.js.map +1 -1
- package/dist/i18n.js +242 -12
- package/dist/i18n.js.map +1 -1
- package/dist/icons.d.ts +3 -0
- package/dist/icons.js +69 -3
- package/dist/icons.js.map +1 -1
- package/dist/model-order.js +1 -0
- package/dist/model-order.js.map +1 -1
- package/dist/page/client/account.js +140 -4
- package/dist/page/client/account.js.map +1 -1
- package/dist/page/client/base.js +42 -16
- package/dist/page/client/base.js.map +1 -1
- package/dist/page/client/browser.js +1 -1
- package/dist/page/client/composer.js +641 -47
- package/dist/page/client/composer.js.map +1 -1
- package/dist/page/client/dialogs.js +75 -0
- package/dist/page/client/dialogs.js.map +1 -1
- package/dist/page/client/events.js +25 -2
- package/dist/page/client/events.js.map +1 -1
- package/dist/page/client/index.js +4 -0
- package/dist/page/client/index.js.map +1 -1
- package/dist/page/client/panels.js +4 -4
- package/dist/page/client/ripple.d.ts +13 -0
- package/dist/page/client/ripple.js +247 -0
- package/dist/page/client/ripple.js.map +1 -0
- package/dist/page/client/routines.js +173 -41
- package/dist/page/client/routines.js.map +1 -1
- package/dist/page/client/shell.js +200 -54
- package/dist/page/client/shell.js.map +1 -1
- package/dist/page/client/state.js +7 -2
- package/dist/page/client/state.js.map +1 -1
- package/dist/page/client/terminal.js +34 -7
- package/dist/page/client/terminal.js.map +1 -1
- package/dist/page/client/theme.d.ts +17 -0
- package/dist/page/client/theme.js +365 -0
- package/dist/page/client/theme.js.map +1 -0
- package/dist/page/client/transcript.js +63 -7
- package/dist/page/client/transcript.js.map +1 -1
- package/dist/page/style.js +273 -22
- package/dist/page/style.js.map +1 -1
- package/dist/page.js +5 -5
- package/dist/page.js.map +1 -1
- package/dist/prefs.d.ts +17 -0
- package/dist/prefs.js +5 -0
- package/dist/prefs.js.map +1 -1
- package/dist/server.js +710 -45
- package/dist/server.js.map +1 -1
- package/dist/suggest.d.ts +42 -0
- package/dist/suggest.js +215 -0
- package/dist/suggest.js.map +1 -0
- package/dist/terminal.d.ts +35 -2
- package/dist/terminal.js +60 -4
- package/dist/terminal.js.map +1 -1
- package/dist/theme-assets.d.ts +39 -0
- package/dist/theme-assets.js +109 -0
- package/dist/theme-assets.js.map +1 -0
- package/dist/theme-store.d.ts +50 -0
- package/dist/theme-store.js +124 -0
- package/dist/theme-store.js.map +1 -0
- package/dist/theme-tools.d.ts +25 -0
- package/dist/theme-tools.js +243 -0
- package/dist/theme-tools.js.map +1 -0
- package/dist/tool-icons.d.ts +12 -0
- package/dist/tool-icons.js +16 -0
- package/dist/tool-icons.js.map +1 -0
- package/dist/turn-shots.d.ts +18 -2
- package/dist/turn-shots.js +10 -1
- package/dist/turn-shots.js.map +1 -1
- package/dist/user-theme.d.ts +143 -0
- package/dist/user-theme.js +510 -0
- package/dist/user-theme.js.map +1 -0
- package/package.json +2 -2
package/dist/page/style.js
CHANGED
|
@@ -353,6 +353,15 @@ aside header{display:none;padding:8px 14px;min-height:44px;gap:8px;align-items:c
|
|
|
353
353
|
.theme-btn:hover{color:var(--fg)}
|
|
354
354
|
.theme-btn[aria-pressed="true"]{background:var(--bg);color:var(--fg)}
|
|
355
355
|
.theme-btn .ico-sm{width:14px;height:14px}
|
|
356
|
+
/* Under it, only while a custom theme is on: its name, and the way back. */
|
|
357
|
+
.menu-custom-theme .menu-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
358
|
+
.custom-theme-actions{display:flex;gap:4px;flex:none}
|
|
359
|
+
.custom-theme-btn{
|
|
360
|
+
height:24px;padding:0 8px;border:0;border-radius:6px;background:var(--field);color:var(--fg);
|
|
361
|
+
font:inherit;font-size:12px;cursor:pointer;
|
|
362
|
+
}
|
|
363
|
+
.custom-theme-btn:hover{background:var(--sel)}
|
|
364
|
+
.custom-theme-btn:disabled{opacity:.4;cursor:default}
|
|
356
365
|
/* The letter that does the same thing without the mouse. Dim, right-aligned,
|
|
357
366
|
and only ever one character — a menu whose right edge is a column of chords
|
|
358
367
|
is a keyboard reference, not a menu. */
|
|
@@ -730,7 +739,12 @@ details.provider>summary .vmark,details.provider>summary .vmono,details.provider
|
|
|
730
739
|
* "position:relative" is what #jump anchors to; it belongs over this column
|
|
731
740
|
* rather than over the drawer.
|
|
732
741
|
*/
|
|
733
|
-
#main{flex:1;display:flex;flex-direction:column;min-width:0;position:relative}
|
|
742
|
+
#main{flex:1;display:flex;flex-direction:column;min-width:0;position:relative;isolation:isolate}
|
|
743
|
+
/* The dot field behind a new session (client/ripple.ts). Under everything in
|
|
744
|
+
#main — isolation makes #main the floor it sits on — and deaf to the
|
|
745
|
+
pointer, so it only ever watches clicks go by. */
|
|
746
|
+
#ripple{position:absolute;inset:0;width:100%;height:100%;z-index:-1;pointer-events:none;opacity:0;transition:opacity .6s ease}
|
|
747
|
+
#ripple.on{opacity:1}
|
|
734
748
|
#log{flex:1;overflow-y:auto;padding:20px 16px;scroll-behavior:smooth;min-width:0}
|
|
735
749
|
/*
|
|
736
750
|
* Models, Routines and Settings are views, not messages. They used to be
|
|
@@ -932,7 +946,11 @@ body.browser-resizing #browser-pane{transition:none}
|
|
|
932
946
|
no bar above it, no fill around it, no bands at its sides. */
|
|
933
947
|
#computer-body{
|
|
934
948
|
aspect-ratio:16/10;max-height:70vh;position:relative;overflow:hidden;border-radius:12px;
|
|
935
|
-
|
|
949
|
+
/* Opaque, never --field: that is a 2% wash, and with no picture to fill the
|
|
950
|
+
card (no Screen Recording, a minimised window) the conversation behind it
|
|
951
|
+
showed through under the message. --panel laid over --bg, so a theme
|
|
952
|
+
whose panel is translucent still gets a solid card. */
|
|
953
|
+
background:linear-gradient(var(--panel),var(--panel)),var(--bg);box-shadow:0 1px 2px #0000001a,0 10px 30px #00000033;
|
|
936
954
|
}
|
|
937
955
|
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) #computer-body{box-shadow:0 1px 2px #0000004d,0 10px 30px #00000080}}
|
|
938
956
|
:root[data-theme="dark"] #computer-body{box-shadow:0 1px 2px #0000004d,0 10px 30px #00000080}
|
|
@@ -1387,6 +1405,52 @@ body.shelf-full #main,body.shelf-full aside,body.shelf-full #top{display:none}
|
|
|
1387
1405
|
* they are answering. */
|
|
1388
1406
|
.connection-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:2px}
|
|
1389
1407
|
.connection-card .err{color:var(--fg)}
|
|
1408
|
+
/* A theme the agent proposed. The swatches are the proposal's colours, not the
|
|
1409
|
+
page's, so each carries a hairline that reads on both. */
|
|
1410
|
+
.theme-card-head{display:flex;align-items:center;gap:10px}
|
|
1411
|
+
.theme-card-name{font-weight:600;font-size:13.5px;flex:1;min-width:0}
|
|
1412
|
+
.theme-card-status{font-size:12px;color:var(--dim)}
|
|
1413
|
+
.theme-card-status.applied{color:var(--ok)}
|
|
1414
|
+
.theme-swatches{display:flex;flex-direction:column;gap:6px}
|
|
1415
|
+
.theme-swatch-row{display:flex;align-items:center;gap:6px}
|
|
1416
|
+
.theme-swatch-label{width:44px;font-size:12px;color:var(--dim)}
|
|
1417
|
+
.theme-swatch{width:22px;height:22px;border-radius:999px;box-shadow:inset 0 0 0 1px #8888884d}
|
|
1418
|
+
.theme-report{display:flex;flex-direction:column;gap:2px}
|
|
1419
|
+
.theme-report-title{font-size:12px;font-weight:600;color:var(--dim)}
|
|
1420
|
+
.theme-report-line{font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--dim);overflow-wrap:anywhere}
|
|
1421
|
+
button.ghost.theme-apply{background:var(--accent);color:var(--bg)}
|
|
1422
|
+
button.ghost.theme-apply:hover{background:var(--accent);opacity:.88}
|
|
1423
|
+
button.ghost.theme-apply:disabled{opacity:.4;cursor:default}
|
|
1424
|
+
.connection-card p.theme-safe-hint{font-size:12px}
|
|
1425
|
+
.theme-images{display:flex;flex-wrap:wrap;gap:8px}
|
|
1426
|
+
.theme-image{display:flex;flex-direction:column;gap:4px;font-size:11.5px;color:var(--dim)}
|
|
1427
|
+
.theme-image img{width:72px;height:48px;object-fit:cover;border-radius:6px;box-shadow:inset 0 0 0 1px #8888884d;background:var(--bg)}
|
|
1428
|
+
|
|
1429
|
+
/* Image slots a theme can fill (user-theme.ts). The theme sets only the
|
|
1430
|
+
custom properties; these rules decide where each image goes, and every one
|
|
1431
|
+
of them is decoration: nothing here takes clicks or covers anything.
|
|
1432
|
+
|
|
1433
|
+
The conversation background is the scroll container's own background, so it
|
|
1434
|
+
stays put while messages scroll over it and cannot cover them. A layer of
|
|
1435
|
+
the page colour sits on top of it, at the theme's scrim or at the minimum
|
|
1436
|
+
the page measured for readable text (client/theme.ts), whichever is more. */
|
|
1437
|
+
#log{
|
|
1438
|
+
--wall-cover:color-mix(in srgb,var(--bg) max(var(--wall-scrim,0%),var(--wall-scrim-min,0%)),transparent);
|
|
1439
|
+
background-color:var(--wall-base,transparent);
|
|
1440
|
+
background-image:linear-gradient(var(--wall-cover),var(--wall-cover)),var(--wall-image,none);
|
|
1441
|
+
background-size:100% 100%,var(--wall-size,auto);
|
|
1442
|
+
background-repeat:no-repeat,var(--wall-repeat,no-repeat);
|
|
1443
|
+
background-position:0 0,var(--wall-position,center);
|
|
1444
|
+
background-blend-mode:var(--wall-blend,normal);
|
|
1445
|
+
}
|
|
1446
|
+
#empty-art{
|
|
1447
|
+
display:var(--empty-art-display,none);height:var(--empty-art-height,180px);max-width:100%;margin:0 0 24px;
|
|
1448
|
+
background:var(--empty-art,none) var(--empty-art-position,left center)/contain no-repeat;pointer-events:none;
|
|
1449
|
+
}
|
|
1450
|
+
.turn.assistant>.who::before{
|
|
1451
|
+
content:"";display:var(--avatar-display,none);width:20px;height:20px;margin-right:8px;vertical-align:-6px;
|
|
1452
|
+
border-radius:var(--avatar-radius,999px);background:var(--avatar,none) center/cover no-repeat;
|
|
1453
|
+
}
|
|
1390
1454
|
|
|
1391
1455
|
/* A question from the agent, in the transcript rather than a modal: answering
|
|
1392
1456
|
* may take a look back up the conversation, which a modal would cover. Options
|
|
@@ -1667,6 +1731,15 @@ details.setting>summary:focus-visible{outline:none;background:var(--hover)}
|
|
|
1667
1731
|
.section-title{
|
|
1668
1732
|
font-size:13px;font-weight:600;color:var(--dim);margin:22px 0 8px;letter-spacing:.01em;
|
|
1669
1733
|
}
|
|
1734
|
+
/* Advanced folds under its heading; the heading is the only control, with the
|
|
1735
|
+
same chevron a settings row turns. */
|
|
1736
|
+
details.settings-advanced>summary.section-title{
|
|
1737
|
+
display:flex;align-items:center;gap:6px;cursor:pointer;list-style:none;width:max-content;
|
|
1738
|
+
}
|
|
1739
|
+
details.settings-advanced>summary::-webkit-details-marker{display:none}
|
|
1740
|
+
details.settings-advanced>summary:hover{color:var(--fg)}
|
|
1741
|
+
details.settings-advanced>summary:focus-visible{outline:none;color:var(--fg)}
|
|
1742
|
+
details.settings-advanced[open]>summary .chev{transform:rotate(90deg)}
|
|
1670
1743
|
/*
|
|
1671
1744
|
* The window picker, and the chart under it.
|
|
1672
1745
|
*
|
|
@@ -1679,6 +1752,13 @@ details.setting>summary:focus-visible{outline:none;background:var(--hover)}
|
|
|
1679
1752
|
/* A segmented choice on a settings row sits in the row's line, like a switch. */
|
|
1680
1753
|
.setting summary .setting-seg{margin:0 0 0 auto;flex:none}
|
|
1681
1754
|
.setting summary .setting-seg .seg-item{padding:3px 10px;font-size:12px}
|
|
1755
|
+
/* A row with several controls opens onto parts, each a name and its control on one line. */
|
|
1756
|
+
.setting-part+.setting-part{margin-top:16px}
|
|
1757
|
+
.setting-part>*+*{margin-top:6px}
|
|
1758
|
+
.setting-part-line{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
|
|
1759
|
+
.setting-part-name{font-weight:500;font-size:13px}
|
|
1760
|
+
.setting-part .setting-seg{margin:0;flex:none}
|
|
1761
|
+
.setting-part .setting-seg .seg-item{padding:3px 10px;font-size:12px}
|
|
1682
1762
|
/* Whether something a row depends on is there: a dot and a sentence. */
|
|
1683
1763
|
.setting-status{display:flex;align-items:center;gap:7px;margin-top:8px;color:var(--dim)}
|
|
1684
1764
|
.status-dot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--dim);opacity:.6}
|
|
@@ -2053,8 +2133,15 @@ details.provider>summary:hover{background:var(--hover)}
|
|
|
2053
2133
|
flex:1;min-width:0;
|
|
2054
2134
|
font-size:12px;color:var(--fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
|
|
2055
2135
|
}
|
|
2056
|
-
|
|
2057
|
-
|
|
2136
|
+
/* One chevron, pointing the way the menu opens — up, from the foot of the
|
|
2137
|
+
sidebar — and turning down while it is open. The ⇕ it replaced is a
|
|
2138
|
+
select box's sign, and this row opens a menu, not a list of choices. */
|
|
2139
|
+
#account .acct-caret{
|
|
2140
|
+
width:14px;height:14px;flex:0 0 auto;margin-right:2px;opacity:.4;
|
|
2141
|
+
transform:rotate(180deg);transition:transform .18s ease,opacity .12s ease;
|
|
2142
|
+
}
|
|
2143
|
+
.account-btn:hover .acct-caret{opacity:.75}
|
|
2144
|
+
#account .account-btn.menu-open .acct-caret{opacity:.75;transform:none}
|
|
2058
2145
|
#account .avatar{
|
|
2059
2146
|
width:24px;height:24px;border-radius:50%;flex:0 0 auto;display:grid;place-items:center;
|
|
2060
2147
|
overflow:hidden;background:var(--accent);color:var(--bg);font-size:11px;font-weight:600;
|
|
@@ -2270,6 +2357,25 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2270
2357
|
#market{width:min(860px,94vw);max-width:min(860px,94vw);max-height:76vh}
|
|
2271
2358
|
#market[open]{display:flex;flex-direction:column}
|
|
2272
2359
|
.mk-head{padding:18px 20px 10px;position:relative}
|
|
2360
|
+
/* The list and the import beside it, as tabs: a row of two under the title,
|
|
2361
|
+
the chosen one on a raised chip that slides over when the other is picked. */
|
|
2362
|
+
.mk-tabs{display:flex;gap:4px;margin-top:12px;padding:3px;border-radius:10px;background:var(--field);width:max-content;max-width:100%}
|
|
2363
|
+
.mk-tabs[hidden]{display:none}
|
|
2364
|
+
.mk-tab{
|
|
2365
|
+
display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 12px;border:0;border-radius:8px;
|
|
2366
|
+
background:transparent;color:var(--dim);font:inherit;font-size:12.5px;font-weight:500;cursor:pointer;
|
|
2367
|
+
transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;
|
|
2368
|
+
}
|
|
2369
|
+
.mk-tab:hover{color:var(--fg)}
|
|
2370
|
+
.mk-tab.on{background:var(--bg);color:var(--fg);box-shadow:0 1px 2px #00000026}
|
|
2371
|
+
.mk-tab .vendor-mark{width:14px;height:14px}
|
|
2372
|
+
.mk-tab .vendor-mark + .vendor-mark{margin-left:-2px}
|
|
2373
|
+
.mk-tab-count{
|
|
2374
|
+
min-width:18px;height:18px;padding:0 5px;border-radius:999px;display:inline-grid;place-items:center;
|
|
2375
|
+
background:var(--accent);color:var(--bg);font-size:10.5px;font-weight:600;
|
|
2376
|
+
}
|
|
2377
|
+
/* A tab switch repaints the list; it fades in rather than snapping. */
|
|
2378
|
+
#mk-list.swap{animation:row-in .18s cubic-bezier(.2,.8,.2,1)}
|
|
2273
2379
|
#mk-list{overflow-y:auto;padding:2px 12px 14px;flex:1}
|
|
2274
2380
|
/* Where every other window puts it. A "Done" under the list meant scrolling
|
|
2275
2381
|
past eighty rows to leave, for a dialog that changes nothing on the way out. */
|
|
@@ -2288,6 +2394,8 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2288
2394
|
.mk-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:0 10px}
|
|
2289
2395
|
.mk-item{display:flex;align-items:flex-start;gap:11px;padding:10px 8px;border-radius:9px}
|
|
2290
2396
|
.mk-item:hover{background:var(--hover)}
|
|
2397
|
+
/* A skill switched off: still listed, so it can be switched back on. */
|
|
2398
|
+
.mk-item.off .mk-naming,.mk-item.off .ico-sm{opacity:.5}
|
|
2291
2399
|
.mk-item .ico-sm{
|
|
2292
2400
|
width:28px;height:28px;margin-top:1px;padding:6px;box-sizing:border-box;
|
|
2293
2401
|
border-radius:7px;background:var(--sel);opacity:.75;
|
|
@@ -2321,6 +2429,10 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2321
2429
|
.mk-naming{flex:1;min-width:0}
|
|
2322
2430
|
.mk-name{font-size:13.5px;font-weight:500}
|
|
2323
2431
|
.mk-desc{font-size:12px;color:var(--dim);margin-top:2px;line-height:1.45}
|
|
2432
|
+
/* Three lines at most: a skill written for another tool can carry a whole
|
|
2433
|
+
paragraph of triggers, and one row should not fill the dialog. The full
|
|
2434
|
+
text is on the row's tooltip. */
|
|
2435
|
+
.mk-naming .mk-desc{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
|
|
2324
2436
|
.mk-desc.warn{color:var(--warn)}
|
|
2325
2437
|
.mk-acts{display:flex;align-items:center;gap:6px;flex:0 0 auto;margin-top:1px}
|
|
2326
2438
|
.mk-state{font-size:11.5px;color:var(--dim)}
|
|
@@ -2344,7 +2456,7 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2344
2456
|
#browse-list{overflow-y:auto;padding:4px 8px;flex:1}
|
|
2345
2457
|
#browse-here{display:block;padding:2px 4px;color:var(--dim);word-break:break-all}
|
|
2346
2458
|
#project-picker[open]{display:flex;flex-direction:column}
|
|
2347
|
-
#proj-list{overflow-y:auto;padding:4px 8px}
|
|
2459
|
+
#proj-list{overflow-y:auto;overflow-x:hidden;padding:4px 8px}
|
|
2348
2460
|
.proj-foot{padding:4px 8px 10px;box-shadow:0 -1px 0 var(--line)}
|
|
2349
2461
|
.proj-item{
|
|
2350
2462
|
width:100%;display:flex;align-items:center;gap:9px;border:0;border-radius:8px;
|
|
@@ -2369,15 +2481,29 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2369
2481
|
.fold-row .fold-new{margin-right:2px}
|
|
2370
2482
|
.fold-row .more:hover,.fold-row .fold.menu-open ~ .more:last-child{background:var(--sel);color:var(--fg)}
|
|
2371
2483
|
.fold-row .more .ico-sm{width:14px;height:14px;opacity:1}
|
|
2372
|
-
|
|
2373
|
-
|
|
2484
|
+
/* A project row: name over its directory, a tick on the one this window is
|
|
2485
|
+
in, and everything else behind ··· — rename, export and forget are rare,
|
|
2486
|
+
and three icons on every row read as a list of things to do to it. The lit
|
|
2487
|
+
row is the one Enter opens, moved by the arrows or the pointer alike. */
|
|
2488
|
+
.proj-row{display:flex;align-items:center;gap:2px;border-radius:10px;padding-right:6px}
|
|
2489
|
+
.proj-row.active,.proj-row.menu-open{background:var(--hover)}
|
|
2374
2490
|
.proj-row .proj-item:hover{background:transparent}
|
|
2375
|
-
.proj-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
}
|
|
2379
|
-
.proj-
|
|
2380
|
-
.proj-
|
|
2491
|
+
.proj-row .proj-item{flex:1;width:auto;min-width:0;padding:7px 8px}
|
|
2492
|
+
.proj-row .avatar{flex:none}
|
|
2493
|
+
.proj-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
|
2494
|
+
.proj-text .path{flex:none;font-weight:500}
|
|
2495
|
+
.proj-dir{font-size:11.5px;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
2496
|
+
.proj-item .tag{flex:none}
|
|
2497
|
+
.proj-check{flex:none;width:16px;height:16px;display:grid;place-items:center;color:var(--fg)}
|
|
2498
|
+
.proj-check svg{width:14px;height:14px}
|
|
2499
|
+
.proj-more{
|
|
2500
|
+
flex:none;display:grid;place-items:center;width:26px;height:26px;padding:0;border:0;border-radius:7px;
|
|
2501
|
+
background:transparent;color:var(--dim);cursor:pointer;opacity:0;
|
|
2502
|
+
}
|
|
2503
|
+
.proj-more svg{width:14px;height:14px}
|
|
2504
|
+
.proj-row.active .proj-more,.proj-row.menu-open .proj-more,.proj-more:focus-visible{opacity:1}
|
|
2505
|
+
.proj-more:hover,.proj-row.menu-open .proj-more{background:var(--sel);color:var(--fg)}
|
|
2506
|
+
.proj-empty{padding:18px 8px;text-align:center;color:var(--dim);font-size:13px}
|
|
2381
2507
|
/* The command palette.
|
|
2382
2508
|
*
|
|
2383
2509
|
* The sidebar shows five sessions per project and folds the rest away, which
|
|
@@ -2517,6 +2643,18 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
|
|
|
2517
2643
|
* the one thing the window exists for and stands over a 42px field. */
|
|
2518
2644
|
.cn-body button.signin-site{height:44px;border-radius:10px;font-size:14px;font-weight:550}
|
|
2519
2645
|
.cn-note .mono{white-space:nowrap}
|
|
2646
|
+
/* A vendor's mark beside its name, at the title's cap height. */
|
|
2647
|
+
.cn-title{display:flex;align-items:center;gap:10px}
|
|
2648
|
+
.cn-title .cn-title-mark{width:24px;height:24px;flex:0 0 auto;border-radius:6px}
|
|
2649
|
+
/* A link-weight action inside a note: words to press, not another button. */
|
|
2650
|
+
.small button.cn-inline,.cn-note button.cn-inline{
|
|
2651
|
+
border:0;background:none;padding:0;font:inherit;color:var(--fg);
|
|
2652
|
+
font-weight:550;cursor:pointer;text-decoration:underline;text-underline-offset:2px;
|
|
2653
|
+
}
|
|
2654
|
+
.small button.cn-inline:hover,.cn-note button.cn-inline:hover{opacity:.75}
|
|
2655
|
+
/* Only the sign-in: no actions row, so the body closes the dialog itself. */
|
|
2656
|
+
#connect.cn-keyless .dlg-actions{display:none}
|
|
2657
|
+
#connect.cn-keyless .cn-body{padding-bottom:24px;gap:14px}
|
|
2520
2658
|
.cn-local{display:flex;gap:6px;align-items:flex-start}
|
|
2521
2659
|
.cn-local .ico-sm{width:13px;height:13px;flex:0 0 auto;margin-top:1.5px;color:var(--fg)}
|
|
2522
2660
|
.cn-local strong{color:var(--fg);font-weight:600}
|
|
@@ -2684,14 +2822,28 @@ details.tool>summary:hover::after{opacity:1}
|
|
|
2684
2822
|
max-width:220px;max-height:160px;border-radius:8px;cursor:zoom-in;
|
|
2685
2823
|
background:var(--bg);object-fit:cover;
|
|
2686
2824
|
}
|
|
2687
|
-
/* The windows
|
|
2825
|
+
/* The windows and browser tabs a turn ended on: the result, so out in the turn
|
|
2688
2826
|
rather than folded into a step, and a little larger than a step's shots. */
|
|
2689
|
-
|
|
2690
|
-
.turn-
|
|
2827
|
+
/* Five across, the count fitTurnShots shows; three on a phone, as two rows. */
|
|
2828
|
+
.turn-shots{
|
|
2829
|
+
display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;
|
|
2830
|
+
margin:10px 0 4px;
|
|
2831
|
+
}
|
|
2832
|
+
@media (max-width:600px){.turn-shots{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
|
2833
|
+
.turn-shot{margin:0;display:flex;flex-direction:column;gap:5px;min-width:0}
|
|
2834
|
+
.turn-shot[hidden]{display:none}
|
|
2835
|
+
.turn-shot-frame{position:relative}
|
|
2691
2836
|
.turn-shot img{
|
|
2692
|
-
display:block;
|
|
2693
|
-
background:var(--bg);object-fit:cover;
|
|
2837
|
+
display:block;width:100%;aspect-ratio:16/10;border-radius:8px;cursor:zoom-in;
|
|
2838
|
+
background:var(--bg);object-fit:cover;object-position:top;
|
|
2839
|
+
}
|
|
2840
|
+
/* The pictures past the row, counted on its last one: a click opens the
|
|
2841
|
+
preview there, and the arrow keys go on through the rest. */
|
|
2842
|
+
.turn-shot-more{
|
|
2843
|
+
position:absolute;inset:0;border:0;border-radius:8px;cursor:zoom-in;
|
|
2844
|
+
background:rgba(0,0,0,.55);color:#fff;font-size:18px;font-weight:600;
|
|
2694
2845
|
}
|
|
2846
|
+
.turn-shot-more:hover{background:rgba(0,0,0,.45)}
|
|
2695
2847
|
.turn-shot figcaption{font-size:11.5px;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
2696
2848
|
/* The preview: the image as large as the window allows, over a dark scrim.
|
|
2697
2849
|
Dark in both themes — a screenshot reads against black, not the page. */
|
|
@@ -2933,6 +3085,9 @@ textarea::placeholder{color:var(--dim)}
|
|
|
2933
3085
|
color:var(--dim);
|
|
2934
3086
|
}
|
|
2935
3087
|
#input-mirror mark .at svg{width:11px;height:11px;display:block;margin-left:.5px}
|
|
3088
|
+
/* The rest of the suggested message, after what has been typed of it: the
|
|
3089
|
+
placeholder's colour, since it is the same offer, half taken. */
|
|
3090
|
+
#input-mirror .ghost{color:var(--dim)}
|
|
2936
3091
|
/* The mirror sits exactly under the textarea, so every metric that decides
|
|
2937
3092
|
where a glyph lands has to match: font, line-height, wrapping, and the
|
|
2938
3093
|
padding, which is zero on the composer's textarea and must be zero here. */
|
|
@@ -3264,8 +3419,22 @@ textarea.boxed:focus{outline:none;background:var(--field-focus)}
|
|
|
3264
3419
|
should not look identical — one of them means Enter takes this row — but the
|
|
3265
3420
|
menu is a quiet surface and the difference is worth one tone, not two. */
|
|
3266
3421
|
#attach-picker .menu-item.cursor{background:var(--sel)}
|
|
3267
|
-
|
|
3268
|
-
|
|
3422
|
+
/* Solid tokens rather than the ink at partial opacity: a translucent stroke
|
|
3423
|
+
picks up whatever row background sits behind it and its anti-aliased edge
|
|
3424
|
+
blends twice, so a 1.5px line read thinner and greyer on hover than at rest.
|
|
3425
|
+
At rest the marks take the section labels' grey; a row in play — under the
|
|
3426
|
+
pointer, under the keyboard cursor, or switched on — lights its mark to the
|
|
3427
|
+
label's own colour. */
|
|
3428
|
+
/* Every mark in the label's own colour, at rest as much as under the pointer:
|
|
3429
|
+
grey glyphs beside white words read as rows that are switched off. The
|
|
3430
|
+
count and the chevron stay a step quieter, as solid mixes of the two theme
|
|
3431
|
+
colours rather than translucency, so they hold their tone in both themes. */
|
|
3432
|
+
#attach-picker .menu-item .ico-sm{opacity:1;color:var(--fg)}
|
|
3433
|
+
#attach-picker .menu-item .sub{color:color-mix(in srgb,var(--fg) 70%,var(--bg))}
|
|
3434
|
+
#attach-picker .menu-item .chev{opacity:1;color:color-mix(in srgb,var(--fg) 60%,var(--bg))}
|
|
3435
|
+
/* Two vendor marks side by side, for the row that imports from both. */
|
|
3436
|
+
#attach-picker .menu-item .mark-pair{display:flex;align-items:center;gap:3px;flex:0 0 auto}
|
|
3437
|
+
#attach-picker .menu-item .mark-pair .vendor-mark{width:16px;height:16px}
|
|
3269
3438
|
/* The stacked rows carry a name over a sentence, so they are already two lines
|
|
3270
3439
|
tall; the mark beside them is a label for the kind, not an illustration, and
|
|
3271
3440
|
at 16px it was the widest thing in a row whose job is the words. */
|
|
@@ -3283,7 +3452,7 @@ textarea.boxed:focus{outline:none;background:var(--field-focus)}
|
|
|
3283
3452
|
#attach-picker .menu-item.stacked .tick{margin-top:0}
|
|
3284
3453
|
#attach-picker .menu-item.stacked{padding-top:5px;padding-bottom:5px}
|
|
3285
3454
|
#attach-picker .menu-item.stacked .stack{gap:1px}
|
|
3286
|
-
#attach-picker .menu-item.on .ico-sm{
|
|
3455
|
+
#attach-picker .menu-item.on .ico-sm{color:var(--fg)}
|
|
3287
3456
|
.menu-hint{padding:6px 8px 8px;font-size:11.5px;color:var(--dim)}
|
|
3288
3457
|
/* A row that has something to say about itself: the name on one line and a
|
|
3289
3458
|
sentence under it. Beside the name, that sentence took the whole row and
|
|
@@ -3361,6 +3530,31 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
|
|
|
3361
3530
|
.pair-title{padding:22px 24px 6px;font-size:16px;font-weight:600}
|
|
3362
3531
|
.pair-body{padding:0 24px;color:var(--dim);font-size:13.5px;line-height:1.5}
|
|
3363
3532
|
.pair-code{margin:18px 24px 6px;padding:14px 0;border-radius:12px;background:var(--sel);text-align:center;font-size:30px;letter-spacing:.12em}
|
|
3533
|
+
/* An update question, in place of the OS's message box: the version is the
|
|
3534
|
+
title, the release notes scroll if there are many, and Later stays quiet. */
|
|
3535
|
+
.upd-dialog{width:min(440px,92vw);padding-bottom:16px}
|
|
3536
|
+
.upd-head{display:flex;align-items:center;gap:12px;padding:22px 24px 8px}
|
|
3537
|
+
.upd-mark{flex:none;display:grid;place-items:center;width:30px;height:30px;border-radius:9px;background:var(--sel);color:var(--fg);font-size:15px;font-weight:600}
|
|
3538
|
+
.upd-dialog.important .upd-mark{background:var(--accent);color:var(--bg)}
|
|
3539
|
+
.upd-title{font-size:16px;font-weight:600;line-height:1.35}
|
|
3540
|
+
.upd-notes{margin:6px 24px 10px;padding:12px 14px;max-height:220px;overflow-y:auto;border-radius:10px;background:var(--hover);font-size:13px;line-height:1.55;white-space:pre-wrap}
|
|
3541
|
+
.upd-body{padding:0 24px;color:var(--dim);font-size:13.5px;line-height:1.5;word-break:break-word}
|
|
3542
|
+
.upd-body.mono{font-size:12.5px}
|
|
3543
|
+
.upd-dialog .dlg-actions{justify-content:flex-end;padding:18px 20px 4px}
|
|
3544
|
+
/* The app's confirm and prompt (askConfirm, askText). */
|
|
3545
|
+
.ask-dialog{width:min(420px,92vw);padding-bottom:16px}
|
|
3546
|
+
.ask-dialog-title{padding:22px 24px 4px;font-size:16px;font-weight:600;line-height:1.35}
|
|
3547
|
+
.ask-dialog-body{padding:6px 24px 0;color:var(--dim);font-size:13.5px;line-height:1.55;white-space:pre-wrap}
|
|
3548
|
+
.ask-dialog-title + .ask-dialog-body{padding-top:2px}
|
|
3549
|
+
.ask-dialog-body:first-child{padding-top:22px;color:var(--fg);font-size:14px}
|
|
3550
|
+
.ask-dialog-field{
|
|
3551
|
+
display:block;box-sizing:border-box;width:calc(100% - 48px);margin:14px 24px 2px;padding:9px 12px;
|
|
3552
|
+
border:1px solid var(--line);border-radius:10px;background:var(--bg);color:var(--fg);font:inherit;font-size:14px;outline:none;
|
|
3553
|
+
}
|
|
3554
|
+
.ask-dialog-field:focus{border-color:var(--fg)}
|
|
3555
|
+
.ask-dialog .dlg-actions{justify-content:flex-end;padding:18px 20px 4px}
|
|
3556
|
+
.ask-dialog .dlg-actions button.quiet{margin-right:0}
|
|
3557
|
+
.dlg-actions button.approve.danger{background:var(--err);color:#fff}
|
|
3364
3558
|
/* The approval dialog.
|
|
3365
3559
|
*
|
|
3366
3560
|
* Everything here is arranged around one question: what exactly is about to
|
|
@@ -3628,7 +3822,7 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
|
|
|
3628
3822
|
*/
|
|
3629
3823
|
@media (hover:none) and (pointer:coarse){
|
|
3630
3824
|
.session .more,.fold-row .more{display:grid;width:28px;height:28px}
|
|
3631
|
-
.proj-
|
|
3825
|
+
.proj-more{opacity:1}
|
|
3632
3826
|
.actions{position:static;opacity:1;margin-top:4px}
|
|
3633
3827
|
.turn{margin-bottom:14px}
|
|
3634
3828
|
.act{padding:6px 10px}
|
|
@@ -3657,5 +3851,62 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
|
|
|
3657
3851
|
panel's width already selects, without the built-in browser. The person's
|
|
3658
3852
|
own browser is the rest of the window. */
|
|
3659
3853
|
.embed #browser-pane,.embed #browser-scrim,.embed .tab-browser{display:none!important}
|
|
3854
|
+
|
|
3855
|
+
/* Motion for the + menu, the pickers beside it and the dialogs they open.
|
|
3856
|
+
A menu grows out of the button it hangs from, a screen inside it slides the
|
|
3857
|
+
way it was entered, and a dialog settles in and fades out. All of it short
|
|
3858
|
+
enough that nothing waits on it, and none of it for someone who asked the
|
|
3859
|
+
system for less motion. */
|
|
3860
|
+
.menu:not([hidden]){animation:menu-in .16s cubic-bezier(.2,.8,.2,1);transform-origin:bottom left}
|
|
3861
|
+
@keyframes menu-in{from{opacity:0;transform:translateY(6px) scale(.97)}to{opacity:1;transform:none}}
|
|
3862
|
+
.menu-body.slide-in{animation:slide-in .2s cubic-bezier(.2,.8,.2,1)}
|
|
3863
|
+
.menu-body.slide-back{animation:slide-back .2s cubic-bezier(.2,.8,.2,1)}
|
|
3864
|
+
@keyframes slide-in{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:none}}
|
|
3865
|
+
@keyframes slide-back{from{opacity:0;transform:translateX(-16px)}to{opacity:1;transform:none}}
|
|
3866
|
+
/* While the height glides the rows stay put against the edge that does not
|
|
3867
|
+
move — the bottom, where the menu hangs from the + — and the top edge
|
|
3868
|
+
uncovers or covers them, rather than the whole list sliding with it. */
|
|
3869
|
+
.menu.resizing{overflow:hidden;justify-content:flex-end}
|
|
3870
|
+
.menu-item{transition:background-color .12s ease}
|
|
3871
|
+
.menu-item:active{transform:scale(.985)}
|
|
3872
|
+
|
|
3873
|
+
#attach-picker .menu-item:hover .chev,#attach-picker .menu-item.cursor .chev{transform:translateX(2px)}
|
|
3874
|
+
dialog[open]{animation:dialog-in .22s cubic-bezier(.2,.8,.2,1)}
|
|
3875
|
+
dialog[open]::backdrop{animation:backdrop-in .22s ease-out}
|
|
3876
|
+
dialog.closing{animation:dialog-out .14s ease-in forwards}
|
|
3877
|
+
dialog.closing::backdrop{animation:backdrop-out .14s ease-in forwards}
|
|
3878
|
+
@keyframes dialog-in{from{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:none}}
|
|
3879
|
+
@keyframes dialog-out{to{opacity:0;transform:translateY(6px) scale(.985)}}
|
|
3880
|
+
@keyframes backdrop-in{from{opacity:0}}
|
|
3881
|
+
@keyframes backdrop-out{to{opacity:0}}
|
|
3882
|
+
.mk-item{transition:background-color .12s ease,opacity .2s ease}
|
|
3883
|
+
.mk-btn,.mk-icon-btn{transition:background-color .12s ease,transform .1s ease,opacity .15s ease}
|
|
3884
|
+
.mk-btn:not(:disabled):active,.mk-icon-btn:active{transform:scale(.96)}
|
|
3885
|
+
/* Rows arrive with the list, a little after one another, the first time a
|
|
3886
|
+
dialog opens; a repaint for a keystroke in the search box does not replay it. */
|
|
3887
|
+
#market.fresh .mk-grid>.mk-item{animation:row-in .22s cubic-bezier(.2,.8,.2,1) both}
|
|
3888
|
+
#market.fresh .mk-grid>.mk-item:nth-child(2){animation-delay:.02s}
|
|
3889
|
+
#market.fresh .mk-grid>.mk-item:nth-child(3){animation-delay:.04s}
|
|
3890
|
+
#market.fresh .mk-grid>.mk-item:nth-child(4){animation-delay:.06s}
|
|
3891
|
+
#market.fresh .mk-grid>.mk-item:nth-child(n+5){animation-delay:.08s}
|
|
3892
|
+
@keyframes row-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
|
|
3893
|
+
/* Claude Code's and Codex's marks: a glyph beside the name it belongs to. */
|
|
3894
|
+
.vendor-mark{width:14px;height:14px;flex:0 0 auto;display:block;position:relative}
|
|
3895
|
+
.vendor-mark img{width:100%;height:100%;display:block;border-radius:24%}
|
|
3896
|
+
|
|
3897
|
+
.vendor-chip{
|
|
3898
|
+
display:inline-flex;align-items:center;gap:5px;margin-left:8px;padding:1px 7px 1px 4px;
|
|
3899
|
+
border-radius:999px;background:var(--sel);color:var(--fg);
|
|
3900
|
+
font-size:11px;font-weight:500;vertical-align:1px;line-height:18px;white-space:nowrap;
|
|
3901
|
+
}
|
|
3902
|
+
.vendor-chip .vendor-mark{width:12px;height:12px}
|
|
3903
|
+
.mk-empty{padding:18px 8px}
|
|
3904
|
+
@media (prefers-reduced-motion:reduce){
|
|
3905
|
+
.menu:not([hidden]),.menu-body.slide-in,.menu-body.slide-back,dialog[open],dialog[open]::backdrop,
|
|
3906
|
+
dialog.closing,dialog.closing::backdrop,#market.fresh .mk-grid>.mk-item,#mk-list.swap{animation:none}
|
|
3907
|
+
.mk-tab{transition:none}
|
|
3908
|
+
.menu-item,.chev,.mk-item,.mk-btn,.mk-icon-btn{transition:none}
|
|
3909
|
+
.menu-item:active,.mk-btn:not(:disabled):active,.mk-icon-btn:active{transform:none}
|
|
3910
|
+
}
|
|
3660
3911
|
`;
|
|
3661
3912
|
//# sourceMappingURL=style.js.map
|
package/dist/page/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;EAC7B,SAAS
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;EAC7B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAm0HV,CAAC"}
|
package/dist/page.js
CHANGED
|
@@ -12,11 +12,8 @@ import { APP_SCRIPT } from "./page/client/index.js";
|
|
|
12
12
|
* an agent, and a CDN request from it would leak the session's existence and
|
|
13
13
|
* hand a third party script execution in a context that can run shell commands.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* trade the paragraph above refuses — that is the point of it being a decision
|
|
18
|
-
* rather than a default, and the reason it is one variable to grep for rather
|
|
19
|
-
* than a setting buried in a config file.
|
|
15
|
+
* No exception for analytics either: the page hands usage events to this
|
|
16
|
+
* server's own /track, and analytics.ts decides whether they go anywhere.
|
|
20
17
|
*/
|
|
21
18
|
/**
|
|
22
19
|
* The tab icon, inlined.
|
|
@@ -168,6 +165,8 @@ ${ANALYTICS_STUB}
|
|
|
168
165
|
<button id="computer-pill" type="button" hidden data-t-title="computer.showPane"><i></i><span id="computer-pill-where"></span></button>
|
|
169
166
|
<div id="log">
|
|
170
167
|
<div id="empty">
|
|
168
|
+
<!-- A theme's art for a new session, when it has one (style.ts). -->
|
|
169
|
+
<div id="empty-art" aria-hidden="true"></div>
|
|
171
170
|
<div class="empty-brand">
|
|
172
171
|
<!-- Lighter stroke than the 18px sidebar copy: at 68px the 2.5 weight
|
|
173
172
|
scales to ~5px and reads much heavier than the wordmark next to it. -->
|
|
@@ -402,6 +401,7 @@ ${ANALYTICS_STUB}
|
|
|
402
401
|
<div class="mk-head">
|
|
403
402
|
<div id="mk-title" class="cn-title"></div>
|
|
404
403
|
<div id="mk-note" class="row-desc"></div>
|
|
404
|
+
<div id="mk-tabs" class="mk-tabs" role="tablist" hidden></div>
|
|
405
405
|
<input id="mk-search" class="mk-search" type="text" autocomplete="off" spellcheck="false">
|
|
406
406
|
<button id="mk-close" class="mk-close" type="button"></button>
|
|
407
407
|
</div>
|
package/dist/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;;;;GAWG;AAGH;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;;;;;yCAKyB,CAAC;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;4CAOwB,kBAAkB,CAAC,OAAO,CAAC;SAC9D,KAAK;EACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAyfK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;qBACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;EAC1C,aAAa;EACb,UAAU;EACV,gBAAgB;;;QAGV,CAAC"}
|
package/dist/prefs.d.ts
CHANGED
|
@@ -52,8 +52,25 @@ export interface Prefs {
|
|
|
52
52
|
* absent is "ask", through the permission prompt each time.
|
|
53
53
|
*/
|
|
54
54
|
computerTakeover?: "ask" | "never";
|
|
55
|
+
/**
|
|
56
|
+
* Whether the agent may switch Computer use on by itself when a request
|
|
57
|
+
* needs it: `ask` (absent) through the permission prompt, `auto` without
|
|
58
|
+
* one, `off` only from the + menu.
|
|
59
|
+
*/
|
|
60
|
+
computerEnable?: "ask" | "auto" | "off";
|
|
55
61
|
/** Apps Computer Use refuses outright, beyond the built-in list: ids or names. */
|
|
56
62
|
computerBlockedApps?: string[];
|
|
63
|
+
/**
|
|
64
|
+
* Whether the windows and browser tabs a turn left are pictured under its
|
|
65
|
+
* reply when it ends. Absent is on.
|
|
66
|
+
*/
|
|
67
|
+
turnShots?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Whether a turn that ends on its own is followed by a guess at the next
|
|
70
|
+
* message, offered in the empty composer. Absent is on; off saves the small
|
|
71
|
+
* model call every turn makes for it.
|
|
72
|
+
*/
|
|
73
|
+
suggestions?: boolean;
|
|
57
74
|
/**
|
|
58
75
|
* Sessions and projects kept at the top of their list.
|
|
59
76
|
*
|
package/dist/prefs.js
CHANGED
|
@@ -32,9 +32,14 @@ export async function readPrefs() {
|
|
|
32
32
|
prefs.keepAwake = parsed.value.keepAwake;
|
|
33
33
|
if (typeof parsed.value.remote === "boolean")
|
|
34
34
|
prefs.remote = parsed.value.remote;
|
|
35
|
+
if (typeof parsed.value.turnShots === "boolean")
|
|
36
|
+
prefs.turnShots = parsed.value.turnShots;
|
|
35
37
|
if (parsed.value.computerTakeover === "ask" || parsed.value.computerTakeover === "never") {
|
|
36
38
|
prefs.computerTakeover = parsed.value.computerTakeover;
|
|
37
39
|
}
|
|
40
|
+
if (parsed.value.computerEnable === "ask" || parsed.value.computerEnable === "auto" || parsed.value.computerEnable === "off") {
|
|
41
|
+
prefs.computerEnable = parsed.value.computerEnable;
|
|
42
|
+
}
|
|
38
43
|
for (const key of STRING_LISTS) {
|
|
39
44
|
const value = parsed.value[key];
|
|
40
45
|
if (Array.isArray(value)) {
|
package/dist/prefs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefs.js","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"prefs.js","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"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"}
|