@oharness/server 0.10.0 → 0.11.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.
Files changed (70) hide show
  1. package/dist/analytics.d.ts +32 -29
  2. package/dist/analytics.js +225 -278
  3. package/dist/analytics.js.map +1 -1
  4. package/dist/i18n.js +152 -8
  5. package/dist/i18n.js.map +1 -1
  6. package/dist/icons.js +1 -0
  7. package/dist/icons.js.map +1 -1
  8. package/dist/model-order.js +1 -0
  9. package/dist/model-order.js.map +1 -1
  10. package/dist/page/client/account.js +140 -4
  11. package/dist/page/client/account.js.map +1 -1
  12. package/dist/page/client/base.js +40 -16
  13. package/dist/page/client/base.js.map +1 -1
  14. package/dist/page/client/browser.js +1 -1
  15. package/dist/page/client/composer.js +111 -7
  16. package/dist/page/client/composer.js.map +1 -1
  17. package/dist/page/client/dialogs.js +75 -0
  18. package/dist/page/client/dialogs.js.map +1 -1
  19. package/dist/page/client/events.js +25 -2
  20. package/dist/page/client/events.js.map +1 -1
  21. package/dist/page/client/index.js +4 -0
  22. package/dist/page/client/index.js.map +1 -1
  23. package/dist/page/client/panels.js +4 -4
  24. package/dist/page/client/ripple.d.ts +13 -0
  25. package/dist/page/client/ripple.js +247 -0
  26. package/dist/page/client/ripple.js.map +1 -0
  27. package/dist/page/client/routines.js +173 -41
  28. package/dist/page/client/routines.js.map +1 -1
  29. package/dist/page/client/shell.js +200 -54
  30. package/dist/page/client/shell.js.map +1 -1
  31. package/dist/page/client/state.js +7 -2
  32. package/dist/page/client/state.js.map +1 -1
  33. package/dist/page/client/terminal.js +34 -7
  34. package/dist/page/client/terminal.js.map +1 -1
  35. package/dist/page/client/theme.d.ts +17 -0
  36. package/dist/page/client/theme.js +365 -0
  37. package/dist/page/client/theme.js.map +1 -0
  38. package/dist/page/client/transcript.js +63 -7
  39. package/dist/page/client/transcript.js.map +1 -1
  40. package/dist/page/style.js +183 -22
  41. package/dist/page/style.js.map +1 -1
  42. package/dist/page.js +4 -5
  43. package/dist/page.js.map +1 -1
  44. package/dist/prefs.d.ts +17 -0
  45. package/dist/prefs.js +5 -0
  46. package/dist/prefs.js.map +1 -1
  47. package/dist/server.js +465 -42
  48. package/dist/server.js.map +1 -1
  49. package/dist/suggest.d.ts +42 -0
  50. package/dist/suggest.js +215 -0
  51. package/dist/suggest.js.map +1 -0
  52. package/dist/terminal.d.ts +28 -2
  53. package/dist/terminal.js +45 -3
  54. package/dist/terminal.js.map +1 -1
  55. package/dist/theme-assets.d.ts +39 -0
  56. package/dist/theme-assets.js +109 -0
  57. package/dist/theme-assets.js.map +1 -0
  58. package/dist/theme-store.d.ts +50 -0
  59. package/dist/theme-store.js +124 -0
  60. package/dist/theme-store.js.map +1 -0
  61. package/dist/theme-tools.d.ts +25 -0
  62. package/dist/theme-tools.js +243 -0
  63. package/dist/theme-tools.js.map +1 -0
  64. package/dist/turn-shots.d.ts +18 -2
  65. package/dist/turn-shots.js +10 -1
  66. package/dist/turn-shots.js.map +1 -1
  67. package/dist/user-theme.d.ts +143 -0
  68. package/dist/user-theme.js +510 -0
  69. package/dist/user-theme.js.map +1 -0
  70. package/package.json +2 -2
@@ -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
- background:var(--field);box-shadow:0 1px 2px #0000001a,0 10px 30px #00000033;
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
- #account .acct-caret{width:12px;height:12px;flex:0 0 auto;opacity:.45}
2057
- .account-btn:hover .acct-caret,#account .account-btn.menu-open .acct-caret{opacity:.8}
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;
@@ -2344,7 +2431,7 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
2344
2431
  #browse-list{overflow-y:auto;padding:4px 8px;flex:1}
2345
2432
  #browse-here{display:block;padding:2px 4px;color:var(--dim);word-break:break-all}
2346
2433
  #project-picker[open]{display:flex;flex-direction:column}
