@xingular/harness 1.2.0 → 1.3.1-unstable.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +10 -5
- package/dist/cli.js +5560 -5056
- package/dist/sdk/agents/builtin.js +3 -3
- package/dist/sdk/agents/planResearch.d.ts +23 -1
- package/dist/sdk/agents/planResearch.js +71 -8
- package/dist/sdk/agents/profiles.d.ts +4 -1
- package/dist/sdk/agents/profiles.js +17 -6
- package/dist/sdk/capabilities/runSnapshot.js +10 -4
- package/dist/sdk/commands/registry.d.ts +11 -3
- package/dist/sdk/commands/registry.js +3 -2
- package/dist/sdk/core/shell.d.ts +20 -0
- package/dist/sdk/core/shell.js +73 -0
- package/dist/sdk/core/workspaceBashTool.d.ts +17 -1
- package/dist/sdk/core/workspaceBashTool.js +16 -2
- package/dist/sdk/core/workspaceSandbox.d.ts +10 -0
- package/dist/sdk/core/workspaceSandbox.js +52 -12
- package/dist/sdk/core/workspaceWriteOperations.d.ts +11 -0
- package/dist/sdk/core/workspaceWriteOperations.js +26 -8
- package/dist/sdk/doctor/checks.js +71 -12
- package/dist/sdk/hub/hub.js +5 -3
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/plugins/builtin.js +3 -3
- package/dist/sdk/plugins/install.d.ts +6 -2
- package/dist/sdk/plugins/install.js +29 -5
- package/dist/sdk/plugins/inventory.js +2 -2
- package/dist/sdk/prompt/compile.d.ts +2 -2
- package/dist/sdk/prompt/compile.js +14 -16
- package/dist/sdk/server/methods.js +4 -2
- package/dist/sdk/sessions/compactionCheckpoint.d.ts +3 -3
- package/dist/sdk/sessions/compactionCheckpoint.js +12 -12
- package/dist/sdk/sessions/continuation.d.ts +4 -2
- package/dist/sdk/sessions/continuation.js +7 -6
- package/dist/sdk/sessions/contracts.d.ts +22 -4
- package/dist/sdk/sessions/contracts.js +12 -7
- package/dist/sdk/sessions/planMode.js +2 -2
- package/dist/sdk/sessions/runStore.js +3 -1
- package/dist/sdk/sessions/runner.js +2 -2
- package/dist/sdk/sessions/sessions.js +29 -11
- package/dist/sdk/sessions/subagentService.d.ts +15 -0
- package/dist/sdk/sessions/subagentService.js +194 -54
- package/dist/sdk/sessions/subagents.d.ts +10 -1
- package/dist/sdk/sessions/subagents.js +4 -0
- package/dist/sdk/sessions/workSlice.d.ts +8 -5
- package/dist/sdk/sessions/workSlice.js +77 -45
- package/dist/sdk/terminal/controller.d.ts +20 -0
- package/dist/sdk/terminal/controller.js +43 -18
- package/dist/sdk/terminal/opentui/ansi.d.ts +25 -0
- package/dist/sdk/terminal/opentui/ansi.js +192 -0
- package/dist/sdk/terminal/opentui/model.d.ts +163 -0
- package/dist/sdk/terminal/opentui/model.js +482 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +3 -3
- package/dist/sdk/terminal/opentui/subagentsWidget.js +7 -5
- package/dist/sdk/terminal/opentui/theme.js +1 -0
- package/dist/sdk/terminal/piExtension.js +28 -14
- package/dist/sdk/terminal/subagentMonitor.d.ts +17 -4
- package/dist/sdk/terminal/subagentMonitor.js +29 -8
- package/dist/sdk/terminal/terminals.d.ts +7 -0
- package/dist/sdk/terminal/terminals.js +86 -14
- package/dist/sdk/terminal/trajectory.d.ts +6 -1
- package/dist/sdk/terminal/trajectory.js +8 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +4 -0
- package/dist/sdk/terminal/tui/chrome.js +13 -0
- package/dist/sdk/terminal/tui/commandPages.js +14 -4
- package/dist/sdk/terminal/tui/commands.d.ts +4 -0
- package/dist/sdk/terminal/tui/commands.js +8 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +13 -6
- package/dist/sdk/terminal/tui/pages/browserPage.js +5 -4
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +14 -1
- package/dist/sdk/terminal/tui/pages/hubPage.js +192 -28
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +8 -1
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +197 -25
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +8 -5
- package/dist/sdk/tools/sessionName.d.ts +2 -0
- package/dist/sdk/tools/sessionName.js +5 -3
- package/dist/sdk/tools/spawnSubagent.js +9 -7
- package/dist/sdk/tools/todo.d.ts +15 -0
- package/dist/sdk/tools/todo.js +64 -0
- package/dist/terminal-opentui.js +1416 -348
- package/dist/terminal-pi.js +315 -126
- package/docs/architecture/00-overview.md +1 -1
- package/docs/architecture/01-extension-points.md +1 -1
- package/docs/architecture/02-sessions-and-runs.md +65 -34
- package/docs/architecture/04-prompt.md +8 -6
- package/docs/architecture/06-plugins-and-capabilities.md +10 -6
- package/docs/architecture/07-tools-and-gate.md +31 -5
- package/docs/architecture/09-accounts-and-connectors.md +8 -2
- package/docs/architecture/10-server-protocol.md +16 -9
- package/docs/architecture/11-terminal.md +51 -26
- package/docs/architecture/14-surfaces-and-parity.md +4 -1
- package/docs/architecture/README.md +18 -17
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +2 -0
- package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +32 -21
- package/docs/architecture/proposals/PROP-0044-work-slice-defaults.md +93 -0
- package/docs/architecture/proposals/PROP-0045-rename-checklist-to-todo.md +132 -0
- package/docs/architecture/proposals/PROP-0046-progress-aware-stall-guards.md +82 -0
- package/docs/architecture/proposals/PROP-0047-plugins-hub-separation.md +122 -0
- package/docs/architecture/proposals/README.md +10 -6
- package/docs/decisions/ADR-0039-progress-aware-stall-guards.md +39 -0
- package/docs/decisions/ADR-0040-architecture-change-workflow.md +31 -0
- package/docs/decisions/ADR-0041-plugins-hub-separation.md +41 -0
- package/docs/decisions/ADR-0042-windows-shell-without-sandbox.md +40 -0
- package/docs/decisions/ADR-0043-parents-continue-stopped-subagents.md +49 -0
- package/docs/doctor.md +14 -1
- package/docs/parity.md +9 -9
- package/docs/releases/1.3.0.md +21 -0
- package/docs/releases/README.md +2 -2
- package/docs/terminal-tui.md +85 -46
- package/package.json +1 -1
- package/dist/sdk/tools/checklist.d.ts +0 -9
- package/dist/sdk/tools/checklist.js +0 -55
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Architecture proposals
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Proposals are optional design records for changes to contracts, invariants, layer boundaries,
|
|
4
|
+
extension points, or storage layout in [the specification](../README.md). They may be written before
|
|
5
|
+
or alongside implementation, but do not gate code or spec changes. When a proposal is created, add
|
|
6
|
+
it to the index and update its status as the work progresses.
|
|
7
7
|
|
|
8
8
|
## Status
|
|
9
9
|
|
|
10
10
|
| Status | Meaning |
|
|
11
11
|
|---|---|
|
|
12
|
-
| `Proposed` |
|
|
13
|
-
| `Accepted` | The user approved
|
|
12
|
+
| `Proposed` | A draft design record; implementation status is tracked separately. |
|
|
13
|
+
| `Accepted` | The user approved the design. Approval is not a prerequisite to implementation. |
|
|
14
14
|
| `Implemented` | Code and spec pages match the proposal. Link the commit or ADR. |
|
|
15
15
|
| `Rejected` | The user declined it. The file stays as a record. |
|
|
16
16
|
| `Withdrawn` | The author dropped it before review. |
|
|
@@ -73,6 +73,10 @@ proposal is `Accepted`.
|
|
|
73
73
|
| [PROP-0041](PROP-0041-bounded-work-slices.md) | Bounded work slices, a durable checkpoint, and a stall guard for long replies | Implemented; terminal card, App presentation and /slices open (PAR-004) | INV-RUN-2/3/4/12, INV-PRM-1/2/4/5/10, INV-GATE-2, INV-STO-3, INV-PAR-1/2, 02, 04, 07, 10–12, 14, parity | 2026-10-26 |
|
|
74
74
|
| [PROP-0042](PROP-0042-usage-and-provider-limits.md) | Usage analytics and provider limits as a built-in capability | Accepted; implemented | INV-MEM-5/6, INV-STO-2, INV-SRV-1, INV-PLG-10, INV-ACC-3, 02, 06, 08–12, 14, parity, ADR-0037 | 2026-10-26 |
|
|
75
75
|
| [PROP-0043](PROP-0043-read-only-plan-bash.md) | Read-only Bash in plan mode, enforced by the OS sandbox | Accepted; implemented | INV-RUN-8, INV-GATE-3/8, 02, 07, 11, terminal-tui, parity, ADR-0038 | 2026-10-26 |
|
|
76
|
+
| [PROP-0044](PROP-0044-work-slice-defaults.md) | Raise the work-slice defaults to 320 tool calls and 60 minutes, with no token cap | Accepted; implemented | INV-RUN-13, 02, 10, 11, PROP-0041 | 2026-10-26 |
|
|
77
|
+
| [PROP-0045](PROP-0045-rename-checklist-to-todo.md) | Rename the run checklist to todo and add the /todo command | Accepted; implemented | 02, 04, 06, 07, 10, 11, 14, parity, terminal-tui, README, PROP-0006 | 2026-10-26 |
|
|
78
|
+
| [PROP-0046](PROP-0046-progress-aware-stall-guards.md) | Progress-aware stall guards and bounded plan research children | Implemented; ADR-0039 | INV-RUN-13, 02-sessions-and-runs.md, PROP-0041, terminal-tui.md, ADR-0039 | 2026-10-27 |
|
|
79
|
+
| [PROP-0047](PROP-0047-plugins-hub-separation.md) | Separate local plugin management from Community Hub discovery | Implemented; ADR-0041 | INV-MCP-4, INV-TUI-2/4, INV-PAR-1/2, 06, 09, 10, 11, 14, terminal-tui.md, parity.md | 2026-10-27 |
|
|
76
80
|
|
|
77
81
|
Numbers are four digits, start at `0001`, and are never reused.
|
|
78
82
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0039
|
|
3
|
+
title: Progress-aware stall guards and bounded plan research children
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-10-27
|
|
6
|
+
proposal: PROP-0046
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# ADR-0039: Progress-aware stall guards and bounded plan research children
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Remove the global file-change/check no-progress trigger. Keep the targeted protections for repeated
|
|
14
|
+
calls, repeated failing checks, per-path edit churn, compaction thrash, and the independent
|
|
15
|
+
work-slice call/time budgets. Count edit churn only from successful native `edit`/`write` results
|
|
16
|
+
with a path. A successful edit/write clears failed-check counts, exact Bash-check repetition counts
|
|
17
|
+
and the pending nudge, but preserves edit counts and repeats of other calls; a passing check clears
|
|
18
|
+
edit churn.
|
|
19
|
+
|
|
20
|
+
Bound plan-research children with the configured work-slice policy without adding
|
|
21
|
+
`checkpoint_write` or any other capability. When that tool is absent, a budget or stall refusal asks
|
|
22
|
+
the child to stop and return partial findings; another tool call ends the reply, and the runner
|
|
23
|
+
records an evidence-derived checkpoint. Children do not auto-continue. Plan-mode browser and
|
|
24
|
+
connected-app restrictions remain unchanged.
|
|
25
|
+
|
|
26
|
+
## Rationale
|
|
27
|
+
|
|
28
|
+
Distinct reads are not evidence of a stall, and the former 25-call threshold imposed an arbitrary
|
|
29
|
+
file/check-progress boundary. Tool results are the shared, observable signal for whether a native
|
|
30
|
+
edit succeeded; treating failed or blocked attempts as edits would consume the churn allowance
|
|
31
|
+
without changing code. Resetting check-retry state after a successful edit lets the same check run
|
|
32
|
+
against changed input without weakening protection when code is unchanged. A derived checkpoint
|
|
33
|
+
bounds read-only research children without widening their frozen capability set.
|
|
34
|
+
|
|
35
|
+
## Consequences
|
|
36
|
+
|
|
37
|
+
Long sequences of distinct reads are limited by the configured slice budget and targeted loop
|
|
38
|
+
protections, not by missing file/check progress. No run-event schema, stored-data layout or server protocol changes are introduced; the terminal
|
|
39
|
+
uses the same guard rules. See [PROP-0046](../architecture/proposals/PROP-0046-progress-aware-stall-guards.md).
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0040
|
|
3
|
+
title: Architecture changes do not require proposal approval first
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-10-27
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-0040: Architecture changes do not require proposal approval first
|
|
9
|
+
|
|
10
|
+
## Decision
|
|
11
|
+
|
|
12
|
+
The architecture specification remains binding, and changes that alter its contracts, invariants,
|
|
13
|
+
layer boundaries, extension points, or storage layout must update the affected specification pages
|
|
14
|
+
in the same change. Such work does not require a proposal or user approval before implementation.
|
|
15
|
+
|
|
16
|
+
Proposals remain optional design records. When used, they may be created before or alongside
|
|
17
|
+
implementation and should be indexed and status-tracked. Add an ADR for a lasting architectural
|
|
18
|
+
choice. Report existing code/spec drift and resolve relevant drift by updating both sides together
|
|
19
|
+
within the requested scope.
|
|
20
|
+
|
|
21
|
+
## Rationale
|
|
22
|
+
|
|
23
|
+
A binding specification and same-change documentation keep implementation accountable to the
|
|
24
|
+
architecture without making a separate proposal review a prerequisite to requested work. Optional
|
|
25
|
+
proposals remain available when a design benefits from a written comparison or durable rationale.
|
|
26
|
+
|
|
27
|
+
## Consequences
|
|
28
|
+
|
|
29
|
+
Coding agents read the affected specification pages, implement the requested change, update the
|
|
30
|
+
specification in the same change, and run relevant checks. Proposal status records design review or
|
|
31
|
+
implementation progress but does not gate implementation.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0041
|
|
3
|
+
title: Separate local plugin management from Community Hub discovery
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-10-27
|
|
6
|
+
proposal: PROP-0047
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# ADR-0041: Separate local plugin management from Community Hub discovery
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
- `/plugins` is the dedicated local installed-plugin manager: switching, code trust, settings, and
|
|
14
|
+
local package install, update and removal. It does not browse the public catalog.
|
|
15
|
+
- `/hub` is a distinct public-catalog page. Its Catalog view shows Community entries across active
|
|
16
|
+
supported types; its Installed view shows receipts from every channel with the channel visible.
|
|
17
|
+
The broad `/harness` resource browser remains available.
|
|
18
|
+
- Opening Hub shows cached or bundled entries first, then refreshes remotely. The page retains the
|
|
19
|
+
data origin, last-refresh time and any fallback/error status. Registry/document entries keep a
|
|
20
|
+
bounded payload Preview; Pi packages have no payload Preview.
|
|
21
|
+
- A Hub-owned package cannot be silently floated by `plugins.update`. Removing it through
|
|
22
|
+
`plugins.remove` delegates to Hub's exact-receipt uninstall operation; Hub remains the writer of
|
|
23
|
+
its receipt and owned resources. Replacing it requires an explicit, exact catalog version.
|
|
24
|
+
- Host presentations use the same filtering, refresh and receipt lifecycle while choosing their own
|
|
25
|
+
layouts. No new capability, loader, storage format or server response schema is introduced.
|
|
26
|
+
|
|
27
|
+
## Rationale
|
|
28
|
+
|
|
29
|
+
Local plugin management and public catalog discovery have different owners and different safety
|
|
30
|
+
contracts. Separating the direct pages makes that visible without duplicating the services: local
|
|
31
|
+
packages use the plugin manager, while Hub installs are pinned catalog releases with receipts. A
|
|
32
|
+
Community-only catalog view also avoids presenting official items as community submissions, while
|
|
33
|
+
retaining existing Official receipts for management.
|
|
34
|
+
|
|
35
|
+
## Consequences
|
|
36
|
+
|
|
37
|
+
The direct terminal and host routes have distinct screens, but `/harness` stays a broad resource
|
|
38
|
+
browser. Catalog filtering is presentation-only; `hub.list` remains unfiltered for other callers.
|
|
39
|
+
Existing receipts and plugin settings need no migration. The current public catalog has no
|
|
40
|
+
Community Pi-package entry, so no Community plugin appears until a publisher adds one. See
|
|
41
|
+
[PROP-0047](../architecture/proposals/PROP-0047-plugins-hub-separation.md).
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0042
|
|
3
|
+
title: Run Windows commands behind a per-call approval instead of a sandbox
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-10-27
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-0042: Run Windows commands behind a per-call approval instead of a sandbox
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
Bash runs inside an OS write-boundary sandbox: `sandbox-exec` on macOS, bubblewrap on Linux
|
|
13
|
+
(INV-GATE-3, INV-GATE-8). Windows has neither, and missing enforcement fails closed, so on Windows
|
|
14
|
+
every Bash call, and every native `write` and `edit` (whose helper was launched through the same
|
|
15
|
+
sandbox), failed before it started. The shell lookup also searched only `/bin/bash`. A harness
|
|
16
|
+
installed from npm on Windows could not run a command or change a file.
|
|
17
|
+
|
|
18
|
+
## Decision
|
|
19
|
+
|
|
20
|
+
- **Shell.** On Windows, commands run in Git Bash (`%ProgramFiles%\Git\bin\bash.exe`,
|
|
21
|
+
`%ProgramFiles(x86)%\Git\bin\bash.exe`, then `bash.exe` on `PATH`, never the WSL launcher in
|
|
22
|
+
`System32`), otherwise in PowerShell (`pwsh.exe`, PowerShell 7 in Program Files, then Windows
|
|
23
|
+
PowerShell). The capability and tool keep the name `bash`, so capability sets, the gate, plan
|
|
24
|
+
lists and approvals are unchanged; the description names the shell.
|
|
25
|
+
- **Bash.** Every Windows command takes the existing `outside` path: a human-only one-call approval
|
|
26
|
+
or an eligible Full Permission answer, then it runs once unconfined. Remembered tool grants never
|
|
27
|
+
answer it. Plan-mode (read-only) Bash is refused on Windows.
|
|
28
|
+
- **Write and edit.** On Windows the atomic helper runs with Node directly. The target is still
|
|
29
|
+
canonicalized, authorized, revalidated, and replaced by rename; outside targets still need their
|
|
30
|
+
one-call approval. In-workspace writes do not ask.
|
|
31
|
+
- `/doctor` reports the Windows shell as a warning that names it and the approval rule.
|
|
32
|
+
|
|
33
|
+
## Consequences
|
|
34
|
+
|
|
35
|
+
- The harness works on Windows right after `npm install`, with no Git or native helper required.
|
|
36
|
+
- Windows commands are unconfined once approved. The guarantee comes from the person, not the OS.
|
|
37
|
+
- On Windows, a junction or symlink swap between the write check and the rename is not prevented
|
|
38
|
+
by the OS. Atomic replacement still keeps a write from going through a hard-link alias.
|
|
39
|
+
- A real Windows sandbox (restricted token and ACLs through a native helper) would let Windows use
|
|
40
|
+
the macOS/Linux rules again. It is not built.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0043
|
|
3
|
+
title: A parent continues its stopped subagents; the monitor shows the main agent and survives reopening
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-10-27
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-0043: A parent continues its stopped subagents
|
|
9
|
+
|
|
10
|
+
## Decision
|
|
11
|
+
|
|
12
|
+
- `spawn_subagent { continue: <runId> }` (and `subagents.spawn { continue }`) continues a child that
|
|
13
|
+
stopped before finishing (`interrupted` or `failed`, with saved history). It is a new child run
|
|
14
|
+
with `continueFrom`. It reopens the first link's history folder
|
|
15
|
+
(`<parent sessionDir>/subagents/<first child run id>`) and keeps the earlier child's session id,
|
|
16
|
+
profile, title, goal, account, variant version and frozen capability set. That set must still lie
|
|
17
|
+
within the parent's ceiling; `agent` and `tools` are refused with `continue`. The id may name any
|
|
18
|
+
link of a chain: the newest link is the one continued, and an active or completed newest link is
|
|
19
|
+
refused.
|
|
20
|
+
- The model decides. A subagent never continues itself, and a restarted harness never restarts
|
|
21
|
+
model work (INV-RUN-4). Children an earlier reply left stopped are delivered **before** the next
|
|
22
|
+
reply's first request: a hidden `xingular-subagent-results` message with a receipt, which says
|
|
23
|
+
each child can be continued. A stopped child that has a continuation is reported through that
|
|
24
|
+
continuation instead.
|
|
25
|
+
- Recovery of an earlier parent's children is keyed on the native history branch: the owner
|
|
26
|
+
marker, the same native history id, account, agent, project and working folder. The Harness
|
|
27
|
+
session id is not compared, because a host may give each launch of one conversation a new one.
|
|
28
|
+
- `main` is a reserved profile name. The terminal monitor projects the parent run itself as a
|
|
29
|
+
`main` row: account, model, effort, usage, activity and todo counts, like a child. The
|
|
30
|
+
`/subagents` page shows it pinned first; the rows under the status line omit it.
|
|
31
|
+
- The terminal marks every turn's run on the branch (`xingular-subagent-owner`). When a
|
|
32
|
+
conversation opens with no run active, it rebuilds the monitor from the branch's latest parent
|
|
33
|
+
run in that folder and its descendants, by folding their saved events. The rows keep their final
|
|
34
|
+
status until the next run begins.
|
|
35
|
+
- Run records carry the launch `model` and `effort` (the opened session's model supersedes the
|
|
36
|
+
selection), so a rebuilt row can show them.
|
|
37
|
+
|
|
38
|
+
## Rationale
|
|
39
|
+
|
|
40
|
+
Esc on a parent interrupts every child, and until now the next turn was told to start them again.
|
|
41
|
+
That lost work that was saved on disk. Reopening a child's own history keeps every pin a run
|
|
42
|
+
already has, so no capability or account can change, and leaving the choice to the model keeps
|
|
43
|
+
INV-RUN-4.
|
|
44
|
+
|
|
45
|
+
## Consequences
|
|
46
|
+
|
|
47
|
+
The monitor stays a private, read-only terminal projection; no event or public method is added.
|
|
48
|
+
Records written before this change have no `model` or `effort`, and their rebuilt rows show `—`.
|
|
49
|
+
A person cannot continue a child from the page directly; they ask the parent.
|
package/docs/doctor.md
CHANGED
|
@@ -8,10 +8,23 @@ provider requests, token refreshes, browser launch, permission prompts or comput
|
|
|
8
8
|
pass does not establish live connectivity. Other accounts show their saved status and timestamp.
|
|
9
9
|
Providers without diagnostics report unverified. Disabled capabilities are not failures.
|
|
10
10
|
|
|
11
|
+
The shell check reports which `bash` the session would run and whether the platform's
|
|
12
|
+
write-boundary sandbox (sandbox-exec on macOS, bubblewrap on Linux) is installed, because a missing
|
|
13
|
+
backend stops every Bash call before the command starts. It runs nothing. On Windows it reports a
|
|
14
|
+
warning naming the shell (Git Bash or PowerShell) and that each command asks for approval, because
|
|
15
|
+
Windows has no write-boundary sandbox; the live shell check reports unverified there, since a
|
|
16
|
+
command would need a person to approve it.
|
|
17
|
+
|
|
11
18
|
Press `l` to choose live checks, then review the account/model, destinations, possible charges and
|
|
12
19
|
isolation notice. The model check makes one synthetic request with at most 64 output tokens;
|
|
13
20
|
usage appears on a separate diagnostic run. Web checks fetch example.com and search for “example
|
|
14
|
-
domain”.
|
|
21
|
+
domain”. The shell check runs one fixed command written by the harness (`printf`) in the working
|
|
22
|
+
folder through the same root, hard-link scan and write-boundary sandbox a normal Bash call uses, and
|
|
23
|
+
reports only the exit status: no model input is sent, no file is written and no network request is
|
|
24
|
+
made. A diagnostic never widens the boundary, so Full Permission cannot change its result; when the
|
|
25
|
+
boundary refuses before the shell starts (for example a hard-link alias in the workspace), the
|
|
26
|
+
finding is blocked with that reason instead of claiming the shell is broken. MCP checks
|
|
27
|
+
connect/list only. Browser checks use a disposable headless profile and an
|
|
15
28
|
offline synthetic page; configured CDP attachment is blocked. Computer input is blocked unless the
|
|
16
29
|
host supplies a disposable diagnostic surface; the current desktop host supplies readiness only.
|
|
17
30
|
|
package/docs/parity.md
CHANGED
|
@@ -22,22 +22,22 @@ implemented is not a parity claim; acceptance is tracked per command.
|
|
|
22
22
|
| Capability | Harness owner | Method or tool | Terminal surface | App surface | Status | Gap |
|
|
23
23
|
|---|---|---|---|---|---|---|
|
|
24
24
|
| Sessions and turns | `sessions/` | `sessions.run`, `terminal.*` | the terminal itself | Solo chat | parity | — |
|
|
25
|
-
| Plan mode | `sessions/planMode.ts` | `plan: true` | `/plan`, Shift+Tab, plan card; bounded plan/
|
|
25
|
+
| Plan mode | `sessions/planMode.ts` | `plan: true` | `/plan`, Shift+Tab, plan card; bounded plan/todo context is restored after compaction | plan request, PlanCard; shared Harness checkpoint behavior | parity | — |
|
|
26
26
|
| Capability discovery | `tools/getCapabilities.ts` | read-only `get_capabilities` | terminal extension reports Pi's active tools and schemas; shared plan allowlist includes it | structured Harness run uses the same tool; no duplicate App-owned tool | implemented; acceptance not recertified | — |
|
|
27
27
|
| Bash command mode | `sessions/sessions.ts`, `sessions/initialBash.ts` | `initialBashCommand`; Bash `workspaceWriteScope` | `!command` defaults to workspace; `!outside command` asks before running once | same `!command` and `!outside command` composer semantics | parity | — |
|
|
28
|
-
| Workspace-scoped writes | `core/workspace.ts`, `sessions/workspaceBoundary.ts`, `core/workspaceBashTool.ts`, `core/workspaceSandbox.ts`, `core/workspaceWriteOperations.ts` | pinned non-root `RunRecord.workspaceRoot`; native `edit`/`write`; Bash scope | revalidated atomic native writes; external-hard-link scan and Bash sandbox; complete escaped outside command in scrollable approval details (deny if too small); no output-triggered retry | same Harness gate and full approval action in scrollable App details; App policy can tighten scope; Full Permission remains the eligible explicit bypass | parity | — |
|
|
28
|
+
| Workspace-scoped writes | `core/workspace.ts`, `sessions/workspaceBoundary.ts`, `core/workspaceBashTool.ts`, `core/workspaceSandbox.ts`, `core/workspaceWriteOperations.ts` | pinned non-root `RunRecord.workspaceRoot`; native `edit`/`write`; Bash scope | revalidated atomic native writes; external-hard-link scan and Bash sandbox (Windows: no sandbox, each Bash call asks once, plan-mode Bash refused; ADR-0042); complete escaped outside command in scrollable approval details (deny if too small); no output-triggered retry | same Harness gate and full approval action in scrollable App details; App policy can tighten scope; Full Permission remains the eligible explicit bypass | parity | — |
|
|
29
29
|
| Side questions | `sessions/sideQuestions.ts` | `sideQuestions.start/read/interrupt`; terminal `terminal.sideQuestions.*` | `/btw` contextual dock with scroll and copy | side-question dock through the shared service | parity | — |
|
|
30
30
|
| Approvals and standing approvals | `sessions/approvals.ts` | `approvals.*` | decision dock, `/permissions` | approvals dock, settings | parity | — |
|
|
31
31
|
| Questions (`ask_user`) | `tools/askUser.ts` | shared `ask_user` tool | plan-mode dock: strict aligned columns, bounded body scroll, 80×24 source sketch viewport; connected structural projection with high-confidence boundary normalization (PROP-0026, PROP-0028) | plan-mode form accepts the same 80×24 ASCII source contract with literal preview and accessible overflow; no typography change required | parity; terminal projection verified in isolated fixtures | — |
|
|
32
|
-
| Subagents | `sessions/subagentService.ts` | `spawn_subagent` (requires `title`, PROP-0030), `subagents.*`; plan mode allows only named eligible read-only research profiles | `/subagents` page and live rows under the status line (mark, profile, parent-set title, `n of m tasks`); plan-mode research delegation uses the same Harness gate | reply trajectory; plan-mode research delegation uses the same Harness gate | parity | — |
|
|
32
|
+
| Subagents | `sessions/subagentService.ts` | `spawn_subagent` (requires `title`, PROP-0030; `continue` resumes a stopped child, ADR-0043), `subagents.*`; plan mode allows only named eligible read-only research profiles | `/subagents` page with the `main` row pinned first, and live rows under the status line (mark, profile, parent-set title, `n of m tasks`), both rebuilt from saved runs when a conversation reopens; plan-mode research delegation uses the same Harness gate | reply trajectory; plan-mode research delegation uses the same Harness gate | parity | — |
|
|
33
33
|
| Agent profiles | `agents/profiles.ts` | `spawn_subagent { agent }`, `agents.list/get/create/remove`; terminal `terminal.agents.*` | `/agents` page: browse, create, edit in `$EDITOR`, copy, delete | Solo `/agents` lists profiles; profile details and management are not wired | partial | PAR-010 |
|
|
34
|
-
| Run
|
|
34
|
+
| Run todo list | `tools/todo.ts` | `todo_write`, `runs.todo` (`runs.checklist` deprecated); terminal `todo` telemetry | registered in terminal sessions and their subagents; each write shows as a todo block in the transcript; `/todo` shows the current list; a subagent row shows its `n of m tasks` | `/todo` shows the current list on demand; each write is not rendered inline | terminal done; App shows it on demand | PAR-001 |
|
|
35
35
|
| Continuation of a stopped run | `sessions/continuation.ts` | `continueFrom`, `runs.continuation` | not offered (`/resume` reopens history only) | not offered | planned | PAR-003 |
|
|
36
36
|
| Bounded replies and checkpoints (PROP-0041) | `sessions/workSlice.ts`, `tools/checkpoint.ts`, `sessions/runner.ts` | `checkpoint_write`, `workSlice`, `runs.continuation.checkpoint`, `checkpoint`/`heartbeat` events | guard on every terminal reply with the shared tool; the handoff is recorded on the run; no checkpoint card or slice control yet | not wired | implemented; terminal card, App presentation and `/slices` open | PAR-004 |
|
|
37
37
|
| Accounts | `accounts/` | `accounts.*` | `/accounts` | Accounts | parity | — |
|
|
38
38
|
| Models and effort | `accounts/choices.ts` | — | `/model`, `/effort` | composer pickers | parity | — |
|
|
39
39
|
| Skills | `plugins/`, `tools/dispatch.ts` | `skill_load` | `$name`, `/skill:name`, browser Skills tab | Capability, composer | parity | — |
|
|
40
|
-
| Plugins and Hub | `plugins/`, `hub/` | `plugins.*`, `hub.*` |
|
|
40
|
+
| Plugins and Hub | `plugins/`, `hub/` | `plugins.*`, `hub.*` | full-screen `/plugins` local manager; separate full-screen `/hub` Community catalog with bounded registry/document Preview (no Pi-package Preview) | local Plugins manager; Community Hub with payload Preview for non-package entries | parity | — |
|
|
41
41
|
| Connected apps (MCP) | `mcp/` | `connections.*`, broker tools | resource browser Connections tab | Connections | parity | — |
|
|
42
42
|
| Web search and page reading | `web/` | `web_search`, `web_fetch` | world tools | world tools | parity | — |
|
|
43
43
|
| Isolated browser | `browser/` | shared `browser_*` schemas | isolated world tools, headed on request, `/settings` Browser tab | native WebKit: navigate, tabs, visible-text read and page scroll without refs; unsupported operations refuse explicitly | partial; native backend gap | PAR-015 |
|
|
@@ -92,13 +92,13 @@ this fixed table.
|
|
|
92
92
|
| `/connections` | Connections browser | Opens App connectors | Not certified per command |
|
|
93
93
|
| `/mcp` | Connections browser shortcut | Opens the same App connectors view | Not certified per command |
|
|
94
94
|
| `/tools` | Tools page | Opens Capability tools | Not certified per command |
|
|
95
|
-
| `/plugins` | Plugins
|
|
96
|
-
| `/hub` | Hub
|
|
95
|
+
| `/plugins` | Full-screen local Plugins manager | Opens local Plugins manager | Not certified per command |
|
|
96
|
+
| `/hub` | Separate full-screen Community Hub catalog | Opens Community Hub | Not certified per command |
|
|
97
97
|
| `/components` | Components browser | Opens App Harness components | Not certified per command |
|
|
98
98
|
| `/settings` | Terminal settings | Opens App settings | Not certified per command |
|
|
99
99
|
| `/doctor` | Doctor checks, including explicitly confirmed live probes | Runs local readiness checks only | Not certified; App route does not expose live checks |
|
|
100
100
|
| `/worktree` | Managed-worktree page and actions | Lists worktrees; Solo has no typed create/status/remove methods wired, and no worktree level | PAR-012; management actions unavailable; not certified |
|
|
101
|
-
| `/subagents` | Live monitor and roster | Opens latest run's trajectory, not a dedicated subagent roster | Not certified; surfaces differ |
|
|
101
|
+
| `/subagents` | Live monitor and roster with the `main` row, restored on reopen | Opens latest run's trajectory, not a dedicated subagent roster | Not certified; surfaces differ |
|
|
102
102
|
| `/agents` | Browse/create/edit/copy/delete profiles | Lists profiles only; detail/create/remove methods are not wired into Solo | PAR-010; management actions unavailable; not certified |
|
|
103
103
|
| `/log` | Harness diagnostics and current run events | Opens latest run's trajectory, not a separate log reader | Not certified; surfaces differ |
|
|
104
104
|
| `/hotkeys` | Keyboard controls | Opens App shortcut settings | Not certified per command |
|
|
@@ -116,7 +116,7 @@ or live-model sketch quality.
|
|
|
116
116
|
|
|
117
117
|
| ID | Gap | Planned change |
|
|
118
118
|
|---|---|---|
|
|
119
|
-
| PAR-001 |
|
|
119
|
+
| PAR-001 | Todo list not rendered inline in the App | Both surfaces can show the current list: the terminal renders each write as a todo block and `/todo` shows a snapshot; the App's `/todo` shows a read-only list. The App still does not draw an inline block for each write. |
|
|
120
120
|
| PAR-002 | Acceptance of terminal-model History/Wiki/skill tools | Source gap resolved: `Terminals.ownTools` registers History/trajectory, Wiki-read and skill tools over the session socket; `xagent-wiki` is a user-facing shell utility, not the model's only route. Acceptance has not been recertified in this documentation pass. |
|
|
121
121
|
| PAR-003 | Continuation unused | `/resume` lists interrupted runs and continues one with `continueFrom`; the App offers Continue. |
|
|
122
122
|
| PAR-004 | Refinement and adoption only in the App | Variant tab actions: start, candidates, adopt, trust. |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Xingular Harness 1.3.0
|
|
2
|
+
|
|
3
|
+
This minor release builds on 1.2.0 with clearer run progress, more reliable work-slice limits, bounded plan research, and distinct local-plugin and Community Hub experiences.
|
|
4
|
+
|
|
5
|
+
## Run progress and work slices
|
|
6
|
+
|
|
7
|
+
- `session_name` guidance names the session before the first tool call when a request needs tools or changes state. Multi-step work uses `todo_write`; the prompt and tool descriptions share the same concrete guidance.
|
|
8
|
+
- The run checklist is now a todo list: `todo_write`, `todo.updated`, `runs.todo`, the `todo` plugin and a terminal todo block. `/todo` displays the current list without a model request; `/checklist` remains an alias. Existing `checklist.updated` events are still read, and legacy pinned tools and server methods remain available as deprecated compatibility aliases for one release.
|
|
9
|
+
- Work slices default to 320 tool calls and 60 minutes, with no token cap unless configured. Stall detection recognizes meaningful progress, bounds repeated calls by name and arguments within each reply, and resets its counters between replies.
|
|
10
|
+
- Plan research can delegate only to named profiles whose effective tools and plugins qualify for read-only research. The active plan and latest todo list are restored after compaction.
|
|
11
|
+
|
|
12
|
+
## Plugins and Community Hub
|
|
13
|
+
|
|
14
|
+
- `/plugins` is a dedicated local plugin manager for installed packages, switching, trust, settings, install, update and removal. `/hub` is a separate Community catalog with Catalog and Installed views; Installed retains receipts from every channel and labels each channel.
|
|
15
|
+
- Hub shows cached or bundled catalog entries before refreshing remotely, and exposes origin, refresh time and stale/error status. Registry/document entries keep a bounded payload Preview; Pi packages have no payload Preview. Hub-owned packages remain pinned to receipt versions: removal is receipt-aware, and floating plugin updates cannot silently replace them.
|
|
16
|
+
- No catalog schema or storage migration is required; existing receipts, settings and trust remain intact. The broad `/harness` resource browser remains available.
|
|
17
|
+
|
|
18
|
+
## Terminal
|
|
19
|
+
|
|
20
|
+
- Skill completion and syntax highlighting distinguish enabled skill invocations, command names and arguments while retaining the existing composer workflow.
|
|
21
|
+
- Doctor's Bash readiness check now requires the platform write-boundary sandbox. Its live check runs one fixed, no-network command through the same workspace boundary as normal Bash, reports only the exit status, and stays subject to policy without being widened by Full Permission.
|
package/docs/releases/README.md
CHANGED
|
@@ -29,8 +29,8 @@ intentional 1.0.0 reset does not rewrite historical decisions or claim an orderi
|
|
|
29
29
|
|
|
30
30
|
## Historical 4.0.0 candidate evidence
|
|
31
31
|
|
|
32
|
-
The following report records a prior candidate and registry snapshot; it is not evidence for
|
|
33
|
-
|
|
32
|
+
The following report records a prior candidate and registry snapshot; it is not evidence for any
|
|
33
|
+
current candidate or a description of the current release gates.
|
|
34
34
|
|
|
35
35
|
At the time, local checks on that candidate source passed: Harness `npm run ci` (typecheck, 134 test
|
|
36
36
|
files with 1,004 passing tests and 3 skipped, plus the standalone proof); App typecheck, `npm test`
|
package/docs/terminal-tui.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Harness terminal frontend
|
|
2
2
|
|
|
3
|
-
Status: current terminal behavior, checked against `@xingular/harness` 1.
|
|
3
|
+
Status: current terminal behavior, checked against `@xingular/harness` 1.3.0. Last updated: 2026-11-19.
|
|
4
4
|
Decision: [ADR-0001](decisions/ADR-0001-owned-terminal.md),
|
|
5
5
|
[ADR-0006](decisions/ADR-0006-opentui-only-terminal.md),
|
|
6
6
|
[ADR-0009](decisions/ADR-0009-xharness-command.md),
|
|
@@ -93,9 +93,9 @@ The frontend is verified with a real isolated PTY and a loopback provider. Run
|
|
|
93
93
|
`python3 scripts/verify-terminal.py --welcome-only --sizes 40x20,80x24,120x40` to check the empty
|
|
94
94
|
welcome, product label, accent colors and `/help` transition. Run
|
|
95
95
|
`python3 scripts/verify-terminal.py --composer-only` for recognized slash-command colors in the composer
|
|
96
|
-
and a user bubble,
|
|
97
|
-
prompt gutters, and normal/plan/Bash mode exclusivity.
|
|
98
|
-
compact through wide layouts. Use `--dialog-paste-only` to verify bracketed paste into a centered
|
|
96
|
+
and a user bubble, enabled-skill colors in the composer, unknown-token and argument colors,
|
|
97
|
+
explicit-newline and soft-wrap checks of both prompt gutters, and normal/plan/Bash mode exclusivity.
|
|
98
|
+
Run it with `--sizes 40x20,80x24,120x40` for compact through wide layouts. Use `--dialog-paste-only` to verify bracketed paste into a centered
|
|
99
99
|
input dialog, `--file-completion-only` for filesystem completion and insertion,
|
|
100
100
|
`--history-only` for active-session history across `/new` and `/session`, `--resume-only` for the full-screen searchable, unnumbered two-line saved-session picker, `--help-only` for `/help` replacing the welcome screen with grouped two-column output that wraps without per-command gaps, `--questions-only` for multi-select marker glyphs, recommended choices,
|
|
101
101
|
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
|
|
@@ -124,16 +124,24 @@ and a searchable `/subagents` page. The rows poll a private monitor route once p
|
|
|
124
124
|
during a turn and make a final read at settlement. They sit one blank row below the status line, with
|
|
125
125
|
no heading, and each reads: the status mark, the agent profile name in its colour (`subagent` for a
|
|
126
126
|
copy of the parent), the title the parent gave the child (PROP-0030), and `n of m tasks` from the
|
|
127
|
-
child's own
|
|
127
|
+
child's own todo list. At most three show, active first, then `+N more · /subagents`. The
|
|
128
128
|
`/subagents` page uses a colored profile and normal-color title on the first line, then muted account,
|
|
129
129
|
effective model, effort and cumulative usage metadata on the second. One blank row separates each
|
|
130
130
|
two-line entry. The page also shows status, elapsed time and the latest tool name. Runtime metadata
|
|
131
131
|
stays in the private terminal projection.
|
|
132
132
|
Usage contains safe token/cache/cost/context totals, not per-request payloads or reasoning summaries.
|
|
133
133
|
The projection is read-only, flat across nested descendants, and scoped to the latest parent run in
|
|
134
|
-
this terminal session; finished rows remain visible until the next parent run starts.
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
this terminal session; finished rows remain visible until the next parent run starts. The page also
|
|
135
|
+
pins a `main` row for the parent run itself, with the same details; the rows under the status line
|
|
136
|
+
leave it out. Reopening a conversation (a new launch, `/resume`, or a switch) rebuilds the rows from
|
|
137
|
+
the branch's latest parent run and its saved child runs, with their final status, until the next run
|
|
138
|
+
starts. A switch to a conversation without one clears them, as does disposal. It never includes tool
|
|
139
|
+
arguments (beyond the title), output or todo item text.
|
|
140
|
+
|
|
141
|
+
An interrupted or failed child keeps its saved conversation. The next reply is told which children
|
|
142
|
+
stopped before it answers, and the parent continues one with `spawn_subagent { continue: <runId> }`,
|
|
143
|
+
which reopens that child's own history with its profile and tools (ADR-0043). Esc therefore does
|
|
144
|
+
not lose a child's progress.
|
|
137
145
|
|
|
138
146
|
`/agents` opens the Agents page (PROP-0029): built-in, global, project and variant profiles with
|
|
139
147
|
their tools, plugins, variant, model and instructions. Enter on a row edits a person's own profile
|
|
@@ -215,7 +223,7 @@ rule; then the work that followed. The summary is shown by default. Clicking eit
|
|
|
215
223
|
shows it, and Ctrl+O shows every summary again. On a narrow screen the rule drops the click hint, then
|
|
216
224
|
the token count. Earlier compactions in the same session keep their own rules and summary in place.
|
|
217
225
|
Notices stay after the message they followed. The model sees the summary and recent messages plus a
|
|
218
|
-
bounded, hidden checkpoint of the active request,
|
|
226
|
+
bounded, hidden checkpoint of the active request, todo list and plan instructions when available;
|
|
219
227
|
the checkpoint is regenerated for each post-compaction request until the run settles. The visible
|
|
220
228
|
transcript remains a presentation of the full history, not the model context.
|
|
221
229
|
Transcript entry ids follow positions in the displayed message list, so when a rebuilt list moves a
|
|
@@ -268,15 +276,20 @@ OSC 8 support. Inline and fenced code use a subtle panel fill with syntax colors
|
|
|
268
276
|
list markers, tables, dividers and task-list markers use the existing titanium palette. Images
|
|
269
277
|
display their alt text and are not fetched or rendered as image files.
|
|
270
278
|
|
|
271
|
-
##
|
|
279
|
+
## Todo block
|
|
272
280
|
|
|
273
|
-
`
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
281
|
+
`todo_write` is registered in terminal sessions (PAR-001). Each call renders in the transcript as
|
|
282
|
+
a todo block: a status mark, `Todo · n of m done`, then one line per item with `✓` (done, success
|
|
283
|
+
colour), `●` (in progress, warning yellow, bold) or `○` (pending, dim). Each row reserves a one-cell
|
|
284
|
+
status column and one-cell gap; item text and wrapped lines share the same starting column. A call
|
|
285
|
+
whose arguments are not a todo list, or that failed, stays an ordinary tool row. The prompt's
|
|
286
|
+
Progress group asks the model to keep the list current and write a final update before replying;
|
|
287
|
+
unfinished work remains unfinished rather than being marked complete.
|
|
288
|
+
|
|
289
|
+
`/todo` (alias `/checklist`) appends a snapshot of the current list: the same header and rows, with
|
|
290
|
+
no status mark on the header, because it is not a tool call. It reads the latest non-side-question
|
|
291
|
+
run of this terminal's native session and makes no model request; an empty list is a one-line
|
|
292
|
+
notice.
|
|
280
293
|
|
|
281
294
|
## Blocks and pages
|
|
282
295
|
|
|
@@ -301,20 +314,36 @@ frontends draw that field from the same muted-blue selection palette (`selection
|
|
|
301
314
|
explicit high-contrast text on it instead of the accent colour, so a choice reads the same in every
|
|
302
315
|
list. Rules use the theme's `warning` and `dim` colors, so a custom theme restyles them.
|
|
303
316
|
|
|
304
|
-
The Harness resource browser (PROP-0013) unifies Overview, Foundation, Variant, Skills,
|
|
305
|
-
Connections, Tools and Library. `/harness` opens Overview; `/skills`, `/
|
|
306
|
-
(`/mcp`) and `/
|
|
307
|
-
|
|
317
|
+
The broad Harness resource browser (PROP-0013) unifies Overview, Foundation, Variant, Skills,
|
|
318
|
+
Plugins, Connections, Tools and Library. `/harness` opens Overview; `/skills`, `/connections`
|
|
319
|
+
(`/mcp`), `/tools` and `/components` open sections. `/plugins` is a separate
|
|
320
|
+
full-screen local manager with Plugins, Trust and Packages tabs; `/hub` is a separate
|
|
321
|
+
full-screen Community catalog with Catalog and Installed tabs. Both keep a searchable
|
|
322
|
+
inventory beside selected-item details on wide terminals, stacking details below the list
|
|
323
|
+
on compact terminals. The existing Accounts, Permissions, Settings, Trajectory and Log
|
|
324
|
+
pages retain their own tabs.
|
|
308
325
|
|
|
309
326
|
`/settings` includes a Browser tab with the device-local **Private address access** setting. It is
|
|
310
327
|
off by default. Enabling it asks for confirmation and allows agent browsing and annotation capture
|
|
311
328
|
to reach localhost and private networks.
|
|
312
329
|
|
|
313
|
-
|
|
314
|
-
resources; current-session availability comes only from the runtime
|
|
315
|
-
Discover uses the
|
|
316
|
-
No matching
|
|
317
|
-
The view preserves search across source switches and restores section selection
|
|
330
|
+
Within the broad `/harness` browser, resource sections share Installed/Discover and source filters.
|
|
331
|
+
Installed includes locally present resources; current-session availability comes only from the runtime
|
|
332
|
+
loader and active tool registry. Discover uses the unfiltered Hub service with All/Community/Official
|
|
333
|
+
filters and an explicit refresh. No matching Community entries is an empty result, never replaced with
|
|
334
|
+
built-in resources. The view preserves search across source switches and restores section selection.
|
|
335
|
+
|
|
336
|
+
The dedicated `/hub` Catalog shows Community entries across supported types only. Its Installed tab
|
|
337
|
+
shows receipts from every channel with the channel labeled. On each page entry, cached/bundled entries
|
|
338
|
+
appear first, then the remote catalog refreshes; the status keeps the origin, last-refresh time and any
|
|
339
|
+
stale/error feedback visible. Manual refresh remains available. Catalog installs are pinned to the
|
|
340
|
+
selected version, and Hub uninstalls remove only receipt-owned resources. Registry/document entries
|
|
341
|
+
offer a bounded payload Preview; Pi packages have no JSON payload Preview.
|
|
342
|
+
|
|
343
|
+
The `/plugins` manager keeps local switching, code trust and settings separate from public discovery.
|
|
344
|
+
Its Packages tab adds local package installation, update and removal. Hub-owned packages remain pinned
|
|
345
|
+
to exact catalog versions; removal goes through Hub receipt cleanup, and updating requires an explicit
|
|
346
|
+
Hub version replacement.
|
|
318
347
|
|
|
319
348
|
The browser fills the terminal (PROP-0014), with Overview, Foundation, Variant, Skills, Plugins,
|
|
320
349
|
Connections, Tools and Library as persistent top tabs. The section dropdown and sidebar are removed.
|
|
@@ -329,8 +358,8 @@ Left/Right changes the focused tab or control; Enter on the tab strip returns to
|
|
|
329
358
|
Ctrl+F focuses search. Escape returns from content to actions, returns to the list, clears search,
|
|
330
359
|
then closes. Mouse clicks select tabs directly, activate resource actions and focus filters;
|
|
331
360
|
wheel scrolling targets the list or inspector under the pointer. Other command pages keep their
|
|
332
|
-
centered presentation; `/settings` and `/
|
|
333
|
-
the composer draft and attachments.
|
|
361
|
+
centered presentation; `/settings`, `/accounts`, `/plugins` and `/hub` use full-screen page layouts.
|
|
362
|
+
Closing the browser preserves the composer draft and attachments.
|
|
334
363
|
|
|
335
364
|
Foundation explains fixed runtime ownership; it is read-only. Variant shows c1–c8 with the
|
|
336
365
|
prepared version and current head separately. It previews pinned files from the preparation
|
|
@@ -384,16 +413,21 @@ Use `/plan <brief>` for one read-only planning request. A plan waits outside Pi'
|
|
|
384
413
|
queue until the active response settles, then runs by itself. Later messages remain behind it, even
|
|
385
414
|
when Pi's follow-up mode is `all`. During that run the session narrows to read-only inspection
|
|
386
415
|
(`read`, `grep`, `find`, `ls`), web search/page reading, questions (`ask_user`, `ask_user_question`)
|
|
387
|
-
and recall (history and Wiki reads, `memory_facts`).
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
416
|
+
and recall (history and Wiki reads, `memory_facts`). The parent may also run Bash in the
|
|
417
|
+
OS-enforced read-only sandbox: no network and no writes except a discarded per-command temporary
|
|
418
|
+
directory (PROP-0043). It may delegate bounded research to a named profile whose effective tool and
|
|
419
|
+
plugin allowlists qualify for research; the child inherits plan mode and receives only the
|
|
420
|
+
intersection of the parent's frozen capabilities, profile and plan-research set. Children cannot
|
|
421
|
+
write, run commands, ask the user, use connectors or spawn more children; they remain bounded by the
|
|
422
|
+
configured work-slice policy without gaining `checkpoint_write`, and the Harness records an
|
|
423
|
+
evidence-derived checkpoint if the child stops at a boundary. Normal mode omits both question tools
|
|
424
|
+
from the active set; the plan request enables registered questions and research delegation
|
|
425
|
+
temporarily and restores the normal set when it settles, including on failure or interruption.
|
|
426
|
+
Providers may mark individual calls as safe for research; every other call is blocked before
|
|
427
|
+
approval. Edits, writes, memory writes and connected-app tools remain unavailable to parent and
|
|
428
|
+
child; generic browser controls are also blocked. Sandboxed read-only Bash is the parent's only
|
|
429
|
+
plan-mode shell exception; children cannot run commands. The plan instructions arrive as a
|
|
430
|
+
request-scoped prompt section, which the next ordinary request withdraws.
|
|
397
431
|
|
|
398
432
|
Each mode keeps its own model and effort for the account. Every selection the person makes (the model
|
|
399
433
|
picker, `/effort`, Shift+Up/Down, Ctrl+P) is saved against the mode it was made in, so Shift+Tab switches to that
|
|
@@ -699,12 +733,16 @@ normal-color title and a muted second line with relative activity time, `<projec
|
|
|
699
733
|
file size separated by ` · `. One blank line separates each session. Enter resumes the selected
|
|
700
734
|
session; account and folder scope checks
|
|
701
735
|
remain enforced. Supplying an explicit path continues directly without opening the picker.
|
|
702
|
-
The
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
736
|
+
The `$` palette completes enabled skill invocations using the same two-column palette as slash
|
|
737
|
+
commands; `/skills` always browses skills. Choosing a skill inserts `$name ` without submitting.
|
|
738
|
+
A recognized leading `$name` uses the blue accent in the composer, while its arguments, unavailable
|
|
739
|
+
names and ordinary currency text keep the normal color. `/help` renders the command list as one
|
|
740
|
+
transcript entry, grouped under Core, Run, Model, Session, Inspect, Harness, Plugins and Prompts;
|
|
741
|
+
command names and descriptions wrap in aligned columns, with no blank rows between choices. `/plugins`
|
|
742
|
+
opens the focused local manager; its Packages tab installs, updates and removes packages with protected
|
|
743
|
+
Harness operations. Settings use `plugins.configure`; on/off settings and bounded whole-number settings
|
|
744
|
+
keep their existing ranges. Saved settings are read when the plugin next uses them and do not require a
|
|
745
|
+
restart. The standalone
|
|
708
746
|
terminal no longer has separate `/login`, `/trust`, `/bug`, `/changelog`, `/share`, `/scoped-mode` or
|
|
709
747
|
`/import` commands. `/btw <question>` (or `/side <question>`) starts a separate Harness run with the
|
|
710
748
|
main run's effective instructions, visible conversation and redacted public tool inputs/results.
|
|
@@ -894,8 +932,9 @@ inherit that retained ledger.
|
|
|
894
932
|
|
|
895
933
|
## Agent-managed session names
|
|
896
934
|
|
|
897
|
-
Agents can use `session_name({ name: string })` to name
|
|
898
|
-
|
|
935
|
+
Agents can use `session_name({ name: string })` to name work before their first other tool call
|
|
936
|
+
when a request needs tools or changes state, and revise the name only when the objective changes.
|
|
937
|
+
Names submitted by agents are short imperative
|
|
899
938
|
sentences with at most six words. The agent may revise a manual name; `/name` remains
|
|
900
939
|
available and manual names have no new word limit. Pi stores the name in native history,
|
|
901
940
|
so resuming the same conversation restores it without another model request.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xingular/harness",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1-unstable.0",
|
|
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": {
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { type ChecklistItem, type RunEvent } from "../sessions/contracts.js";
|
|
2
|
-
import type { ActiveRun } from "../sessions/registry.js";
|
|
3
|
-
import type { ToolSpec } from "./types.js";
|
|
4
|
-
export declare const CHECKLIST_WRITE = "checklist_write";
|
|
5
|
-
/** The checklist as the model reads it back. */
|
|
6
|
-
export declare function describeChecklist(items: readonly ChecklistItem[]): string;
|
|
7
|
-
/** The latest checklist a run wrote, or an empty list. */
|
|
8
|
-
export declare function checklistOf(events: readonly RunEvent[]): ChecklistItem[];
|
|
9
|
-
export declare function checklistTool(run: Pick<ActiveRun, 'emit'>): ToolSpec;
|