@xenosystem/agent-interface-ui 0.1.108 → 0.1.109

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 (2) hide show
  1. package/dist/agent.css +464 -25
  2. package/package.json +6 -6
package/dist/agent.css CHANGED
@@ -8029,10 +8029,6 @@ a.xeno-source-card:focus-visible {
8029
8029
  .xa-row.xa-think .xa-full { min-height: 0; overflow: hidden; font-size: 11.5px; line-height: 16px; color: var(--xa-t4); }
8030
8030
  .xa-row.xa-think .xa-full p { margin: 0 0 4px; } .xa-row.xa-think .xa-full p:last-child { margin: 0; }
8031
8031
  /* the plan row keeps the list folded under it for the record; the list itself rides the composer */
8032
- .xa-row.xa-plan .xa-head { display: flex; align-items: center; gap: 9px; flex: 1; min-width: 0; cursor: pointer; }
8033
- .xa-planwrap { flex-basis: 100%; margin: -9px 0 0 43px; display: grid; grid-template-rows: 0fr; transition: grid-template-rows 220ms var(--xa-ease), margin 220ms var(--xa-ease); }
8034
- .xa-row.xa-plan.xa-open .xa-planwrap { grid-template-rows: 1fr; margin: 0 0 0 43px; }
8035
- .xa-planwrap > div { min-height: 0; overflow: hidden; }
8036
8032
  .xa-plan-list { display: flex; flex-direction: column; padding-bottom: 2px; }
8037
8033
  .xa-plan-list .xa-item, .xa-tasks .xa-item { display: flex; align-items: center; gap: 9px; min-height: 22px; font-size: 11px; color: var(--xa-t4); }
8038
8034
  .xa-plan-list .xa-item .xa-sq, .xa-tasks .xa-item .xa-sq { flex: none; width: 6px; height: 6px; border-radius: 1px; border: 1px solid var(--xa-t5); background: none; transition: background 160ms linear, border-color 160ms linear; }
@@ -8304,6 +8300,10 @@ img.xa-fav { padding: 1px; background: #fff; }
8304
8300
  .xa-tasks.xa-open .xa-listwrap { grid-template-rows: 1fr; }
8305
8301
  .xa-tasks .xa-list { min-height: 0; overflow: hidden; }
8306
8302
  .xa-tasks .xa-list .xa-in { padding: 2px 10px 6px; border-top: 1px solid rgba(var(--xa-ink), 0.05); max-height: 160px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(var(--xa-ink), 0.12) transparent; }
8303
+ /* while the person is typing, the trays above the field step back: the field is the focus, the trays are context.
8304
+ Hover or focus on a tray brings it back to full strength. */
8305
+ .xa-tasks { transition: opacity 160ms linear; }
8306
+ .xa-dock:has(.xa-field textarea:focus) .xa-tasks:not(:hover):not(:focus-within) { opacity: 0.45; }
8307
8307
 
8308
8308
  /* a background run's controls — on the row that started it, and on the tray's items. Text, never a
8309
8309
  button plate: a row is a sentence, and these are the two verbs it accepts. */
@@ -8320,6 +8320,92 @@ img.xa-fav { padding: 1px; background: #fff; }
8320
8320
 
8321
8321
  /* the thread is still opening: the clock line alone, the reply not yet begun */
8322
8322
  .xa-turn.xa-opening .xa-rail { min-height: 0; }
8323
+
8324
+
8325
+
8326
+ /* =============================================================================
8327
+ The rail — XENO AGENT PANEL - SPEC.md D10 and XENO AGENT TRANSCRIPT - STEP KINDS.md, unchanged:
8328
+ the family's glyph in an 18px square on one rail that joins the markers, the box EARNED (bare and
8329
+ breathing on the 1.4s clock while the step runs, boxed when it settles), `verb · object` then the
8330
+ result right-aligned and tabular.
8331
+
8332
+ One amendment (owner, 2026-10-16): an OPENED step becomes a plate — the row and what it prints, in one
8333
+ full-width surface one step lighter than the ground — instead of its detail hanging off the rail on
8334
+ branches. The rail runs through the plate's marker column unbroken; nothing about a closed step changes.
8335
+ ============================================================================= */
8336
+ .xa-rail { margin: 0 -8px; padding: 0 8px; } /* room for an open plate on both sides, evenly — the thread scrubber sits outside the column, so it needs no gutter here */
8337
+ .xa-row > .xa-res { margin-left: auto; padding-left: 12px; }
8338
+ .xa-row > .xa-chev { margin-left: 8px; }
8339
+ .xa-row.xa-hasd:not(.xa-open):not(.xa-now) { cursor: pointer; }
8340
+ .xa-row.xa-hasd:not(.xa-open):not(.xa-now):hover > .xa-verb,
8341
+ .xa-row.xa-hasd:not(.xa-open):not(.xa-now):hover > .xa-obj { color: var(--xa-t2); }
8342
+ .xa-row.xa-hasd:not(.xa-open):not(.xa-now):hover > .xa-chev { color: var(--xa-t3); }
8343
+
8344
+ /* rhythm: 28px rows, 4px apart (was 12) — the rail stays one unbroken line from marker to marker */
8345
+ .xa-rail { gap: 4px; }
8346
+ .xa-row:not(.xa-note):not(.xa-plan):not(.xa-think) { align-items: center; row-gap: 0; }
8347
+ .xa-row:not(.xa-now):not(.xa-open) > .xa-dwrap { margin-top: 0; } /* a folded detail adds no height under the band */
8348
+ .xa-row:not(.xa-note):not(.xa-plan):not(.xa-think) > .xa-ic { margin-top: 5px; margin-bottom: 5px; } /* one 28px band; the icon and words centre in it */
8349
+ .xa-row::before { left: 8.5px; top: 23px; bottom: -9px; }
8350
+ .xa-row:has(+ .xa-row:not(.xa-note):not(.xa-plan):not(.xa-sub):is(.xa-open, .xa-now:has(> .xa-dwrap .xa-detail :is(pre:not(:empty), .xa-file, .xa-it))))::before, .xa-row:has(+ .xa-row.xa-think.xa-open)::before { bottom: -4px; } /* into a plate: stop at its edge */ /* from this marker's bottom edge to the next marker's top edge, across the 4px gap */
8351
+
8352
+ /* the plate: margin and padding cancel, so the marker, words and rail stay exactly where they were.
8353
+ A step is on a plate whenever something is printed under it — opened, or a live step streaming its output
8354
+ (a dev server, a test run) — and a closed step shows no plate. */
8355
+ .xa-row:not(.xa-note):not(.xa-plan):not(.xa-sub):is(.xa-open, .xa-now:has(> .xa-dwrap .xa-detail :is(pre:not(:empty), .xa-file, .xa-it))),
8356
+ .xa-row.xa-think.xa-open {
8357
+ margin: 0 -8px; padding: 3px 8px 8px; border-radius: 4px;
8358
+ background: var(--xa-plate); box-shadow: inset 0 0 0 1px var(--xa-line-soft);
8359
+ }
8360
+ /* a closed step you can open takes no plate on hover (owner, 2026-10-16): its words brighten, nothing moves */
8361
+ /* a plate is itself the step: the rail stops at its edge and resumes from its bottom edge to the next marker,
8362
+ never running through what the step printed */
8363
+ .xa-row:not(.xa-note):not(.xa-plan):not(.xa-sub):is(.xa-open, .xa-now:has(> .xa-dwrap .xa-detail :is(pre:not(:empty), .xa-file, .xa-it)))::before,
8364
+ .xa-row.xa-think.xa-open::before { left: 16.5px; top: 100%; bottom: -4px; }
8365
+ .xa-row.xa-open > .xa-verb, .xa-row.xa-open > .xa-obj { color: var(--xa-t2); }
8366
+
8367
+ /* inside the plate the detail spans it: the same 8px from the line above, the sides and the bottom */
8368
+ .xa-row:is(.xa-open, .xa-now) .xa-dwrap { margin: 0; }
8369
+ .xa-row:is(.xa-open, .xa-now) .xa-detail, .xa-row:is(.xa-open, .xa-now) .xa-dwrap .xa-detail { margin: 8px 0 0 0; }
8370
+ /* every detail sits in the same inner box: the well, a hairline, small corners */
8371
+ .xa-row:is(.xa-open, .xa-now) .xa-detail:not(.xa-output):not(.xa-diff):not(.xa-slice):not(.xa-nest) {
8372
+ padding: 6px 10px; border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; background: var(--xa-well);
8373
+ }
8374
+ .xa-row.xa-think.xa-open .xa-fullwrap { margin: 3px 0 0 0; }
8375
+ .xa-row:is(.xa-open, .xa-now) .xa-dwrap::before, .xa-row:is(.xa-open, .xa-now) .xa-dwrap::after,
8376
+ .xa-row:is(.xa-open, .xa-now) .xa-dwrap > div::before, .xa-row:is(.xa-open, .xa-now) .xa-dwrap > div::after,
8377
+ .xa-row:is(.xa-open, .xa-now) .xa-detail .xa-it::before, .xa-row:is(.xa-open, .xa-now) .xa-detail .xa-file::before,
8378
+ .xa-row:is(.xa-open, .xa-now) .xa-detail.xa-matches .xa-lns::before,
8379
+ .xa-row:is(.xa-open, .xa-now) .xa-detail.xa-matches .xa-ln .xa-n::before { display: none !important; }
8380
+ .xa-row.xa-open .xa-detail.xa-output .xa-foot:not(:has(.xa-cwd)) { display: none; } /* exit and time are on the row */
8381
+
8382
+ /* the edited-files card spans the transcript */
8383
+ .xa-files { width: 100%; max-width: none; box-sizing: border-box; }
8384
+
8385
+ /* matches: the file, then its lines indented to the file name, numbers right-aligned in one column */
8386
+ .xa-row.xa-open .xa-detail.xa-matches .xa-ln { padding-left: 0; gap: 8px; }
8387
+ .xa-row.xa-open .xa-detail.xa-matches .xa-ln .xa-n { width: 26px; }
8388
+ /* the diff: the step's line already names the file, so the hunk header keeps only the range; no empty space under the code */
8389
+ .xa-row .xa-detail.xa-diff .xa-hunk > .xa-mono + .xa-mono { display: none; }
8390
+ .xa-row .xa-detail.xa-diff pre { padding-bottom: 6px; }
8391
+ .xa-row .xa-detail.xa-diff, .xa-row .xa-detail.xa-output { margin-top: 2px; }
8392
+
8393
+ /* the thinking line opens the same way */
8394
+
8395
+
8396
+ /* An ask answered above the box reads on its step's own line: the answer in the result column, quiet; the
8397
+ marker already carries the verdict's colour (xa-ok / xa-bad). Pending, it says what it waits on, brighter. */
8398
+ .xa-row > .xa-res[data-tone] { font-size: 11px; color: var(--xa-t5); }
8399
+ .xa-row > .xa-res[data-tone='pending'] { color: var(--xa-t2); }
8400
+ .xa-row > .xa-res[data-tone='no'], .xa-row > .xa-res[data-tone='cancelled'] { color: var(--xa-t5); }
8401
+ /* the options a question offered, opened inside the step's plate */
8402
+ .xa-row .xa-detail.xa-q-rec-body { margin: 8px 0 0; padding: 6px 10px; border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; background: var(--xa-well); }
8403
+ .xa-row .xa-detail.xa-q-rec-body ol { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 2px; }
8404
+ .xa-row .xa-detail.xa-q-rec-body li { display: flex; align-items: center; gap: 9px; min-height: 22px; font-size: 11.5px; color: var(--xa-t4); }
8405
+ .xa-row .xa-detail.xa-q-rec-body li[data-picked='true'] { color: var(--xa-t1); }
8406
+ .xa-row .xa-detail.xa-q-rec-body .xa-q-key { width: 18px; height: 18px; border-radius: 3px; }
8407
+ .xa-row .xa-detail.xa-q-rec-body .xa-q-keyc { font-size: 10px; }
8408
+ .xa-row .xa-detail.xa-q-rec-body .xa-q-rec-why { margin-top: 6px; font-size: 11.5px; color: var(--xa-t3); }
8323
8409
  /* =============================================================================
8324
8410
  The XENO Agent composer — D9 / D9a / D11 of `XENO AGENT PANEL - SPEC.md`.
8325
8411
  -----------------------------------------------------------------------------
@@ -8386,16 +8472,16 @@ img.xa-fav { padding: 1px; background: #fff; }
8386
8472
 
8387
8473
  .xa-dock .xa-box { display: flex; flex-direction: column; justify-content: center; gap: 9px; min-height: 46px; padding: 9px 11px; background: var(--xa-plate); border: 1px solid var(--xa-line); border-radius: 6px; }
8388
8474
  .xa-dock .xa-box.xa-off { opacity: 0.55; }
8389
- .xa-dock .xa-box textarea {
8475
+ .xa-dock .xa-box .xa-field textarea {
8390
8476
  display: block; width: 100%; margin: 0; padding: 0; border: 0; background: transparent; resize: none;
8391
8477
  font: inherit; font-size: 13px; line-height: 1.5; color: var(--xa-ink-text); caret-color: var(--xa-t1);
8392
8478
  min-height: 19.5px; max-height: 220px; overflow-y: auto; scrollbar-width: thin;
8393
8479
  }
8394
- .xa-dock .xa-box textarea::placeholder { color: var(--xa-t6); }
8480
+ .xa-dock .xa-box .xa-field textarea::placeholder { color: var(--xa-t6); }
8395
8481
  /* the bench's `textarea:focus { outline: none }`: the box is the field's frame, so a host's focus ring
8396
8482
  (`*:focus-visible`, drawn outside the field) reads as a stray stroke over it — DESIGN_SYSTEM.md exempts
8397
8483
  text entry, and only text entry, from the ring */
8398
- .xa-dock .xa-box textarea:focus, .xa-dock .xa-box textarea:focus-visible { outline: none; box-shadow: none; }
8484
+ .xa-dock .xa-box .xa-field textarea:focus, .xa-dock .xa-box .xa-field textarea:focus-visible { outline: none; box-shadow: none; }
8399
8485
  .xa-dock .xa-tiles { display: flex; flex-wrap: wrap; gap: 7px; }
8400
8486
  .xa-dock .xa-tile { position: relative; width: 44px; height: 44px; background: var(--xa-tile); border: 1px solid var(--xa-line-tip); border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 500; color: var(--xa-t3); }
8401
8487
  .xa-dock .xa-tile.xa-img { background: var(--xa-tile-img); overflow: visible; }
@@ -8535,7 +8621,7 @@ img.xa-fav { padding: 1px; background: #fff; }
8535
8621
  .xa-dock .xa-menu.xa-typed .xa-none { padding: 7px 9px; font-size: 11px; color: var(--xa-t5); }
8536
8622
  /* a taken reference is a chip in the SENT message (`.xa-chip`, with its glyph); in the box it is the
8537
8623
  words as typed — the bench's field is the textarea and nothing else */
8538
- .xa-dock .xa-box textarea { letter-spacing: -0.006em; } /* a form control does not inherit it */
8624
+ .xa-dock .xa-box .xa-field textarea { letter-spacing: -0.006em; } /* a form control does not inherit it */
8539
8625
  .xa-dock .xa-chip { display: inline-flex; align-items: center; gap: 4px; vertical-align: -2px; padding: 1px 5px 1px 4px; background: rgba(var(--xa-ink),0.07); border: 1px solid var(--xa-line-soft); border-radius: 3px; font-size: 12px; line-height: 1.3; color: var(--xa-t1); white-space: nowrap; }
8540
8626
  .xa-dock .xa-chip svg { flex: none; color: var(--xa-t4); }
8541
8627
  .xa-dock .xa-mrow { display: flex; align-items: center; gap: 9px; width: 100%; padding: 7px 9px; border-radius: 4px; text-align: left; font-size: 12px; color: var(--xa-t3); }
@@ -8657,6 +8743,373 @@ img.xa-fav { padding: 1px; background: #fff; }
8657
8743
  The dot is not animated, so it can simply own its spacing the way the icon does. This belongs
8658
8744
  in the prototype too. */
8659
8745
  .xa-dock .xa-mgrp .xa-txt.xa-down .xa-dot { margin-right: 6px; }
8746
+ /* =============================================================================
8747
+ The agent's question, docked on the composer (QuestionPanel.tsx) — the XENO platform chat's
8748
+ question panel (xeno-platform `chatQuestion.css`, approved 2026-10-02), on the Agent interface's own
8749
+ tokens so it follows both themes. Same card the queue uses (queue.css), on purpose: the slot above the
8750
+ box holds one kind of card.
8751
+ ============================================================================= */
8752
+ .xa-dock .xa-above { display: flex; flex-direction: column; gap: 8px; }
8753
+
8754
+ .xa-q {
8755
+ display: flex; flex-direction: column;
8756
+ background: var(--xa-plate); border: 1px solid var(--xa-line); border-radius: 8px;
8757
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.25), 0 12px 32px rgb(0 0 0 / 0.3);
8758
+ overflow: hidden; outline: none; color: var(--xa-t2);
8759
+ animation: xa-q-rise 0.34s var(--xa-ease) both;
8760
+ }
8761
+ /* The panel takes focus only so its keys work. It is a container, not a control: it never draws a focus
8762
+ ring (a ring that appears on open and vanishes on the first click reads as a glitch). */
8763
+ .xa-q:focus, .xa-q:focus-visible { outline: none; border-color: var(--xa-line); }
8764
+ @keyframes xa-q-rise { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
8765
+
8766
+ /* The marker: a filled square, never animated. Bright while the question waits, dim once answered. */
8767
+ .xa-q-sq { flex: none; width: 10px; height: 10px; border-radius: 2.5px; background: var(--xa-t1); }
8768
+
8769
+ .xa-q-head { display: flex; align-items: flex-start; gap: 10px; padding: 12px 12px 6px 14px; }
8770
+ .xa-q-mark { flex: none; width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; }
8771
+ .xa-q-text { flex: 1; min-width: 0; font-size: 14px; font-weight: 500; line-height: 20px; color: var(--xa-t1); user-select: text; }
8772
+ .xa-q-text small { display: block; font-size: 11.5px; font-weight: 400; line-height: 1.4; color: var(--xa-t4); margin-top: 2px; }
8773
+ .xa-q-fold { flex: none; width: 26px; height: 26px; margin: -3px -4px 0 0; border-radius: 6px; color: var(--xa-t4); display: inline-flex; align-items: center; justify-content: center; background: none; border: 0; cursor: pointer; }
8774
+ .xa-q-fold:hover { background: var(--xa-wash-hover); color: var(--xa-t1); }
8775
+
8776
+ .xa-q-list { list-style: none; margin: 0; padding: 2px 6px 4px; display: flex; flex-direction: column; gap: 1px; max-height: min(46vh, 420px); overflow-y: auto; overscroll-behavior: contain; }
8777
+ .xa-q-opt {
8778
+ width: 100%; display: flex; align-items: flex-start; gap: 10px; padding: 7px 8px; border-radius: 6px;
8779
+ text-align: left; font: inherit; font-size: 13.5px; line-height: 1.45; color: var(--xa-t2);
8780
+ background: none; border: 0; cursor: pointer; transition: background 0.12s;
8781
+ }
8782
+ .xa-q-opt:hover { background: var(--xa-wash-hover); }
8783
+ .xa-q-opt[aria-checked='true'] { background: var(--xa-wash); color: var(--xa-t1); }
8784
+ .xa-q-opt[data-active='true'] { background: var(--xa-wash-hover); }
8785
+ .xa-q-opt:focus-visible { outline: none; background: var(--xa-wash-hover); }
8786
+ .xa-q-key {
8787
+ flex: none; width: 20px; height: 20px; border-radius: 5px; border: 1px solid var(--xa-line-tip); background: var(--xa-well);
8788
+ color: var(--xa-t4); display: inline-flex; align-items: center; justify-content: center; transition: background 0.12s, color 0.12s;
8789
+ }
8790
+ .xa-q-opt[data-multi='true'] .xa-q-key { border-radius: 3px; }
8791
+ .xa-q-opt[aria-checked='true'] .xa-q-key { background: var(--xa-send); border-color: var(--xa-send); color: var(--xa-ground); }
8792
+ /* Centre the CAPITAL, not the line box: a line box reserves descender room capitals never use. */
8793
+ .xa-q-keyc { display: block; font-size: 11px; font-weight: 600; line-height: 1; text-box: trim-both cap alphabetic; }
8794
+ .xa-q-opt-text { flex: 1; min-width: 0; }
8795
+
8796
+ .xa-q-why { margin: 4px 12px 0; }
8797
+ .xa-q-why textarea, .xa-q-why input {
8798
+ display: block; width: 100%; box-sizing: border-box; resize: none; min-height: 36px; max-height: 120px; border: 1px solid var(--xa-line-tip);
8799
+ background: var(--xa-well); color: var(--xa-t1); border-radius: 6px; padding: 8px 10px; font: inherit; font-size: 13px; line-height: 1.45; outline: none;
8800
+ }
8801
+ .xa-q-why textarea:focus, .xa-q-why input:focus { border-color: var(--xa-t4); box-shadow: none; }
8802
+ .xa-q-why textarea::placeholder, .xa-q-why input::placeholder { color: var(--xa-t6); }
8803
+ .xa-q-error { margin: 6px 14px 0; font-size: 12px; color: var(--xa-red); }
8804
+
8805
+ .xa-q-foot { display: flex; align-items: center; gap: 6px; padding: 8px 10px 10px 12px; }
8806
+ .xa-q-addwhy { display: inline-flex; align-items: center; gap: 5px; font: inherit; font-size: 12.5px; color: var(--xa-t4); padding: 5px 6px; margin-left: -6px; border-radius: 6px; background: none; border: 0; cursor: pointer; }
8807
+ .xa-q-addwhy:hover { color: var(--xa-t1); background: var(--xa-wash-hover); }
8808
+ .xa-q-keys { margin-left: auto; margin-right: 4px; font-size: 11.5px; color: var(--xa-t5); white-space: nowrap; }
8809
+ .xa-q-keys kbd { font: inherit; font-size: 10.5px; padding: 1px 5px; border: 1px solid var(--xa-line-tip); border-radius: 4px; background: var(--xa-well); }
8810
+ .xa-q-btn { height: 30px; padding: 0 12px; border-radius: 6px; font: inherit; font-size: 12.5px; font-weight: 500; white-space: nowrap; border: 0; cursor: pointer; transition: background 0.12s, color 0.12s, opacity 0.12s; }
8811
+ .xa-q-btn[data-variant='ghost'] { background: none; color: var(--xa-t4); }
8812
+ .xa-q-btn[data-variant='ghost']:hover { background: var(--xa-wash-hover); color: var(--xa-t1); }
8813
+ .xa-q-btn[data-variant='primary'] { background: var(--xa-send); color: var(--xa-ground); }
8814
+ .xa-q-btn[data-variant='primary']:hover:not(:disabled) { background: var(--xa-send-hover); }
8815
+ .xa-q-btn:disabled { opacity: 0.35; cursor: not-allowed; }
8816
+
8817
+ /* Folded (Esc): one line, still waiting. */
8818
+ .xa-q-bar { width: 100%; display: flex; align-items: center; gap: 9px; padding: 10px 12px; text-align: left; font: inherit; font-size: 13px; background: none; border: 0; cursor: pointer; color: var(--xa-t1); }
8819
+ .xa-q-bar:hover { background: var(--xa-wash); }
8820
+ .xa-q-bar .xa-q-sq { margin: 0 5px; }
8821
+ .xa-q-bar-q { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--xa-t4); }
8822
+ .xa-q-bar b { flex: none; font-weight: 600; }
8823
+ .xa-q-bar-open { flex: none; font-size: 12px; color: var(--xa-t4); }
8824
+
8825
+ /* The record inside the transcript: one line, expands on click. */
8826
+ .xa-q-rec { margin: 4px 0; border: 1px solid var(--xa-line); border-radius: 7px; background: var(--xa-plate); overflow: hidden; max-width: 560px; }
8827
+ .xa-q-rec-line { width: 100%; display: flex; align-items: center; gap: 8px; padding: 8px 11px; font: inherit; font-size: 12.5px; line-height: 1.4; text-align: left; color: var(--xa-t4); background: none; border: 0; cursor: pointer; }
8828
+ .xa-q-rec-line:hover { background: var(--xa-wash); }
8829
+ .xa-q-rec .xa-q-sq { background: var(--xa-t5); }
8830
+ .xa-q-rec[data-pending='true'] .xa-q-sq { background: var(--xa-t1); }
8831
+ .xa-q-rec-q { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
8832
+ .xa-q-rec-a { flex: none; max-width: 46%; color: var(--xa-t1); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
8833
+ .xa-q-rec-chev { flex: none; display: flex; transition: transform 0.15s; }
8834
+ .xa-q-rec[data-open='true'] .xa-q-rec-chev { transform: rotate(180deg); }
8835
+ .xa-q-rec-body { border-top: 1px solid var(--xa-line); padding: 6px 6px 8px; user-select: text; }
8836
+ .xa-q-rec-qq { padding: 6px 6px 4px; font-size: 13px; font-weight: 500; color: var(--xa-t1); }
8837
+ .xa-q-rec-body ol { list-style: none; margin: 0; padding: 0; }
8838
+ .xa-q-rec-body li { display: flex; gap: 9px; align-items: flex-start; padding: 5px 6px; border-radius: 6px; font-size: 12.5px; line-height: 1.45; color: var(--xa-t4); }
8839
+ .xa-q-rec-body li[data-picked='true'] { background: var(--xa-wash); color: var(--xa-t1); }
8840
+ .xa-q-rec-body li .xa-q-key { width: 18px; height: 18px; border-radius: 4px; }
8841
+ .xa-q-rec-body li[data-picked='true'] .xa-q-key { background: var(--xa-send); border-color: var(--xa-send); color: var(--xa-ground); }
8842
+ .xa-q-rec-why { margin: 6px 6px 0; font-size: 12.5px; line-height: 1.5; color: var(--xa-t1); white-space: pre-wrap; }
8843
+ .xa-q-rec-why span { color: var(--xa-t4); }
8844
+
8845
+ @container (max-width: 520px) {
8846
+ .xa-q-keys { display: none; }
8847
+ .xa-q-list { max-height: 26vh; }
8848
+ .xa-q-opt { font-size: 13px; line-height: 1.4; padding: 6px; }
8849
+ .xa-q-head { padding: 10px 10px 4px 12px; }
8850
+ .xa-q-text { font-size: 13.5px; }
8851
+ .xa-q-foot { padding: 6px 8px 8px 10px; }
8852
+ }
8853
+ @media (prefers-reduced-motion: reduce) { .xa-q { animation: none; } }
8854
+
8855
+ /* =============================================================================
8856
+ A permission in the same slot (PermissionPanel.tsx): the question's card, carrying what the agent wants to
8857
+ do — the command as a block, or the folder and why — and the three answers: this once, refuse, remember.
8858
+ ============================================================================= */
8859
+ .xa-perm .xa-perm-ic { color: var(--xa-t2); border-radius: 4px; background: var(--xa-box); box-shadow: inset 0 0 0 1px var(--xa-line-soft); animation: xa-breathe 1.4s ease-in-out infinite; }
8860
+ .xa-perm-body { margin: 2px 12px 4px 44px; padding: 8px 10px; font-size: 12px; line-height: 18px; color: var(--xa-t1); white-space: pre-wrap; word-break: break-all; background: var(--xa-well); border: 1px solid rgba(var(--xa-ink), 0.06); border-radius: 4px; user-select: text; }
8861
+ .xa-perm-note { margin: 2px 12px 4px 44px; font-size: 12.5px; line-height: 1.45; color: var(--xa-t3); }
8862
+ .xa-perm-always { display: inline-flex; gap: 2px; }
8863
+ .xa-perm-always kbd { font: inherit; font-size: 10px; padding: 0 4px; border: 1px solid var(--xa-line-tip); border-radius: 3px; background: var(--xa-well); color: var(--xa-t4); }
8864
+ .xa-q-addwhy:disabled { opacity: 0.35; cursor: not-allowed; }
8865
+ .xa-perm .xa-q-foot { padding-left: 44px; }
8866
+ @media (prefers-reduced-motion: reduce) { .xa-perm .xa-perm-ic { animation: none; } }
8867
+
8868
+ /* the permission's record in the transcript: one line, coloured once answered */
8869
+ .xa-q-rec[data-agent-permission-record] .xa-q-rec-line { cursor: default; }
8870
+ .xa-q-rec[data-agent-permission-record] .xa-q-rec-line:hover { background: none; }
8871
+ .xa-q-rec[data-tone='yes'] .xa-q-sq { background: var(--xa-green); }
8872
+ .xa-q-rec[data-tone='no'] .xa-q-sq, .xa-q-rec[data-tone='cancelled'] .xa-q-sq { background: var(--xa-red); }
8873
+
8874
+ /* The ask is answered above the box now, so in collapsed mode the turn does not surface it a second time: the
8875
+ clock line keeps saying what the agent is waiting on, and the rail stays folded. (Spec D10's "an ask still
8876
+ surfaces in collapsed mode" is met by the card above the composer.) */
8877
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open):has(.xa-rail [data-agent-permission-record], .xa-rail [data-agent-question-record]) .xa-railwrap { grid-template-rows: 0fr; }
8878
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open):has(.xa-rail [data-agent-permission-record], .xa-rail [data-agent-question-record]) .xa-line .xa-vr { display: block; }
8879
+ /* the ticker is a flex row (glyph slot, then the words): `revert` here made it inline, and the words — absolutely
8880
+ placed inside their own box — landed on the glyph */
8881
+ .xa-collapsed .xa-turn.xa-live.xa-asking:not(.xa-open):has(.xa-rail [data-agent-permission-record], .xa-rail [data-agent-question-record]) .xa-line .xa-cur { display: flex; }
8882
+
8883
+ /* =============================================================================
8884
+ The ask lives INSIDE the input box, at its top (owner, 2026-10-16): the box grows upward to hold it, a
8885
+ hairline divides it from the field. Full width, no card of its own — the box IS the card.
8886
+ ============================================================================= */
8887
+ .xa-dock .xa-box.xa-asking { padding-top: 0; }
8888
+ .xa-box-ask { margin: 0 -11px 2px; border-bottom: 1px solid var(--xa-line); }
8889
+ .xa-box-ask .xa-q { background: none; border: 0; border-radius: 0; box-shadow: none; }
8890
+ .xa-box-ask .xa-q[data-folded='true'] .xa-q-bar { padding: 9px 12px; }
8891
+ .xa-box-ask .xa-q-head { padding: 11px 11px 4px 12px; }
8892
+ .xa-box-ask .xa-q-list { padding: 2px 4px 2px; }
8893
+ .xa-box-ask .xa-q-foot { padding: 6px 10px 9px 12px; }
8894
+ .xa-box-ask .xa-perm .xa-q-foot { padding-left: 42px; }
8895
+ .xa-box-ask .xa-perm-body, .xa-box-ask .xa-perm-note { margin-left: 42px; margin-right: 11px; }
8896
+ /* while the agent waits on an answer the box IS the ask: the message field steps aside (it comes back the
8897
+ moment the ask is answered, with whatever was typed still in it) */
8898
+ .xa-dock .xa-box.xa-asking { padding: 0; gap: 0; }
8899
+ .xa-dock .xa-box.xa-asking > :not(.xa-box-ask):not(input[type='file']) { display: none !important; }
8900
+ .xa-dock .xa-box.xa-asking .xa-box-ask { margin: 0; border-bottom: 0; }
8901
+
8902
+ /* the ask, in the same family (inside the box: the box is its border) */
8903
+ .xa-box-ask .xa-q-head { align-items: center; padding: 8px 10px 4px 12px; gap: 9px; }
8904
+ .xa-box-ask .xa-q-mark { width: 18px; height: 18px; }
8905
+ .xa-box-ask .xa-q-sq { width: 6px; height: 6px; border-radius: 1.5px; animation: xa-breathe 1.4s ease-in-out infinite; }
8906
+ .xa-box-ask .xa-q-text { font-size: 12.5px; font-weight: 500; line-height: 18px; }
8907
+ .xa-box-ask .xa-q-text small { font-size: 11px; color: var(--xa-t4); margin-top: 0; }
8908
+ .xa-box-ask .xa-q-fold { width: 22px; height: 22px; margin: 0; border-radius: 3px; color: var(--xa-t6); }
8909
+ .xa-box-ask .xa-q-list { padding: 0 6px 2px; gap: 0; }
8910
+ .xa-box-ask .xa-q-opt { padding: 5px 6px; gap: 9px; border-radius: 3px; font-size: 12.5px; line-height: 18px; }
8911
+ .xa-box-ask .xa-q-key { width: 18px; height: 18px; }
8912
+ .xa-box-ask .xa-q-keyc { font-size: 10px; border-radius: 3px; }
8913
+ .xa-box-ask .xa-q-foot { padding: 4px 8px 8px 12px; gap: 4px; }
8914
+ .xa-box-ask .xa-q-addwhy { font-size: 11.5px; padding: 4px 6px; border-radius: 3px; }
8915
+ .xa-box-ask .xa-q-keys { font-size: 10.5px; }
8916
+ .xa-box-ask .xa-q-keys kbd { font-size: 10px; padding: 0 4px; border-radius: 3px; }
8917
+ .xa-box-ask .xa-q-btn { height: 24px; padding: 0 10px; border-radius: 3px; font-size: 11.5px; }
8918
+ .xa-box-ask .xa-perm .xa-q-foot, .xa-box-ask .xa-perm-body, .xa-box-ask .xa-perm-note { margin-left: 0; padding-left: 12px; }
8919
+ .xa-box-ask .xa-perm .xa-q-foot { padding-left: 39px; }
8920
+ .xa-box-ask .xa-perm-body { margin: 2px 10px 4px 39px; padding: 6px 9px; font-size: 11.5px; line-height: 16px; }
8921
+ .xa-box-ask .xa-perm-note { margin: 2px 10px 4px 39px; padding: 0; font-size: 11.5px; }
8922
+ .xa-box-ask .xa-perm .xa-perm-ic { width: 18px; height: 18px; border-radius: 3px; }
8923
+ /* the reasoning field, in the footer where "Add your reasoning" was — same line, same left edge */
8924
+ .xa-q-whyin {
8925
+ flex: 1 1 auto; min-width: 0; resize: none; overflow-y: auto; box-sizing: border-box;
8926
+ margin: 0 6px 0 -6px; padding: 4px 6px; min-height: 24px; max-height: 96px;
8927
+ font: inherit; font-size: 12px; line-height: 16px; color: var(--xa-t1);
8928
+ background: var(--xa-well); border: 1px solid var(--xa-line-soft); border-radius: 3px; outline: none;
8929
+ }
8930
+ .xa-q-whyin::placeholder { color: var(--xa-t5); }
8931
+ .xa-q-whyin:focus { border-color: var(--xa-line-tip); }
8932
+ .xa-q-foot:has(.xa-q-whyin) .xa-q-keys { display: none; }
8933
+ /* the prompt and the field are one slot: the same 28px height, the same text line, so nothing moves when it opens */
8934
+ .xa-box-ask .xa-q-addwhy { height: 28px; box-sizing: border-box; padding: 0 6px; line-height: 16px; }
8935
+ .xa-q-whyin { height: 28px; min-height: 28px; padding: 5px 6px; line-height: 16px; font-size: 11.5px; margin-left: -6px !important; }
8936
+ .xa-box-ask .xa-q-foot > .xa-q-whyin { margin: 0 6px 0 -6px; }
8937
+ /* typed text starts where the words "Add your reasoning" started — after the plus — so the text does not jump sideways */
8938
+ .xa-box-ask .xa-q-foot > .xa-q-whyin { padding-left: 23px; }
8939
+ /* one frame only: a host's focus ring is suppressed for text entry (DESIGN_SYSTEM.md), the field's own edge brightens */
8940
+ .xa-box-ask .xa-q-foot > .xa-q-whyin:focus, .xa-box-ask .xa-q-foot > .xa-q-whyin:focus-visible { outline: none !important; box-shadow: none !important; }
8941
+ /* the plus stays where it was, now inside the field, so the slot reads as the same thing opened */
8942
+ .xa-box-ask .xa-q-foot > .xa-q-whyin {
8943
+ background-image: linear-gradient(currentColor, currentColor), linear-gradient(currentColor, currentColor);
8944
+ background-size: 9px 1.4px, 1.4px 9px; background-position: 8px 13px, 11.8px 9.2px; background-repeat: no-repeat;
8945
+ color: var(--xa-t1); background-color: var(--xa-well);
8946
+ }
8947
+ /* no stroke on the reasoning field, focused or not (owner, 2026-10-16): the well's shade alone says "type here" */
8948
+ .xa-q-whyin, .xa-q-whyin:hover, .xa-q-whyin:focus, .xa-q-whyin:focus-visible,
8949
+ .xa-box-ask .xa-q-foot > .xa-q-whyin, .xa-box-ask .xa-q-foot > .xa-q-whyin:focus, .xa-box-ask .xa-q-foot > .xa-q-whyin:focus-visible {
8950
+ border-color: transparent !important; outline: none !important; box-shadow: none !important;
8951
+ }
8952
+ /* the open reasoning slot keeps the very same plus icon, in the very same place as the button's: the slot is the
8953
+ button's box (same padding, same gap), the field fills the rest of it */
8954
+ .xa-q-whyslot { flex: 1 1 auto; min-width: 0; display: flex; align-items: flex-start; gap: 5px; font-size: 11.5px; height: auto; min-height: 28px; padding: 0 6px; margin-left: -6px; margin-right: 6px; box-sizing: border-box; border-radius: 3px; background: var(--xa-well); color: var(--xa-t4); }
8955
+ .xa-q-whyplus { flex: none; display: inline-flex; align-items: center; height: 28px; }
8956
+ .xa-box-ask .xa-q-foot .xa-q-whyslot > .xa-q-whyin {
8957
+ flex: 1 1 auto; margin: 0 !important; padding: 6px 0 !important; background: none !important; background-image: none !important;
8958
+ height: 28px; min-height: 28px; line-height: 16px; font-size: 11.5px; color: var(--xa-t1);
8959
+ }
8960
+ .xa-q-foot:has(.xa-q-whyslot) .xa-q-keys { display: none; }
8961
+ /* the reasoning field scrolls with the wheel past four lines but never shows a scrollbar */
8962
+ .xa-q-whyin { scrollbar-width: none; }
8963
+ .xa-q-whyin::-webkit-scrollbar { display: none; }
8964
+ /* the permission's command and its answers start at the card's left edge, under the icon — not indented under
8965
+ the title (owner, 2026-10-16) */
8966
+ .xa-box-ask .xa-perm .xa-perm-body, .xa-box-ask .xa-perm .xa-perm-note { margin-left: 12px !important; }
8967
+ .xa-box-ask .xa-perm .xa-q-foot { padding-left: 12px !important; }
8968
+ .xa-box-ask .xa-perm .xa-perm-body, .xa-box-ask .xa-perm .xa-perm-note { margin-right: 12px !important; }
8969
+ .xa-box-ask .xa-perm .xa-q-foot { padding-right: 12px !important; }
8970
+ .xa-box-ask .xa-perm .xa-q-head { padding-right: 12px; }
8971
+ /* the permission's title and its scope share one line: "Wants to run a command | In the project, on this machine · once" */
8972
+ .xa-box-ask .xa-perm .xa-q-text { display: flex; align-items: center; min-width: 0; gap: 0; white-space: nowrap; }
8973
+ .xa-box-ask .xa-perm .xa-q-text small { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; margin: 0; font-size: 11.5px; font-weight: 400; line-height: 18px; color: var(--xa-t4); }
8974
+ .xa-box-ask .xa-perm .xa-q-text small::before { content: ''; display: inline-block; width: 1px; height: 11px; margin: 0 9px; vertical-align: -1px; background: var(--xa-line-tip); }
8975
+ .xa-box-ask .xa-perm .xa-q-head { align-items: center; padding-bottom: 6px; }
8976
+ /* folded, the bar is the whole box: no minimum height around it, and its hover fills the box to its corners */
8977
+ .xa-dock .xa-box.xa-asking { min-height: 0; overflow: hidden; }
8978
+ .xa-box-ask .xa-q[data-folded='true'] .xa-q-bar { border-radius: 5px; }
8979
+
8980
+ /* While the agent waits on an answer, the box holds the focus: the cards stacked above it in the dock — Tasks,
8981
+ Delegated, Running, Queued — and the workspace row step back. A pointer on any of them brings it back at once,
8982
+ so nothing is out of reach; it is emphasis, not a lock. */
8983
+ .xa-dock-inner:has(.xa-box.xa-asking) > :not(.xa-box):not(.xa-foot):not(.xa-notice):not(.xa-controls) {
8984
+ opacity: 0.45; transition: opacity 200ms var(--xa-ease);
8985
+ }
8986
+ .xa-dock-inner:has(.xa-box.xa-asking) > :not(.xa-box):not(.xa-foot):not(.xa-notice):not(.xa-controls):hover,
8987
+ .xa-dock-inner:has(.xa-box.xa-asking) > :not(.xa-box):not(.xa-foot):not(.xa-notice):not(.xa-controls):focus-within { opacity: 1; }
8988
+ .xa-dock-inner > :not(.xa-box) { transition: opacity 200ms var(--xa-ease); }
8989
+ @media (prefers-reduced-motion: reduce) { .xa-dock-inner > * { transition: none !important; } }
8990
+ /* =============================================================================
8991
+ The queue (QueuePanel.tsx) — the XENO platform chat's queue card (xeno-platform `chatQueue.css`,
8992
+ approved 2026-09-30), on the Agent interface's tokens. Same card as the question (question.css).
8993
+ ============================================================================= */
8994
+ .xa-queue {
8995
+ display: flex; flex-direction: column;
8996
+ background: var(--xa-plate); border: 1px solid var(--xa-line); border-radius: 8px;
8997
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.25), 0 12px 32px rgb(0 0 0 / 0.3);
8998
+ overflow: hidden; color: var(--xa-t2);
8999
+ animation: xa-queue-rise 0.34s var(--xa-ease) both;
9000
+ }
9001
+ .xa-queue-bar { width: 100%; display: flex; align-items: center; gap: 8px; padding: 10px 12px 10px 11px; color: var(--xa-t1); font: inherit; text-align: left; background: none; border: 0; cursor: pointer; transition: background 0.12s; }
9002
+ .xa-queue-bar:hover { background: var(--xa-wash); }
9003
+ .xa-queue-ico { color: var(--xa-t4); display: flex; }
9004
+ .xa-queue-title { font-size: 12.5px; font-weight: 600; letter-spacing: -0.01em; flex: none; }
9005
+ .xa-queue-vr { flex: none; width: 1px; height: 12px; background: var(--xa-line-tip); margin: 0 3px; }
9006
+ .xa-queue-note { flex: 1; min-width: 0; color: var(--xa-t5); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
9007
+ .xa-queue-count { margin-left: auto; flex: none; font-size: 11px; color: var(--xa-t4); font-variant-numeric: tabular-nums; }
9008
+ .xa-queue-chev { flex: none; color: var(--xa-t4); display: flex; transition: transform 0.2s; }
9009
+ .xa-queue[data-expanded='true'] .xa-queue-chev { transform: rotate(180deg); }
9010
+ .xa-queue-hold { flex: none; width: 6px; height: 6px; border-radius: 1.5px; background: var(--xa-t1); animation: xa-queue-breathe 1.2s ease-in-out infinite; }
9011
+ .xa-queue[data-held='true'] .xa-queue-note { color: var(--xa-t2); }
9012
+ .xa-queue[data-grace='true'] .xa-queue-count { color: var(--xa-red); }
9013
+ .xa-queue[data-grace='true'] .xa-queue-hold { background: var(--xa-red); }
9014
+
9015
+ .xa-queue-wrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 0.22s var(--xa-ease); }
9016
+ .xa-queue[data-expanded='true'] .xa-queue-wrap { grid-template-rows: 1fr; }
9017
+ .xa-queue-inner { min-height: 0; overflow: hidden; }
9018
+ .xa-queue-list { list-style: none; margin: 0; padding: 6px 8px 8px; display: flex; flex-direction: column; max-height: 260px; overflow-y: auto; }
9019
+
9020
+ .xa-queue-item { display: flex; align-items: flex-start; gap: 9px; padding: 8px 6px 8px 7px; border-radius: 6px; position: relative; transition: background 0.18s, box-shadow 0.2s ease, transform 0.2s var(--xa-ease); animation: xa-queue-rise 0.26s var(--xa-ease) both; }
9021
+ .xa-queue-item:hover { background: var(--xa-wash); }
9022
+ .xa-queue-item[data-lifted='true'] { transition: none; z-index: 20; cursor: grabbing; background: var(--xa-menu); box-shadow: 0 0 0 1px var(--xa-line-tip), 0 14px 30px -8px rgb(0 0 0 / 0.35), 0 5px 12px -6px rgb(0 0 0 / 0.25); }
9023
+
9024
+ /* The square IS the drag handle: the marker by default, the grip on hover. */
9025
+ .xa-queue-mark { flex: none; position: relative; width: 14px; height: 20px; margin-top: 1px; display: flex; align-items: flex-start; justify-content: center; }
9026
+ .xa-queue-sq { width: 6px; height: 6px; margin-top: 7px; border-radius: 1.5px; background: var(--xa-t5); transition: opacity 0.12s; }
9027
+ .xa-queue-grip { position: absolute; inset: 0; display: flex; align-items: flex-start; justify-content: center; color: var(--xa-t4); opacity: 0; transition: opacity 0.12s; }
9028
+ .xa-queue-grip svg { margin-top: 4px; }
9029
+ .xa-queue-item:hover .xa-queue-mark { cursor: grab; }
9030
+ .xa-queue-item:hover .xa-queue-sq { opacity: 0; }
9031
+ .xa-queue-item:hover .xa-queue-grip { opacity: 0.8; }
9032
+ .xa-queue-item[data-next='true'] .xa-queue-sq { background: var(--xa-t1); animation: xa-queue-breathe 1.6s ease-in-out infinite; }
9033
+ .xa-queue[data-held='true'] .xa-queue-item[data-next='true'] .xa-queue-sq { animation: none; opacity: 0.3; }
9034
+
9035
+ .xa-queue-main { flex: 1; min-width: 0; }
9036
+ .xa-queue-text { min-width: 0; color: var(--xa-t1); font-size: 13px; line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; cursor: text; }
9037
+ .xa-queue-text:focus-visible { outline: none; text-decoration: underline; text-decoration-color: var(--xa-t5); }
9038
+ .xa-queue-edit { display: block; width: 100%; box-sizing: border-box; font: inherit; font-size: 13px; line-height: 1.5; color: var(--xa-t1); background: transparent; border: none; border-bottom: 1.5px solid var(--xa-line-tip); border-radius: 0; padding: 0 0 3px; margin: 0; resize: none; outline: none; overflow: hidden; }
9039
+ .xa-queue-edit:focus { border-bottom-color: var(--xa-t3); box-shadow: none; }
9040
+ .xa-queue-att { display: inline-flex; align-items: center; vertical-align: middle; gap: 3px; height: 16px; max-width: 124px; margin-left: 6px; padding: 0 5px; border: 1px solid var(--xa-line-tip); border-radius: 4px; color: var(--xa-t4); font-size: 10px; line-height: 1; }
9041
+ .xa-queue-att > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
9042
+ .xa-queue-atts { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
9043
+ .xa-queue-att.xa-edit { height: 20px; max-width: 190px; margin-left: 0; padding: 0 3px 0 6px; }
9044
+ .xa-queue-att-x { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; margin-left: 2px; padding: 0; border: none; border-radius: 3px; background: transparent; color: var(--xa-t4); cursor: pointer; }
9045
+ .xa-queue-att-x:hover { background: var(--xa-wash-hover); color: var(--xa-red); }
9046
+
9047
+ .xa-queue-right { flex: none; position: relative; width: 52px; min-height: 20px; margin-top: 1px; }
9048
+ .xa-queue-tag { display: flex; justify-content: flex-end; align-items: center; height: 20px; padding-right: 4px; transition: opacity 0.2s, filter 0.2s; }
9049
+ .xa-queue-item:hover .xa-queue-tag, .xa-queue-item[data-editing='true'] .xa-queue-tag { opacity: 0; filter: blur(3px); }
9050
+ .xa-queue-next { padding: 0 6px; height: 17px; border-radius: 4px; background: var(--xa-t1); color: var(--xa-ground); font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; display: flex; align-items: center; }
9051
+ .xa-queue-n { color: var(--xa-t4); font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums; }
9052
+ .xa-queue-acts { position: absolute; top: -3px; right: -3px; display: flex; align-items: center; gap: 1px; pointer-events: none; }
9053
+ .xa-queue-item:hover .xa-queue-acts, .xa-queue-item[data-editing='true'] .xa-queue-acts { pointer-events: auto; }
9054
+ .xa-queue-b {
9055
+ width: 25px; height: 25px; border-radius: 6px; border: 0; background: none; color: var(--xa-t4);
9056
+ display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
9057
+ opacity: 0; transform: translateX(12px); filter: blur(4px);
9058
+ transition: opacity 0.24s var(--xa-ease), transform 0.3s var(--xa-ease), filter 0.24s, background 0.12s linear, color 0.12s linear;
9059
+ }
9060
+ .xa-queue-item:hover .xa-queue-b, .xa-queue-item[data-editing='true'] .xa-queue-b, .xa-queue-b:focus-visible { opacity: 1; transform: none; filter: blur(0); outline: none; }
9061
+ .xa-queue-item:hover .xa-queue-b:nth-child(2) { transition-delay: 50ms; }
9062
+ .xa-queue-b:hover, .xa-queue-b:focus-visible { background: var(--xa-wash-hover); color: var(--xa-t1); }
9063
+ .xa-queue-b:active { transform: scale(0.88); }
9064
+ .xa-queue-b.xa-del:hover { color: var(--xa-red); }
9065
+ .xa-queue-b.xa-save { color: var(--xa-t1); }
9066
+ .xa-queue[data-grace='true'] .xa-queue-b.xa-save { animation: xa-queue-breathe 1.1s ease-in-out infinite; }
9067
+
9068
+ @keyframes xa-queue-rise { from { transform: translateY(6px); opacity: 0; filter: blur(2px); } to { transform: none; opacity: 1; filter: blur(0); } }
9069
+ @keyframes xa-queue-breathe { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } }
9070
+ @media (prefers-reduced-motion: reduce) {
9071
+ .xa-queue, .xa-queue-item { animation: none; }
9072
+ .xa-queue-tag, .xa-queue-b { transition: opacity 0.12s linear !important; transform: none !important; filter: none !important; }
9073
+ }
9074
+ /* the list scrolls up and down only: a long word wraps instead of opening a sideways scrollbar */
9075
+ .xa-queue-list { overflow-x: hidden; }
9076
+ .xa-queue-item { min-width: 0; }
9077
+ .xa-queue-text, .xa-queue-edit { overflow-wrap: anywhere; }
9078
+ .xa-queue-item[data-lifted='true'] { transform-origin: center; }
9079
+ .xa-queue-acts { right: 0; }
9080
+
9081
+ /* =============================================================================
9082
+ One family with the composer's other cards — Tasks, Delegated, Running (transcript.css `.xa-tasks`):
9083
+ the same wash, hairline and 4px corners, the same 30px bar with a small uppercase label, the same
9084
+ sizes inside. Owner, 2026-10-16: the queue and the ask look like the rest of the app, not like a chat.
9085
+ ============================================================================= */
9086
+ .xa-queue { background: var(--xa-wash); border: 1px solid var(--xa-line-soft); border-radius: 4px; box-shadow: none; animation: none; }
9087
+ .xa-queue-bar { height: 30px; padding: 0 10px; gap: 8px; }
9088
+ .xa-queue-bar:hover { background: var(--xa-wash-hover); }
9089
+ .xa-queue-ico { display: none; }
9090
+ .xa-queue-title { font-size: 10px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--xa-label); }
9091
+ .xa-queue-vr { display: none; }
9092
+ .xa-queue-note { font-size: 11px; color: var(--xa-t3); }
9093
+ .xa-queue-count { font-size: 10px; color: var(--xa-t6); }
9094
+ .xa-queue-chev { color: var(--xa-t6); }
9095
+ .xa-queue-list { padding: 2px 6px 6px; border-top: 1px solid rgba(var(--xa-ink), 0.05); }
9096
+ .xa-queue-item { padding: 4px 4px 4px 4px; gap: 8px; border-radius: 3px; }
9097
+ .xa-queue-text, .xa-queue-edit { font-size: 12px; line-height: 18px; color: var(--xa-t2); }
9098
+ .xa-queue-mark { height: 18px; }
9099
+ .xa-queue-sq { margin-top: 6px; }
9100
+ .xa-queue-right { min-height: 18px; }
9101
+ .xa-queue-tag { height: 18px; }
9102
+ .xa-queue-next { height: 15px; padding: 0 5px; font-size: 8.5px; border-radius: 3px; }
9103
+ .xa-queue-n { font-size: 10px; color: var(--xa-t6); }
9104
+ .xa-queue-b { width: 22px; height: 22px; border-radius: 3px; }
9105
+ .xa-queue-acts { top: -2px; }
9106
+ /* editing a queued message: the same field as the reasoning one — no stroke, no ring, a slightly darker
9107
+ ground — and the words stay exactly where they were before the click */
9108
+ .xa-queue-edit, .xa-queue-edit:hover, .xa-queue-edit:focus, .xa-queue-edit:focus-visible {
9109
+ border: 0 !important; outline: none !important; box-shadow: none !important;
9110
+ }
9111
+ .xa-queue-edit { padding: 0 6px; margin: 0 -6px; width: calc(100% + 12px); border-radius: 3px; background: var(--xa-well); scrollbar-width: none; }
9112
+ .xa-queue-edit::-webkit-scrollbar { display: none; }
8660
9113
 
8661
9114
  *, ::before, ::after {
8662
9115
  --tw-border-spacing-x: 0;
@@ -9132,9 +9585,6 @@ img.xa-fav { padding: 1px; background: #fff; }
9132
9585
  margin-top: auto;
9133
9586
  margin-bottom: auto;
9134
9587
  }
9135
- .-mb-\[9px\] {
9136
- margin-bottom: -9px;
9137
- }
9138
9588
  .-ml-1 {
9139
9589
  margin-left: -0.25rem;
9140
9590
  }
@@ -9744,9 +10194,6 @@ img.xa-fav { padding: 1px; background: #fff; }
9744
10194
  .min-w-0 {
9745
10195
  min-width: 0px;
9746
10196
  }
9747
- .min-w-5 {
9748
- min-width: 1.25rem;
9749
- }
9750
10197
  .min-w-64 {
9751
10198
  min-width: 16rem;
9752
10199
  }
@@ -10014,6 +10461,9 @@ img.xa-fav { padding: 1px; background: #fff; }
10014
10461
  .select-none {
10015
10462
  user-select: none;
10016
10463
  }
10464
+ .select-all {
10465
+ user-select: all;
10466
+ }
10017
10467
  .resize-none {
10018
10468
  resize: none;
10019
10469
  }
@@ -10448,10 +10898,6 @@ img.xa-fav { padding: 1px; background: #fff; }
10448
10898
  border-top-left-radius: 0.5rem;
10449
10899
  border-top-right-radius: 0.5rem;
10450
10900
  }
10451
- .rounded-t-md {
10452
- border-top-left-radius: 0.375rem;
10453
- border-top-right-radius: 0.375rem;
10454
- }
10455
10901
  .rounded-t-none {
10456
10902
  border-top-left-radius: 0px;
10457
10903
  border-top-right-radius: 0px;
@@ -10496,9 +10942,6 @@ img.xa-fav { padding: 1px; background: #fff; }
10496
10942
  .border-b {
10497
10943
  border-bottom-width: 1px;
10498
10944
  }
10499
- .border-b-0 {
10500
- border-bottom-width: 0px;
10501
- }
10502
10945
  .border-l {
10503
10946
  border-left-width: 1px;
10504
10947
  }
@@ -14158,10 +14601,6 @@ body, #root, #app {
14158
14601
  outline-color: rgb(255 255 255 / 0.25);
14159
14602
  }
14160
14603
 
14161
- .focus-visible\:outline-white\/35:focus-visible {
14162
- outline-color: rgb(255 255 255 / 0.35);
14163
- }
14164
-
14165
14604
  .focus-visible\:outline-white\/40:focus-visible {
14166
14605
  outline-color: rgb(255 255 255 / 0.4);
14167
14606
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xenosystem/agent-interface-ui",
3
- "version": "0.1.108",
3
+ "version": "0.1.109",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -41,11 +41,11 @@
41
41
  "react-markdown": "^10.1.0",
42
42
  "remark-gfm": "^4.0.1",
43
43
  "zustand": "^5.0.2",
44
- "@xenosystem/agent-conversation": "0.1.108",
45
- "@xenosystem/agent-interface-client": "0.1.108",
46
- "@xenosystem/agent-interface-contract": "0.1.108",
47
- "@xenosystem/agent-interface-core": "0.1.108",
48
- "@xenosystem/agent-interface-hub-adapter": "0.1.108"
44
+ "@xenosystem/agent-conversation": "0.1.109",
45
+ "@xenosystem/agent-interface-core": "0.1.109",
46
+ "@xenosystem/agent-interface-client": "0.1.109",
47
+ "@xenosystem/agent-interface-contract": "0.1.109",
48
+ "@xenosystem/agent-interface-hub-adapter": "0.1.109"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "react": "^19.0.0",