@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.
Files changed (74) 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 +242 -12
  5. package/dist/i18n.js.map +1 -1
  6. package/dist/icons.d.ts +3 -0
  7. package/dist/icons.js +69 -3
  8. package/dist/icons.js.map +1 -1
  9. package/dist/model-order.js +1 -0
  10. package/dist/model-order.js.map +1 -1
  11. package/dist/page/client/account.js +140 -4
  12. package/dist/page/client/account.js.map +1 -1
  13. package/dist/page/client/base.js +42 -16
  14. package/dist/page/client/base.js.map +1 -1
  15. package/dist/page/client/browser.js +1 -1
  16. package/dist/page/client/composer.js +641 -47
  17. package/dist/page/client/composer.js.map +1 -1
  18. package/dist/page/client/dialogs.js +75 -0
  19. package/dist/page/client/dialogs.js.map +1 -1
  20. package/dist/page/client/events.js +25 -2
  21. package/dist/page/client/events.js.map +1 -1
  22. package/dist/page/client/index.js +4 -0
  23. package/dist/page/client/index.js.map +1 -1
  24. package/dist/page/client/panels.js +4 -4
  25. package/dist/page/client/ripple.d.ts +13 -0
  26. package/dist/page/client/ripple.js +247 -0
  27. package/dist/page/client/ripple.js.map +1 -0
  28. package/dist/page/client/routines.js +173 -41
  29. package/dist/page/client/routines.js.map +1 -1
  30. package/dist/page/client/shell.js +200 -54
  31. package/dist/page/client/shell.js.map +1 -1
  32. package/dist/page/client/state.js +7 -2
  33. package/dist/page/client/state.js.map +1 -1
  34. package/dist/page/client/terminal.js +34 -7
  35. package/dist/page/client/terminal.js.map +1 -1
  36. package/dist/page/client/theme.d.ts +17 -0
  37. package/dist/page/client/theme.js +365 -0
  38. package/dist/page/client/theme.js.map +1 -0
  39. package/dist/page/client/transcript.js +63 -7
  40. package/dist/page/client/transcript.js.map +1 -1
  41. package/dist/page/style.js +273 -22
  42. package/dist/page/style.js.map +1 -1
  43. package/dist/page.js +5 -5
  44. package/dist/page.js.map +1 -1
  45. package/dist/prefs.d.ts +17 -0
  46. package/dist/prefs.js +5 -0
  47. package/dist/prefs.js.map +1 -1
  48. package/dist/server.js +710 -45
  49. package/dist/server.js.map +1 -1
  50. package/dist/suggest.d.ts +42 -0
  51. package/dist/suggest.js +215 -0
  52. package/dist/suggest.js.map +1 -0
  53. package/dist/terminal.d.ts +35 -2
  54. package/dist/terminal.js +60 -4
  55. package/dist/terminal.js.map +1 -1
  56. package/dist/theme-assets.d.ts +39 -0
  57. package/dist/theme-assets.js +109 -0
  58. package/dist/theme-assets.js.map +1 -0
  59. package/dist/theme-store.d.ts +50 -0
  60. package/dist/theme-store.js +124 -0
  61. package/dist/theme-store.js.map +1 -0
  62. package/dist/theme-tools.d.ts +25 -0
  63. package/dist/theme-tools.js +243 -0
  64. package/dist/theme-tools.js.map +1 -0
  65. package/dist/tool-icons.d.ts +12 -0
  66. package/dist/tool-icons.js +16 -0
  67. package/dist/tool-icons.js.map +1 -0
  68. package/dist/turn-shots.d.ts +18 -2
  69. package/dist/turn-shots.js +10 -1
  70. package/dist/turn-shots.js.map +1 -1
  71. package/dist/user-theme.d.ts +143 -0
  72. package/dist/user-theme.js +510 -0
  73. package/dist/user-theme.js.map +1 -0
  74. 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;
@@ -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
- .proj-row{display:flex;align-items:center;border-radius:8px}
2373
- .proj-row:hover{background:var(--hover)}
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-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)}
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 a Computer use turn ended on: the result, so out in the turn
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
- .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}
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;max-width:280px;max-height:200px;border-radius:10px;cursor:zoom-in;
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
- #attach-picker .menu-item.cursor .ico-sm{opacity:.8}
3268
- #attach-picker .menu-item .ico-sm{opacity:.55}
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{opacity:.9}
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-forget{opacity:1}
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
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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
- * 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. -->
@@ -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;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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":"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"}
1
+ {"version":3,"file":"prefs.js","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"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"}