@xingular/harness 1.3.1-unstable.1 → 1.3.1-unstable.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48,7 +48,14 @@ Screen: transcript above the composer, centred dialogs, full-screen resource bro
48
48
  shared tool alongside its read-only set and restores the normal set on success, failure or
49
49
  interruption. There is no terminal-only question alias (PROP-0040).
50
50
  - A plan request keeps `bash` in its active set; each call runs in the sandbox's read-only scope
51
- (PROP-0043). A user `!` command is refused while a plan request runs.
51
+ (PROP-0043). A user `!` command submitted during a plan request waits as a separate turn; it
52
+ cannot run inside the plan's read-only request.
53
+ - The terminal message-delivery contract is Enter to send or steer an active reply, and
54
+ Cmd/Ctrl/Alt+Enter to queue a follow-up. Pending steering, follow-up and deferred plan/Bash
55
+ inputs are projected above the working line from Pi's queues and the deferred barrier. Pi's
56
+ projection may briefly include an item already taken for delivery. A queued plan or Bash command
57
+ runs separately after the active reply, and later inputs cannot bypass it through Pi's native
58
+ queues. Modified shortcuts require terminal support.
52
59
  - Current standalone source defaults: `~/.xingular-harness/{data,state}`; `npm run dev` uses
53
60
  `~/.xingular-harness-dev/{data,state}`. The standalone development launch uses a file SecretStore
54
61
  under its resolved development state directory, even when its profile names a host backend; it
@@ -125,5 +125,6 @@ resolve relevant drift by updating the implementation and specification together
125
125
  | D-15 | Terminal sketch verification status — resolved 2026-10-24 by PROP-0028 | Pages 11 and 14 and `terminal-tui.md` said connected-sketch implementation verification was pending, while retained PTY evidence and PAR-014 recorded it as verified. Updated the docs to distinguish deterministic fixture verification from owner visual acceptance, every-emulator rendering and live-model sketch quality. |
126
126
  | D-16 | Terminal slash-command highlighting — resolved 2026-10-24 | `terminal-tui.md` specified accent coloring for recognized leading commands while typing, but the OpenTUI composer only styled attachment labels. User-message bubbles also lacked command-token styling. The renderer now uses the active command registry for both surfaces. |
127
127
  | D-17 | `PROP-0039`, `ADR-0036`, `INV-GATE-3/8` | Implementation is in progress in the 1.2.0 worktree: native writes revalidate canonical targets and atomically replace files under an OS write scope; default Bash fails closed on external hard-link aliases and runs in a sandbox that prevents new cross-boundary links; outside-scope Bash requires approval before one execution and command output never triggers approval or replay. The filesystem root is rejected as a workspace, and approval details expose the complete command. Launcher selection uses fixed system paths. Same-user peer processes remain outside this boundary. Focused macOS tests, full Harness CI, App compatibility checks, and PTY verification at 40x20, 80x24, and 100x30 pass. Linux sandbox integration remains unverified locally because this Darwin host has no `bwrap` and Colima is stopped; both CI workflows now install bubblewrap and `scripts/ci.sh` fails if it is absent, but an Ubuntu run is still required. No candidate, tag, or publication exists. |
128
+ | D-20 | Terminal pending queues, page 11 — resolved | The terminal now projects native and deferred pending messages above the working line. |
128
129
  | D-19 | Provider limits layout | Page 09 describes a centered Limits dialog; page 11 and `src/terminal/tui/pages/usagePage.ts` describe and implement a full-screen page. |
129
130
  | D-18 | `core/index.ts` migration 5 | The `run_stats` table has no writer in the Harness. PROP-0042's `usage_requests` ledger is the analytics source; whether to drop the older table is open. |
@@ -0,0 +1,11 @@
1
+ # Xingular Harness 1.3.1-unstable.2
2
+
3
+ Unstable preview of the current Harness work. Install with `npm install @xingular/harness@unstable`.
4
+
5
+ - Swap the OpenTUI send keys back. `Return` sends, or steers a running reply, and `Cmd+Return`,
6
+ `Ctrl+Return` or `Alt+Return` queues a follow-up. The `app.message.followUp` action replaces
7
+ `app.message.steer`, so a `keybindings.json` entry under that name needs renaming.
8
+ - Show pending steering, follow-up and deferred plan/Bash inputs above the working line, each with
9
+ its delivery type. A queued plan or `!` command is a barrier: it runs as a standalone turn and
10
+ later inputs wait behind it instead of entering Pi's native queues.
11
+ - Restore queued text to the draft with `Alt+Up`. Queued images are dropped; deferred images warn.
@@ -1,6 +1,7 @@
1
1
  # Harness terminal frontend
2
2
 
