@xingular/harness 1.2.0 → 1.3.1-unstable.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 +63 -0
- package/README.md +26 -17
- package/builtin/skills/plugin-authoring/SKILL.md +34 -0
- package/dist/cli.js +7362 -6239
- 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 +16 -4
- package/dist/sdk/agents/profiles.js +75 -12
- package/dist/sdk/annotations/bridge.d.ts +2 -0
- package/dist/sdk/annotations/bridge.js +4 -0
- package/dist/sdk/annotations/capture.d.ts +44 -2
- package/dist/sdk/annotations/capture.js +104 -3
- package/dist/sdk/annotations/delivery.d.ts +24 -17
- package/dist/sdk/annotations/delivery.js +82 -49
- package/dist/sdk/annotations/inspect.js +7 -6
- package/dist/sdk/annotations/pageScript.js +4 -4
- package/dist/sdk/annotations/part.d.ts +0 -2
- package/dist/sdk/annotations/part.js +4 -33
- package/dist/sdk/annotations/queue.d.ts +2 -2
- package/dist/sdk/annotations/queue.js +12 -7
- package/dist/sdk/annotations/serverMethods.js +11 -7
- package/dist/sdk/annotations/store.d.ts +13 -21
- package/dist/sdk/annotations/store.js +47 -37
- package/dist/sdk/capabilities/runSnapshot.js +10 -4
- package/dist/sdk/commands/list.js +2 -0
- package/dist/sdk/commands/registry.d.ts +11 -3
- package/dist/sdk/commands/registry.js +3 -2
- package/dist/sdk/core/links.d.ts +51 -0
- package/dist/sdk/core/links.js +155 -0
- 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/harness.d.ts +5 -0
- package/dist/sdk/harness.js +11 -6
- package/dist/sdk/hub/hub.js +5 -3
- package/dist/sdk/index.d.ts +3 -2
- package/dist/sdk/index.js +2 -1
- package/dist/sdk/plugins/builtin.js +14 -9
- package/dist/sdk/plugins/builtinRegistry.d.ts +3 -1
- package/dist/sdk/plugins/builtinRegistry.js +9 -3
- package/dist/sdk/plugins/discover.d.ts +7 -1
- package/dist/sdk/plugins/discover.js +41 -2
- package/dist/sdk/plugins/identity.js +1 -1
- package/dist/sdk/plugins/install.d.ts +6 -2
- package/dist/sdk/plugins/install.js +29 -5
- package/dist/sdk/plugins/inventory.js +3 -3
- package/dist/sdk/plugins/manifest.d.ts +2 -0
- package/dist/sdk/plugins/manifest.js +21 -4
- package/dist/sdk/plugins/plugins.d.ts +2 -0
- package/dist/sdk/plugins/plugins.js +1 -0
- package/dist/sdk/plugins/proposals.d.ts +17 -0
- package/dist/sdk/plugins/proposals.js +147 -0
- package/dist/sdk/plugins/types.d.ts +1 -1
- package/dist/sdk/plugins/types.js +1 -1
- package/dist/sdk/prompt/compile.d.ts +13 -4
- package/dist/sdk/prompt/compile.js +46 -20
- package/dist/sdk/prompt/standard.d.ts +1 -1
- package/dist/sdk/prompt/standard.js +1 -1
- package/dist/sdk/server/methods.js +14 -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/sessionState.d.ts +13 -0
- package/dist/sdk/sessions/sessionState.js +31 -0
- package/dist/sdk/sessions/sessions.d.ts +7 -0
- package/dist/sdk/sessions/sessions.js +73 -15
- package/dist/sdk/sessions/subagentService.d.ts +15 -0
- package/dist/sdk/sessions/subagentService.js +195 -55
- 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.d.ts +2 -0
- package/dist/sdk/terminal/opentui/theme.js +2 -0
- package/dist/sdk/terminal/piExtension.js +98 -15
- package/dist/sdk/terminal/subagentMonitor.d.ts +17 -4
- package/dist/sdk/terminal/subagentMonitor.js +29 -8
- package/dist/sdk/terminal/terminals.d.ts +16 -0
- package/dist/sdk/terminal/terminals.js +130 -26
- package/dist/sdk/terminal/trajectory.d.ts +6 -1
- package/dist/sdk/terminal/trajectory.js +8 -0
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +5 -1
- package/dist/sdk/terminal/tui/annotateCommand.js +21 -7
- package/dist/sdk/terminal/tui/annotateSend.d.ts +30 -0
- package/dist/sdk/terminal/tui/annotateSend.js +40 -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.d.ts +1 -1
- package/dist/sdk/terminal/tui/commandPages.js +16 -11
- package/dist/sdk/terminal/tui/commands.d.ts +4 -0
- package/dist/sdk/terminal/tui/commands.js +12 -2
- package/dist/sdk/terminal/tui/dialogs.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +3 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +25 -7
- package/dist/sdk/terminal/tui/pages/agentsPage.js +5 -2
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +70 -16
- package/dist/sdk/terminal/tui/pages/annotatePage.js +349 -115
- 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 +14 -1
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +295 -25
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +8 -5
- package/dist/sdk/terminal/tui/pages/usagePage.d.ts +4 -2
- package/dist/sdk/terminal/tui/pages/usagePage.js +39 -12
- package/dist/sdk/terminal/tui/pluginCommands.d.ts +1 -1
- package/dist/sdk/terminal/tui/pluginCommands.js +13 -3
- package/dist/sdk/tools/defaultSkills.d.ts +4 -0
- package/dist/sdk/tools/defaultSkills.js +20 -0
- package/dist/sdk/tools/definitions.d.ts +3 -1
- package/dist/sdk/tools/definitions.js +17 -1
- package/dist/sdk/tools/dispatch.js +12 -0
- package/dist/sdk/tools/harnessTools.js +1 -1
- package/dist/sdk/tools/sessionName.d.ts +9 -0
- package/dist/sdk/tools/sessionName.js +58 -11
- 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/sdk/world/world.d.ts +0 -2
- package/dist/terminal-opentui.js +3331 -1584
- package/dist/terminal-pi.js +421 -133
- package/docs/README.md +3 -0
- 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 +73 -36
- package/docs/architecture/03-variants.md +1 -3
- package/docs/architecture/04-prompt.md +24 -13
- package/docs/architecture/06-plugins-and-capabilities.md +46 -10
- package/docs/architecture/07-tools-and-gate.md +49 -8
- package/docs/architecture/09-accounts-and-connectors.md +8 -2
- package/docs/architecture/10-server-protocol.md +68 -16
- package/docs/architecture/11-terminal.md +94 -45
- package/docs/architecture/12-storage.md +1 -0
- package/docs/architecture/13-world-tools.md +8 -6
- package/docs/architecture/14-surfaces-and-parity.md +4 -1
- package/docs/architecture/README.md +20 -18
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +2 -0
- package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +6 -2
- 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/PROP-0048-simple-annotate.md +85 -0
- package/docs/architecture/proposals/README.md +11 -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/decisions/ADR-0044-annotations-pending-or-sent.md +24 -0
- package/docs/decisions/ADR-0045-default-plugin-authoring-skill.md +9 -0
- package/docs/decisions/ADR-0046-hash-bound-plugin-proposals.md +20 -0
- package/docs/decisions/ADR-0047-links-open-with-the-os-handler.md +47 -0
- package/docs/doctor.md +14 -1
- package/docs/parity.md +16 -13
- package/docs/releases/1.3.0.md +21 -0
- package/docs/releases/1.3.1-unstable.1.md +8 -0
- package/docs/releases/README.md +9 -6
- package/docs/terminal-tui.md +127 -65
- package/package.json +1 -1
- package/dist/sdk/terminal/tui/pages/notesPage.d.ts +0 -75
- package/dist/sdk/terminal/tui/pages/notesPage.js +0 -201
- 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,11 @@ 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 |
|
|
80
|
+
| [PROP-0048](PROP-0048-simple-annotate.md) | One annotate page, two actions, and easy app attach | Implemented; ADR-0044 | PROP-0018, 07, 10, 11, 13, terminal-tui.md, parity.md | 2026-10-27 |
|
|
76
81
|
|
|
77
82
|
Numbers are four digits, start at `0001`, and are never reused.
|
|
78
83
|
|
|
@@ -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.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0044
|
|
3
|
+
title: An annotation is pending or sent; the agent's page-note tools are read-only
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-10-27
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-0044: An annotation is pending or sent
|
|
9
|
+
|
|
10
|
+
## Decision
|
|
11
|
+
|
|
12
|
+
- Every annotation a person makes in the inspector with a session is shared with that session at
|
|
13
|
+
once and is **pending** until sent. There is no queue to add to or take out of, and no "fixed"
|
|
14
|
+
state. Records written before keep working: `queued` reads as `pending`, `fixed` as `sent`.
|
|
15
|
+
- The popover has two actions, Annotate and Annotate & send. A send sends every pending note of
|
|
16
|
+
the session as one message, optionally followed by the person's request (`/annotate:submit`).
|
|
17
|
+
- `page_notes_mark_fixed` is removed. The agent reads annotations; only the person resolves them.
|
|
18
|
+
- A held-back send is retried while the session is still busy after a run ends.
|
|
19
|
+
- Built-in plugin commands may be `rootOnly`, so a namespace root is not listed twice.
|
|
20
|
+
|
|
21
|
+
## Why
|
|
22
|
+
|
|
23
|
+
People found three actions, a queue and a fix status too much to control, and the extra state is
|
|
24
|
+
what made sends fail silently. See [PROP-0048](../architecture/proposals/PROP-0048-simple-annotate.md).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# ADR-0045: Release-owned plugin-authoring skill
|
|
2
|
+
|
|
3
|
+
## Decision
|
|
4
|
+
|
|
5
|
+
Ship plugin-authoring guidance as an on-demand Harness resource, selected for both structured and terminal sessions without changing variant versions. A pinned variant's skill of the same name takes precedence. The release supplies the resource in the package; the normal skill loader and Pi resource loader expose it. The guidance grants no trust or permissions.
|
|
6
|
+
|
|
7
|
+
## Consequences
|
|
8
|
+
|
|
9
|
+
Existing variants receive the guidance without migration. Its release-owned content can change with the installed Harness version rather than with a variant fingerprint. Only its name and description are advertised until requested; the body does not enter the always-on variant text. Proposal creation and hash-bound review are separate from the skill and are recorded in [ADR-0046](ADR-0046-hash-bound-plugin-proposals.md).
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# ADR-0046: Hash-bound plugin proposal review
|
|
2
|
+
|
|
3
|
+
## Decision
|
|
4
|
+
|
|
5
|
+
Keep model-authored plugin proposals as inert, bounded text in the data root. The model may create
|
|
6
|
+
one through the gated `plugin_propose` tool; only a trusted caller may accept or reject it. Both
|
|
7
|
+
decisions require the hash of the current revalidated preview. The hash binds the name, description,
|
|
8
|
+
generated manifest and sorted file contents, not a person's identity or an authorization grant.
|
|
9
|
+
Acceptance publishes a new package switched off, does not run its code or grant trust, and refuses
|
|
10
|
+
an existing package name or identical already-trusted package code. Normal attachment, code trust,
|
|
11
|
+
capability and approval checks remain separate.
|
|
12
|
+
|
|
13
|
+
## Consequences
|
|
14
|
+
|
|
15
|
+
Reviewers can inspect exactly the content a decision names, and stale or already-decided reviews
|
|
16
|
+
are refused. Text can itself contain hostile instructions and may load when enabled without code
|
|
17
|
+
trust; review must cover every contribution. Proposal records, including rejected ones, remain in
|
|
18
|
+
the data root; device-local code trust remains in the state directory. This decision does not claim
|
|
19
|
+
that a terminal or host review UI exists. See [06 Plugins and capabilities](../architecture/06-plugins-and-capabilities.md),
|
|
20
|
+
[10 Server protocol](../architecture/10-server-protocol.md), and [PAR-017](../parity.md#gaps).
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0047
|
|
3
|
+
title: A link a person clicks opens with the system's own handler, through one allowlist
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-11-20
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-0047: A link a person clicks opens with the system's own handler
|
|
9
|
+
|
|
10
|
+
## Decision
|
|
11
|
+
|
|
12
|
+
- `core/links.ts` holds the one link policy: `linkTarget` classifies a target without touching the
|
|
13
|
+
filesystem (`http`/`https`, `mailto`, `file`, an absolute path, or a relative path under a
|
|
14
|
+
supplied base), and `openableTarget` checks what a path names before anything is launched.
|
|
15
|
+
- A path may be opened only when it is a regular file or a directory, is not an application bundle
|
|
16
|
+
or an installer, is not a launchable script kind (`.command`, `.sh`, `.bat`, `.pkg`, `.dmg`,
|
|
17
|
+
`.app`, …), and has no executable bit set. The last two matter because `xdg-open` runs an
|
|
18
|
+
executable file and `open` launches a bundle.
|
|
19
|
+
- The address reaches `open` (macOS), `xdg-open` (Linux and the BSDs) or `rundll32.exe
|
|
20
|
+
url.dll,FileProtocolHandler` (Windows) as one argument, never through a shell.
|
|
21
|
+
- `links.open` is a server method, so a host presents the same capability, and the terminal is the
|
|
22
|
+
reference surface: hovering a link recolours it, and the gesture the platform uses opens it —
|
|
23
|
+
Ctrl+click where a terminal reports the modifier, and the primary click on macOS, whose ⌘ the
|
|
24
|
+
terminal mouse protocol cannot carry. The opener is `HarnessOptions.linkOpener`, so a host with
|
|
25
|
+
its own native opener replaces the spawn and keeps the policy.
|
|
26
|
+
- A link is a person's action. Nothing here is in `HARNESS_TOOLS`, so the gate, standing approvals
|
|
27
|
+
and redaction are not involved, exactly as with `variants.save`.
|
|
28
|
+
- Both front ends show the hover state: the terminal repaints the hovered link's spans in
|
|
29
|
+
`theme.linkHover`, and the App uses the shared `--link-hover` token on `a:hover`. The App's
|
|
30
|
+
modifier is the platform's own: ⌘ on macOS, Ctrl elsewhere.
|
|
31
|
+
|
|
32
|
+
## Rationale
|
|
33
|
+
|
|
34
|
+
The terminal opened web links only, and the App opened web pages and stored documents in its
|
|
35
|
+
sidebar while silently swallowing everything else — `mailto:`, folders, relative paths and unknown
|
|
36
|
+
kinds. The allowlist existed three times (a terminal module, the App's TypeScript, and the App's
|
|
37
|
+
Rust), which is the drift the parity rules exist to prevent. One policy in the Harness, used by
|
|
38
|
+
both surfaces, is the smallest thing that makes a link behave the same everywhere.
|
|
39
|
+
|
|
40
|
+
## Consequences
|
|
41
|
+
|
|
42
|
+
A refused link is reported, never ignored: the terminal posts a notice and the App reports an
|
|
43
|
+
error. Opening a document still hands its bytes to whichever application the system has associated
|
|
44
|
+
with that kind, which is inherent to the request; the deny list and the executable-bit check are
|
|
45
|
+
the boundary, not a sandbox. A host that wants different kinds to open replaces `linkOpener`, and
|
|
46
|
+
an architecture change would be needed to let a model open a link on its own, because that would
|
|
47
|
+
put an operating-system action inside the gate's reach.
|
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,26 +22,28 @@ 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
|
+
| Opening a link | `core/links.ts` | `links.open`; `HarnessOptions.linkOpener` (ADR-0047) | hover shows the hand pointer and recolours the link, Ctrl+click (the primary click on macOS, whose ⌘ the mouse protocol cannot report) opens web, `mailto:`, file and folder targets with the system handler, a refused link posts a notice | ⌘-click on macOS and Ctrl+click elsewhere opens with the system handler, a plain click keeps the sidebar and falls back to the system for what it cannot show, `a:hover` uses `--link-hover` | implemented; acceptance not certified | — |
|
|
31
32
|
| 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 | — |
|
|
33
|
-
| Agent profiles | `agents/profiles.ts` | `spawn_subagent { agent }`, `agents.list/get/create/remove`; terminal `terminal.agents
|
|
34
|
-
| Run
|
|
33
|
+
| 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 | — |
|
|
34
|
+
| Agent profiles | `agents/profiles.ts` | `spawn_subagent { agent }`, `agents.list/get/create/remove`; terminal `terminal.agents.*`; package profiles through `Loading.profilePaths` | `/agents` page: browse, create, edit in `$EDITOR`, copy, delete; package profiles listed under "From a plugin" and switched on `/plugins` | Solo `/agents` lists profiles; profile details and management are not wired | partial | PAR-010 |
|
|
35
|
+
| 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
36
|
| Continuation of a stopped run | `sessions/continuation.ts` | `continueFrom`, `runs.continuation` | not offered (`/resume` reopens history only) | not offered | planned | PAR-003 |
|
|
36
37
|
| 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
38
|
| Accounts | `accounts/` | `accounts.*` | `/accounts` | Accounts | parity | — |
|
|
38
39
|
| Models and effort | `accounts/choices.ts` | — | `/model`, `/effort` | composer pickers | parity | — |
|
|
39
40
|
| Skills | `plugins/`, `tools/dispatch.ts` | `skill_load` | `$name`, `/skill:name`, browser Skills tab | Capability, composer | parity | — |
|
|
40
|
-
| Plugins and Hub | `plugins/`, `hub/` | `plugins.*`, `hub.*` |
|
|
41
|
+
| 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 | — |
|
|
42
|
+
| Plugin authoring and proposal review | `plugins/proposals.ts`, `tools/defaultSkills.ts` | `plugin_propose`, `plugins.proposals.*` | `/plugins` Proposals tab: preview, accept or reject | structured model tool and skill; review UI not implemented | partial; App review pending | PAR-017 |
|
|
41
43
|
| Connected apps (MCP) | `mcp/` | `connections.*`, broker tools | resource browser Connections tab | Connections | parity | — |
|
|
42
44
|
| Web search and page reading | `web/` | `web_search`, `web_fetch` | world tools | world tools | parity | — |
|
|
43
45
|
| 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 |
|
|
44
|
-
| Web annotations | `annotations/` (PROP-0017, PROP-0018, PROP-0038) | `annotations.*`, `annotations.capture.*`, `page_notes_*` | `/annotate:`
|
|
46
|
+
| Web annotations | `annotations/` (PROP-0017, PROP-0018, PROP-0038, PROP-0048) | `annotations.*`, `annotations.capture.*`, `page_notes_*` | `/annotate:` page (Annotate and All annotations tabs; DevTools app list and launch), `/annotate:notes`, `/annotate:submit`, `/annotate:clear` | website tab Annotate panel (inspector, queue to the focused thread, app windows through `annotations.capture.*`) | App behind PROP-0048 (queue methods removed); native WKWebView gestures unaccepted | PAR-011 |
|
|
45
47
|
| Managed worktrees | `worktrees/` (PROP-0016) | `worktrees.*` | `--worktree`, `/worktree`, `xagent worktree` | Solo `/worktree` lists records only; Solo starts sessions in the project folder and has no worktree level | partial | PAR-012 |
|
|
46
48
|
| Wiki notes (model tools) | `wiki/`, `tools/` | `wiki_*` | `Terminals.ownTools` registers Wiki-read tools through the session socket; `xagent-wiki` remains a person-facing shell utility | structured Harness tools | implemented on both; acceptance not recertified | PAR-002: acceptance not recertified |
|
|
47
49
|
| History and trajectory (model tools) | `history/` | `history_*`, `trajectory_*` | `Terminals.ownTools` registers model tools through the session socket; `/trajectory` page; `/history` navigates session branches | structured tools and trajectory views | implemented on both; acceptance not recertified | PAR-002: acceptance not recertified |
|
|
@@ -51,7 +53,7 @@ implemented is not a parity claim; acceptance is tracked per command.
|
|
|
51
53
|
| Doctor | `doctor/` | `doctor.*` | `/doctor` | diagnostics | parity | — |
|
|
52
54
|
| Run inspection | `sessions/runStore.ts` | `runs.*` | `/trajectory`, `/log` | run views, analytics | parity | — |
|
|
53
55
|
| Usage analytics | `usage/` (PROP-0042) | `usage.summary`, `usage.sync` | `/usage:`, `/usage:analysis` page (Analysis tab) | not wired | terminal implemented; host planned | PAR-016 |
|
|
54
|
-
| Provider limits | `usage/limits/` (PROP-0042) | `usage.limits` | `/usage:limit`
|
|
56
|
+
| Provider limits | `usage/limits/` (PROP-0042) | `usage.limits` | `/usage:limit` (current account), `/usage:accounts` (all accounts) | not wired | terminal implemented; host planned | PAR-016 |
|
|
55
57
|
| Session catalog (sessions per folder) | `sessions/` saved-history controls; shared catalog not implemented | `sessions.*` controls; no cross-surface catalog method | `/session` selects native Pi histories in the current folder | `/session` reads `bridge.agent.threads(SOLO_ID)`, maps each thread to its project folder, and filters by current effective account; `all` broadens only this App list | planned; catalogs differ | PAR-008 |
|
|
56
58
|
| Folder choice and recent folders | project/worktree selection remains surface-specific | launch `cwd`, `--worktree`, `/worktree` | starts in launch folder; explicit worktree commands | Solo sidebar is Project › Session; new sessions use the project's folder, with no folder/worktree level | planned; no shared recent-folder picker | PAR-009 |
|
|
57
59
|
| Computer control | — | `computer_*` (host tools) | unavailable, with reason | macOS bridge (host-backed) | host-backed | PAR-007 |
|
|
@@ -92,13 +94,13 @@ this fixed table.
|
|
|
92
94
|
| `/connections` | Connections browser | Opens App connectors | Not certified per command |
|
|
93
95
|
| `/mcp` | Connections browser shortcut | Opens the same App connectors view | Not certified per command |
|
|
94
96
|
| `/tools` | Tools page | Opens Capability tools | Not certified per command |
|
|
95
|
-
| `/plugins` | Plugins
|
|
96
|
-
| `/hub` | Hub
|
|
97
|
+
| `/plugins` | Full-screen local Plugins manager | Opens local Plugins manager | Not certified per command |
|
|
98
|
+
| `/hub` | Separate full-screen Community Hub catalog | Opens Community Hub | Not certified per command |
|
|
97
99
|
| `/components` | Components browser | Opens App Harness components | Not certified per command |
|
|
98
100
|
| `/settings` | Terminal settings | Opens App settings | Not certified per command |
|
|
99
101
|
| `/doctor` | Doctor checks, including explicitly confirmed live probes | Runs local readiness checks only | Not certified; App route does not expose live checks |
|
|
100
102
|
| `/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 |
|
|
103
|
+
| `/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
104
|
| `/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
105
|
| `/log` | Harness diagnostics and current run events | Opens latest run's trajectory, not a separate log reader | Not certified; surfaces differ |
|
|
104
106
|
| `/hotkeys` | Keyboard controls | Opens App shortcut settings | Not certified per command |
|
|
@@ -116,7 +118,8 @@ or live-model sketch quality.
|
|
|
116
118
|
|
|
117
119
|
| ID | Gap | Planned change |
|
|
118
120
|
|---|---|---|
|
|
119
|
-
| PAR-
|
|
121
|
+
| PAR-017 | Plugin proposal review surfaces | The terminal provides hash-bound review in `/plugins`; the App has no proposal review UI yet. |
|
|
122
|
+
| 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
123
|
| 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
124
|
| PAR-003 | Continuation unused | `/resume` lists interrupted runs and continues one with `continueFrom`; the App offers Continue. |
|
|
122
125
|
| PAR-004 | Refinement and adoption only in the App | Variant tab actions: start, candidates, adopt, trust. |
|
|
@@ -126,7 +129,7 @@ or live-model sketch quality.
|
|
|
126
129
|
| PAR-008 | Separate session catalogs | Proposal approved; shared catalog is not implemented. Terminal `/session` selects native Pi history in the current folder. App `/session` reads Solo `agent.threads`, maps threads through Solo project groups, and filters to the current effective account and folder; `/session all` broadens only within that App catalog. It cannot open an arbitrary native session path. No cross-surface catalog or visibility guarantee exists. |
|
|
127
130
|
| PAR-009 | Shared folder/recent-project choice | Terminal starts from its launch `cwd` and can switch through its worktree surface. App Solo uses Project › Session and starts new sessions in the selected project's folder; it has no folder/worktree level or shared recent-folder picker. |
|
|
128
131
|
| PAR-010 | Agent profile management in Solo | App Solo `/agents` can list profiles. Although the renderer allowlist includes `agents.get`, Solo does not wrap it; `agents.create/remove` are not exposed there. Profile details and management actions are unavailable, unlike terminal `/agents`. |
|
|
129
|
-
| PAR-011 | Web annotations | Harness, terminal and App source done (PROP-0017, PROP-0018, 2026-10-24): the App calls `annotations.*`, imports its old notes once, uses the `page_notes_*` tools, and has the Annotate panel. Open: acceptance of the inspector and selection gestures in the running App's WKWebView. PROP-0038 (2026-10-25): both front ends share the page helper, so open shadow roots work in the terminal's capture browser and the App's tabs alike; composed text capture, save, resolve and reveal were exercised in an isolated App WKWebView, inspector clicks were not. |
|
|
132
|
+
| PAR-011 | Web annotations | Harness, terminal and App source done (PROP-0017, PROP-0018, 2026-10-24): the App calls `annotations.*`, imports its old notes once, uses the `page_notes_*` tools, and has the Annotate panel. Open: acceptance of the inspector and selection gestures in the running App's WKWebView. PROP-0038 (2026-10-25): both front ends share the page helper, so open shadow roots work in the terminal's capture browser and the App's tabs alike; composed text capture, save, resolve and reveal were exercised in an isolated App WKWebView, inspector clicks were not. PROP-0048 (2026-10-27): Harness and terminal moved to pending/sent with two popover actions, send-all with an optional request, clear, read-only page-note tools, and DevTools app discovery and launch; the App's Annotate panel still uses the removed queue methods and must follow. |
|
|
130
133
|
| PAR-012 | Managed worktree management in Solo | Harness and terminal provide full worktree operations (PROP-0016). Solo `/worktree` lists records only: its renderer adapter does not wire typed `worktrees.create`, `status` or `remove` calls, and Solo session creation stays at the project folder with no worktree level. Handoff, branch, prune, restore and setup-trust actions are also absent from this Solo surface. |
|
|
131
134
|
| PAR-013 | Expanded question wireframes and terminal layout | Closed by [PROP-0025 verification](evidence/terminal-question-wireframes/README.md): four-size production PTY acceptance covers aligned compact columns, body scrolling, pinned controls, Shift+arrow sketch panning and live resizing. Host contracts accept 80×24 literal ASCII sketches (1,943 bytes); six isolated browser tests include exact-boundary content, accessible overflow and unchanged selection/answers. This is controlled fixture acceptance, not live-provider or native Tauri evidence. |
|
|
132
135
|
| PAR-014 | Connected terminal sketch display | Closed by [PROP-0026 verification](evidence/terminal-connected-sketches/README.md) and extended by [PROP-0028 verification](evidence/terminal-wireframe-normalization/README.md): production PTY fixtures cover connected corners/tees, title-bearing rules, missing and whitespace-shifted side edges, internal table widths, frame-attached dividers, resize/panning and unchanged raw persistence/answers. Harness and host checks passed. Host literal rendering remains permitted; no host implementation change was required. This is fixture verification, not an every-font or live-model guarantee. |
|
|
@@ -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.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Xingular Harness 1.3.1-unstable.1
|
|
2
|
+
|
|
3
|
+
Unstable preview of the current Harness work. Install with `npm install @xingular/harness@unstable`.
|
|
4
|
+
|
|
5
|
+
- Import agent profiles from compatible plugins and continue stopped subagents across interruptions and restarts.
|
|
6
|
+
- Improve Windows shell, workspace write and edit support, with explicit per-call approval where an OS write-boundary sandbox is unavailable.
|
|
7
|
+
- Extend Doctor to check the active shell and exercise its workspace boundary with a fixed, no-network probe.
|
|
8
|
+
- Improve terminal subagent progress and plugin management, plus work-slice and plan-research behavior.
|
package/docs/releases/README.md
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
1. Review and commit the completed Harness changes on the active release branch. Review App
|
|
4
4
|
compatibility changes separately. Preserve old tags and exclude outputs, external references,
|
|
5
|
-
and caches.
|
|
5
|
+
and caches. Stable versions use `X.Y.Z`; unstable previews use `X.Y.Z-unstable.N` and publish
|
|
6
|
+
to npm's `unstable` dist-tag. Use a new, unused version for every publication.
|
|
6
7
|
2. Run `npm run ci` and the required App checks. Require green CI on Ubuntu and macOS; install Bun
|
|
7
8
|
1.4.2 and use Node 22.19.0. Do not waive failing checks.
|
|
8
9
|
3. Run `npm run release:pack` and inspect the candidate inventory, SHA-256 and npm integrity. Run
|
|
9
10
|
`npm run release:smoke -- <tarball> --terminal` for a fresh-install SDK/server/terminal check;
|
|
10
|
-
`--offline` is only a local smoke check, not fresh-install acceptance.
|
|
11
|
+
`--offline` is only a local smoke check, not fresh-install acceptance. Unstable candidates go
|
|
12
|
+
through the same checks as stable releases.
|
|
11
13
|
4. Run `npm run release:preflight`. Verify npm scope ownership and trusted-publisher settings for
|
|
12
14
|
`tanntnny/xingular-harness` and `release.yml`, with direct publishing enabled. Configure the
|
|
13
15
|
GitHub `npm-publish` environment with required reviewers. No login is started automatically; an
|
|
@@ -20,8 +22,9 @@
|
|
|
20
22
|
the protected `npm-publish` environment, compare the uploaded candidate's commit, SHA-256 and npm
|
|
21
23
|
integrity with the approved local candidate; stop if they differ. This environment approval is a
|
|
22
24
|
separate publication gate. The publish job publishes that same tarball with OIDC provenance and
|
|
23
|
-
`--tag latest
|
|
24
|
-
|
|
25
|
+
`--tag latest` for stable versions or `--tag unstable` for unstable previews, then verifies the
|
|
26
|
+
matching registry dist-tag, integrity and provenance and creates a GitHub release (marked
|
|
27
|
+
prerelease for unstable versions). No local publishing token is needed. Inspect registry state before retrying any failed publication.
|
|
25
28
|
|
|
26
29
|
A published version cannot be replaced. Corrections require a later version. This package's
|
|
27
30
|
intentional 1.0.0 reset does not rewrite historical decisions or claim an ordering above older
|
|
@@ -29,8 +32,8 @@ intentional 1.0.0 reset does not rewrite historical decisions or claim an orderi
|
|
|
29
32
|
|
|
30
33
|
## Historical 4.0.0 candidate evidence
|
|
31
34
|
|
|
32
|
-
The following report records a prior candidate and registry snapshot; it is not evidence for
|
|
33
|
-
|
|
35
|
+
The following report records a prior candidate and registry snapshot; it is not evidence for any
|
|
36
|
+
current candidate or a description of the current release gates.
|
|
34
37
|
|
|
35
38
|
At the time, local checks on that candidate source passed: Harness `npm run ci` (typecheck, 134 test
|
|
36
39
|
files with 1,004 passing tests and 3 skipped, plus the standalone proof); App typecheck, `npm test`
|