@xingular/harness 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -5
- package/README.md +70 -19
- package/dist/cli.js +10321 -5785
- package/dist/sdk/agents/builtin.d.ts +2 -0
- package/dist/sdk/agents/builtin.js +34 -0
- package/dist/sdk/agents/narrow.d.ts +13 -0
- package/dist/sdk/agents/narrow.js +29 -0
- package/dist/sdk/agents/profiles.d.ts +80 -0
- package/dist/sdk/agents/profiles.js +221 -0
- package/dist/sdk/annotations/bridge.d.ts +42 -0
- package/dist/sdk/annotations/bridge.js +264 -0
- package/dist/sdk/annotations/capture.d.ts +116 -0
- package/dist/sdk/annotations/capture.js +308 -0
- package/dist/sdk/annotations/delivery.d.ts +72 -0
- package/dist/sdk/annotations/delivery.js +130 -0
- package/dist/sdk/annotations/inspect.d.ts +10 -0
- package/dist/sdk/annotations/inspect.js +33 -0
- package/dist/sdk/annotations/isolated.d.ts +6 -0
- package/dist/sdk/annotations/isolated.js +51 -0
- package/dist/sdk/annotations/pageScript.d.ts +28 -0
- package/dist/sdk/annotations/pageScript.js +570 -0
- package/dist/sdk/annotations/part.d.ts +10 -0
- package/dist/sdk/annotations/part.js +144 -0
- package/dist/sdk/annotations/queue.d.ts +4 -0
- package/dist/sdk/annotations/queue.js +40 -0
- package/dist/sdk/annotations/serverMethods.d.ts +3 -0
- package/dist/sdk/annotations/serverMethods.js +62 -0
- package/dist/sdk/annotations/store.d.ts +160 -0
- package/dist/sdk/annotations/store.js +386 -0
- package/dist/sdk/browser/index.d.ts +14 -3
- package/dist/sdk/browser/index.js +11 -4
- package/dist/sdk/browser/serverMethods.d.ts +3 -0
- package/dist/sdk/browser/serverMethods.js +7 -0
- package/dist/sdk/browser/session.d.ts +1 -0
- package/dist/sdk/browser/session.js +45 -9
- package/dist/sdk/cli.js +19 -11
- package/dist/sdk/core/bus.js +1 -1
- package/dist/sdk/core/env.d.ts +1 -1
- package/dist/sdk/core/env.js +1 -1
- package/dist/sdk/doctor/serverMethods.d.ts +3 -0
- package/dist/sdk/doctor/serverMethods.js +8 -0
- package/dist/sdk/harness.d.ts +15 -0
- package/dist/sdk/harness.js +44 -5
- package/dist/sdk/history/recall.js +8 -8
- package/dist/sdk/history/serverMethods.d.ts +3 -0
- package/dist/sdk/history/serverMethods.js +8 -0
- package/dist/sdk/hub/cli.d.ts +1 -1
- package/dist/sdk/hub/cli.js +1 -1
- package/dist/sdk/hub/schema.d.ts +1 -1
- package/dist/sdk/hub/serverMethods.d.ts +3 -0
- package/dist/sdk/hub/serverMethods.js +11 -0
- package/dist/sdk/index.d.ts +10 -0
- package/dist/sdk/index.js +7 -0
- package/dist/sdk/mcp/connections.js +14 -7
- package/dist/sdk/mcp/serverMethods.d.ts +3 -0
- package/dist/sdk/mcp/serverMethods.js +22 -0
- package/dist/sdk/plugins/builtin.d.ts +1 -0
- package/dist/sdk/plugins/builtin.js +128 -33
- package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
- package/dist/sdk/plugins/builtinRegistry.js +49 -0
- package/dist/sdk/plugins/cli.d.ts +1 -1
- package/dist/sdk/plugins/cli.js +4 -3
- package/dist/sdk/prompt/compile.d.ts +5 -2
- package/dist/sdk/prompt/compile.js +25 -8
- package/dist/sdk/refine/cli.d.ts +1 -1
- package/dist/sdk/refine/cli.js +2 -2
- package/dist/sdk/refine/serverMethods.d.ts +3 -0
- package/dist/sdk/refine/serverMethods.js +20 -0
- package/dist/sdk/server/methods.js +9 -86
- package/dist/sdk/server/params.d.ts +4 -0
- package/dist/sdk/server/params.js +11 -0
- package/dist/sdk/sessions/contracts.d.ts +17 -0
- package/dist/sdk/sessions/contracts.js +42 -3
- package/dist/sdk/sessions/planMode.d.ts +5 -2
- package/dist/sdk/sessions/planMode.js +12 -3
- package/dist/sdk/sessions/reasoningSummaries.d.ts +2 -2
- package/dist/sdk/sessions/reasoningSummaries.js +3 -3
- package/dist/sdk/sessions/registry.d.ts +1 -0
- package/dist/sdk/sessions/registry.js +4 -1
- package/dist/sdk/sessions/runIndex.js +7 -7
- package/dist/sdk/sessions/runStore.js +3 -1
- package/dist/sdk/sessions/runner.js +2 -2
- package/dist/sdk/sessions/sessions.d.ts +17 -5
- package/dist/sdk/sessions/sessions.js +79 -12
- package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
- package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
- package/dist/sdk/sessions/sideQuestions.js +290 -0
- package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/subagentServerMethods.js +41 -0
- package/dist/sdk/sessions/subagentService.d.ts +13 -2
- package/dist/sdk/sessions/subagentService.js +34 -16
- package/dist/sdk/sessions/subagents.d.ts +9 -1
- package/dist/sdk/sessions/subagents.js +19 -0
- package/dist/sdk/terminal/browser.d.ts +62 -0
- package/dist/sdk/terminal/browser.js +41 -0
- package/dist/sdk/terminal/browserControl.d.ts +29 -0
- package/dist/sdk/terminal/browserControl.js +186 -0
- package/dist/sdk/terminal/commandHelp.d.ts +17 -0
- package/dist/sdk/terminal/commandHelp.js +20 -0
- package/dist/sdk/terminal/controller.d.ts +7 -1
- package/dist/sdk/terminal/controller.js +34 -2
- package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
- package/dist/sdk/terminal/piExtension.js +33 -48
- package/dist/sdk/terminal/socket.d.ts +6 -3
- package/dist/sdk/terminal/socket.js +40 -9
- package/dist/sdk/terminal/standalone.d.ts +2 -0
- package/dist/sdk/terminal/standalone.js +50 -10
- package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
- package/dist/sdk/terminal/subagentMonitor.js +121 -0
- package/dist/sdk/terminal/terminals.d.ts +42 -6
- package/dist/sdk/terminal/terminals.js +359 -18
- package/dist/sdk/terminal/trajectory.js +2 -2
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
- package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +5 -1
- package/dist/sdk/terminal/tui/commandPages.js +54 -6
- package/dist/sdk/terminal/tui/commands.d.ts +8 -4
- package/dist/sdk/terminal/tui/commands.js +181 -58
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +2 -2
- package/dist/sdk/terminal/tui/dialogGeometry.js +4 -2
- package/dist/sdk/terminal/tui/dialogs.d.ts +6 -1
- package/dist/sdk/terminal/tui/dialogs.js +9 -2
- package/dist/sdk/terminal/tui/modelPicker.js +1 -6
- package/dist/sdk/terminal/tui/page.d.ts +3 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +17 -6
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +26 -4
- package/dist/sdk/terminal/tui/pages/accountsPage.js +264 -36
- package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
- package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
- package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +2 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +103 -15
- package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
- package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +8 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +16 -1
- package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +23 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +12 -5
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +156 -83
- package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
- package/dist/sdk/terminal/tui/planMode.d.ts +1 -1
- package/dist/sdk/terminal/tui/planMode.js +1 -1
- package/dist/sdk/terminal/tui/pluginCommands.d.ts +14 -0
- package/dist/sdk/terminal/tui/pluginCommands.js +27 -0
- package/dist/sdk/terminal/tui/questions.d.ts +2 -0
- package/dist/sdk/terminal/tui/runtime.js +4 -2
- package/dist/sdk/terminal/tui/settingsModel.d.ts +2 -0
- package/dist/sdk/terminal/tui/settingsModel.js +32 -2
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +26 -26
- package/dist/sdk/terminal/tui/sideQuestion.js +131 -98
- package/dist/sdk/terminal/tui/ui.d.ts +2 -0
- package/dist/sdk/terminal/tui/ui.js +1 -0
- package/dist/sdk/tools/askUser.js +26 -8
- package/dist/sdk/tools/checklist.js +2 -2
- package/dist/sdk/tools/harnessTools.d.ts +2 -0
- package/dist/sdk/tools/harnessTools.js +1 -1
- package/dist/sdk/tools/spawnSubagent.js +13 -4
- package/dist/sdk/web/part.d.ts +10 -0
- package/dist/sdk/web/part.js +6 -0
- package/dist/sdk/web/serverMethods.d.ts +3 -0
- package/dist/sdk/web/serverMethods.js +7 -0
- package/dist/sdk/wiki/serverMethods.d.ts +3 -0
- package/dist/sdk/wiki/serverMethods.js +26 -0
- package/dist/sdk/worktrees/cli.d.ts +11 -0
- package/dist/sdk/worktrees/cli.js +146 -0
- package/dist/sdk/worktrees/copy.d.ts +9 -0
- package/dist/sdk/worktrees/copy.js +111 -0
- package/dist/sdk/worktrees/git.d.ts +16 -0
- package/dist/sdk/worktrees/git.js +81 -0
- package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
- package/dist/sdk/worktrees/serverMethods.js +30 -0
- package/dist/sdk/worktrees/service.d.ts +73 -0
- package/dist/sdk/worktrees/service.js +483 -0
- package/dist/sdk/worktrees/setup.d.ts +23 -0
- package/dist/sdk/worktrees/setup.js +65 -0
- package/dist/sdk/worktrees/types.d.ts +91 -0
- package/dist/sdk/worktrees/types.js +1 -0
- package/dist/sdk/world/cli.d.ts +2 -2
- package/dist/sdk/world/cli.js +6 -6
- package/dist/sdk/world/world.d.ts +3 -1
- package/dist/sdk/world/world.js +8 -9
- package/dist/terminal-opentui.js +14540 -7374
- package/dist/terminal-pi.js +285 -666
- package/docs/README.md +22 -2
- package/docs/architecture/00-overview.md +28 -16
- package/docs/architecture/02-sessions-and-runs.md +72 -15
- package/docs/architecture/03-variants.md +10 -2
- package/docs/architecture/04-prompt.md +26 -6
- package/docs/architecture/06-plugins-and-capabilities.md +39 -3
- package/docs/architecture/07-tools-and-gate.md +21 -6
- package/docs/architecture/09-accounts-and-connectors.md +8 -0
- package/docs/architecture/10-server-protocol.md +111 -2
- package/docs/architecture/11-terminal.md +185 -5
- package/docs/architecture/12-storage.md +15 -1
- package/docs/architecture/13-world-tools.md +28 -6
- package/docs/architecture/14-surfaces-and-parity.md +89 -0
- package/docs/architecture/README.md +15 -4
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +4 -2
- package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
- package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
- package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
- package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
- package/docs/architecture/proposals/PROP-0017-page-annotations.md +127 -0
- package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
- package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
- package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
- package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
- package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
- package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
- package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
- package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
- package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
- package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
- package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
- package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
- package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
- package/docs/architecture/proposals/README.md +25 -0
- package/docs/decisions/ADR-0009-xharness-command.md +6 -5
- package/docs/decisions/ADR-0014-public-release-baseline.md +3 -2
- package/docs/decisions/ADR-0015-resource-browser.md +28 -0
- package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
- package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
- package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
- package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
- package/docs/decisions/ADR-0020-page-annotations.md +37 -0
- package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
- package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
- package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
- package/docs/decisions/ADR-0024-xagent-command.md +40 -0
- package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
- package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
- package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
- package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
- package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
- package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
- package/docs/doctor.md +10 -4
- package/docs/features/README.md +26 -0
- package/docs/features/interfaces/README.md +1 -1
- package/docs/future-work.md +48 -0
- package/docs/parity.md +78 -0
- package/docs/releases/1.0.0.md +2 -2
- package/docs/releases/4.0.0.md +46 -0
- package/docs/releases/README.md +20 -15
- package/docs/study/00-index.md +5 -0
- package/docs/study/autonomous-engineering-sources.md +277 -0
- package/docs/study/autonomy-sources.md +147 -0
- package/docs/study/proactive-autonomy.md +408 -0
- package/docs/study/tui-resource-browser.md +78 -0
- package/docs/terminal-tui.md +325 -93
- package/package.json +3 -3
package/docs/terminal-tui.md
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
# Harness terminal frontend
|
|
2
2
|
|
|
3
|
-
Status: release candidate `@xingular/harness` 4.0.0; npm publication blocked by registry authorization. Last updated: 2026-10-
|
|
3
|
+
Status: release candidate `@xingular/harness` 4.0.0; npm publication blocked by registry authorization. Last updated: 2026-10-24.
|
|
4
4
|
Decision: [ADR-0001](decisions/ADR-0001-owned-terminal.md),
|
|
5
5
|
[ADR-0006](decisions/ADR-0006-opentui-only-terminal.md),
|
|
6
|
-
[ADR-0009](decisions/ADR-0009-xharness-command.md)
|
|
6
|
+
[ADR-0009](decisions/ADR-0009-xharness-command.md),
|
|
7
|
+
[ADR-0021](decisions/ADR-0021-required-command-namespaces.md),
|
|
8
|
+
[ADR-0024](decisions/ADR-0024-xagent-command.md),
|
|
9
|
+
[ADR-0026](decisions/ADR-0026-contextual-question-wireframes.md),
|
|
10
|
+
[ADR-0027](decisions/ADR-0027-connected-sketch-display.md),
|
|
11
|
+
[ADR-0028](decisions/ADR-0028-xingular-agent-product-identity.md).
|
|
7
12
|
|
|
8
13
|
## OpenTUI terminal
|
|
9
14
|
|
|
@@ -29,14 +34,14 @@ empty composer, unmodified Up recalls the latest non-empty user message from the
|
|
|
29
34
|
After recall, unmodified Up/Down are available for normal editor movement and do not browse history
|
|
30
35
|
while the draft is non-empty. Ctrl+Up/Down remain explicit history shortcuts; Down past the newest
|
|
31
36
|
entry restores a blank draft. History comes from the active Pi session's saved messages, so `/new`
|
|
32
|
-
and `/resume` switch to that session's history. Steering needs a terminal that reports Cmd with the
|
|
37
|
+
and `/session` (also `/resume`) switch to that session's history. Steering needs a terminal that reports Cmd with the
|
|
33
38
|
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
|
|
34
39
|
and transcript are transparent, so the terminal's own background shows through, while panels,
|
|
35
40
|
dialogs and the scrim stay opaque. The composer has no panel background: it is bounded by a top and
|
|
36
41
|
a bottom rule, with the working status and spinner above it and a wrapping status bar below it. Its
|
|
37
42
|
fixed-width left gutter shows `❯` on the first input row and leaves continuation rows blank, including
|
|
38
43
|
explicit newlines and soft wraps; Bash mode shows `!` on the first row instead. In plan mode,
|
|
39
|
-
`plan mode` is right-aligned within the top rule, followed by exactly one divider character. The status bar shows the working folder's name
|
|
44
|
+
`plan mode` is right-aligned within the top rule, followed by exactly one divider character. The status bar shows the working folder's name and Git branch together as `<repo>:<branch>`, followed by the account, model and effort separated by spaces, and input (`↑`) and output (`↓`) token counts with each glyph adjacent to its count; `|` separates the groups. Token counts
|
|
40
45
|
below 1,000 show as whole numbers and larger counts use K/M/B suffixes. A leading `!`
|
|
41
46
|
enters Bash mode: the chevron becomes `!`, and the marker and both rules use the `bashMode` colour.
|
|
42
47
|
In plan mode, the marker and rules use the plan blue and `plan mode` is right-aligned within the
|
|
@@ -50,8 +55,8 @@ never receive an OpenTUI renderable or a second account. A theme an extension se
|
|
|
50
55
|
its own components, while the OpenTUI chrome keeps the fixed OpenCode-inspired palette. Component
|
|
51
56
|
UI is supported; an extension that draws only by writing raw ANSI through the TUI terminal is not.
|
|
52
57
|
|
|
53
|
-
|
|
54
|
-
`/
|
|
58
|
+
Most pages become centered dialogs. The page commands `/permissions`, `/log`, the `/model` and
|
|
59
|
+
`/history` pickers, and
|
|
55
60
|
the `select`, `confirm`, `input` and `editor` dialogs (such as `/effort` and the Thinking setting),
|
|
56
61
|
take 80% of the terminal, capped at 100 columns by 30 rows, on a flat panel in the console's panel
|
|
57
62
|
colour. A full-screen scrim dims the console behind the panel so the transcript stays faintly
|
|
@@ -62,17 +67,36 @@ omit divider rules and footer hints. Shortcut behavior remains available. Search
|
|
|
62
67
|
the same glyph, placeholder, spacing, and muted result note, with search context included on that
|
|
63
68
|
row. A terminal too small for a 30-column by
|
|
64
69
|
12-row dialog falls back to the full-screen page chrome. A plugin's full-screen surface stays full
|
|
65
|
-
screen.
|
|
70
|
+
screen. `/settings` fills the terminal with its category tabs, search, settings list and full-screen
|
|
71
|
+
page chrome. `/accounts` also fills the terminal with Accounts/Pools tabs and search. Wide terminals
|
|
72
|
+
show selected-account details beside the list; opening an account reveals grouped actions in that
|
|
73
|
+
inspector. On compact terminals, opening an account replaces the list with a full-page detail view
|
|
74
|
+
and its grouped actions. `Enter` opens the selected account; `Esc` returns to the list. Tab and
|
|
75
|
+
Shift+Tab move focus between tabs, the list and (when open) actions; Left/Right changes a focused
|
|
76
|
+
tab and Up/Down moves the focused list or action list. Search, section and account selection survive
|
|
77
|
+
returning and resizing.
|
|
78
|
+
Account actions are grouped by Session, Account, Sign-in and Remove; pool
|
|
79
|
+
actions are grouped by Manage and Remove. Existing confirmations and account-service calls remain
|
|
80
|
+
unchanged. The Harness resource browser and all its shortcuts use a full-screen page with persistent
|
|
81
|
+
resource-section tabs.
|
|
66
82
|
|
|
67
83
|
The frontend is verified with a real isolated PTY and a loopback provider. Run
|
|
68
|
-
`python3 scripts/verify-terminal.py --
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
84
|
+
`python3 scripts/verify-terminal.py --welcome-only --sizes 40x20,80x24,120x40` to check the empty
|
|
85
|
+
welcome, product label, accent colors and `/help` transition. Run
|
|
86
|
+
`python3 scripts/verify-terminal.py --composer-only` for recognized slash-command colors in the composer
|
|
87
|
+
and a user bubble, unknown-command and argument colors, explicit-newline and soft-wrap checks of both
|
|
88
|
+
prompt gutters, and normal/plan/Bash mode exclusivity. Run it with `--sizes 40x20,80x24,120x40` for
|
|
89
|
+
compact through wide layouts. Use `--file-completion-only` for filesystem completion and insertion,
|
|
90
|
+
`--history-only` for active-session history across `/new` and `/session`, `--help-only` for `/help` replacing the welcome screen with grouped two-column output that wraps without per-command gaps, `--questions-only` for recommended choices,
|
|
72
91
|
selected-row and Continue/Submit colors, `--jump-latest-only` for scroll-away badge visibility and click-to-latest (screen-level click assertions use optional `pyte`), and choice-backed “Something else” answers, or `--thinking-only` for `/thinking` visibility toggles. The full suite covers a complete turn, `read`, `bash` approval, `ask_user_question` approval and picker, plugin overlay/widget/status
|
|
73
92
|
disposal, a completed run record with usage and decision events, `/help`, `/permissions`,
|
|
74
|
-
`/settings`, `/model`, palette selection, confirm cancel, and Ctrl+D exit.
|
|
75
|
-
|
|
93
|
+
`/settings`, `/model`, palette selection, confirm cancel, and Ctrl+D exit. `--questions-only` checks
|
|
94
|
+
recommended choices, bounded literal ASCII sketch previews, focus-driven preview changes and answer
|
|
95
|
+
colors; run it with `--sizes 40x20,80x24,120x40` for compact through wide layouts. At 80 columns and
|
|
96
|
+
above it also checks wrapped notes and free-text; the narrowest run keeps the sketch and answer
|
|
97
|
+
interaction compact. The normal turn omits question tools; plan-mode flows exercise `ask_user` batches
|
|
98
|
+
and `ask_user_question` cancellation. Live-provider behavior, exact OpenCode parity and concurrent
|
|
99
|
+
session tabs are not established.
|
|
76
100
|
|
|
77
101
|
## Native subagents (2026-10-18)
|
|
78
102
|
|
|
@@ -85,8 +109,25 @@ The terminal joins outstanding children before its final reply, projects child a
|
|
|
85
109
|
with their original run IDs, and stops descendants when interrupted or disposed. Connected apps
|
|
86
110
|
need not be enabled. `TerminalPrepareInput.subagents: null` disables the capability.
|
|
87
111
|
|
|
88
|
-
|
|
89
|
-
|
|
112
|
+
The terminal also projects the active parent's subagent descendants into live rows under the
|
|
113
|
+
status line and a searchable `/subagents` page. The rows poll a private monitor route once per
|
|
114
|
+
second during a turn. They sit one blank row below the status line, with no heading, and each
|
|
115
|
+
reads: the status mark, the agent profile name in its colour (`subagent` for a copy of the
|
|
116
|
+
parent), the title the parent gave the child (PROP-0030), and `n of m tasks` from the child's own
|
|
117
|
+
checklist. At most three show, active first, then `+N more · /subagents`. The `/subagents` page
|
|
118
|
+
adds status, elapsed time and the latest tool name. The projection is read-only, flat across nested
|
|
119
|
+
descendants, and scoped to the current parent run; it keeps finished child rows until that parent
|
|
120
|
+
settles. It never includes tool arguments (beyond the title), output or
|
|
121
|
+
checklist item text.
|
|
122
|
+
|
|
123
|
+
`/agents` opens the Agents page (PROP-0029): built-in, global, project and variant profiles with
|
|
124
|
+
their tools, plugins, variant, model and instructions. Enter on a row edits a person's own profile
|
|
125
|
+
in `$VISUAL`/`$EDITOR`, copies one, or deletes one after confirmation; New profile writes a template
|
|
126
|
+
in the project or global folder and opens it.
|
|
127
|
+
|
|
128
|
+
Real scripted Pi execution over the actual terminal socket verifies result delivery, decision
|
|
129
|
+
routing, and the monitor's parent scoping and summary redaction. It does not establish live-provider
|
|
130
|
+
behavior. See
|
|
90
131
|
[ADR-0003](decisions/ADR-0003-shared-asynchronous-subagents.md) for recovery and lifecycle details.
|
|
91
132
|
|
|
92
133
|
## Ownership and process boundary
|
|
@@ -132,24 +173,40 @@ unattended execution path.
|
|
|
132
173
|
## Screen layout
|
|
133
174
|
|
|
134
175
|
[`root.tsx`](../src/terminal/opentui/root.tsx) draws the terminal on OpenTUI's alternate screen.
|
|
135
|
-
An empty conversation shows
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
176
|
+
An empty conversation shows a centered welcome. The default `Xingular Agent` identity appears as
|
|
177
|
+
an orange block `X` and blue letter-spaced `A G E N T`, followed by `Welcome.`, the tagline
|
|
178
|
+
`One run, done well.`, and a blue `/help` hint. Explicit host product names use the same generic mark and
|
|
179
|
+
subline formatting. The current model and thinking level remain available in dim text. Once a message
|
|
180
|
+
exists, a scrollable transcript fills the space above the composer. Single-line notices can appear
|
|
181
|
+
with the welcome, while multiline notices such as `/help` switch to the transcript layout so their
|
|
182
|
+
output cannot overlap it. The composer is a single top and bottom rule, with the right-aligned `plan mode` label followed by one divider character in the top rule,
|
|
139
183
|
and the textarea in the middle.
|
|
140
184
|
The working status row shows the active verb with a soft, warm glint that feathers across it and
|
|
141
185
|
fades past its edges, followed by run duration and the latest completed assistant response's output
|
|
142
186
|
rate, formatted as `(time, tok/s)`; the spinner and metrics stay steady, and duration updates during a run.
|
|
143
187
|
Until response usage is available, the rate shows `— tok/s`. On settlement, the completion verb and
|
|
144
188
|
final run statistics stay in that row until the next run replaces them; they do not become a transcript
|
|
145
|
-
entry. Notifications, queue announcements
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
189
|
+
entry. Notifications, queue announcements and retry updates—including retries while summarizing
|
|
190
|
+
context or branches—are one-line transcript entries at the point they occur, so subsequent chat
|
|
191
|
+
moves them up rather than keeping them pinned at the bottom.
|
|
192
|
+
|
|
193
|
+
While context compaction runs, the working line shows `Compacting context` (or `Retrying
|
|
194
|
+
compaction`) with the same spinner, in place of the working verb. During a run it keeps the run's
|
|
195
|
+
clock; a `/compact` while idle shows the spinner with its own clock. Compaction does not start a new
|
|
196
|
+
session or hide earlier chat. After it, the transcript shows, in order: the whole conversation from
|
|
197
|
+
before the compaction (rebuilt from Pi's session history, kept messages included); a rule labelled
|
|
198
|
+
`Context compacted · <tokens> tokens`; the summary printed as a normal reply; an `End of summary`
|
|
199
|
+
rule; then the work that followed. The summary is shown by default. Clicking either rule hides or
|
|
200
|
+
shows it, and Ctrl+O shows every summary again. On a narrow screen the rule drops the click hint, then
|
|
201
|
+
the token count. Earlier compactions in the same session keep their own rules and summary in place.
|
|
202
|
+
Notices stay after the message they followed. The model still sees only the summary and the recent
|
|
203
|
+
messages; this is presentation only.
|
|
204
|
+
Transcript entry ids follow positions in the displayed message list, so when a rebuilt list moves a
|
|
205
|
+
different kind of entry onto an id, the renderer builds a new component for it instead of reusing the
|
|
206
|
+
old layout, and each entry draws inside its own error boundary. A run therefore keeps updating live
|
|
207
|
+
through a compaction; it does not need `/resume` to show its later output.
|
|
208
|
+
A successful copy shows a temporary, opaque toast anchored at the terminal's top-right. Interactive blocks and widgets remain docked above the composer. A wrapping status bar
|
|
209
|
+
below the composer shows `<repo>:<branch>`, account, model, effort and token totals, with `|` between groups. After
|
|
153
210
|
the input token count it shows cache hit rate as `R<percentage>%`, calculated from cache reads divided
|
|
154
211
|
by total input tokens. The footer shows status messages without a shortcut-hint row. Press `?` with an empty
|
|
155
212
|
composer to open the shortcut reference. Transcript entries include
|
|
@@ -165,15 +222,17 @@ their content; other entries have no internal vertical padding. Bubble padding i
|
|
|
165
222
|
inter-entry gap. Internal lines within an entry stay together. The transcript stays pinned to the
|
|
166
223
|
latest message until you scroll away. While scrolled away, a `↓ Jump to latest` badge overlays the
|
|
167
224
|
transcript's lower-right corner; clicking it returns to the newest message and hides the badge.
|
|
168
|
-
`Ctrl+End` remains an alternate way to jump to the end. A primary click in the transcript or empty
|
|
169
|
-
|
|
170
|
-
|
|
225
|
+
`Ctrl+End` remains an alternate way to jump to the end. A primary click in the transcript or empty
|
|
226
|
+
welcome area focuses the composer. Dragging to select text anywhere in the TUI—including the
|
|
227
|
+
composer, transcript, widgets, dialogs and pages—copies the selected plain text when selection ends;
|
|
228
|
+
a simple click does not copy. `/copy` and `Ctrl+X` continue to copy the latest assistant reply.
|
|
171
229
|
|
|
172
230
|
Mouse movement highlights the row under the pointer in the command palette, plan choices, question
|
|
173
231
|
dock, searchable dialogs and Harness page lists; the highlight uses the same selection style as
|
|
174
232
|
keyboard navigation. A primary click activates the row, and clicks on page tabs switch that page's
|
|
175
|
-
section.
|
|
176
|
-
|
|
233
|
+
section. In `/accounts`, clicking an account opens its inspector or compact detail view, and clicking
|
|
234
|
+
an action runs the existing account flow. Question choices still stage their answer until the
|
|
235
|
+
question's action is clicked. Dialogs preserve their existing confirmation safeguards. OpenTUI enables terminal mouse-motion reporting for
|
|
177
236
|
hover; terminals or multiplexers that do not report motion retain keyboard navigation. ANSI-only
|
|
178
237
|
custom UI without a mouse handler remains keyboard-driven.
|
|
179
238
|
|
|
@@ -192,6 +251,14 @@ OSC 8 support. Inline and fenced code use a subtle panel fill with syntax colors
|
|
|
192
251
|
list markers, tables, dividers and task-list markers use the existing titanium palette. Images
|
|
193
252
|
display their alt text and are not fetched or rendered as image files.
|
|
194
253
|
|
|
254
|
+
## Checklist block
|
|
255
|
+
|
|
256
|
+
`checklist_write` is registered in terminal sessions (PAR-001). Each call renders in the
|
|
257
|
+
transcript as a checklist block: a status mark, `Checklist · n of m done`, then one line per item
|
|
258
|
+
with `✓` (done, success colour), `●` (in progress, warning yellow, bold) or `○` (pending, dim). A call whose
|
|
259
|
+
arguments are not a checklist, or that failed, stays an ordinary tool row. The prompt's Progress
|
|
260
|
+
group asks the model to keep the list current because the user follows work from it.
|
|
261
|
+
|
|
195
262
|
## Blocks and pages
|
|
196
263
|
|
|
197
264
|
In Pi's own terminal UI, [`chrome.ts`](../src/terminal/tui/chrome.ts) gives terminal surfaces one
|
|
@@ -203,9 +270,10 @@ of two rule-based shapes, using the 2-cell composer gutter on each side and a di
|
|
|
203
270
|
Approvals, questions, and the `select`, `confirm`, `input` and `editor` dialogs use this shape
|
|
204
271
|
there. OpenTUI renders Harness-managed centered dialogs with the inset header treatment below.
|
|
205
272
|
- A **page** is a header row (title left, position or status right), a neutral rule, the body,
|
|
206
|
-
a neutral rule, and the hint row. `/settings`, `/
|
|
207
|
-
`/
|
|
208
|
-
|
|
273
|
+
a neutral rule, and the hint row. `/settings`, `/log`, `/permissions`, and the `/accounts`,
|
|
274
|
+
`/plugins` and `/hub` menus are pages. Section labels inside a page are plain bold headings, never
|
|
275
|
+
text set into a rule. `/trajectory` is a full-screen page with searchable Runs and Events
|
|
276
|
+
tabs; its Events view keeps the event list beside the selected event's JSON on wide terminals.
|
|
209
277
|
|
|
210
278
|
`DialogPanel` takes a `variant` (`block` by default). `ui.select` accepts a harness-owned `page`
|
|
211
279
|
option, which Pi's own dialogs ignore, so the same extension code runs in either terminal. Selected
|
|
@@ -214,24 +282,82 @@ frontends draw that field from the same muted-blue selection palette (`selection
|
|
|
214
282
|
explicit high-contrast text on it instead of the accent colour, so a choice reads the same in every
|
|
215
283
|
list. Rules use the theme's `warning` and `dim` colors, so a custom theme restyles them.
|
|
216
284
|
|
|
217
|
-
|
|
218
|
-
and
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
285
|
+
The Harness resource browser (PROP-0013) unifies Overview, Foundation, Variant, Skills, Plugins,
|
|
286
|
+
Connections, Tools and Library. `/harness` opens Overview; `/skills`, `/plugins`, `/connections`
|
|
287
|
+
(`/mcp`) and `/tools` open sections. `/hub` selects Discover and `/components` selects Library.
|
|
288
|
+
The existing Accounts, Permissions, Settings, Trajectory and Log pages retain their own tabs.
|
|
289
|
+
|
|
290
|
+
`/settings` includes a Browser tab with the device-local **Private address access** setting. It is
|
|
291
|
+
off by default. Enabling it asks for confirmation and allows agent browsing and annotation capture
|
|
292
|
+
to reach localhost and private networks.
|
|
293
|
+
|
|
294
|
+
Resource sections share Installed/Discover and source filters. Installed includes locally present
|
|
295
|
+
resources; current-session availability comes only from the runtime loader and active tool registry.
|
|
296
|
+
Discover uses the existing Hub with All/Community/Official filtering and an explicit remote refresh.
|
|
297
|
+
No matching community entries is an empty result, never replaced with built-in resources.
|
|
298
|
+
The view preserves search across source switches and restores section selection on return.
|
|
299
|
+
|
|
300
|
+
The browser fills the terminal (PROP-0014), with Overview, Foundation, Variant, Skills, Plugins,
|
|
301
|
+
Connections, Tools and Library as persistent top tabs. The section dropdown and sidebar are removed.
|
|
302
|
+
When the strip cannot fit, it shows the active tab and its position with previous/next navigation.
|
|
303
|
+
At 88 content columns, inventory sits beside an inspector containing metadata, actions and readable
|
|
304
|
+
content. Enter focuses the inspector. Its action rows group related tasks under Use, Inspect, Manage,
|
|
305
|
+
Access and Remove. Compact terminals show details/content within the active tab; resizing preserves
|
|
306
|
+
the selected resource and content position, clamped to the available height.
|
|
307
|
+
|
|
308
|
+
Tab/Shift+Tab focuses tabs, source, filter, toolbar actions, list and (when available) inspector.
|
|
309
|
+
Left/Right changes the focused tab or control; Enter on the tab strip returns to the inventory.
|
|
310
|
+
Ctrl+F focuses search. Escape returns from content to actions, returns to the list, clears search,
|
|
311
|
+
then closes. Mouse clicks select tabs directly, activate resource actions and focus filters;
|
|
312
|
+
wheel scrolling targets the list or inspector under the pointer. Other command pages keep their
|
|
313
|
+
centered presentation; `/settings` and `/accounts` use full-screen page layouts. Closing the browser preserves
|
|
314
|
+
the composer draft and attachments.
|
|
315
|
+
|
|
316
|
+
Foundation explains fixed runtime ownership; it is read-only. Variant shows c1–c8 with the
|
|
317
|
+
prepared version and current head separately. It previews pinned files from the preparation
|
|
318
|
+
snapshot and compares their text with the latest saved version. No in-place editing or adoption
|
|
319
|
+
is added. Library skills and rules are added through `terminal.components.add`, which commits a
|
|
320
|
+
validated future version. Directory-backed variants stay read-only.
|
|
321
|
+
|
|
322
|
+
Skill browsing is independent of the Skill commands setting. Use inserts a leading `$name`
|
|
323
|
+
without submitting. Ctrl+K opens a separate command filter; choosing a browser section keeps
|
|
324
|
+
the existing draft text and attachment labels. Canceling the filter restores that draft. OpenTUI completes
|
|
325
|
+
loaded skills for a leading `$`; Enter or Tab inserts the selected skill rather than sending.
|
|
326
|
+
Plugin contributions, settings, attachment and code trust share one detail flow. Package install
|
|
327
|
+
and removal delegate to existing services; installing never trusts or activates code.
|
|
328
|
+
|
|
329
|
+
Connections supports local stdio and remote HTTP forms, masked credentials, explicit scope,
|
|
330
|
+
saved disabled defaults, explicit testing and OAuth sign-in. Browsing never starts an MCP process.
|
|
331
|
+
Saved test results show timestamps rather than claiming a live connection. A Hub connector document
|
|
332
|
+
is inert: a separate setup action validates supported remote-definition fields before opening the
|
|
333
|
+
normal connection form. Other document kinds stay inspectable data. Tools show their owner,
|
|
334
|
+
parameters, active state and saved approval; each call still passes the gate.
|
|
335
|
+
|
|
336
|
+
The typed model is `terminal/browser.ts`; the protected adapter is `terminal/browserControl.ts`.
|
|
337
|
+
The browser accepts resource IDs for bounded regular-file previews, not arbitrary paths. Local
|
|
338
|
+
skill import rejects symbolic links and limits bytes, files and traversal. See
|
|
339
|
+
[source study and wireframes](study/tui-resource-browser.md),
|
|
340
|
+
[PROP-0013](architecture/proposals/PROP-0013-resource-browser.md) and
|
|
341
|
+
[ADR-0015](decisions/ADR-0015-resource-browser.md).
|
|
342
|
+
|
|
343
|
+
## Annotate pane (PROP-0018)
|
|
344
|
+
|
|
345
|
+
`/plugin:annotate` opens a full-screen page that works beside the window being inspected. That window is one of:
|
|
346
|
+
- the visible capture browser
|
|
347
|
+
- an app's own windows attached over its DevTools port (`--app`)
|
|
348
|
+
- app windows that loaded the page bridge script (`--bridge`)
|
|
349
|
+
|
|
350
|
+
The header shows the target and window and whether the inspector is on. The list has three groups: Queue, Sent and fixed, and Saved. While the inspector is on, the page polls for the next popover comment every 400 ms, shows the result as a notice, and refreshes the list.
|
|
351
|
+
|
|
352
|
+
| Key | Action |
|
|
353
|
+
|---|---|
|
|
354
|
+
| `i` | inspector on/off |
|
|
355
|
+
| `s` | send the queue |
|
|
356
|
+
| `x` | unqueue the selected note |
|
|
357
|
+
| `t` | choose a window |
|
|
358
|
+
| `Enter` | the note menu |
|
|
359
|
+
|
|
360
|
+
The page has no search row, so these letters are free for actions. `/plugin:notes` keeps the searchable list.
|
|
235
361
|
|
|
236
362
|
## Plan mode and thinking keys
|
|
237
363
|
|
|
@@ -239,7 +365,9 @@ Use `/plan <brief>` for one read-only planning request. A plan waits outside Pi'
|
|
|
239
365
|
queue until the active response settles, then runs by itself. Later messages remain behind it, even
|
|
240
366
|
when Pi's follow-up mode is `all`. During that run the session narrows to read-only inspection
|
|
241
367
|
(`read`, `grep`, `find`, `ls`), web search/page reading, questions (`ask_user`, `ask_user_question`)
|
|
242
|
-
and recall (history and Wiki reads, `memory_facts`).
|
|
368
|
+
and recall (history and Wiki reads, `memory_facts`). Normal mode omits both question tools from the
|
|
369
|
+
active set; the plan request enables registered questions temporarily and restores the normal set
|
|
370
|
+
when it settles, including on failure or interruption. Providers may mark individual calls as safe for
|
|
243
371
|
research; every other call is blocked before approval. Edits, writes, shell commands, memory writes,
|
|
244
372
|
subagents and connected-app tools remain unavailable. The plan instructions arrive as a
|
|
245
373
|
request-scoped prompt section, which the next ordinary request withdraws.
|
|
@@ -268,9 +396,11 @@ Implement leaves plan mode, so the normal tools and the mode's own model and eff
|
|
|
268
396
|
mode and focuses the composer, so the next message revises the plan and offers a new choice. A plan run
|
|
269
397
|
that was interrupted, failed, or had work queued behind it is not offered.
|
|
270
398
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
399
|
+
A recognized leading slash command uses the selected theme's link color while typing and in its
|
|
400
|
+
user-message bubble. Only the command token is accented; arguments and unknown slash tokens keep the
|
|
401
|
+
normal text color. Recognition follows the active command registry, including built-in commands and
|
|
402
|
+
aliases, loaded extension and prompt commands, and enabled skill invocations written as
|
|
403
|
+
`/skill:name`.
|
|
274
404
|
|
|
275
405
|
SDK session runs receive plan instructions as a dynamic context update, leaving the stable system
|
|
276
406
|
prompt unchanged; their session gate refuses calls outside the read-only set. The standalone
|
|
@@ -311,8 +441,8 @@ not an arbitrary checkout of upstream main. The source repository is
|
|
|
311
441
|
In the extracted `pi-tui` package, `src/theme/defaults/titanium.json` establishes the titanium
|
|
312
442
|
palette and its indexed-color fallbacks. Harness adapts these into
|
|
313
443
|
[`theme.ts`](../src/terminal/tui/theme.ts) and
|
|
314
|
-
[`opentui/theme.ts`](../src/terminal/opentui/theme.ts). The OpenTUI status bar shows the project name
|
|
315
|
-
branch
|
|
444
|
+
[`opentui/theme.ts`](../src/terminal/opentui/theme.ts). The OpenTUI status bar shows the project name and
|
|
445
|
+
branch together as `<repo>:<branch>`, followed by account, model, context use and current-session input/output totals. Input totals add cache
|
|
316
446
|
reads and exclude cache writes; its `R<percentage>%` hit rate is cache reads divided by total input.
|
|
317
447
|
Token counts below 1,000 show as whole numbers; larger counts use floor-rounded K/M/B suffixes
|
|
318
448
|
without decimals.
|
|
@@ -403,7 +533,7 @@ personal Pi profile. Provider authentication and model catalogs use that account
|
|
|
403
533
|
The selected account stays pinned. The existing `/accounts` command requests a parent-managed
|
|
404
534
|
restart to use a different account while resuming the conversation.
|
|
405
535
|
|
|
406
|
-
An initial `--session` or `/
|
|
536
|
+
An initial `--session` option or `/session` target (also accepted as `/resume`) must resolve inside the prepared history directory,
|
|
407
537
|
including symlink targets, and its stored absolute working folder must match the terminal's
|
|
408
538
|
canonical working folder. `/import` may copy an explicitly selected external native JSONL file
|
|
409
539
|
only when its recorded working folder matches. A caller cannot override a foreign recorded
|
|
@@ -450,22 +580,69 @@ a tool waiting forever on a question after the screen has closed. Native `sessio
|
|
|
450
580
|
clears controller readiness and stops that session's poller; the replacement's `session_start`
|
|
451
581
|
restores readiness while retaining the same process control claim.
|
|
452
582
|
|
|
453
|
-
The bridge
|
|
454
|
-
`ask_user_question` contract
|
|
455
|
-
recommended choice; recommendations remain visual and
|
|
456
|
-
retain a free-text “Something else” answer. A pending
|
|
457
|
-
composer, not in a modal. It has only a muted
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
583
|
+
The bridge registers the shared `ask_user` batch tool alongside the single-question
|
|
584
|
+
`ask_user_question` contract; only plan requests activate them. Each question has a concise 1–2 word
|
|
585
|
+
label, at least one choice, and at least one recommended choice; recommendations remain visual and
|
|
586
|
+
never preselect. Choice-based questions also retain a free-text “Something else” answer. A pending
|
|
587
|
+
question appears in a flat block immediately above the composer, not in a modal. It has only a muted
|
|
588
|
+
top divider and separates its hint from the content by one blank line; below 60 terminal columns,
|
|
589
|
+
it uses a compact hint. The body is height-bounded and vertically scrollable, with tabs and
|
|
590
|
+
answer/action controls outside that region. While the dock is active, PageUp/PageDown scroll its
|
|
591
|
+
body and Ctrl+Home/End jump to its beginning/end instead of the transcript. Focused choices and
|
|
592
|
+
note fields are brought into view. A tab strip shows each
|
|
593
|
+
question label above the active question title, with one blank row below the tabs and below the title;
|
|
594
|
+
clicking a tab or using Left/Right changes questions without discarding staged answers. The header has
|
|
595
|
+
no pager controls, and the block cannot be collapsed. Choices and descriptions appear above the numbered free-text answer and Continue or Skip
|
|
596
|
+
action. Selected choices fill the whole row with subtle dark green; Continue and Submit uses a
|
|
597
|
+
green-filled button, while Skip remains neutral. While the block is active, the chat composer and
|
|
598
|
+
its lower status bar are hidden. Tab and Shift+Tab move through the available controls; `n` opens a
|
|
599
|
+
note for the focused selected choice. Its editor appears below that choice, aligned with the description
|
|
600
|
+
column, and begins with an accent-colored `Note:` label. Tab only visits note fields that are already
|
|
601
|
+
open. Notes are submitted by choice label and cleared when that choice is deselected. Notes and
|
|
602
|
+
free-text answers wrap across lines. Tab takes precedence over normal thinking and plan-mode shortcuts. Up
|
|
603
|
+
and Down navigate choices. Enter selects a choice, activates the focused action, or submits the
|
|
604
|
+
answer or note field. Escape cancels the pending question and interrupts the run.
|
|
605
|
+
|
|
606
|
+
Questions may set `uiSketch: true` to enable a choice sketch preview. Every choice must then include
|
|
607
|
+
an ASCII sketch of 1–24 LF-separated lines, no more than 80 printable ASCII characters per line
|
|
608
|
+
(1,943 bytes maximum), and at least one visible character. Tabs, CR, controls, escape sequences and
|
|
609
|
+
non-ASCII text are rejected. Without the flag, choice sketches are rejected. Tool guidance asks for
|
|
610
|
+
contextual UI wireframes with actual panel/table structure and neighboring elements, consistent
|
|
611
|
+
across alternatives, rather than isolated decorative diagrams; quality is not a schema guarantee.
|
|
612
|
+
|
|
613
|
+
The dock uses one shared measured layout for all choices: marker gutter, one-third label cell,
|
|
614
|
+
two-cell gap, and remaining description cell. Boundaries align across rows at every width, including
|
|
615
|
+
compact terminals; both cells wrap independently, missing descriptions keep their cell, and columns
|
|
616
|
+
never stack. Recommendation text becomes `(Rec.)` when the label column is fewer than 14 cells.
|
|
617
|
+
|
|
618
|
+
One shared border-only monospace preview below the choices follows the hovered choice, falling
|
|
619
|
+
back to keyboard focus. It has no visible caption or extra left rule. Under the approved
|
|
620
|
+
[PROP-0026](architecture/proposals/PROP-0026-connected-sketch-display.md) /
|
|
621
|
+
[ADR-0027](decisions/ADR-0027-connected-sketch-display.md) and
|
|
622
|
+
[PROP-0028](architecture/proposals/PROP-0028-normalize-question-wireframes.md) /
|
|
623
|
+
[ADR-0029](decisions/ADR-0029-normalized-question-wireframe-borders.md) amendments,
|
|
624
|
+
the terminal display uses a bounded structural projection in
|
|
625
|
+
`src/terminal/opentui/sketchPanel.ts`: recognized ASCII table-border rows—including title-bearing
|
|
626
|
+
top rules—and enclosed vertical table edges become connected box-drawing glyphs. Internal framed
|
|
627
|
+
tables keep their original widths and positions. Within a high-confidence frame, a missing side
|
|
628
|
+
edge may be filled or a displaced edge moved only through whitespace to matched corner columns;
|
|
629
|
+
interior text and ambiguous rows remain literal. Bare standalone hyphen divider rows expand to
|
|
630
|
+
`max(panel viewport width, original sketch widest line)` and attach to the outer single-line frame
|
|
631
|
+
with `├` and `┤`. Prose, content operators, ordinary pipes and unrecognized rows remain literal;
|
|
632
|
+
there is no global `+|-` substitution. The original validated ASCII source, including whitespace,
|
|
633
|
+
is persisted untouched; normalization and projected glyphs are display-only.
|
|
634
|
+
|
|
635
|
+
A bounded two-axis viewport exposes all overflow without wrapping, reflow, truncation or
|
|
636
|
+
Markdown/ANSI interpretation. Shift+arrows pan the sketch; ordinary arrows retain question/choice
|
|
637
|
+
navigation. Hosts may keep literal previews of that same source. The preview does not change the
|
|
638
|
+
selected answer, and sketch metadata is not included in the answer event. The 80×24 source bounds
|
|
639
|
+
and dock layout remain as specified by
|
|
640
|
+
[PROP-0025](architecture/proposals/PROP-0025-contextual-question-wireframes.md) and
|
|
641
|
+
[ADR-0026](decisions/ADR-0026-contextual-question-wireframes.md). Isolated production PTY evidence
|
|
642
|
+
for [PROP-0026](architecture/proposals/PROP-0026-connected-sketch-display.md) and
|
|
643
|
+
[PROP-0028](architecture/proposals/PROP-0028-normalize-question-wireframes.md) is retained under
|
|
644
|
+
`docs/evidence/terminal-wireframe-normalization/`; it does not claim every-emulator rendering or
|
|
645
|
+
live-model sketch quality.
|
|
469
646
|
|
|
470
647
|
Recommended choices appear first with a warning-colored marker, without changing their labels or
|
|
471
648
|
preselecting them; every question requires at least one recommendation. A single-choice question
|
|
@@ -480,22 +657,35 @@ event subscriptions and custom transcript components detach before native invali
|
|
|
480
657
|
Cleanup failures cannot prevent terminal restoration. Fatal asynchronous errors restore the
|
|
481
658
|
terminal and exit with failure; startup failures and suspend/resume use the same lifecycle.
|
|
482
659
|
|
|
483
|
-
The command registry supplies help and completion for Harness commands, loaded extensions
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
660
|
+
The command registry supplies help and slash completion for Harness commands, loaded extensions
|
|
661
|
+
and prompts. `/session` selects a saved session (`/resume` remains an alias), and `/history` navigates
|
|
662
|
+
branches in the current session (`/tree` remains an alias). `/btw <question>` asks a side question;
|
|
663
|
+
`/side` is its alias. Help and the slash-command palette show each pair once, as `/session (resume)`,
|
|
664
|
+
`/history (tree)` and `/btw (side)`; aliases still match palette searches.
|
|
665
|
+
The separate `$` palette completes enabled skill invocations; `/skills` always browses skills. `/help`
|
|
666
|
+
renders the command list as one transcript entry, grouped under Core, Run, Model, Session, Inspect,
|
|
667
|
+
Harness, Plugins and Prompts; command names and descriptions wrap in aligned columns, with no
|
|
668
|
+
blank rows between choices. `/plugins` opens the browser with protected code trust and plugin settings actions. Settings use
|
|
669
|
+
`plugins.configure`; on/off settings and bounded whole-number settings keep their existing ranges.
|
|
670
|
+
Saved settings are read when the plugin next uses them and do not require a restart. The standalone
|
|
489
671
|
terminal no longer has separate `/login`, `/trust`, `/bug`, `/changelog`, `/share`, `/scoped-mode` or
|
|
490
|
-
`/import` commands. `/btw <question>`
|
|
672
|
+
`/import` commands. `/btw <question>` (or `/side <question>`) starts a separate Harness run with the
|
|
673
|
+
main run's effective instructions, visible conversation and redacted public tool inputs/results.
|
|
674
|
+
Hidden reasoning and image bytes are excluded; the side run has no tools. Its block puts the
|
|
675
|
+
question after `/btw`, shows the normal animated spinner while answering, and separates the answer
|
|
676
|
+
and hint by one blank row; it has no status labels. PageUp/PageDown browse a long answer and Ctrl+X
|
|
677
|
+
copies the full answer. Escape or either command with no question dismisses the dock and interrupts
|
|
678
|
+
only that side run; the main reply continues. `/stop` interrupts the current main reply. The `/accounts` page handles sign-in
|
|
491
679
|
and sign-out. `/components` browses reusable skills, prompts and rules; a confirmed skill or rule addition
|
|
492
680
|
creates a variant version for future sessions while the current terminal keeps its pinned version. `/reload` applies trusted resource and keybinding changes.
|
|
493
681
|
|
|
494
682
|
`/trajectory` opens the newest recorded run for the current native conversation; `/trajectory <run-id>`
|
|
495
|
-
opens a selected run from that conversation.
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
683
|
+
opens a selected run from that conversation. The full-screen page keeps searchable Runs and Events
|
|
684
|
+
tabs. In Events, the list sits beside the selected event's JSON on wide terminals and stacks above it
|
|
685
|
+
on compact terminals. Type to search run IDs, goals, event types, timestamps, summaries and payload
|
|
686
|
+
text; `[` and `]` change runs, up/down selects events, PageUp/PageDown scrolls event details, and
|
|
687
|
+
`Shift+C` copies the selected event JSON. Active runs refresh while the page is open. The protected
|
|
688
|
+
terminal socket scopes both the run list and event reads to the current terminal and native session file.
|
|
499
689
|
|
|
500
690
|
`/log` opens a centered page dialog with separate Harness diagnostics and current-conversation
|
|
501
691
|
run-event views. The diagnostic file is read at its captured size in bounded socket chunks. Tab/Shift+Tab
|
|
@@ -504,6 +694,17 @@ diagnostics retain available error stacks and safe request metadata, while the v
|
|
|
504
694
|
and URL queries and omits response bodies, prompts and message contents. Embedded hosts without a
|
|
505
695
|
`harness.log` still show the conversation's recorded run events.
|
|
506
696
|
|
|
697
|
+
## Slash command ownership
|
|
698
|
+
|
|
699
|
+
Core commands and commands owned by required built-in plugins stay unprefixed. The required
|
|
700
|
+
plugin commands are `/subagents`, `/agents`, `/trajectory`, `/doctor`, and `/worktree`. Optional built-in
|
|
701
|
+
plugin commands (currently `/plugin:notes` and `/plugin:annotate`) and Pi extension commands use
|
|
702
|
+
`/plugin:<command>`. A bare core command, alias, required built-in command, or loaded prompt owns its
|
|
703
|
+
name; a colliding prefixed command is omitted and rejected with a hint to use the bare command.
|
|
704
|
+
Duplicate extension names are rejected with the extension paths shown in the diagnostic. Old
|
|
705
|
+
`/plugin:` forms of required built-in commands are not aliases. Prompt templates and
|
|
706
|
+
`/skill:<name>` keep their existing forms.
|
|
707
|
+
|
|
507
708
|
## Input performance profile
|
|
508
709
|
|
|
509
710
|
`npm run profile:terminal-latency` (`scripts/profile-terminal-latency.py`) types into the real
|
|
@@ -529,8 +730,8 @@ How the frontend keeps typing fast:
|
|
|
529
730
|
results change; session statistics refresh at most every 250 ms during a run.
|
|
530
731
|
- **Kept connections.** Session-socket requests ask to `keep` their connection, so the two 100 ms
|
|
531
732
|
polls and per-key draft updates reuse a connection instead of opening one each.
|
|
532
|
-
- **No swallowed keys.**
|
|
533
|
-
is typed there.
|
|
733
|
+
- **No swallowed keys.** While a question is active, an unused printable character moves focus to
|
|
734
|
+
“Something else” and is typed there when free text is allowed; it never creates a hidden chat draft.
|
|
534
735
|
|
|
535
736
|
## Verification and remaining limits
|
|
536
737
|
|
|
@@ -665,7 +866,38 @@ truncate trailing text. Renaming refreshes the line through Pi's existing metada
|
|
|
665
866
|
## `/doctor`
|
|
666
867
|
|
|
667
868
|
Checks accounts/models, tools, MCP, plugins/skills, variant/prompt validity, runtime assets, storage
|
|
668
|
-
and startup recovery.
|
|
669
|
-
|
|
670
|
-
and
|
|
671
|
-
|
|
869
|
+
and startup recovery. The summary keeps mode, progress, account/model and status counts visible above
|
|
870
|
+
the findings. Wide layouts use aligned Status, Check, Category and Verification columns, with evidence
|
|
871
|
+
and any next step beneath each finding; narrow layouts stack those fields. Status colors follow the
|
|
872
|
+
active theme: pass is success, warning/blocked warning, fail error, disabled dim and unverified muted.
|
|
873
|
+
|
|
874
|
+
`r` refreshes, `t` retries one local finding, `l` selects live checks, `c` cancels, Up/Down scroll by
|
|
875
|
+
line, PgUp/PgDn or the mouse wheel by page, and Home/End jump to the first/last finding. Escape
|
|
876
|
+
closes/cancels. Live
|
|
877
|
+
checks show their costs and isolated resources before confirmation. Providers without diagnostic
|
|
878
|
+
callbacks are reported unverified. See [Doctor](doctor.md).
|
|
879
|
+
|
|
880
|
+
## Resource browser verification (2026-10-22)
|
|
881
|
+
|
|
882
|
+
The [retained evidence](evidence/terminal-resource-browser/README.md) records three-size PTY
|
|
883
|
+
acceptance, pointer/filter and resize behavior, skill completion/insertion and preserved drafts,
|
|
884
|
+
with zero model requests. Isolated idle/history/stream input profiling reported no missed keys
|
|
885
|
+
and p95 14.81/14.27/17.32 ms. The manifest binds both the CLI and OpenTUI bundle to their digests.
|
|
886
|
+
Live external connector authentication and community package installation were not exercised.
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
## Full-screen browser verification (2026-10-23)
|
|
890
|
+
|
|
891
|
+
[PROP-0014](architecture/proposals/PROP-0014-fullscreen-browser-tabs.md) and
|
|
892
|
+
[ADR-0016](decisions/ADR-0016-fullscreen-browser-tabs.md) replace the browser's centered layout
|
|
893
|
+
with full-screen section tabs and a responsive inventory/inspector. The
|
|
894
|
+
[retained PTY evidence](evidence/terminal-fullscreen-browser/README.md) covers 40×20, 80×24 and
|
|
895
|
+
120×40, keyboard and pointer tab selection, filter interaction, resizing and draft preservation,
|
|
896
|
+
with zero model requests. The manifest binds the CLI, OpenTUI bundle and verification script.
|
|
897
|
+
|
|
898
|
+
Harness typecheck, full tests (893 passing, three platform skips), build and standalone proof
|
|
899
|
+
passed. The final focused browser/page/command run passed 75 tests. Agent app typecheck, layer
|
|
900
|
+
checks, frontend tests, all 40 sidecar tests and 240 Rust tests passed (one Rust test ignored).
|
|
901
|
+
Sidecar tests were rerun with two workers and a 30-second timeout after four five-second timeouts
|
|
902
|
+
under concurrent load. Socket-backed Harness and PTY checks required sandbox escalation;
|
|
903
|
+
verification used local fixtures and disposable session data.
|