3
- Status: current terminal behavior, checked against `@xingular/harness` 1.3.0. Last updated: 2026-11-19.
3
+ Status: terminal behavior and message-delivery contract
4
+ ([known drift D-20](architecture/README.md#known-drift)).
4
5
  Decision: [ADR-0001](decisions/ADR-0001-owned-terminal.md),
5
6
  [ADR-0006](decisions/ADR-0006-opentui-only-terminal.md),
6
7
  [ADR-0009](decisions/ADR-0009-xharness-command.md),
@@ -28,8 +29,9 @@ overrides the Bun executable.
28
29
  [`app.ts`](../src/terminal/opentui/app.ts) owns the terminal lifecycle and reuses the shared
29
30
  `TerminalRuntime`, session replacement, commands, decisions, account pinning and run records. It
30
31
  projects the runtime's snapshot and transcript into an OpenCode-inspired view, with a native
31
- OpenTUI textarea for the prompt, `Ctrl+K` for the command palette, `Return` to send (or to queue behind a running reply),
32
- `Cmd+Return` (or `Alt+Return`) to steer a running reply, and `Shift+Return` for a newline. Typing `/` or `$` filters
32
+ OpenTUI textarea for the prompt and `Ctrl+K` for the command palette. `Return` sends or steers a
33
+ running reply; `Cmd+Return`, `Ctrl+Return` or `Alt+Return` queues a follow-up, and `Shift+Return`
34
+ inserts a newline. Typing `/` or `$` filters
33
35
  matching commands or skills; `Tab` inserts the selected entry and leaves the cursor at the end of the inserted text.
34
36
  With an empty composer, unmodified Up recalls the latest non-empty user message from the active session.
35
37
  With a draft, unmodified Up browses older history and Down browses newer history when the caret is at
@@ -41,8 +43,8 @@ history shortcuts from anywhere. History includes
41
43
  user messages and Bash commands from the active Pi session; recalled Bash commands return to `!`
42
44
  mode. Executed slash commands from this terminal instance are included too, across session switches.
43
45
  `/new` and `/session` (also `/resume`) switch the saved-message and Bash history to that session.
44
- Steering needs a terminal that reports Cmd with the
45
- kitty keyboard protocol; elsewhere `Alt+Return` steers. In the composer, `Tab` opens up to eight matching filesystem entries for the path token at the cursor, or current-folder entries when the token is empty. The list has no heading or hint row. Up/Down select; Enter or Tab inserts the selection; Escape closes the list. Directories end in `/`, and Bash mode escapes shell-special characters. Use `/effort` or Shift+Up/Down to change effort. The command palette opens above the composer under a muted (`dim`) top rule, and has no other border. Its rows align slash commands and descriptions in two columns: the command column sizes to the widest visible name, bounded to preserve description space, and both columns wrap instead of truncating. The plan-choice rule, question block's top-only divider, and `/btw` block's top rule use the same muted color as the normal composer divider. The console has no background of its own: the renderer, root surface
46
+ Modified Enter shortcuts depend on the terminal reporting the modifier distinctly; Cmd may require
47
+ the kitty keyboard protocol. In the composer, `Tab` opens up to eight matching filesystem entries for the path token at the cursor, or current-folder entries when the token is empty. The list has no heading or hint row. Up/Down select; Enter or Tab inserts the selection; Escape closes the list. Directories end in `/`, and Bash mode escapes shell-special characters. Use `/effort` or Shift+Up/Down to change effort. The command palette opens above the composer under a muted (`dim`) top rule, and has no other border. Its rows align slash commands and descriptions in two columns: the command column sizes to the widest visible name, bounded to preserve description space, and both columns wrap instead of truncating. The plan-choice rule, question block's top-only divider, and `/btw` block's top rule use the same muted color as the normal composer divider. The console has no background of its own: the renderer, root surface
46
48
  and transcript are transparent, so the terminal's own background shows through, while panels,
47
49
  dialogs and the scrim stay opaque. The composer has no panel background: it is bounded by a top and
48
50
  a bottom rule, with the working status and spinner above it and a wrapping status bar below it. Its
@@ -425,6 +427,20 @@ The Annotate tab has no search row, so these letters are free for actions. `/ann
425
427
  sends the unsent annotations with your request after them; `/annotate:clear` resolves the unsent ones
426
428
  and stops sharing them.
427
429
 
430
+ ## Pending messages and barriers
431
+
432
+ The terminal shows pending steering, follow-up and deferred plan/Bash inputs above the working
433
+ line, distinguishing their delivery type. A steering message is
434
+ intended for the active reply; a follow-up waits until it finishes. With no active reply, a normal
435
+ message starts a turn. Pi's steering and follow-up settings determine delivery within those queues.
436
+
437
+ A queued plan or `!` Bash command is a barrier: it runs as a standalone turn after the current
438
+ response, and subsequent inputs wait behind it rather than entering Pi's native queues and
439
+ crossing the barrier. `Alt+Up` restores queued text to the draft; queued images are dropped, with
440
+ a warning for deferred images. Pi's queue projection can briefly include an item already taken
441
+ for delivery; identical queued text can also make its displayed removal ambiguous. Interrupting a
442
+ reply does not automatically clear native queues, and deferred work may run after it settles.
443
+
428
444
  ## Plan mode and thinking keys
429
445
 
430
446
  Use `/plan <brief>` for one read-only planning request. A plan waits outside Pi's native follow-up
@@ -594,7 +610,7 @@ cursor, Backspace and Delete treat it as one unit.
594
610
  - **Refusals.** A model whose `input` lacks `image` refuses the attach with a notice naming the
595
611
  model. Bash mode and plugin editors take no images. A slash command or Bash command sent with
596
612
  images runs without them, with a warning. Alt+Up (dequeue) restores queued text and drops
597
- queued images with a warning.
613
+ queued images; deferred images produce a warning.
598
614
 
599
615
  Finder-copied file paths are read before clipboard image pixels. On macOS, `.heic` and `.heif`
600
616
  files are converted with `/usr/bin/sips` to private temporary PNGs, preserving the copied path
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xingular/harness",
3
- "version": "1.3.1-unstable.1",
3
+ "version": "1.3.1-unstable.2",
4
4
  "type": "module",
5
5
  "description": "Xingular Harness — a Pi agent harness built on recursive harnessing (Harness²): versioned eight-component variants, refinement from evidence, multi-account sessions, a compiled prompt, project notes, tools, and MCP",
6
6
  "repository": {