2347
- #proj-list{overflow-y:auto;padding:4px 8px}
2434
+ #proj-list{overflow-y:auto;overflow-x:hidden;padding:4px 8px}
2348
2435
  .proj-foot{padding:4px 8px 10px;box-shadow:0 -1px 0 var(--line)}
2349
2436
  .proj-item{
2350
2437
  width:100%;display:flex;align-items:center;gap:9px;border:0;border-radius:8px;
@@ -2369,15 +2456,29 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
2369
2456
  .fold-row .fold-new{margin-right:2px}
2370
2457
  .fold-row .more:hover,.fold-row .fold.menu-open ~ .more:last-child{background:var(--sel);color:var(--fg)}
2371
2458
  .fold-row .more .ico-sm{width:14px;height:14px;opacity:1}
2372
- .proj-row{display:flex;align-items:center;border-radius:8px}
2373
- .proj-row:hover{background:var(--hover)}
2459
+ /* A project row: name over its directory, a tick on the one this window is
2460
+ in, and everything else behind ··· — rename, export and forget are rare,
2461
+ and three icons on every row read as a list of things to do to it. The lit
2462
+ row is the one Enter opens, moved by the arrows or the pointer alike. */
2463
+ .proj-row{display:flex;align-items:center;gap:2px;border-radius:10px;padding-right:6px}
2464
+ .proj-row.active,.proj-row.menu-open{background:var(--hover)}
2374
2465
  .proj-row .proj-item:hover{background:transparent}
2375
- .proj-forget{
2376
- border:0;background:transparent;color:var(--dim);font:inherit;font-size:13px;
2377
- cursor:pointer;padding:6px 9px;border-radius:8px;opacity:0;flex:none;
2378
- }
2379
- .proj-row:hover .proj-forget,.proj-forget:focus-visible{opacity:1}
2380
- .proj-forget:hover{background:var(--sel);color:var(--fg)}
2466
+ .proj-row .proj-item{flex:1;width:auto;min-width:0;padding:7px 8px}
2467
+ .proj-row .avatar{flex:none}
2468
+ .proj-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
2469
+ .proj-text .path{flex:none;font-weight:500}
2470
+ .proj-dir{font-size:11.5px;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
2471
+ .proj-item .tag{flex:none}
2472
+ .proj-check{flex:none;width:16px;height:16px;display:grid;place-items:center;color:var(--fg)}
2473
+ .proj-check svg{width:14px;height:14px}
2474
+ .proj-more{
2475
+ flex:none;display:grid;place-items:center;width:26px;height:26px;padding:0;border:0;border-radius:7px;
2476
+ background:transparent;color:var(--dim);cursor:pointer;opacity:0;
2477
+ }
2478
+ .proj-more svg{width:14px;height:14px}
2479
+ .proj-row.active .proj-more,.proj-row.menu-open .proj-more,.proj-more:focus-visible{opacity:1}
2480
+ .proj-more:hover,.proj-row.menu-open .proj-more{background:var(--sel);color:var(--fg)}
2481
+ .proj-empty{padding:18px 8px;text-align:center;color:var(--dim);font-size:13px}
2381
2482
  /* The command palette.
2382
2483
  *
2383
2484
  * The sidebar shows five sessions per project and folds the rest away, which
@@ -2517,6 +2618,18 @@ button.pw-plan:disabled{opacity:.4;cursor:default}
2517
2618
  * the one thing the window exists for and stands over a 42px field. */
2518
2619
  .cn-body button.signin-site{height:44px;border-radius:10px;font-size:14px;font-weight:550}
2519
2620
  .cn-note .mono{white-space:nowrap}
2621
+ /* A vendor's mark beside its name, at the title's cap height. */
2622
+ .cn-title{display:flex;align-items:center;gap:10px}
2623
+ .cn-title .cn-title-mark{width:24px;height:24px;flex:0 0 auto;border-radius:6px}
2624
+ /* A link-weight action inside a note: words to press, not another button. */
2625
+ .small button.cn-inline,.cn-note button.cn-inline{
2626
+ border:0;background:none;padding:0;font:inherit;color:var(--fg);
2627
+ font-weight:550;cursor:pointer;text-decoration:underline;text-underline-offset:2px;
2628
+ }
2629
+ .small button.cn-inline:hover,.cn-note button.cn-inline:hover{opacity:.75}
2630
+ /* Only the sign-in: no actions row, so the body closes the dialog itself. */
2631
+ #connect.cn-keyless .dlg-actions{display:none}
2632
+ #connect.cn-keyless .cn-body{padding-bottom:24px;gap:14px}
2520
2633
  .cn-local{display:flex;gap:6px;align-items:flex-start}
2521
2634
  .cn-local .ico-sm{width:13px;height:13px;flex:0 0 auto;margin-top:1.5px;color:var(--fg)}
2522
2635
  .cn-local strong{color:var(--fg);font-weight:600}
@@ -2684,14 +2797,28 @@ details.tool>summary:hover::after{opacity:1}
2684
2797
  max-width:220px;max-height:160px;border-radius:8px;cursor:zoom-in;
2685
2798
  background:var(--bg);object-fit:cover;
2686
2799
  }
2687
- /* The windows a Computer use turn ended on: the result, so out in the turn
2800
+ /* The windows and browser tabs a turn ended on: the result, so out in the turn
2688
2801
  rather than folded into a step, and a little larger than a step's shots. */
2689
- .turn-shots{display:flex;flex-wrap:wrap;gap:10px;margin:10px 0 4px}
2690
- .turn-shot{margin:0;display:flex;flex-direction:column;gap:5px;max-width:280px}
2802
+ /* Five across, the count fitTurnShots shows; three on a phone, as two rows. */
2803
+ .turn-shots{
2804
+ display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;
2805
+ margin:10px 0 4px;
2806
+ }
2807
+ @media (max-width:600px){.turn-shots{grid-template-columns:repeat(3,minmax(0,1fr))}}
2808
+ .turn-shot{margin:0;display:flex;flex-direction:column;gap:5px;min-width:0}
2809
+ .turn-shot[hidden]{display:none}
2810
+ .turn-shot-frame{position:relative}
2691
2811
  .turn-shot img{
2692
- display:block;max-width:280px;max-height:200px;border-radius:10px;cursor:zoom-in;
2693
- background:var(--bg);object-fit:cover;
2812
+ display:block;width:100%;aspect-ratio:16/10;border-radius:8px;cursor:zoom-in;
2813
+ background:var(--bg);object-fit:cover;object-position:top;
2814
+ }
2815
+ /* The pictures past the row, counted on its last one: a click opens the
2816
+ preview there, and the arrow keys go on through the rest. */
2817
+ .turn-shot-more{
2818
+ position:absolute;inset:0;border:0;border-radius:8px;cursor:zoom-in;
2819
+ background:rgba(0,0,0,.55);color:#fff;font-size:18px;font-weight:600;
2694
2820
  }
2821
+ .turn-shot-more:hover{background:rgba(0,0,0,.45)}
2695
2822
  .turn-shot figcaption{font-size:11.5px;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
2696
2823
  /* The preview: the image as large as the window allows, over a dark scrim.
2697
2824
  Dark in both themes — a screenshot reads against black, not the page. */
@@ -2933,6 +3060,9 @@ textarea::placeholder{color:var(--dim)}
2933
3060
  color:var(--dim);
2934
3061
  }
2935
3062
  #input-mirror mark .at svg{width:11px;height:11px;display:block;margin-left:.5px}
3063
+ /* The rest of the suggested message, after what has been typed of it: the
3064
+ placeholder's colour, since it is the same offer, half taken. */
3065
+ #input-mirror .ghost{color:var(--dim)}
2936
3066
  /* The mirror sits exactly under the textarea, so every metric that decides
2937
3067
  where a glyph lands has to match: font, line-height, wrapping, and the
2938
3068
  padding, which is zero on the composer's textarea and must be zero here. */
@@ -3264,8 +3394,14 @@ textarea.boxed:focus{outline:none;background:var(--field-focus)}
3264
3394
  should not look identical — one of them means Enter takes this row — but the
3265
3395
  menu is a quiet surface and the difference is worth one tone, not two. */
3266
3396
  #attach-picker .menu-item.cursor{background:var(--sel)}
3267
- #attach-picker .menu-item.cursor .ico-sm{opacity:.8}
3268
- #attach-picker .menu-item .ico-sm{opacity:.55}
3397
+ /* Solid tokens rather than the ink at partial opacity: a translucent stroke
3398
+ picks up whatever row background sits behind it and its anti-aliased edge
3399
+ blends twice, so a 1.5px line read thinner and greyer on hover than at rest.
3400
+ At rest the marks take the section labels' grey; a row in play — under the
3401
+ pointer, under the keyboard cursor, or switched on — lights its mark to the
3402
+ label's own colour. */
3403
+ #attach-picker .menu-item .ico-sm{opacity:1;color:var(--dim)}
3404
+ #attach-picker .menu-item:hover .ico-sm,#attach-picker .menu-item.cursor .ico-sm{color:var(--fg)}
3269
3405
  /* The stacked rows carry a name over a sentence, so they are already two lines
3270
3406
  tall; the mark beside them is a label for the kind, not an illustration, and
3271
3407
  at 16px it was the widest thing in a row whose job is the words. */
@@ -3283,7 +3419,7 @@ textarea.boxed:focus{outline:none;background:var(--field-focus)}
3283
3419
  #attach-picker .menu-item.stacked .tick{margin-top:0}
3284
3420
  #attach-picker .menu-item.stacked{padding-top:5px;padding-bottom:5px}
3285
3421
  #attach-picker .menu-item.stacked .stack{gap:1px}
3286
- #attach-picker .menu-item.on .ico-sm{opacity:.9}
3422
+ #attach-picker .menu-item.on .ico-sm{color:var(--fg)}
3287
3423
  .menu-hint{padding:6px 8px 8px;font-size:11.5px;color:var(--dim)}
3288
3424
  /* A row that has something to say about itself: the name on one line and a
3289
3425
  sentence under it. Beside the name, that sentence took the whole row and
@@ -3361,6 +3497,31 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
3361
3497
  .pair-title{padding:22px 24px 6px;font-size:16px;font-weight:600}
3362
3498
  .pair-body{padding:0 24px;color:var(--dim);font-size:13.5px;line-height:1.5}
3363
3499
  .pair-code{margin:18px 24px 6px;padding:14px 0;border-radius:12px;background:var(--sel);text-align:center;font-size:30px;letter-spacing:.12em}
3500
+ /* An update question, in place of the OS's message box: the version is the
3501
+ title, the release notes scroll if there are many, and Later stays quiet. */
3502
+ .upd-dialog{width:min(440px,92vw);padding-bottom:16px}
3503
+ .upd-head{display:flex;align-items:center;gap:12px;padding:22px 24px 8px}
3504
+ .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}
3505
+ .upd-dialog.important .upd-mark{background:var(--accent);color:var(--bg)}
3506
+ .upd-title{font-size:16px;font-weight:600;line-height:1.35}
3507
+ .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}
3508
+ .upd-body{padding:0 24px;color:var(--dim);font-size:13.5px;line-height:1.5;word-break:break-word}
3509
+ .upd-body.mono{font-size:12.5px}
3510
+ .upd-dialog .dlg-actions{justify-content:flex-end;padding:18px 20px 4px}
3511
+ /* The app's confirm and prompt (askConfirm, askText). */
3512
+ .ask-dialog{width:min(420px,92vw);padding-bottom:16px}
3513
+ .ask-dialog-title{padding:22px 24px 4px;font-size:16px;font-weight:600;line-height:1.35}
3514
+ .ask-dialog-body{padding:6px 24px 0;color:var(--dim);font-size:13.5px;line-height:1.55;white-space:pre-wrap}
3515
+ .ask-dialog-title + .ask-dialog-body{padding-top:2px}
3516
+ .ask-dialog-body:first-child{padding-top:22px;color:var(--fg);font-size:14px}
3517
+ .ask-dialog-field{
3518
+ display:block;box-sizing:border-box;width:calc(100% - 48px);margin:14px 24px 2px;padding:9px 12px;
3519
+ border:1px solid var(--line);border-radius:10px;background:var(--bg);color:var(--fg);font:inherit;font-size:14px;outline:none;
3520
+ }
3521
+ .ask-dialog-field:focus{border-color:var(--fg)}
3522
+ .ask-dialog .dlg-actions{justify-content:flex-end;padding:18px 20px 4px}
3523
+ .ask-dialog .dlg-actions button.quiet{margin-right:0}
3524
+ .dlg-actions button.approve.danger{background:var(--err);color:#fff}
3364
3525
  /* The approval dialog.
3365
3526
  *
3366
3527
  * Everything here is arranged around one question: what exactly is about to
@@ -3628,7 +3789,7 @@ dialog::backdrop{background:rgba(0,0,0,.55)}
3628
3789
  */
3629
3790
  @media (hover:none) and (pointer:coarse){
3630
3791
  .session .more,.fold-row .more{display:grid;width:28px;height:28px}
3631
- .proj-forget{opacity:1}
3792
+ .proj-more{opacity:1}
3632
3793
  .actions{position:static;opacity:1;margin-top:4px}
3633
3794
  .turn{margin-bottom:14px}
3634
3795
  .act{padding:6px 10px}
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwkHV,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyuHV,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
- * One exception, and it is off unless someone sets an environment variable to
16
- * turn it on: analytics.ts loads PostHog. Turning it on accepts exactly the
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. -->
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;;;;;;;;;;;;;;GAcG;AAGH;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG;;;;;yCAKyB,CAAC;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;4CAOwB,kBAAkB,CAAC,OAAO,CAAC;SAC9D,KAAK;EACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsfK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;qBACvB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;EAC1C,aAAa;EACb,UAAU;EACV,gBAAgB;;;QAGV,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwfK,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":"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"}
1
+ {"version":3,"file":"prefs.js","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"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"}