@xingular/harness 1.0.0 → 1.2.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 +46 -5
- package/README.md +75 -21
- package/dist/cli.js +17421 -8711
- package/dist/sdk/accounts/accounts.d.ts +27 -3
- package/dist/sdk/accounts/accounts.js +78 -24
- package/dist/sdk/accounts/secrets.d.ts +12 -0
- package/dist/sdk/accounts/secrets.js +114 -7
- package/dist/sdk/accounts/store.d.ts +26 -1
- package/dist/sdk/accounts/store.js +1 -1
- package/dist/sdk/agents/builtin.d.ts +2 -0
- package/dist/sdk/agents/builtin.js +48 -0
- package/dist/sdk/agents/narrow.d.ts +13 -0
- package/dist/sdk/agents/narrow.js +29 -0
- package/dist/sdk/agents/planResearch.d.ts +5 -0
- package/dist/sdk/agents/planResearch.js +19 -0
- package/dist/sdk/agents/profiles.d.ts +81 -0
- package/dist/sdk/agents/profiles.js +226 -0
- package/dist/sdk/annotations/bridge.d.ts +42 -0
- package/dist/sdk/annotations/bridge.js +264 -0
- package/dist/sdk/annotations/capture.d.ts +116 -0
- package/dist/sdk/annotations/capture.js +308 -0
- package/dist/sdk/annotations/delivery.d.ts +72 -0
- package/dist/sdk/annotations/delivery.js +130 -0
- package/dist/sdk/annotations/inspect.d.ts +10 -0
- package/dist/sdk/annotations/inspect.js +33 -0
- package/dist/sdk/annotations/isolated.d.ts +6 -0
- package/dist/sdk/annotations/isolated.js +51 -0
- package/dist/sdk/annotations/pageScript.d.ts +28 -0
- package/dist/sdk/annotations/pageScript.js +871 -0
- package/dist/sdk/annotations/part.d.ts +10 -0
- package/dist/sdk/annotations/part.js +155 -0
- package/dist/sdk/annotations/queue.d.ts +4 -0
- package/dist/sdk/annotations/queue.js +40 -0
- package/dist/sdk/annotations/serverMethods.d.ts +3 -0
- package/dist/sdk/annotations/serverMethods.js +62 -0
- package/dist/sdk/annotations/store.d.ts +167 -0
- package/dist/sdk/annotations/store.js +394 -0
- package/dist/sdk/browser/backend.d.ts +16 -0
- package/dist/sdk/browser/backend.js +17 -0
- package/dist/sdk/browser/contracts.d.ts +19 -0
- package/dist/sdk/browser/contracts.js +116 -0
- package/dist/sdk/browser/index.d.ts +14 -3
- package/dist/sdk/browser/index.js +11 -4
- package/dist/sdk/browser/serverMethods.d.ts +3 -0
- package/dist/sdk/browser/serverMethods.js +7 -0
- package/dist/sdk/browser/session.d.ts +1 -0
- package/dist/sdk/browser/session.js +45 -9
- package/dist/sdk/browser/tools.d.ts +1 -4
- package/dist/sdk/browser/tools.js +14 -91
- package/dist/sdk/cli.js +24 -15
- package/dist/sdk/commands/list.d.ts +3 -0
- package/dist/sdk/commands/list.js +75 -0
- package/dist/sdk/commands/registry.d.ts +250 -0
- package/dist/sdk/commands/registry.js +47 -0
- package/dist/sdk/commands/routes.d.ts +16 -0
- package/dist/sdk/commands/routes.js +33 -0
- package/dist/sdk/core/bus.js +1 -1
- package/dist/sdk/core/commandBudget.d.ts +23 -0
- package/dist/sdk/core/commandBudget.js +57 -0
- package/dist/sdk/core/env.d.ts +1 -1
- package/dist/sdk/core/env.js +1 -1
- package/dist/sdk/core/index.js +17 -1
- package/dist/sdk/core/interactiveProfile.d.ts +46 -0
- package/dist/sdk/core/interactiveProfile.js +143 -0
- package/dist/sdk/core/workspace.d.ts +13 -0
- package/dist/sdk/core/workspace.js +88 -0
- package/dist/sdk/core/workspaceBashTool.d.ts +4 -0
- package/dist/sdk/core/workspaceBashTool.js +36 -0
- package/dist/sdk/core/workspaceSandbox.d.ts +31 -0
- package/dist/sdk/core/workspaceSandbox.js +320 -0
- package/dist/sdk/core/workspaceWriteOperations.d.ts +22 -0
- package/dist/sdk/core/workspaceWriteOperations.js +206 -0
- package/dist/sdk/doctor/serverMethods.d.ts +3 -0
- package/dist/sdk/doctor/serverMethods.js +8 -0
- package/dist/sdk/doctor/types.d.ts +2 -2
- package/dist/sdk/harness.d.ts +22 -0
- package/dist/sdk/harness.js +84 -5
- package/dist/sdk/history/recall.js +8 -8
- package/dist/sdk/history/serverMethods.d.ts +3 -0
- package/dist/sdk/history/serverMethods.js +8 -0
- package/dist/sdk/hub/cli.d.ts +1 -1
- package/dist/sdk/hub/cli.js +1 -1
- package/dist/sdk/hub/schema.d.ts +1 -1
- package/dist/sdk/hub/serverMethods.d.ts +3 -0
- package/dist/sdk/hub/serverMethods.js +11 -0
- package/dist/sdk/index.d.ts +16 -1
- package/dist/sdk/index.js +10 -0
- package/dist/sdk/mcp/connections.js +14 -7
- package/dist/sdk/mcp/serverMethods.d.ts +3 -0
- package/dist/sdk/mcp/serverMethods.js +22 -0
- package/dist/sdk/pi/runtime.d.ts +2 -1
- package/dist/sdk/pi/runtime.js +2 -2
- package/dist/sdk/plugins/builtin.d.ts +1 -0
- package/dist/sdk/plugins/builtin.js +145 -33
- package/dist/sdk/plugins/builtinRegistry.d.ts +60 -0
- package/dist/sdk/plugins/builtinRegistry.js +71 -0
- package/dist/sdk/plugins/catalogue.js +2 -1
- package/dist/sdk/plugins/cli.d.ts +1 -1
- package/dist/sdk/plugins/cli.js +4 -3
- package/dist/sdk/plugins/commandPrefix.d.ts +8 -0
- package/dist/sdk/plugins/commandPrefix.js +21 -0
- package/dist/sdk/plugins/firstParty.d.ts +1 -1
- package/dist/sdk/plugins/firstParty.js +8 -2
- package/dist/sdk/plugins/inventory.js +4 -3
- package/dist/sdk/plugins/manifest.d.ts +2 -0
- package/dist/sdk/plugins/manifest.js +2 -1
- package/dist/sdk/plugins/surfaces.d.ts +5 -0
- package/dist/sdk/plugins/surfaces.js +11 -0
- package/dist/sdk/plugins/types.d.ts +15 -0
- package/dist/sdk/prompt/compile.d.ts +19 -2
- package/dist/sdk/prompt/compile.js +79 -26
- package/dist/sdk/prompt/standard.d.ts +17 -0
- package/dist/sdk/prompt/standard.js +21 -0
- package/dist/sdk/refine/cli.d.ts +1 -1
- package/dist/sdk/refine/cli.js +2 -2
- package/dist/sdk/refine/serverMethods.d.ts +3 -0
- package/dist/sdk/refine/serverMethods.js +20 -0
- package/dist/sdk/server/methods.js +27 -86
- package/dist/sdk/server/params.d.ts +4 -0
- package/dist/sdk/server/params.js +11 -0
- package/dist/sdk/server/remote.js +36 -11
- package/dist/sdk/sessions/compactionCheckpoint.d.ts +11 -0
- package/dist/sdk/sessions/compactionCheckpoint.js +79 -0
- package/dist/sdk/sessions/continuation.d.ts +3 -0
- package/dist/sdk/sessions/continuation.js +5 -1
- package/dist/sdk/sessions/contracts.d.ts +185 -0
- package/dist/sdk/sessions/contracts.js +101 -4
- package/dist/sdk/sessions/control.d.ts +72 -0
- package/dist/sdk/sessions/control.js +158 -0
- package/dist/sdk/sessions/initialBash.d.ts +7 -0
- package/dist/sdk/sessions/initialBash.js +7 -0
- package/dist/sdk/sessions/planMode.d.ts +18 -4
- package/dist/sdk/sessions/planMode.js +82 -16
- package/dist/sdk/sessions/reasoningSummaries.d.ts +2 -2
- package/dist/sdk/sessions/reasoningSummaries.js +3 -3
- package/dist/sdk/sessions/registry.d.ts +2 -1
- package/dist/sdk/sessions/registry.js +6 -3
- package/dist/sdk/sessions/runIndex.js +7 -7
- package/dist/sdk/sessions/runStore.d.ts +14 -0
- package/dist/sdk/sessions/runStore.js +38 -1
- package/dist/sdk/sessions/runner.d.ts +40 -2
- package/dist/sdk/sessions/runner.js +163 -15
- package/dist/sdk/sessions/sessions.d.ts +40 -8
- package/dist/sdk/sessions/sessions.js +279 -27
- package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
- package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
- package/dist/sdk/sessions/sideQuestions.js +290 -0
- package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/subagentServerMethods.js +41 -0
- package/dist/sdk/sessions/subagentService.d.ts +22 -2
- package/dist/sdk/sessions/subagentService.js +93 -16
- package/dist/sdk/sessions/subagents.d.ts +9 -1
- package/dist/sdk/sessions/subagents.js +19 -0
- package/dist/sdk/sessions/workSlice.d.ts +103 -0
- package/dist/sdk/sessions/workSlice.js +297 -0
- package/dist/sdk/sessions/workspaceBoundary.d.ts +15 -0
- package/dist/sdk/sessions/workspaceBoundary.js +46 -0
- package/dist/sdk/terminal/browser.d.ts +62 -0
- package/dist/sdk/terminal/browser.js +41 -0
- package/dist/sdk/terminal/browserControl.d.ts +29 -0
- package/dist/sdk/terminal/browserControl.js +187 -0
- package/dist/sdk/terminal/commandHelp.d.ts +17 -0
- package/dist/sdk/terminal/commandHelp.js +20 -0
- package/dist/sdk/terminal/controller.d.ts +15 -1
- package/dist/sdk/terminal/controller.js +67 -8
- package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
- package/dist/sdk/terminal/opentui/theme.d.ts +43 -0
- package/dist/sdk/terminal/opentui/theme.js +87 -0
- package/dist/sdk/terminal/piExtension.d.ts +6 -1
- package/dist/sdk/terminal/piExtension.js +169 -84
- package/dist/sdk/terminal/socket.d.ts +6 -3
- package/dist/sdk/terminal/socket.js +40 -9
- package/dist/sdk/terminal/standalone.d.ts +9 -0
- package/dist/sdk/terminal/standalone.js +118 -19
- package/dist/sdk/terminal/subagentMonitor.d.ts +47 -0
- package/dist/sdk/terminal/subagentMonitor.js +152 -0
- package/dist/sdk/terminal/terminals.d.ts +60 -7
- package/dist/sdk/terminal/terminals.js +598 -47
- package/dist/sdk/terminal/trajectory.js +2 -2
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
- package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +7 -1
- package/dist/sdk/terminal/tui/commandPages.js +57 -6
- package/dist/sdk/terminal/tui/commands.d.ts +10 -4
- package/dist/sdk/terminal/tui/commands.js +269 -65
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +2 -2
- package/dist/sdk/terminal/tui/dialogGeometry.js +4 -2
- package/dist/sdk/terminal/tui/dialogs.d.ts +6 -1
- package/dist/sdk/terminal/tui/dialogs.js +9 -2
- package/dist/sdk/terminal/tui/list.d.ts +14 -1
- package/dist/sdk/terminal/tui/list.js +96 -14
- package/dist/sdk/terminal/tui/modelPicker.js +1 -6
- package/dist/sdk/terminal/tui/page.d.ts +3 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +27 -7
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +26 -4
- package/dist/sdk/terminal/tui/pages/accountsPage.js +264 -36
- package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
- package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
- package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +2 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +103 -15
- package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
- package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +0 -5
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +9 -3
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +8 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +16 -1
- package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +24 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +152 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +12 -5
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +156 -83
- package/dist/sdk/terminal/tui/pages/usagePage.d.ts +43 -0
- package/dist/sdk/terminal/tui/pages/usagePage.js +370 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
- package/dist/sdk/terminal/tui/piAdapter.d.ts +1 -2
- package/dist/sdk/terminal/tui/piAdapter.js +3 -5
- package/dist/sdk/terminal/tui/planMode.d.ts +1 -1
- package/dist/sdk/terminal/tui/planMode.js +1 -1
- package/dist/sdk/terminal/tui/pluginCommands.d.ts +16 -0
- package/dist/sdk/terminal/tui/pluginCommands.js +31 -0
- package/dist/sdk/terminal/tui/questions.d.ts +2 -0
- package/dist/sdk/terminal/tui/runtime.js +27 -5
- package/dist/sdk/terminal/tui/sessionPicker.d.ts +40 -0
- package/dist/sdk/terminal/tui/sessionPicker.js +141 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +2 -0
- package/dist/sdk/terminal/tui/settingsModel.js +32 -2
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +26 -26
- package/dist/sdk/terminal/tui/sideQuestion.js +131 -98
- package/dist/sdk/terminal/tui/ui.d.ts +2 -0
- package/dist/sdk/terminal/tui/ui.js +1 -0
- package/dist/sdk/tools/askUser.js +26 -8
- package/dist/sdk/tools/checklist.js +3 -2
- package/dist/sdk/tools/checkpoint.d.ts +27 -0
- package/dist/sdk/tools/checkpoint.js +154 -0
- package/dist/sdk/tools/getCapabilities.d.ts +31 -0
- package/dist/sdk/tools/getCapabilities.js +34 -0
- package/dist/sdk/tools/harnessTools.d.ts +2 -0
- package/dist/sdk/tools/harnessTools.js +1 -1
- package/dist/sdk/tools/spawnSubagent.js +14 -4
- package/dist/sdk/usage/analytics.d.ts +20 -0
- package/dist/sdk/usage/analytics.js +151 -0
- package/dist/sdk/usage/ledger.d.ts +38 -0
- package/dist/sdk/usage/ledger.js +142 -0
- package/dist/sdk/usage/limits/adapters.d.ts +11 -0
- package/dist/sdk/usage/limits/adapters.js +349 -0
- package/dist/sdk/usage/limits/capture.d.ts +8 -0
- package/dist/sdk/usage/limits/capture.js +47 -0
- package/dist/sdk/usage/limits/http.d.ts +12 -0
- package/dist/sdk/usage/limits/http.js +51 -0
- package/dist/sdk/usage/limits/normalize.d.ts +15 -0
- package/dist/sdk/usage/limits/normalize.js +211 -0
- package/dist/sdk/usage/limits/service.d.ts +30 -0
- package/dist/sdk/usage/limits/service.js +176 -0
- package/dist/sdk/usage/limits/types.d.ts +65 -0
- package/dist/sdk/usage/limits/types.js +1 -0
- package/dist/sdk/usage/serverMethods.d.ts +3 -0
- package/dist/sdk/usage/serverMethods.js +22 -0
- package/dist/sdk/usage/service.d.ts +32 -0
- package/dist/sdk/usage/service.js +66 -0
- package/dist/sdk/usage/settings.d.ts +7 -0
- package/dist/sdk/usage/settings.js +28 -0
- package/dist/sdk/usage/types.d.ts +60 -0
- package/dist/sdk/usage/types.js +4 -0
- package/dist/sdk/web/part.d.ts +10 -0
- package/dist/sdk/web/part.js +6 -0
- package/dist/sdk/web/serverMethods.d.ts +3 -0
- package/dist/sdk/web/serverMethods.js +7 -0
- package/dist/sdk/wiki/serverMethods.d.ts +3 -0
- package/dist/sdk/wiki/serverMethods.js +26 -0
- package/dist/sdk/worktrees/cli.d.ts +11 -0
- package/dist/sdk/worktrees/cli.js +146 -0
- package/dist/sdk/worktrees/copy.d.ts +9 -0
- package/dist/sdk/worktrees/copy.js +111 -0
- package/dist/sdk/worktrees/git.d.ts +16 -0
- package/dist/sdk/worktrees/git.js +81 -0
- package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
- package/dist/sdk/worktrees/serverMethods.js +30 -0
- package/dist/sdk/worktrees/service.d.ts +73 -0
- package/dist/sdk/worktrees/service.js +483 -0
- package/dist/sdk/worktrees/setup.d.ts +23 -0
- package/dist/sdk/worktrees/setup.js +65 -0
- package/dist/sdk/worktrees/types.d.ts +91 -0
- package/dist/sdk/worktrees/types.js +1 -0
- package/dist/sdk/world/cli.d.ts +2 -2
- package/dist/sdk/world/cli.js +6 -6
- package/dist/sdk/world/world.d.ts +3 -1
- package/dist/sdk/world/world.js +8 -9
- package/dist/terminal-opentui.js +16456 -5966
- package/dist/terminal-pi.js +1579 -573
- package/docs/README.md +22 -2
- package/docs/architecture/00-overview.md +28 -16
- package/docs/architecture/02-sessions-and-runs.md +184 -25
- package/docs/architecture/03-variants.md +10 -2
- package/docs/architecture/04-prompt.md +65 -7
- package/docs/architecture/06-plugins-and-capabilities.md +57 -4
- package/docs/architecture/07-tools-and-gate.md +112 -17
- package/docs/architecture/08-memory-and-history.md +4 -2
- package/docs/architecture/09-accounts-and-connectors.md +39 -1
- package/docs/architecture/10-server-protocol.md +168 -4
- package/docs/architecture/11-terminal.md +251 -8
- package/docs/architecture/12-storage.md +45 -3
- package/docs/architecture/13-world-tools.md +49 -6
- package/docs/architecture/14-surfaces-and-parity.md +136 -0
- package/docs/architecture/README.md +17 -4
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +4 -2
- package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
- package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
- package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
- package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
- package/docs/architecture/proposals/PROP-0017-page-annotations.md +131 -0
- package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
- package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
- package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
- package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
- package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
- package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
- package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
- package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
- package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
- package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
- package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
- package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
- package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
- package/docs/architecture/proposals/PROP-0031-plugin-command-owner-namespaces.md +54 -0
- package/docs/architecture/proposals/PROP-0032-planning-quality.md +196 -0
- package/docs/architecture/proposals/PROP-0033-compaction-plan-checkpoints.md +75 -0
- package/docs/architecture/proposals/PROP-0034-conversation-fast-mode.md +120 -0
- package/docs/architecture/proposals/PROP-0035-retain-subagent-status.md +47 -0
- package/docs/architecture/proposals/PROP-0036-first-class-harness-commands.md +59 -0
- package/docs/architecture/proposals/PROP-0037-workspace-write-boundary.md +63 -0
- package/docs/architecture/proposals/PROP-0038-annotate-open-shadow-roots.md +73 -0
- package/docs/architecture/proposals/PROP-0039-workspace-boundary-hardening.md +139 -0
- package/docs/architecture/proposals/PROP-0040-one-launch-path.md +87 -0
- package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +247 -0
- package/docs/architecture/proposals/PROP-0042-usage-and-provider-limits.md +127 -0
- package/docs/architecture/proposals/PROP-0043-read-only-plan-bash.md +74 -0
- package/docs/architecture/proposals/README.md +39 -0
- package/docs/decisions/ADR-0001-owned-terminal.md +1 -1
- package/docs/decisions/ADR-0009-xharness-command.md +6 -5
- package/docs/decisions/ADR-0014-public-release-baseline.md +3 -2
- package/docs/decisions/ADR-0015-resource-browser.md +28 -0
- package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
- package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
- package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
- package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
- package/docs/decisions/ADR-0020-page-annotations.md +37 -0
- package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
- package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
- package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
- package/docs/decisions/ADR-0024-xagent-command.md +40 -0
- package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
- package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
- package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
- package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
- package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
- package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
- package/docs/decisions/ADR-0031-plugin-command-owner-namespaces.md +37 -0
- package/docs/decisions/ADR-0032-compaction-run-checkpoints.md +33 -0
- package/docs/decisions/ADR-0033-plan-mode-research-delegation.md +47 -0
- package/docs/decisions/ADR-0034-first-class-harness-terminal-commands.md +25 -0
- package/docs/decisions/ADR-0035-one-launch-path.md +40 -0
- package/docs/decisions/ADR-0036-workspace-write-operation-boundary.md +54 -0
- package/docs/decisions/ADR-0037-usage-ledger-and-provider-limits.md +44 -0
- package/docs/decisions/ADR-0038-plan-bash-os-read-only.md +29 -0
- package/docs/doctor.md +10 -4
- package/docs/experiments/EXP-0003-performance-audit/data/session-runtime-replication.json +420 -0
- package/docs/experiments/EXP-0003-performance-audit/data/session-runtime.json +420 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-compact.json +376 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-history.json +422 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-question.json +95 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-wide.json +1036 -0
- package/docs/experiments/EXP-0003-performance-audit/plan.md +109 -0
- package/docs/experiments/EXP-0003-performance-audit/results.md +151 -0
- package/docs/features/README.md +26 -0
- package/docs/features/interfaces/README.md +1 -1
- package/docs/future-work.md +48 -0
- package/docs/handoff-2026-10-25-app-parity-and-solo-tabs.md +202 -0
- package/docs/parity.md +134 -0
- package/docs/releases/1.0.0.md +2 -2
- package/docs/releases/1.1.1.md +28 -0
- package/docs/releases/1.2.0.md +49 -0
- package/docs/releases/4.0.0.md +47 -0
- package/docs/releases/README.md +37 -27
- package/docs/study/00-index.md +8 -0
- package/docs/study/STUDY-0003-long-horizon-runs.md +210 -0
- package/docs/study/autonomous-engineering-sources.md +277 -0
- package/docs/study/autonomy-sources.md +147 -0
- package/docs/study/proactive-autonomy.md +408 -0
- package/docs/study/tui-resource-browser.md +78 -0
- package/docs/terminal-tui.md +386 -113
- package/package.json +6 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Harness architecture specification
|
|
2
2
|
|
|
3
|
-
**Status:** binding. **As of:** 2026-10-
|
|
3
|
+
**Status:** binding. **As of:** 2026-10-26, checked against `src/` on branch `release/1.0.0`.
|
|
4
4
|
|
|
5
5
|
This folder is the core specification of `@xingular/harness`. Code must conform to it. A change
|
|
6
6
|
that would alter what it says needs a proposal the user approves first (see
|
|
@@ -41,6 +41,7 @@ not one class (a set of functions in one module, say), it says so.
|
|
|
41
41
|
| [11 Terminal](11-terminal.md) | The Harness-owned terminal frontend and its process boundary | `INV-TUI` |
|
|
42
42
|
| [12 Storage](12-storage.md) | The data root and state directory, and who writes what | `INV-STO` |
|
|
43
43
|
| [13 World tools](13-world-tools.md) | Generic web and isolated browser backends, host boundary and diagnostics | — |
|
|
44
|
+
| [14 Surfaces and parity](14-surfaces-and-parity.md) | Every capability is a Harness capability with a terminal surface; host-backed capabilities; host-only surfaces | `INV-PAR` |
|
|
44
45
|
| [Proposals](proposals/README.md) | Architecture change proposals and their status | — |
|
|
45
46
|
|
|
46
47
|
Related records, not binding by themselves:
|
|
@@ -57,11 +58,14 @@ Related records, not binding by themselves:
|
|
|
57
58
|
|
|
58
59
|
## Glossary
|
|
59
60
|
|
|
60
|
-
These words are used the same way
|
|
61
|
+
These words are used the same way across architecture pages and, for implemented concepts, in code
|
|
62
|
+
and the data layout. Terms marked as planned are future vocabulary only; they do not describe
|
|
63
|
+
current behavior.
|
|
61
64
|
|
|
62
65
|
| Word | Meaning |
|
|
63
66
|
|---|---|
|
|
64
67
|
| **Foundation** | The fixed half of the harness: code and invariants that no edit, improver or adoption can change. Changes by release, and by proposal when a contract moves. |
|
|
68
|
+
| **Agent Mode** | A planned foundation-level work style, with at most one mode active at a time. Plugins remain independently stackable contributions. This is distinct from plan mode and existing `mode` fields; it is not a runtime contract ([FW-0001](../future-work.md#fw-0001-agent-modes-starting-with-router-agent-mode)). |
|
|
65
69
|
| **Variant** | The mutating half: one tree of eight components (c1–c8) for one scope. Formerly "harness tree". |
|
|
66
70
|
| **Component** | One of c1–c8 inside a variant (system prompt, guardrails, memory, tool guidance, subagents, skills, scripts, plugins). |
|
|
67
71
|
| **Surface** | The foundation's definition of what a variant may contain (`PI_SURFACE`): paths, patterns, the always-on cap. |
|
|
@@ -106,9 +110,18 @@ proposal, or a correction to the other document).
|
|
|
106
110
|
| D-1 | `AGENTS.md` (before this spec), `INV-RUN-6` | The old rule said only `sessions/runStore.ts` writes `runs/<id>/`. In code, four other harness modules also write side files there: `prompt/compile.ts` (`context.json`), `sessions/sessions.ts` (`caller.json`), `capabilities/runSnapshot.ts` (`capabilities.json`), `mcp/service.ts` (`mcp-context.json`). The spec states the rule the code keeps (see `INV-RUN-6`); whether to route all of them through `runStore.ts` is open. |
|
|
107
111
|
| D-2 | `README.md` "Plugins" | Describes a `plugin_propose` tool and an Inbox for proposed plugins. No such tool exists in `src/`. |
|
|
108
112
|
| D-3 | `README.md` "External curation" | Describes `externalMaintenance`, `vaultAccess`, `MAINTENANCE_PLUGIN`, `maintenance.*` methods and tools. None exist in `src/`. |
|
|
109
|
-
| D-4 | `INV-BND-2` | Several names carry an application's name: the context message type `xingular-context`, the approval extension `xagent-approvals`, the MCP client name `xagent`, and the terminal commands `xagent-wiki` / `xagent-mcp`. The default product name `Xingular
|
|
110
|
-
| D-5 | `INV-BND-2` | `RunRecord` carries `worktreeId` and `handoffId`, which are application concepts. They are stored and returned, never read, and are documented as the application's fields. |
|
|
113
|
+
| D-4 | `INV-BND-2` | Several names carry an application's name: the context message type `xingular-context`, the approval extension `xagent-approvals`, the MCP client name `xagent`, and the terminal commands `xagent-wiki` / `xagent-mcp`. The default product name `Xingular Agent` is allowed; these are not. |
|
|
114
|
+
| D-5 | `INV-BND-2` | `RunRecord` carries `worktreeId` and `handoffId`, which are application concepts. They are stored and returned, never read, and are documented as the application's fields. Since PROP-0016 (2026-10-23) `worktreeId` has Harness meaning when it names a registered worktree; only `handoffId` remains an application field. |
|
|
111
115
|
| D-6 | `INV-BND-2` | Plan-mode instructions (`sessions/planMode.ts`) name a managed browser and computer controls, which the harness does not provide. |
|
|
112
116
|
| D-7 | `INV-MEM-3` | `wiki/notes.ts::remove` keeps a version but does not call `noteChange`, so hooks hear saves but not removals. |
|
|
113
117
|
| D-8 | old `AGENTS.md` | Listed `work` among the sections delivered as updates. The compiler's built-in dynamic sections are only `references` and `wiki`; `work` is dynamic only when the application marks it so. `INV-PRM-3` states the code's rule. |
|
|
114
118
|
| D-9 | World/browser implementation | Resolved for the 1.0.0 candidate by PROP-0012/ADR-0014 and page 13: the Harness owns a generic isolated browser; App browser UI, tab sharing and computer integration remain with the host. |
|
|
119
|
+
| D-10 | OpenTUI skill completion | At the start of PROP-0013, documentation claimed skill completion, but OpenTUI only rendered slash-command completions. The skill helper had no frontend caller. PROP-0013 explicitly resolves this drift. |
|
|
120
|
+
| D-11 | `INV-RUN-5`, unattended approval and question paths | Source inspection on 2026-10-23 found that `SessionRunInput.automatic` disables resource discovery and extension dialogs (`sessions/runner.ts:574`), but the general gate does not receive that flag. `Sessions.gate` explicitly refuses approvals for `probe`, `improver` and `reflection` triggers, then otherwise calls `requestApproval` (`sessions/sessions.ts:198`). `ask_user` was also constructed independently of `automatic` when harness tools were enabled (`sessions/sessions.ts:397`, `tools/askUser.ts:69`). That question-tool gap is resolved for newly resolved runs by PROP-0022/ADR-0022 (2026-10-24); an unattended continuation of a run pinned with that tool is rejected. Thus the flag alone does not establish the invariant that every unattended run refuses human interaction; host policy and capability selection can narrow these paths. This is a static source finding, not a live reproduction. See [proactive autonomy research](../study/proactive-autonomy.md#current-foundation-and-the-missing-loop). |
|
|
121
|
+
| D-12 | 12-storage layout | The isolated browser keeps device-local profiles and settings under `<state dir>/browser/` (`browser/config.ts`, `browser/session.ts`); page 12's layout did not list it. Resolved 2026-10-23: page 12 lists it. |
|
|
122
|
+
| D-13 | `docs/study/feature-gap-review.md` row 8 | Says browser and computer interaction are not built in. Page 13 (PROP-0012) records a generic isolated browser in the foundation; computer interaction needs a host surface. |
|
|
123
|
+
| D-14 | 12-storage layout | Page 12 lists browser settings under `<state dir>/browser/`, while `browser/config.ts` stores configuration in `<state dir>/browser.json`; browser profiles and downloads use the `browser/` directory. The layout needs an owner decision before either side is changed. |
|
|
124
|
+
| D-15 | Terminal sketch verification status — resolved 2026-10-24 by PROP-0028 | Pages 11 and 14 and `terminal-tui.md` said connected-sketch implementation verification was pending, while retained PTY evidence and PAR-014 recorded it as verified. Updated the docs to distinguish deterministic fixture verification from owner visual acceptance, every-emulator rendering and live-model sketch quality. |
|
|
125
|
+
| D-16 | Terminal slash-command highlighting — resolved 2026-10-24 | `terminal-tui.md` specified accent coloring for recognized leading commands while typing, but the OpenTUI composer only styled attachment labels. User-message bubbles also lacked command-token styling. The renderer now uses the active command registry for both surfaces. |
|
|
126
|
+
| D-17 | `PROP-0039`, `ADR-0036`, `INV-GATE-3/8` | Implementation is in progress in the 1.2.0 worktree: native writes revalidate canonical targets and atomically replace files under an OS write scope; default Bash fails closed on external hard-link aliases and runs in a sandbox that prevents new cross-boundary links; outside-scope Bash requires approval before one execution and command output never triggers approval or replay. The filesystem root is rejected as a workspace, and approval details expose the complete command. Launcher selection uses fixed system paths. Same-user peer processes remain outside this boundary. Focused macOS tests, full Harness CI, App compatibility checks, and PTY verification at 40x20, 80x24, and 100x30 pass. Linux sandbox integration remains unverified locally because this Darwin host has no `bwrap` and Colima is stopped; both CI workflows now install bubblewrap and `scripts/ci.sh` fails if it is absent, but an Ubuntu run is still required. No candidate, tag, or publication exists. |
|
|
127
|
+
| D-18 | `core/index.ts` migration 5 | The `run_stats` table has no writer in the Harness. PROP-0042's `usage_requests` ledger is the analytics source; whether to drop the older table is open. |
|
|
@@ -3,7 +3,7 @@ id: PROP-0006
|
|
|
3
3
|
title: A run checklist the model writes, recorded as a run event
|
|
4
4
|
status: Implemented
|
|
5
5
|
created: 2026-10-22
|
|
6
|
-
updated: 2026-10-
|
|
6
|
+
updated: 2026-10-24
|
|
7
7
|
affects: [02-sessions-and-runs.md, 06-plugins-and-capabilities.md, 07-tools-and-gate.md, 10-server-protocol.md]
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -41,7 +41,9 @@ Gap #2 of `docs/study/feature-gap-review.md`.
|
|
|
41
41
|
where public instruction lives" (study insight 4).
|
|
42
42
|
- New built-in plugin `checklist` declares the tool.
|
|
43
43
|
- `checklistOf(events)` projects the latest list; the server exposes it as `runs.checklist`.
|
|
44
|
-
- Terminal sessions do not get the tool yet.
|
|
44
|
+
- Terminal sessions do not get the tool yet. (Update 2026-10-24: they do now; the terminal
|
|
45
|
+
extension registers the same tool, records it through `checklist` telemetry and renders each
|
|
46
|
+
write as a checklist block. See `docs/parity.md` PAR-001.)
|
|
45
47
|
|
|
46
48
|
## Alternatives
|
|
47
49
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0013
|
|
3
|
+
title: Unified terminal resource browser
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-22
|
|
6
|
+
updated: 2026-10-22
|
|
7
|
+
affects: [INV-TUI-4, 03-variants.md, 06-plugins-and-capabilities.md, 09-accounts-and-connectors.md, 11-terminal.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0013: Unified terminal resource browser
|
|
11
|
+
|
|
12
|
+
## Problem
|
|
13
|
+
|
|
14
|
+
Skills, local resources, variant additions and community discovery are split across commands.
|
|
15
|
+
See [source study](../../study/tui-resource-browser.md). The user approved the proposed UX plan
|
|
16
|
+
and requested implementation in this session.
|
|
17
|
+
|
|
18
|
+
## Affected rules
|
|
19
|
+
|
|
20
|
+
INV-TUI-4 requires a private control key for terminal configuration mutations. Extend that
|
|
21
|
+
protected route to browser reads, local imports, package install/remove and connection management.
|
|
22
|
+
INV-FND-2 (validated variant commits), INV-PLG-1 (single loader), INV-PLG-3 (installation grants
|
|
23
|
+
no trust/attachment) and INV-MCP-4 remain enforced. No extension point is added.
|
|
24
|
+
|
|
25
|
+
## Proposal
|
|
26
|
+
|
|
27
|
+
One browser exposes Overview, Foundation, Variant, Skills, Plugins, Connections, Tools and Library.
|
|
28
|
+
Resource sections share Installed/Discover. Existing commands become shortcuts. Saved and live
|
|
29
|
+
availability remain separate: session loader/tool registry proves current availability; configuration
|
|
30
|
+
and variant head describe future sessions. Inspecting never loads extensions or connects MCP.
|
|
31
|
+
The private socket adds terminal.browser.* adapters to the existing services. File reads accept
|
|
32
|
+
resource IDs and use enumerated owner paths, regular-file checks and bounded previews.
|
|
33
|
+
|
|
34
|
+
## Alternatives
|
|
35
|
+
|
|
36
|
+
Do nothing retains fragmented discovery. Separate improved pages still require users to learn
|
|
37
|
+
where a resource lives. A combined local/remote list obscures the action and availability differences.
|
|
38
|
+
|
|
39
|
+
## Consequences
|
|
40
|
+
|
|
41
|
+
No second loader, enablement store or secret store. The public host RPC framing is unchanged.
|
|
42
|
+
Optional install/remove callbacks extend the terminal adapter. Credential inputs are masked.
|
|
43
|
+
Hub documents remain inert until a separate explicit connector-setup action validates their shape.
|
|
44
|
+
|
|
45
|
+
## Migration
|
|
46
|
+
|
|
47
|
+
No data migration. Existing commands remain valid shortcuts. Existing sessions keep their resource
|
|
48
|
+
selection and variant pins. New resources require the same trust/attachment and restart as before.
|
|
49
|
+
|
|
50
|
+
## Checks
|
|
51
|
+
|
|
52
|
+
Focused model/page/socket tests, OpenTUI completion tests, isolated PTY journeys at 40x20, 80x24,
|
|
53
|
+
120x40, Harness typecheck/tests/build/proof and required sibling App checks. No real model requests.
|
|
54
|
+
|
|
55
|
+
## Implementation evidence
|
|
56
|
+
|
|
57
|
+
[Terminal acceptance and limits](../../evidence/terminal-resource-browser/README.md).
|
|
58
|
+
Implementation remains in the working tree; no release or publication is claimed.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0014
|
|
3
|
+
title: Full-screen resource browser with persistent section tabs
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-23
|
|
6
|
+
updated: 2026-10-23
|
|
7
|
+
affects: [11-terminal.md, terminal-tui.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0014: Full-screen resource browser with persistent section tabs
|
|
11
|
+
|
|
12
|
+
Accepted by the user's request to implement the agreed plan on 2026-10-23.
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
The browser's centered panel, section dropdown and wide sidebar consume space and hide
|
|
17
|
+
navigation when inspecting a resource. The user requested a full-page screen with component tabs.
|
|
18
|
+
|
|
19
|
+
## Affected rules
|
|
20
|
+
|
|
21
|
+
The terminal guide states: “The browser keeps the centered dialog size policy.”
|
|
22
|
+
This proposal replaces that browser layout contract. INV-TUI-1 through INV-TUI-6 remain intact.
|
|
23
|
+
|
|
24
|
+
## Proposal
|
|
25
|
+
|
|
26
|
+
Every resource-browser command opens the full terminal. Overview, Foundation, Variant, Skills,
|
|
27
|
+
Plugins, Connections, Tools and Library occupy a persistent top tab strip. Narrow terminals
|
|
28
|
+
show the active tab and previous/next navigation. Tab moves focus; arrows change the focused tab;
|
|
29
|
+
mouse selection selects a tab directly. Each section retains search and resource selection.
|
|
30
|
+
|
|
31
|
+
At 88 content columns, inventory and inspector share the screen; details, actions and content
|
|
32
|
+
stay beside the list. Narrow screens show details and content within the active tab. Escape
|
|
33
|
+
returns through content, inspection and search before closing. Other command pages retain
|
|
34
|
+
centered presentation. Browser actions retain existing confirmations and protected services.
|
|
35
|
+
|
|
36
|
+
## Alternatives
|
|
37
|
+
|
|
38
|
+
Keeping the centered browser leaves insufficient working space. Full-width lists with replacement
|
|
39
|
+
detail views hide useful context on wide terminals. A c1–c8 primary tab strip was considered;
|
|
40
|
+
the user selected resource sections instead.
|
|
41
|
+
|
|
42
|
+
## Consequences
|
|
43
|
+
|
|
44
|
+
This is foundation UI behavior. TerminalPage gains optional presentation and direct tab selection.
|
|
45
|
+
There is no server protocol, stored data, account, loader or gate change.
|
|
46
|
+
|
|
47
|
+
## Migration
|
|
48
|
+
|
|
49
|
+
Existing command destinations and resource state are preserved. No migration is needed.
|
|
50
|
+
The UI change is reversible without touching stored data.
|
|
51
|
+
|
|
52
|
+
## Checks
|
|
53
|
+
|
|
54
|
+
Cover page geometry, keyboard and mouse tab selection, inspection, scrolling, responsive resize,
|
|
55
|
+
shortcut destinations, and draft preservation. Run typecheck, tests, build, the isolated browser
|
|
56
|
+
PTY suite and the consuming application's required checks. No real model requests are needed.
|
|
57
|
+
|
|
58
|
+
Related decision: [ADR-0016](../../decisions/ADR-0016-fullscreen-browser-tabs.md).
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0015
|
|
3
|
+
title: One capability surface — the Harness terminal and every host offer the same capabilities
|
|
4
|
+
status: Accepted
|
|
5
|
+
created: 2026-10-23
|
|
6
|
+
updated: 2026-10-23
|
|
7
|
+
affects: [INV-BND-2, new INV-PAR-1..4, 00-overview.md, 11-terminal.md, new 14-surfaces-and-parity.md, AGENTS.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0015: One capability surface
|
|
11
|
+
|
|
12
|
+
Accepted by the user's approval of the parity plan on 2026-10-23. Related decision:
|
|
13
|
+
[ADR-0017](../../decisions/ADR-0017-one-capability-surface.md).
|
|
14
|
+
|
|
15
|
+
## Problem
|
|
16
|
+
|
|
17
|
+
Two front ends sit on the same harness: the Harness-owned terminal (`xharness`) and the App.
|
|
18
|
+
Capabilities a person uses grew in the App alone (web annotations, managed worktrees, agent
|
|
19
|
+
organizations, delegated work), so the terminal cannot do what the App does, and a reader cannot
|
|
20
|
+
tell which repository owns a feature. The App also carried an orchestration layer (agents as
|
|
21
|
+
product objects, routed chats, group chats, a reporting tree, delegated work queues) that no other
|
|
22
|
+
host could reuse and that was never verified in a running app.
|
|
23
|
+
|
|
24
|
+
The owner decided on 2026-10-23 that the App is a richer presentation of the Harness and that the
|
|
25
|
+
terminal and the App offer the same capabilities, with room reserved for future host-only
|
|
26
|
+
surfaces such as interactive agent output ("OpenUI").
|
|
27
|
+
|
|
28
|
+
## Affected rules
|
|
29
|
+
|
|
30
|
+
- 00-overview "Stays in the application: agents, groups, conversations, tasks and coordination,
|
|
31
|
+
projects and worktrees, App browser UI and tab sharing, computer use, windows, the PTY, the
|
|
32
|
+
keychain, and application UI."
|
|
33
|
+
- `INV-BND-2` lists "worktree" among application concepts.
|
|
34
|
+
- 11-terminal describes the terminal as one frontend, with no parity obligation.
|
|
35
|
+
|
|
36
|
+
## Proposal
|
|
37
|
+
|
|
38
|
+
A new page, [14 Surfaces and parity](../14-surfaces-and-parity.md), states four invariants:
|
|
39
|
+
|
|
40
|
+
- **INV-PAR-1** Every capability a person can use in a host is a Harness capability: a foundation
|
|
41
|
+
service, a `WorldPart`, or a first-party plugin, reachable through server methods. The standalone
|
|
42
|
+
terminal surfaces it. A host is a presentation of it.
|
|
43
|
+
- **INV-PAR-2** A capability is complete only when its terminal surface and its host surface both
|
|
44
|
+
pass acceptance. It lands in the Harness first, together with its terminal surface.
|
|
45
|
+
- **INV-PAR-3** A host-backed capability needs an operating-system object only a host has (a
|
|
46
|
+
WebKit tab, a native computer bridge, a keychain). The Harness defines its generic contract and a
|
|
47
|
+
terminal fallback. Without a fallback, the terminal shows the capability as unavailable with the
|
|
48
|
+
reason, in `/doctor` and `/tools`.
|
|
49
|
+
- **INV-PAR-4** A host-only surface is presentation that cannot exist in a terminal. It owns no
|
|
50
|
+
capability: its actions are Harness methods or tools, its data lives in Harness records, the
|
|
51
|
+
terminal shows a text fallback, and each one is listed in the host's register by an owner
|
|
52
|
+
decision. A generic rich-output event for such surfaces needs its own proposal; the name is
|
|
53
|
+
reserved, nothing is designed.
|
|
54
|
+
|
|
55
|
+
00-overview changes:
|
|
56
|
+
|
|
57
|
+
- "Belongs in the harness" gains managed worktrees (PROP-0016) and page annotations (PROP-0017).
|
|
58
|
+
- "Stays in the application" becomes: windows, the PTY, the keychain, native operating-system
|
|
59
|
+
bridges (WebKit tabs, computer control), presentation, and registered host-only surfaces.
|
|
60
|
+
- `INV-BND-2` no longer lists "worktree" as an application concept once PROP-0016 lands.
|
|
61
|
+
|
|
62
|
+
A non-binding register, [`docs/parity.md`](../../parity.md), lists every capability with its
|
|
63
|
+
Harness owner, its terminal surface, its host surface and its status.
|
|
64
|
+
|
|
65
|
+
## Alternatives
|
|
66
|
+
|
|
67
|
+
- **Keep the App as the full product and the terminal as a developer tool.** Rejected by the owner:
|
|
68
|
+
it keeps two products and the ownership confusion.
|
|
69
|
+
- **Strict identity of the two front ends.** Rejected: some presentation (rich panes, interactive
|
|
70
|
+
output) cannot exist in a terminal. INV-PAR-4 bounds that category instead.
|
|
71
|
+
- **Do nothing.** The gap grows with every App feature.
|
|
72
|
+
|
|
73
|
+
## Consequences
|
|
74
|
+
|
|
75
|
+
- New user capabilities are Harness work first, with their terminal surface.
|
|
76
|
+
- Hosts may still add tools through `ToolProvider`, but a tool a person relies on is either a
|
|
77
|
+
Harness capability or a declared host-backed capability (INV-PAR-3).
|
|
78
|
+
- The server protocol gains method groups only through the proposals that add each capability.
|
|
79
|
+
|
|
80
|
+
## Migration
|
|
81
|
+
|
|
82
|
+
No stored data changes. Existing gaps are recorded in `docs/parity.md` with IDs (`PAR-NNN`) and
|
|
83
|
+
closed one at a time.
|
|
84
|
+
|
|
85
|
+
## Checks
|
|
86
|
+
|
|
87
|
+
Documentation change. Link check of the edited pages; each later capability brings its own tests
|
|
88
|
+
on both surfaces.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0016
|
|
3
|
+
title: Managed git worktrees as a Harness capability, in the terminal and every host
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-23
|
|
6
|
+
updated: 2026-10-23
|
|
7
|
+
affects: [INV-BND-2, D-5, INV-STO-3, INV-SRV-1, 00-overview.md, 02-sessions-and-runs.md, 10-server-protocol.md, 11-terminal.md, 12-storage.md, 14-surfaces-and-parity.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0016: Managed git worktrees
|
|
11
|
+
|
|
12
|
+
Accepted by the user's approval of the parity plan on 2026-10-23 (PROP-0015, ADR-0017).
|
|
13
|
+
Implemented in the working tree on 2026-10-23: `src/worktrees/`, `Sessions.run`, `Terminals`,
|
|
14
|
+
`xharness --worktree`, `xharness worktree`, `/worktree`; spec pages 00, 02, 10, 11, 12 updated.
|
|
15
|
+
The App source has create integration; remaining App actions are tracked as PAR-012. Harness and
|
|
16
|
+
terminal implementation is included in the 4.0.0 candidate. The owner chose the Codex model:
|
|
17
|
+
managed, disposable worktrees with automatic pruning and a handoff back to the main checkout.
|
|
18
|
+
|
|
19
|
+
## Problem
|
|
20
|
+
|
|
21
|
+
Worktrees exist only in the App (`App/src-tauri/src/projects.rs`: `create_worktree`,
|
|
22
|
+
`list_worktrees`), with no removal, so thread, task and Solo worktrees accumulate. The terminal
|
|
23
|
+
runs in its launch folder only (`terminal/standalone.ts`), with no way to isolate a session's
|
|
24
|
+
edits. `RunRecord.worktreeId` is an opaque App field (drift D-5). Under INV-PAR-1 a capability a
|
|
25
|
+
person uses must be a Harness capability with a terminal surface.
|
|
26
|
+
|
|
27
|
+
## Affected rules
|
|
28
|
+
|
|
29
|
+
- 00-overview "Stays in the application: … projects and worktrees …".
|
|
30
|
+
- `INV-BND-2` lists "worktree" as an application concept.
|
|
31
|
+
- Drift D-5: `RunRecord` carries `worktreeId` and `handoffId`, which are application concepts.
|
|
32
|
+
- `INV-STO-3`: a new top-level folder is an architecture change.
|
|
33
|
+
- `INV-SRV-1`: a new method group.
|
|
34
|
+
|
|
35
|
+
## Proposal
|
|
36
|
+
|
|
37
|
+
### Model
|
|
38
|
+
|
|
39
|
+
A **worktree** is a linked git worktree of a repository (the *source checkout*) that the Harness
|
|
40
|
+
created or adopted. It has an id, a repository root, a path, a name, a branch or a detached HEAD,
|
|
41
|
+
the ref and commit it started from, a kind and an origin.
|
|
42
|
+
|
|
43
|
+
- **Managed** worktrees (the default) are disposable, usually one per session, on a detached HEAD.
|
|
44
|
+
They are pruned automatically.
|
|
45
|
+
- **Permanent** worktrees are named, may host several sessions, and are never pruned.
|
|
46
|
+
- **Create branch** gives a worktree a branch under a configurable prefix (default `wt/`).
|
|
47
|
+
|
|
48
|
+
### Creation
|
|
49
|
+
|
|
50
|
+
`create({ repo, name?, baseRef?, kind?, carryChanges? })`:
|
|
51
|
+
|
|
52
|
+
1. Resolve the source checkout's top level; refuse a folder that is not a git repository with at
|
|
53
|
+
least one commit.
|
|
54
|
+
2. `git worktree add --detach <path> <baseRef>` (default `HEAD`), with repository filter drivers
|
|
55
|
+
switched off (`GIT_LFS_SKIP_SMUDGE=1`, `-c filter.lfs.*` cleared), never through a shell.
|
|
56
|
+
3. When `carryChanges` (default true for `baseRef: HEAD`), apply the source checkout's
|
|
57
|
+
uncommitted tracked changes (`git diff HEAD --binary` piped to `git apply`) and copy its
|
|
58
|
+
untracked, non-ignored files, as Codex does.
|
|
59
|
+
4. Copy ignored files matched by `.worktreeinclude` (gitignore syntax, matched by git itself). A
|
|
60
|
+
file is copied only when it does not exist in the worktree; symlinks are skipped; a per-file
|
|
61
|
+
(5 MB) and total (100 MB) cap applies; the result lists what was copied and skipped.
|
|
62
|
+
5. Run the repository's setup script `.xharness/worktree-setup` when it exists and its exact text
|
|
63
|
+
is trusted by hash (`worktrees.setup.trust`). It runs with `HARNESS_WORKTREE_PATH`,
|
|
64
|
+
`HARNESS_WORKTREE_SOURCE`, `HARNESS_WORKTREE_NAME`, a 10-minute timeout, and its output in a log
|
|
65
|
+
file. An untrusted script is reported, never run.
|
|
66
|
+
|
|
67
|
+
### Lifecycle
|
|
68
|
+
|
|
69
|
+
- **Lease and lock.** A session that runs in a worktree holds a lease (session id, process id) and
|
|
70
|
+
`git worktree lock --reason`. The lease is released on dispose; a lease whose process is gone is
|
|
71
|
+
released on `open` (recovery).
|
|
72
|
+
- **Prune.** `prune({ keep })` keeps the `keep` (default 15) most recently used managed worktrees
|
|
73
|
+
per repository and removes older ones that hold no lease. Permanent, leased and locked-by-others
|
|
74
|
+
worktrees are never pruned.
|
|
75
|
+
- **Snapshot before removal.** Every removal of a worktree with uncommitted changes or commits not
|
|
76
|
+
on any other branch first records them: `git stash create` (with untracked files committed into a
|
|
77
|
+
temporary index) and `git update-ref refs/xharness/snapshots/<id> <commit>`. `restore({ id })`
|
|
78
|
+
recreates the worktree from its snapshot.
|
|
79
|
+
- **Remove.** `remove({ id, force? })` refuses a leased worktree, and refuses dirty work unless
|
|
80
|
+
`force`, in which case it snapshots first.
|
|
81
|
+
- **Handoff.** `handoff({ id, direction: 'toSource' | 'toWorktree' })` moves uncommitted changes
|
|
82
|
+
between the worktree and the source checkout through git (`diff --binary` and `apply --3way`,
|
|
83
|
+
plus untracked files). It refuses when the target has uncommitted changes, when a branch would be
|
|
84
|
+
checked out twice, or when the patch does not apply cleanly; nothing is changed on refusal.
|
|
85
|
+
- **Adopt.** `adopt({ path })` registers an existing linked worktree (for example ones a host
|
|
86
|
+
created earlier) with origin `adopted`. It moves nothing.
|
|
87
|
+
|
|
88
|
+
### Sessions and runs
|
|
89
|
+
|
|
90
|
+
`SessionRunInput` and `TerminalPrepareInput` accept `worktreeId`. The Harness resolves the working
|
|
91
|
+
folder from the registry, takes the lease, and records `RunRecord.worktreeId`, which now has
|
|
92
|
+
Harness meaning. A caller that passes a folder without `worktreeId` behaves as before. D-5 narrows
|
|
93
|
+
to `handoffId`.
|
|
94
|
+
|
|
95
|
+
### Storage
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
<state dir>/worktrees.json registry, owner: worktrees/registry.ts
|
|
99
|
+
<state dir>/worktrees/<repoKey>/<name>/ checkouts (device-local)
|
|
100
|
+
<state dir>/worktrees/logs/<id>.setup.log setup output
|
|
101
|
+
<state dir>/worktree-setup-trust.json trusted setup-script hashes, owner-only
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
`repoKey` is a slug of the source folder's name and a short hash of its real path. Checkouts are
|
|
105
|
+
device-local and may be large, so they live in the state directory (`INV-STO-1`). A host may set
|
|
106
|
+
`HarnessOptions.worktrees = { root?, branchPrefix?, keep? }`.
|
|
107
|
+
|
|
108
|
+
### Server methods
|
|
109
|
+
|
|
110
|
+
New group `worktrees`: `list { repo? }`, `status { id }`, `create`, `branch { id, name }`,
|
|
111
|
+
`handoff { id, direction }`, `remove { id, force? }`, `restore { id }`, `prune { repo?, keep? }`,
|
|
112
|
+
`adopt { path }`, `setup.trust { repo, hash }`. Terminal equivalents use the control key
|
|
113
|
+
(INV-TUI-4).
|
|
114
|
+
|
|
115
|
+
### Terminal
|
|
116
|
+
|
|
117
|
+
- `xharness --worktree [name]` (`-w`) starts the terminal in a new managed worktree of the current
|
|
118
|
+
repository (or reuses the named one).
|
|
119
|
+
- `xharness worktree list|new|rm|prune|adopt|restore`.
|
|
120
|
+
- `/worktree` opens a page: list with branch, changes and last use; actions new, switch, create
|
|
121
|
+
branch, hand off, remove, restore, prune, trust setup script. Switching uses the terminal
|
|
122
|
+
relaunch loop with the new folder.
|
|
123
|
+
|
|
124
|
+
### INV-BND-2
|
|
125
|
+
|
|
126
|
+
"worktree" leaves the list of application concepts; a worktree is now a Harness object.
|
|
127
|
+
|
|
128
|
+
## Alternatives
|
|
129
|
+
|
|
130
|
+
- **Keep worktrees in the App.** Breaks INV-PAR-1; the terminal could not isolate a session.
|
|
131
|
+
- **Claude Code's opt-in named worktrees only.** The owner chose Codex's managed model; named
|
|
132
|
+
permanent worktrees are kept as the second kind.
|
|
133
|
+
- **Inside the repository** (`.claude/worktrees`, `.agents/worktrees`). Puts large device-local
|
|
134
|
+
folders where editors and tools index them; the state directory avoids that.
|
|
135
|
+
- **Copy-on-write clones** (omp). Faster for large ignored folders but platform-specific; left for
|
|
136
|
+
a later option.
|
|
137
|
+
|
|
138
|
+
## Consequences
|
|
139
|
+
|
|
140
|
+
- Hosts call `worktrees.*` instead of running git themselves. The App's `projects.rs` worktree
|
|
141
|
+
code is replaced; its existing worktrees can be adopted on the person's command.
|
|
142
|
+
- New folders in the state directory; no data-root change.
|
|
143
|
+
- The terminal gains a command-line flag, a command and a page.
|
|
144
|
+
|
|
145
|
+
## Migration
|
|
146
|
+
|
|
147
|
+
Nothing moves automatically. `adopt` registers existing worktrees when a person asks. The change
|
|
148
|
+
can be undone by removing the registry; checkouts stay valid git worktrees.
|
|
149
|
+
|
|
150
|
+
## Checks
|
|
151
|
+
|
|
152
|
+
Unit tests on temporary repositories: create (detached, branch, carry changes), include copy (no
|
|
153
|
+
overwrite, symlink skip, caps), setup trust gate, lease and lock, recovery of a stale lease, prune
|
|
154
|
+
order and protection, snapshot and restore, remove refusal, handoff both ways and its refusals,
|
|
155
|
+
adopt. Terminal page model tests. `npm run typecheck`, `npm test`, `npm run prove`, and the App's
|
|
156
|
+
checks.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0017
|
|
3
|
+
title: Page annotations as a Harness capability, captured in the headed browser or a host's web view
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-23
|
|
6
|
+
updated: 2026-10-25
|
|
7
|
+
affects: [INV-STO-3, INV-SRV-1, 07-tools-and-gate.md, 10-server-protocol.md, 11-terminal.md, 12-storage.md, 13-world-tools.md, 14-surfaces-and-parity.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0017: Page annotations
|
|
11
|
+
|
|
12
|
+
Accepted by the user's approval of the parity plan on 2026-10-23 (PROP-0015, ADR-0017). The owner
|
|
13
|
+
chose capture through a visible (headed) Harness browser window when only the terminal runs.
|
|
14
|
+
Implemented in the working tree on 2026-10-23: `src/annotations/`, the `annotations` world part,
|
|
15
|
+
`annotations.*` methods, `/notes` and `/annotate`; spec pages 07, 10, 11, 12, 13 updated. The App
|
|
16
|
+
source changes migrate the prior store into Harness and provide the Annotate panel; acceptance of
|
|
17
|
+
native WKWebView gestures remains outstanding. The Harness implementation is included in the 4.0.0
|
|
18
|
+
candidate.
|
|
19
|
+
|
|
20
|
+
## Problem
|
|
21
|
+
|
|
22
|
+
Web annotations exist only in the App (`App/src-tauri/src/browser_annotations/`, FEAT-0016): a
|
|
23
|
+
person marks a page, a text range or an element in an App WebKit tab, writes a note, and shares it
|
|
24
|
+
with an agent, which reads it with `browser_annotations_list` / `browser_annotations_read`. The
|
|
25
|
+
store, the page script and the tools are App code, so the terminal has no annotations (INV-PAR-1).
|
|
26
|
+
|
|
27
|
+
## Affected rules
|
|
28
|
+
|
|
29
|
+
- 13-world-tools: "The App owns its shared WebKit browser UI, private/shared tab policy, …" — the
|
|
30
|
+
WebKit capture surface stays with the host; the store, tools and page script move here.
|
|
31
|
+
- `INV-STO-3`: new data-root folder `annotations/`.
|
|
32
|
+
- `INV-SRV-1`: new method group `annotations`.
|
|
33
|
+
|
|
34
|
+
## Proposal
|
|
35
|
+
|
|
36
|
+
### Records
|
|
37
|
+
|
|
38
|
+
A **note** is `{ id, version, source, target, body, tags, status, author, createdAt, updatedAt,
|
|
39
|
+
grants, history }`, the format of the App store, so existing notes import unchanged:
|
|
40
|
+
|
|
41
|
+
- `source`: `{ url, title, capturedAt }` plus an optional opaque `surface` string from the capturing
|
|
42
|
+
front end.
|
|
43
|
+
- `target`: `page`, `text { exact, prefix, suffix, start, end }` (Unicode code points over
|
|
44
|
+
normalised page text), or `element { tag, role, name, text, context, selector }`. Element capture
|
|
45
|
+
prefers role/name/text; when an otherwise empty visual element has no semantic label, it may use
|
|
46
|
+
a specific CSS selector (ID, test ID, classes, and a structural path when needed), never a bare
|
|
47
|
+
tag. Resolution uses that selector only when it identifies one allowed element and the captured
|
|
48
|
+
semantics/context still agree; stale or duplicate targets remain unresolved or ambiguous.
|
|
49
|
+
- `status`: `open` or `resolved`. `version` increases on every change; update and delete name the
|
|
50
|
+
version they expect (compare-and-swap). The last 100 change receipts are kept, without earlier
|
|
51
|
+
bodies. At most 10,000 notes.
|
|
52
|
+
- `grants`: `{ principal: { sessionId? , agentId? }, binding?: string, grantedAt }[]`. `binding` is
|
|
53
|
+
an opaque host string (the App uses its tab and sharing epoch); the Harness compares it, never
|
|
54
|
+
interprets it. Sharing and revoking are a person's action through the methods below, never a
|
|
55
|
+
model's.
|
|
56
|
+
|
|
57
|
+
Notes are one JSON file each under `<data root>/annotations/`, written atomically, owned by
|
|
58
|
+
`annotations/store.ts`. The store is synchronous, like the Wiki.
|
|
59
|
+
|
|
60
|
+
### Page script
|
|
61
|
+
|
|
62
|
+
`annotations/pageScript.js` is the App's page script, moved: plain DOM code with a pull model
|
|
63
|
+
(`identity`, `begin`, `capture`, `cancel`, `resolve`, `reveal`). The page never calls out; the
|
|
64
|
+
front end polls it. It runs in the page's own script world, as in the App, so a page can tamper
|
|
65
|
+
with it: every result is untrusted and validated by the store before it is saved. A host reads the
|
|
66
|
+
same source with `annotations.pageScript`.
|
|
67
|
+
|
|
68
|
+
### Tools
|
|
69
|
+
|
|
70
|
+
A world part `annotations` (plugin id `annotations`, switchable, on by default) offers two
|
|
71
|
+
read-only tools to SDK and terminal sessions:
|
|
72
|
+
|
|
73
|
+
- `page_notes_list { url?, status?, offset? }` — up to 20 summaries, 12,000 characters total.
|
|
74
|
+
- `page_notes_read { id }` — the full note, marked untrusted.
|
|
75
|
+
|
|
76
|
+
A tool returns only notes granted to the calling session or agent. A binding is the host's handle
|
|
77
|
+
for revocation: when what it stands for ends (a tab closes or is shared again), the host calls
|
|
78
|
+
`annotations.revokeBinding` and every grant made with it ends. The Harness never interprets a
|
|
79
|
+
binding. The part is separate from the browser part, so a host that replaces the browser
|
|
80
|
+
(`browser: false`) still has annotations.
|
|
81
|
+
|
|
82
|
+
### Server methods
|
|
83
|
+
|
|
84
|
+
Group `annotations`: `list { url?, query?, status?, offset? }`, `read { id }`,
|
|
85
|
+
`create { source, target, body, tags }`, `update { id, expectedVersion, patch }`,
|
|
86
|
+
`delete { id, expectedVersion }`, `share { id, principal, binding? }`,
|
|
87
|
+
`unshare { id, principal }`, `revokeBinding { binding }`, `import { notes }` (keeps ids; used once
|
|
88
|
+
by a host migrating its own store), `pageScript` (the page helper's source for a host's web view).
|
|
89
|
+
|
|
90
|
+
### Terminal capture
|
|
91
|
+
|
|
92
|
+
- `/annotate [url]` opens a visible capture browser for the terminal session (its own window and
|
|
93
|
+
its own profile, `<state dir>/browser/profiles/person`, separate from the agent's browser),
|
|
94
|
+
navigates when a URL is given, and runs the page script there. The person selects
|
|
95
|
+
text or an element in the Chromium window and presses Capture in the terminal; the terminal pulls
|
|
96
|
+
the selection, asks for a body and tags, and saves the note. `/annotate --page <url>` saves a
|
|
97
|
+
page note without opening a window.
|
|
98
|
+
- `/notes` lists notes for the current page or all notes, with search and status filter, and offers
|
|
99
|
+
edit, resolve or reopen, share with this session, unshare, delete and reveal (highlight in the
|
|
100
|
+
headed window; result `matched`, `ambiguous` or `unresolved`).
|
|
101
|
+
|
|
102
|
+
### Host capture
|
|
103
|
+
|
|
104
|
+
A host with its own web view (the App's WebKit tabs) runs the same page script there and calls the
|
|
105
|
+
same methods. The host keeps its tab and sharing policy and passes it as the grant's binding.
|
|
106
|
+
|
|
107
|
+
## Alternatives
|
|
108
|
+
|
|
109
|
+
- **Keep annotations in the App.** Breaks INV-PAR-1.
|
|
110
|
+
- **Terminal-only capture from page text and the accessibility snapshot.** The owner chose the
|
|
111
|
+
headed window, which captures exactly what the person selects. Snapshot picking can be added
|
|
112
|
+
later as a fallback.
|
|
113
|
+
- **Put the tools in the browser part.** A host that replaces the browser would lose them.
|
|
114
|
+
|
|
115
|
+
## Consequences
|
|
116
|
+
|
|
117
|
+
- New data-root folder `annotations/`, new method group, two new model tools.
|
|
118
|
+
- The App's store and tools are replaced by Harness calls; its WebKit capture stays.
|
|
119
|
+
|
|
120
|
+
## Migration
|
|
121
|
+
|
|
122
|
+
The App imports its existing `<data root>/browser-annotations/*.json` once with
|
|
123
|
+
`annotations.import`, keeping ids, then renames the old folder `browser-annotations.migrated`. If
|
|
124
|
+
the import fails, nothing is renamed and the App reports it.
|
|
125
|
+
|
|
126
|
+
## Checks
|
|
127
|
+
|
|
128
|
+
Store tests ported from the App's `store.rs` tests (compare-and-swap, cap, history, target
|
|
129
|
+
validation, code-point offsets); grant tests (an unshared note is invisible, a binding mismatch is
|
|
130
|
+
refused); page-script tests; capture and reveal with a fake browser launcher; terminal page model
|
|
131
|
+
tests. `npm run typecheck`, `npm test`, `npm run prove`, and the App's checks.
|