@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
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0018
|
|
3
|
+
title: Inspector-style page notes, a fix queue to the agent, and app windows as capture targets
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-23
|
|
6
|
+
updated: 2026-10-23
|
|
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-0018: Inspector, fix queue and app targets for page notes
|
|
11
|
+
|
|
12
|
+
Requested by the owner on 2026-10-23. They chose these four things:
|
|
13
|
+
- the popover's three choices: Save, Queue, Send now
|
|
14
|
+
- the popover drawn inside the page
|
|
15
|
+
- Electron over its DevTools port, and real Tauri windows on macOS, as targets
|
|
16
|
+
- the Harness and terminal first, then the App pane
|
|
17
|
+
|
|
18
|
+
Implemented for the Harness and terminal on 2026-10-23 and in the App source on 2026-10-24 (store migration, `page_notes_*` tools, Annotate panel). The Harness implementation is included in the 4.0.0 candidate. Native WKWebView gestures still need acceptance in the running App.
|
|
19
|
+
|
|
20
|
+
## Problem
|
|
21
|
+
|
|
22
|
+
Page notes (PROP-0017) take several prompts each. The person picks a kind, confirms in the terminal, types the note in the terminal, then shares it. A note never reaches the agent unless the person asks the agent to read it. Capture works only on http(s) pages, in a new browser context. So a person cannot point at a component of the app they are building, say what to change, and have the agent do it, and they cannot do it at all in a desktop app's own window.
|
|
23
|
+
|
|
24
|
+
## Affected rules
|
|
25
|
+
|
|
26
|
+
- `INV-SRV-1`: new methods `annotations.queue`, `dequeue`, `confirm`, `queued`, `createAndAct`, `compose`, `delivered`, `send`, `annotations.capture.*` and `annotations.bridge.start`. All are additive.
|
|
27
|
+
- `INV-STO-3`: one new state-directory file, `<state dir>/notes-bridge.json`, which holds the page bridge's port and token. It is owned by `annotations/bridge.ts`.
|
|
28
|
+
- 07: a new model tool, `page_notes_mark_fixed`. It is the first page-note tool that writes.
|
|
29
|
+
- 13: "Capture happens in the terminal's visible browser or in a host web view" now also covers app windows, either over a loopback DevTools port or through the page bridge.
|
|
30
|
+
|
|
31
|
+
## Proposal
|
|
32
|
+
|
|
33
|
+
### Records
|
|
34
|
+
|
|
35
|
+
A note gains an optional `delivery`:
|
|
36
|
+
`{ state: 'queued' | 'sent' | 'fixed', sessionId, queuedAt, autoSend?, confirm?, sentAt?, runId?, fixedAt?, summary? }`.
|
|
37
|
+
|
|
38
|
+
- `status` (`open` | `resolved`) is unchanged, and only a person resolves a note.
|
|
39
|
+
- Queueing a note shares it with that session, because the agent must be able to read what it is asked to fix.
|
|
40
|
+
- New history operations: `queue`, `dequeue`, `deliver`, `mark_fixed`.
|
|
41
|
+
- A note captured in an app window carries `source.app: { kind: 'cdp' | 'bridge', name }`. Its URL may then also use `file:`, `app:`, `tauri:`, `electron:` or `asset:`, still without credentials. Web notes keep the http(s) rule.
|
|
42
|
+
|
|
43
|
+
### Inspector and popover
|
|
44
|
+
|
|
45
|
+
`begin` takes a third kind, `inspect`.
|
|
46
|
+
- Hovering draws an outline and a `tag.class W×H` chip.
|
|
47
|
+
- A click, or a drag over text, opens a popover beside the target. It has a comment box and three buttons:
|
|
48
|
+
- **Create annotation**: `save`
|
|
49
|
+
- **Ask agent to fix**: `queue`
|
|
50
|
+
- **Proceed now**: `send`
|
|
51
|
+
- ⌘/Ctrl+Enter is Proceed now; with Shift it is queue.
|
|
52
|
+
- Everything is drawn in a closed shadow root.
|
|
53
|
+
- The page never receives the press or click on what is inspected, nor anything typed in the popover.
|
|
54
|
+
- Inputs, secrets, `[data-sensitive]` elements, frames, shadow roots and custom elements are never picked, as in PROP-0017. (Open shadow roots and readable custom elements became pickable in [PROP-0038](PROP-0038-annotate-open-shadow-roots.md).)
|
|
55
|
+
- The inspector stays on after each comment.
|
|
56
|
+
- A new operation, `next`, returns `{ active, documentId, url, title, result }`, one comment at a time.
|
|
57
|
+
- `toast` shows a short status in the page.
|
|
58
|
+
- The helper's global key moves to `…page.v2`.
|
|
59
|
+
|
|
60
|
+
### Trust
|
|
61
|
+
|
|
62
|
+
What the page helper returns is page data. Whether a "Proceed now" goes straight to the agent depends on **where the helper ran**, decided by the Harness:
|
|
63
|
+
- **Chromium (the capture browser and DevTools-attached apps):** the helper runs in an isolated script world (`Page.createIsolatedWorld`). The DOM is shared, but the JavaScript globals are not, so the page cannot read or forge results. These results are trusted and sent directly.
|
|
64
|
+
- **Page bridge and host web views without isolation:** results are untrusted. A send becomes a queued note with `confirm: true`, which the person confirms in the panel before it goes out.
|
|
65
|
+
|
|
66
|
+
A host's `annotations.createAndAct` passes `trusted: true` only for comments from its own UI or an isolated world.
|
|
67
|
+
|
|
68
|
+
### Delivery
|
|
69
|
+
|
|
70
|
+
`compose(notes)` builds one instruction for a batch:
|
|
71
|
+
- It contains each note's id, where it is, the element (tag, role, name, selector, text) or the quoted text, and the person's comment.
|
|
72
|
+
- Page-derived text is labelled untrusted and fenced; the comment is in a `comment` fence.
|
|
73
|
+
- It asks the agent to call `page_notes_mark_fixed`.
|
|
74
|
+
- A batch holds at most 20 notes.
|
|
75
|
+
|
|
76
|
+
The `NoteDeliveries` service (`annotations/delivery.ts`) handles sending:
|
|
77
|
+
- **Terminal session:** the batch goes out as a new run through `TerminalSessions.send`, and the notes become `sent` with that run id. If the session is busy, the notes stay queued with `autoSend`.
|
|
78
|
+
- **Host session:** the reply is `{ state: 'host', text, ids }`. The host starts the run (`sessions.run`) and reports it with `annotations.delivered`.
|
|
79
|
+
- **When a run ends** (`runs.listen`, after 250 ms), the session's `autoSend` notes go out. Notes still waiting for a person's confirmation are skipped. For a host session, the service emits the notice `annotations.ready`.
|
|
80
|
+
- Every change emits `annotations.changed`.
|
|
81
|
+
|
|
82
|
+
### Model tool
|
|
83
|
+
|
|
84
|
+
`page_notes_mark_fixed { id, summary }` works only on a note shared with the caller. It sets `delivery.state = 'fixed'` with the summary. It never resolves a note and never changes grants. It is not read-only, so it is unavailable in plan mode.
|
|
85
|
+
|
|
86
|
+
### Capture targets
|
|
87
|
+
|
|
88
|
+
`AnnotationCapture` captures in one target per key:
|
|
89
|
+
- **`web`:** the visible browser window from PROP-0017. Its helper calls now run in an isolated world.
|
|
90
|
+
- **`cdp`:** an app started with a DevTools port, attached with `connectOverCDP` to a loopback address only. It uses the app's own windows, and nothing is routed or opened. Releasing the target disconnects; the app keeps running. The default name is `App at <host:port>`.
|
|
91
|
+
- **`bridge`:** a loopback HTTP server (`annotations/bridge.ts`) serves `/page-notes.js?token=…`. That script is the page helper plus a long-poll loop that pulls operations and posts replies.
|
|
92
|
+
- The port and token are kept in `notes-bridge.json`, so the script tag in an app stays valid across restarts.
|
|
93
|
+
- Requests need the token and the host name `127.0.0.1:<port>` or `localhost:<port>`, which blocks DNS rebinding.
|
|
94
|
+
- At most 32 windows; a window is dropped after 45 s without a poll.
|
|
95
|
+
|
|
96
|
+
Methods (`key`, `windows`, `selectWindow`, `inspect`, `stopInspect`, `next`, `toast`) behave the same for all three.
|
|
97
|
+
|
|
98
|
+
`inspectStep` (`annotations/inspect.ts`) is the one loop step the terminal and hosts share. It:
|
|
99
|
+
1. reads the next comment;
|
|
100
|
+
2. creates the note with `source.surface` and `source.app`;
|
|
101
|
+
3. applies the action with the target's trust;
|
|
102
|
+
4. shows a toast in the page.
|
|
103
|
+
|
|
104
|
+
### Server methods
|
|
105
|
+
|
|
106
|
+
| Method | Input | Reply |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| `annotations.queue` | `{ id, sessionId, expectedVersion?, autoSend? }` | `Note` |
|
|
109
|
+
| `annotations.dequeue` | `{ id, expectedVersion? }` | `Note` |
|
|
110
|
+
| `annotations.confirm` | `{ id, expectedVersion? }` | `Note` |
|
|
111
|
+
| `annotations.queued` | `{ sessionId }` | `{ notes }`, oldest first |
|
|
112
|
+
| `annotations.createAndAct` | `{ note, action, sessionId?, trusted? }` | `{ note, send }` |
|
|
113
|
+
| `annotations.compose` | `{ sessionId, ids? }` | `{ text, ids }` |
|
|
114
|
+
| `annotations.delivered` | `{ ids, sessionId, runId }` | `{ notes }` |
|
|
115
|
+
| `annotations.send` | `{ sessionId, ids? }` | `{ state: sent \| busy \| host \| empty, … }` |
|
|
116
|
+
| `annotations.capture.attach` | `{ key, kind, endpoint?, name? }` | `{ kind, app, windows, bridge? }` |
|
|
117
|
+
| `annotations.capture.target` | `{ key }` | `{ kind, app, inspecting, windows }` |
|
|
118
|
+
| `annotations.capture.selectWindow` | `{ key, window }` | `{}` |
|
|
119
|
+
| `annotations.capture.open` | `{ key, url? }` | `{ url, title }` |
|
|
120
|
+
| `annotations.capture.inspect` / `stopInspect` | `{ key }` | `{ captureId }` / `{}` |
|
|
121
|
+
| `annotations.capture.next` | `{ key, sessionId?, surface? }` | `{ active, trusted, app, note, send, message, … }` |
|
|
122
|
+
| `annotations.capture.release` | `{ key }` | `{}` |
|
|
123
|
+
| `annotations.bridge.start` | `{}` | `{ port, token, scriptUrl, snippet }` |
|
|
124
|
+
|
|
125
|
+
### Terminal
|
|
126
|
+
|
|
127
|
+
`/annotate` is now a full-screen pane. The browser window or the app's window is the canvas, and the pane is the panel beside it.
|
|
128
|
+
|
|
129
|
+
Ways to start it:
|
|
130
|
+
- `/annotate [url]`: a web page or dev server
|
|
131
|
+
- `/annotate --app <DevTools address | port> [name]`: an app over its DevTools port
|
|
132
|
+
- `/annotate --bridge [name]`: shows the script tag to load in the app
|
|
133
|
+
|
|
134
|
+
The pane:
|
|
135
|
+
- The header shows the target, the window, and whether the inspector is on.
|
|
136
|
+
- Sections: **Queue (N)**, **Sent and fixed**, and **Saved**.
|
|
137
|
+
- Keys:
|
|
138
|
+
|
|
139
|
+
| Key | Action |
|
|
140
|
+
|---|---|
|
|
141
|
+
| `i` | inspector on/off |
|
|
142
|
+
| `s` | send the queue, confirming page-origin notes first |
|
|
143
|
+
| `x` | take the selected note out of the queue |
|
|
144
|
+
| `t` | choose a window |
|
|
145
|
+
| `Enter` | note menu: reveal, send, confirm, queue, unqueue, edit, resolve, delete |
|
|
146
|
+
|
|
147
|
+
- It polls `terminal.annotations.next` every 400 ms while the inspector is on.
|
|
148
|
+
|
|
149
|
+
New terminal routes: `target`, `attach`, `windows`, `selectWindow`, `inspect`, `stopInspect`, `next`, `queue`, `dequeue`, `confirm`, `send`. They queue and send only to the terminal's own session and need the control key. `/notes` stays the plain list.
|
|
150
|
+
|
|
151
|
+
## Alternatives
|
|
152
|
+
|
|
153
|
+
- **The host draws the popover.** The App's native web view covers React content, and each host would build its own. The owner chose in-page drawing.
|
|
154
|
+
- **A WebSocket bridge.** It would need a new dependency. Long-polling over plain HTTP is enough for one person's clicks, and `text/plain` posts avoid CORS preflights.
|
|
155
|
+
- **Trust whatever the page reports.** A hostile page could start a run with its own text. The isolated world, plus confirmation where isolation is impossible, prevents that.
|
|
156
|
+
- **Do nothing.** The owner's request goes unmet.
|
|
157
|
+
|
|
158
|
+
## Consequences
|
|
159
|
+
|
|
160
|
+
- **Notes:** the record has a new optional field; older notes read unchanged.
|
|
161
|
+
- **Protocol:** additive methods and notices.
|
|
162
|
+
- **Hosts:** the App replaces its bottom-strip panel with a pane, and calls `annotations.*`, `annotations.capture.*` for app targets, and `compose`/`delivered` around its own `sessions.run`.
|
|
163
|
+
- **Agent tools:** sessions get a third page-note tool.
|
|
164
|
+
|
|
165
|
+
## Migration
|
|
166
|
+
|
|
167
|
+
No data migration: `delivery` is optional. The App's PAR-011 migration (`annotations.import`) is unchanged. The bridge settings file is created on first use and can be deleted to get a new port and token.
|
|
168
|
+
|
|
169
|
+
## Checks
|
|
170
|
+
|
|
171
|
+
| What | Where |
|
|
172
|
+
|---|---|
|
|
173
|
+
| Queue, delivery, busy and auto-send, confirmation, host hand-off, mark fixed, app URLs | `annotations/delivery.test.ts` |
|
|
174
|
+
| Inspector in a real page: element, text drag, sensitive field refused, Escape, toast, cancel | `annotations/pageScript.test.ts` |
|
|
175
|
+
| Isolated world (the page cannot see the helper), reload re-arm, DevTools attach leaves the app running, bridge round-trip as untrusted, stable port and token | `annotations/capture.test.ts` |
|
|
176
|
+
| Bridge token, host-name check and relay | `annotations/bridge.test.ts` |
|
|
177
|
+
| Pane | `terminal/tui/pages/annotatePage.test.ts` |
|
|
178
|
+
| Terminal send and auto-send on run end | `terminal/terminal.test.ts` |
|
|
179
|
+
| Host compose and delivered | `npm run prove` |
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0019
|
|
3
|
+
title: Harness-owned contextual side questions across surfaces
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-24
|
|
6
|
+
updated: 2026-10-24
|
|
7
|
+
affects: [INV-RUN-1, INV-RUN-3, INV-RUN-5, INV-GATE-1, INV-PLG-1, INV-PLG-5, INV-CAP-1, INV-SRV-1, INV-SRV-2, INV-PAR-1, INV-PAR-2, 02-sessions-and-runs.md, 06-plugins-and-capabilities.md, 07-tools-and-the-gate.md, 10-server-protocol.md, 11-terminal.md, 14-surfaces-and-parity.md, 12-storage.md, ADR-0023-contextual-side-question-runs.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0019: Harness-owned contextual side questions across surfaces
|
|
11
|
+
|
|
12
|
+
## Problem
|
|
13
|
+
|
|
14
|
+
`/btw` currently has two different execution paths. The terminal constructs a direct, in-memory Pi
|
|
15
|
+
session in `src/terminal/tui/sideQuestion.ts`; it supplies at most six visible turns and 6,000
|
|
16
|
+
characters, names of tools called, but no tool inputs or results. It has no Harness run record. The
|
|
17
|
+
App assembles a different bounded snapshot and starts a separate, tracked `sessions.run` with
|
|
18
|
+
trigger `side-question` (`App/docs/features/FEAT-0014-side-questions.md`). The parity register calls
|
|
19
|
+
these one capability but lists no Harness owner method (`docs/parity.md`).
|
|
20
|
+
|
|
21
|
+
The terminal side model therefore answers from a short excerpt, lacks the main run's instructions
|
|
22
|
+
and evidence, and is explicitly told to be brief. The two surfaces also have different observability
|
|
23
|
+
and lifecycle. A question about work outside the repository can be answered incorrectly when that
|
|
24
|
+
work is absent from the excerpt, even if the main run already read it.
|
|
25
|
+
|
|
26
|
+
## Affected rules
|
|
27
|
+
|
|
28
|
+
- **INV-RUN-1:** A side question pins its selected account and an empty capability set, with no
|
|
29
|
+
variant (`variantVersion: null`), because it uses only fixed Harness instructions and a redacted
|
|
30
|
+
projection supplied by or read from the main run.
|
|
31
|
+
- **INV-RUN-3:** Parent run events used as context have already been validated, redacted and
|
|
32
|
+
persisted. Side-question events use the same contract.
|
|
33
|
+
- **INV-RUN-5:** Side questions use a dedicated unattended launch: no extensions, context files,
|
|
34
|
+
variant code, connectors, providers, subagents, or Harness tools.
|
|
35
|
+
- **INV-GATE-1:** A side-question run has no tools to call; this is enforced by the Harness.
|
|
36
|
+
- **INV-PLG-1 / INV-PLG-5:** The Harness remains the only loader. Its fixed side-question
|
|
37
|
+
instruction is attributed to a Harness-owned plugin descriptor.
|
|
38
|
+
- **INV-CAP-1:** The side run freezes an empty tool, connector, and contribution set.
|
|
39
|
+
- **INV-SRV-1/2:** Hosts call an additive Harness service through the server contract and the same
|
|
40
|
+
in-process API.
|
|
41
|
+
- **INV-PAR-1/2:** The Harness owns the capability; terminal and host surfaces use it.
|
|
42
|
+
|
|
43
|
+
## Proposal
|
|
44
|
+
|
|
45
|
+
1. Add a generic Harness side-question service with start, read and interrupt operations. It is
|
|
46
|
+
callable by the standalone terminal and embedding hosts. Each question is an independent
|
|
47
|
+
run with a new native history identity, ordinary run records, event validation and redaction.
|
|
48
|
+
It is not a child, subagent, continuation, queued message, or change to the main run.
|
|
49
|
+
2. The service builds a bounded context from the main run's recorded effective system prompt,
|
|
50
|
+
current context update, visible tool inventory, persisted public run events, and a caller-supplied
|
|
51
|
+
transcript projection. Visible context includes assistant text, tool names, inputs and results.
|
|
52
|
+
Hidden reasoning and attachment bytes are excluded. Credential-like fields and common secret
|
|
53
|
+
forms are redacted before context enters the side run. Conversation and tool contents are framed
|
|
54
|
+
as evidence; they cannot expand the side run's authority. Context limits are fixed in code and
|
|
55
|
+
tested, keeping the effective prompt first and the newest conversation/activity when trimming.
|
|
56
|
+
3. A side-question run uses the main conversation's selected account, model and effort, with an
|
|
57
|
+
independent session identity and a fixed, attributed Harness instruction. It records no variant
|
|
58
|
+
(`variantVersion: null`) and freezes an empty capability set. It loads no tools, providers,
|
|
59
|
+
connectors, subagents, project context files, user or variant plugin code, or main native history.
|
|
60
|
+
The main system prompt is context for answering, not permission to access the main run's tools.
|
|
61
|
+
4. A side question and answer never enter, steer, stop or queue work on the parent conversation.
|
|
62
|
+
They are recorded only in the independent side run's ordinary events; clients may show that run
|
|
63
|
+
in Trajectory and Usage. No separate durable side-thread store is introduced.
|
|
64
|
+
5. Each surface keeps its current side-question presentation. The terminal supports a scrollable
|
|
65
|
+
answer, copy and dismissal. The App continues to own its dock and conversation selection, while
|
|
66
|
+
the Harness owns launch policy, context construction, run lifecycle and result events.
|
|
67
|
+
6. Phase two aligns the host path policy with the main read path: absolute and `~` paths are
|
|
68
|
+
available to read-only file tools anywhere the operating system permits. The working directory
|
|
69
|
+
is a default location, not a repository sandbox. Edit, write and command calls continue through
|
|
70
|
+
the existing gate.
|
|
71
|
+
7. Update the capability register so the Harness service owns side questions and both terminal and
|
|
72
|
+
App surfaces call the shared contract.
|
|
73
|
+
|
|
74
|
+
## Alternatives
|
|
75
|
+
|
|
76
|
+
- **Keep the terminal-only Pi session and raise its excerpt limits.** This leaves the App and
|
|
77
|
+
terminal with different semantics and observability.
|
|
78
|
+
- **Send hidden reasoning, attachment bytes, or the entire native history.** This exposes material
|
|
79
|
+
that is not needed to answer questions and can include private or provider-internal content.
|
|
80
|
+
- **Give the side question the main run's tools.** This turns a side answer into independent work
|
|
81
|
+
with authority and can cause effects that the user did not request.
|
|
82
|
+
- **Persist all side-question threads in a new store.** This adds retention, deletion and
|
|
83
|
+
cross-surface synchronization contracts; ordinary run records already capture model usage and
|
|
84
|
+
results.
|
|
85
|
+
- **Treat the repository root as a read boundary.** Pi's read-only file tools accept absolute and
|
|
86
|
+
`~` paths, but the App's host policy also applies a working-folder/trusted-folder check. The
|
|
87
|
+
approved implementation removes that extra read restriction and accepts `~` in host path checks;
|
|
88
|
+
writes and commands keep their existing gates.
|
|
89
|
+
|
|
90
|
+
## Consequences
|
|
91
|
+
|
|
92
|
+
- Side-question requests and answers become ordinary, separately inspectable Harness run records.
|
|
93
|
+
They remain absent from the parent transcript and are no longer ephemeral from the run store.
|
|
94
|
+
- The Harness owns the context schema, redaction, bounds, restricted launch and lifecycle. Hosts
|
|
95
|
+
provide only the transcript projection they own and present the Harness result.
|
|
96
|
+
- A dedicated restricted launch and an attributed first-party instruction are required. The
|
|
97
|
+
restriction is explicit; `automatic: true` alone is not the contract because unattended runs have
|
|
98
|
+
their own plugin loading rules.
|
|
99
|
+
- No data migration or protocol version change is required. New side runs use the
|
|
100
|
+
`side-question` trigger and no variant pin. A supplied parent run must belong to the supplied
|
|
101
|
+
parent session; the terminal and App derive that relationship from their active conversation.
|
|
102
|
+
- The Harness file-reading behavior does not change. The App now aligns its host gate with that
|
|
103
|
+
OS-permission boundary for read-only native file tools. Its existing approval and scope gates
|
|
104
|
+
remain in place for writes and commands.
|
|
105
|
+
|
|
106
|
+
## Migration
|
|
107
|
+
|
|
108
|
+
No stored schema migration is planned. New side questions use standard run records under a distinct
|
|
109
|
+
trigger; clients do not reopen old side-question sessions. The App switches its launch path to the
|
|
110
|
+
shared Harness service and permits OS-readable paths in read-only native file tools. Existing run
|
|
111
|
+
records and write/command gates are unchanged.
|
|
112
|
+
|
|
113
|
+
## Checks
|
|
114
|
+
|
|
115
|
+
- Unit tests for context redaction, ordering, bounds, omitted hidden fields, parent event projection,
|
|
116
|
+
attributed instructions, no-tool launch, run pinning and owner-scoped reads/interrupts.
|
|
117
|
+
- Lifecycle checks for streaming, replacement, cancellation and dismissal without changing the
|
|
118
|
+
parent run or transcript.
|
|
119
|
+
- Harness `npm run typecheck`, `npm test`, `npm run prove`, and `python3 scripts/verify-terminal.py`.
|
|
120
|
+
- App `npm run typecheck`, `npm test`, `npm run check:layers`, and `cd src-tauri && cargo test`.
|
|
121
|
+
- Fake-provider tests are the default. Any real-model/cache or live UI acceptance run requires the
|
|
122
|
+
account owner's permission.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0020
|
|
3
|
+
title: Built-in feature modules and namespaced plugin commands
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-24
|
|
6
|
+
updated: 2026-10-24
|
|
7
|
+
affects: [INV-PLG-5, INV-PLG-6, INV-TUI-2, INV-TUI-7, INV-SRV-1, 06-plugins-and-capabilities.md, 11-terminal.md, 13-world-tools.md, 14-surfaces-and-parity.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0020: Built-in feature modules and namespaced plugin commands
|
|
11
|
+
|
|
12
|
+
**Command namespace note:** The initial decision to prefix every built-in command was superseded by
|
|
13
|
+
[PROP-0021](PROP-0021-command-namespaces-and-duplicates.md) and
|
|
14
|
+
[ADR-0021](../../decisions/ADR-0021-required-command-namespaces.md). Required built-in commands now
|
|
15
|
+
use their bare names; this proposal remains the record of the feature-module architecture.
|
|
16
|
+
|
|
17
|
+
## Problem
|
|
18
|
+
|
|
19
|
+
`PluginDescriptor` already describes first-party tools, but runtime ownership is split across the
|
|
20
|
+
central `World` constructor, `server/methods.ts`, and the TUI's command switch. TUI plugin commands
|
|
21
|
+
are indistinguishable from core commands, while Pi extension commands are exposed under their
|
|
22
|
+
unprefixed names. This makes feature ownership hard to follow and allows command-name conflicts to
|
|
23
|
+
be resolved by Pi's automatic suffixes instead of a clear owner decision.
|
|
24
|
+
|
|
25
|
+
Evidence: `src/world/world.ts` directly constructed the web, browser and annotation parts;
|
|
26
|
+
`src/server/methods.ts` owned their handlers alongside Wiki, history, worktree and refinement
|
|
27
|
+
handlers; `src/terminal/tui/commands.ts` held feature-page dispatch and exposed Pi commands as
|
|
28
|
+
`/<name>`.
|
|
29
|
+
|
|
30
|
+
## Affected rules
|
|
31
|
+
|
|
32
|
+
- **INV-PLG-5:** Everything model-visible belongs to a plugin. A new prompt section, tool group or
|
|
33
|
+
tool is declared by a `PluginDescriptor` or reported as unattributed.
|
|
34
|
+
- **INV-TUI-2:** The Harness owns screen composition, input, scrolling, command routing and plugin
|
|
35
|
+
UI. Pi owns the execution runtime, native history and rich content components.
|
|
36
|
+
- **INV-SRV-1:** `src/server/methods.ts` is the contract for every non-Node host. Renaming, removing,
|
|
37
|
+
or changing the params or result shape of a method is an architecture change.
|
|
38
|
+
|
|
39
|
+
## Proposal
|
|
40
|
+
|
|
41
|
+
Add one internal typed registry of Harness-managed built-in plugin modules. A module may contribute
|
|
42
|
+
its existing descriptor, world part and cleanup, server-method handlers, and terminal command
|
|
43
|
+
metadata. The registry checks plugin IDs, terminal command names and built-in server-method names
|
|
44
|
+
for duplicates. It does not add category fields to `PluginDescriptor`, plugin responses, or storage.
|
|
45
|
+
|
|
46
|
+
The TUI uses `/plugin:<command>` for built-in and Pi extension commands. Core terminal commands
|
|
47
|
+
remain unprefixed. The built-in commands become `/plugin:doctor`, `/plugin:worktree`,
|
|
48
|
+
`/plugin:trajectory`, `/plugin:subagents`, `/plugin:notes`, and `/plugin:annotate`. Their former
|
|
49
|
+
unprefixed forms are removed at cutover. Prompt templates and the existing `/skill:<name>` syntax
|
|
50
|
+
keep their current behavior.
|
|
51
|
+
|
|
52
|
+
Pi extension commands are invoked through their registered handler and command context. Duplicate
|
|
53
|
+
extension names are omitted from completion and rejected with the owning extension paths when
|
|
54
|
+
invoked. A built-in command name is reserved against extension commands; the built-in remains
|
|
55
|
+
available and reports the colliding extension owner.
|
|
56
|
+
|
|
57
|
+
Ownership taxonomy is documentation only:
|
|
58
|
+
|
|
59
|
+
- **Foundation:** accounts, sessions and run recording, prompt/variant validation, the gate,
|
|
60
|
+
plugin loading/trust/attachments, resource browsing, server and terminal frameworks, and the
|
|
61
|
+
isolated browser engine/network safety.
|
|
62
|
+
- **World:** web tools, browser tools and page annotations.
|
|
63
|
+
- **Memory:** Wiki, history and trajectory.
|
|
64
|
+
- **Automation:** subagents, ask-user, checklist, lessons and refinement.
|
|
65
|
+
- **Integrations:** connected apps/MCP and Hub.
|
|
66
|
+
- **Operations:** doctor and worktrees.
|
|
67
|
+
|
|
68
|
+
The generic browser engine stays Foundation-owned. The browser plugin contributes the user-facing
|
|
69
|
+
tools through an adapter. Required and switchable plugin availability remains as before. Public
|
|
70
|
+
server method names, method schemas, stored data and capability gating do not change.
|
|
71
|
+
|
|
72
|
+
## Alternatives
|
|
73
|
+
|
|
74
|
+
- Keep the TUI switch and move only the annotation command. This leaves all feature commands and
|
|
75
|
+
world assembly split across central dispatch points.
|
|
76
|
+
- Invoke extension handlers through rewritten user text. This relies on Pi's input parsing and
|
|
77
|
+
would not provide one collision policy or a stable plugin command context.
|
|
78
|
+
- Expose plugin categories in the public descriptor. The categories are for ownership and
|
|
79
|
+
documentation, and do not improve current runtime decisions or user flows.
|
|
80
|
+
- Do nothing. Feature ownership and command collisions stay implicit.
|
|
81
|
+
|
|
82
|
+
## Consequences
|
|
83
|
+
|
|
84
|
+
The built-in registry is the runtime source for first-party descriptors, world parts, server
|
|
85
|
+
handlers and command metadata. The terminal adapter still owns page construction and rendering.
|
|
86
|
+
Hosts retain the same RPC methods, tools pass through the same capability set and gate, and no
|
|
87
|
+
storage migration is needed. People update plugin slash commands to the `plugin:` prefix.
|
|
88
|
+
|
|
89
|
+
## Migration
|
|
90
|
+
|
|
91
|
+
Change all current terminal documentation and tests to the namespaced forms. Do not retain aliases
|
|
92
|
+
for old plugin command names. Keep the generic browser engine in Foundation and move only the
|
|
93
|
+
browser tools adapter under the browser plugin. Record plugin categories as an ownership taxonomy,
|
|
94
|
+
not public metadata.
|
|
95
|
+
|
|
96
|
+
## Checks
|
|
97
|
+
|
|
98
|
+
- Registry tests cover unique module IDs, command owners, duplicate server handlers and lifecycle
|
|
99
|
+
part construction.
|
|
100
|
+
- Terminal tests cover built-in and Pi command completions, argument dispatch, duplicate-owner
|
|
101
|
+
diagnostics and rejection of retired command names.
|
|
102
|
+
- Existing attachment tests continue to prove that switchable tool contributions obey the saved
|
|
103
|
+
capability set.
|
|
104
|
+
- Run Harness typecheck, tests, build and `npm run prove`; run terminal PTY journeys and the App's
|
|
105
|
+
typecheck, tests, layer check and Rust tests.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0021
|
|
3
|
+
title: Required built-in commands and duplicate command suppression
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-24
|
|
6
|
+
updated: 2026-10-24
|
|
7
|
+
affects: [INV-TUI-7, INV-PAR-1, 11-terminal.md, 14-surfaces-and-parity.md, ADR-0021]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0021: Required built-in commands and duplicate command suppression
|
|
11
|
+
|
|
12
|
+
Accepted by the user’s request to implement this plan on 2026-10-24; implemented in the working tree and recorded in ADR-0021.
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
PROP-0020 put every built-in plugin command behind `/plugin:`. This makes required Harness features
|
|
17
|
+
less direct to invoke, and stale bridge registrations create duplicate `/plugin:accounts`,
|
|
18
|
+
`/plugin:hub`, and `/plugin:plugins` entries beside their core commands. Loaded extension commands can
|
|
19
|
+
also duplicate an existing bare command or prompt, as with `/plugin:mcp` or `/plugin:llama`.
|
|
20
|
+
|
|
21
|
+
Evidence: the required `subagents`, `history`, `doctor`, and `worktrees` plugin descriptors own
|
|
22
|
+
`subagents`, `trajectory`, `doctor`, and `worktree` terminal commands in `src/plugins/builtin.ts`.
|
|
23
|
+
`src/terminal/tui/commands.ts` prefixes every registry command and does not check extension names
|
|
24
|
+
against core commands or prompt templates. `src/terminal/piExtension.ts` separately registers
|
|
25
|
+
`hub`, `plugins`, and `accounts`, although the owned terminal already routes those names. `/mcp` is a
|
|
26
|
+
core alias for Connections. `/llama` is resource-dependent rather than a Harness core command; when
|
|
27
|
+
a matching prompt is loaded, it is the bare command that takes precedence.
|
|
28
|
+
|
|
29
|
+
## Affected rules
|
|
30
|
+
|
|
31
|
+
- **INV-TUI-7:** A plugin command is invoked as `/plugin:<command>`, dispatched to its registered
|
|
32
|
+
owner and shown that way in completion and help. Duplicate names are rejected with owner
|
|
33
|
+
diagnostics. Old unprefixed plugin command forms are not aliases; core commands stay unprefixed.
|
|
34
|
+
- **INV-PAR-1:** Every capability a person can use in a host is a Harness capability; the standalone
|
|
35
|
+
terminal surfaces it.
|
|
36
|
+
- **14 Surfaces and parity, Contracts:** Plugin-owned terminal commands use `/plugin:<command>`;
|
|
37
|
+
Foundation commands remain unprefixed.
|
|
38
|
+
|
|
39
|
+
## Proposal
|
|
40
|
+
|
|
41
|
+
Use an explicit namespace on each built-in terminal command. Commands owned by a required
|
|
42
|
+
`PluginDescriptor` use the bare terminal namespace; optional built-in plugin commands use
|
|
43
|
+
`/plugin:<command>`. This yields:
|
|
44
|
+
|
|
45
|
+
| Plugin | Command | Invocation |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `subagents` (required) | `subagents` | `/subagents` |
|
|
48
|
+
| `history` (required) | `trajectory` | `/trajectory` |
|
|
49
|
+
| `doctor` (required) | `doctor` | `/doctor` |
|
|
50
|
+
| `worktrees` (required) | `worktree` | `/worktree` |
|
|
51
|
+
| `annotations` (switchable) | `notes`, `annotate` | `/plugin:notes`, `/plugin:annotate` |
|
|
52
|
+
|
|
53
|
+
Keep core `/accounts`, `/hub`, `/plugins`, and `/mcp` unprefixed. Remove the Pi bridge's duplicate
|
|
54
|
+
`accounts`, `hub`, and `plugins` command registrations.
|
|
55
|
+
|
|
56
|
+
A bare core command, alias, required built-in command, or loaded prompt owns that bare name. Do not
|
|
57
|
+
show or execute `/plugin:<name>` when its name collides with one of those commands; direct use reports
|
|
58
|
+
the bare command to use. The same rule handles dynamic duplicates such as `/plugin:mcp` or
|
|
59
|
+
`/plugin:llama` without special-casing installed packages. Pi extension commands with no bare-name
|
|
60
|
+
collision remain `/plugin:<name>`. Namespace collisions between core and required built-in commands
|
|
61
|
+
are rejected rather than silently overwritten. Old prefixed forms of required built-in commands are
|
|
62
|
+
not aliases.
|
|
63
|
+
|
|
64
|
+
Command routing, pages and existing account/plugin methods remain Harness-owned. No server method,
|
|
65
|
+
capability gate, storage layout, or plugin availability changes.
|
|
66
|
+
|
|
67
|
+
## Alternatives
|
|
68
|
+
|
|
69
|
+
- Keep all built-in commands namespaced. This preserves the duplicate entries and makes required
|
|
70
|
+
Harness operations less direct.
|
|
71
|
+
- Unprefix every built-in plugin command. This also changes the optional, switchable Annotations
|
|
72
|
+
commands even though the request targets required plugins.
|
|
73
|
+
- Hide only the five currently named duplicate entries. A general same-name rule would still allow
|
|
74
|
+
future extensions or prompts to create duplicates.
|
|
75
|
+
- Do nothing. The current prefixed required commands and duplicate entries remain.
|
|
76
|
+
|
|
77
|
+
## Consequences
|
|
78
|
+
|
|
79
|
+
Completion, help and dispatch use the namespace declared by the built-in registry. Bare names for
|
|
80
|
+
required plugins participate in the core command collision checks. Optional built-in and third-party
|
|
81
|
+
plugin commands retain the plugin namespace. When a bare prompt or command conflicts with a Pi
|
|
82
|
+
extension command, the bare command wins and the extension's slash command is unavailable under that
|
|
83
|
+
name; the extension must choose another name to expose both.
|
|
84
|
+
|
|
85
|
+
## Migration
|
|
86
|
+
|
|
87
|
+
Use `/subagents`, `/trajectory`, `/doctor`, and `/worktree` in place of their `/plugin:` forms. Keep
|
|
88
|
+
`/plugin:notes` and `/plugin:annotate`. Use `/accounts`, `/hub`, `/plugins`, and `/mcp` for their
|
|
89
|
+
existing core commands. No stored data or server methods migrate.
|
|
90
|
+
|
|
91
|
+
## Checks
|
|
92
|
+
|
|
93
|
+
- Registry tests cover the explicit namespace derived for required and optional plugin commands.
|
|
94
|
+
- Terminal tests cover bare command routing, optional/plugin-prefixed routing, help/completion,
|
|
95
|
+
bridge registration removal, extension duplicates, and extension collisions with bare commands,
|
|
96
|
+
aliases, and loaded prompts.
|
|
97
|
+
- Update parity and command documentation, including Doctor, trajectory, subagents and worktrees.
|
|
98
|
+
- Run Harness typecheck, tests, build and terminal proof; then run the App typecheck, tests, layer
|
|
99
|
+
check and Rust tests.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: PROP-0022
|
|
3
|
+
title: Keep question tools available only in interactive plan mode
|
|
4
|
+
status: Implemented
|
|
5
|
+
created: 2026-10-24
|
|
6
|
+
updated: 2026-10-24
|
|
7
|
+
affects: [INV-RUN-8, 02-sessions-and-runs.md, 04-prompt.md, 06-plugins-and-capabilities.md, 07-tools-and-gate.md, 11-terminal.md, 14-surfaces-and-parity.md, docs/parity.md]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# PROP-0022: Keep question tools available only in interactive plan mode
|
|
11
|
+
|
|
12
|
+
## Problem
|
|
13
|
+
|
|
14
|
+
The user wants ordinary chat not to expose a model-initiated question tool, while plan mode retains
|
|
15
|
+
questions, with no setting or plugin toggle. Today `Sessions.start` requests `ask_user` whenever
|
|
16
|
+
Harness tools are enabled (`src/sessions/sessions.ts`), and the terminal bridge registers both
|
|
17
|
+
`ask_user` and `ask_user_question` (`src/terminal/piExtension.ts`). Plan mode currently retains the
|
|
18
|
+
same SDK tool list (`src/sessions/planMode.ts`) and filters the terminal's active list from its
|
|
19
|
+
current tools (`src/terminal/tui/runtime.ts`).
|
|
20
|
+
|
|
21
|
+
`ask-user` is a required built-in plugin (`src/plugins/builtin.ts`); it has no switchable attachment,
|
|
22
|
+
and `plugins.attach` rejects required plugins (`src/plugins/api.ts`). `harnessTools: false` is too
|
|
23
|
+
broad: it also omits History, Wiki, skill loading, checklist, and session naming. A mode-aware tool
|
|
24
|
+
policy is needed instead of disabling the plugin.
|
|
25
|
+
|
|
26
|
+
## Affected rules
|
|
27
|
+
|
|
28
|
+
- **INV-RUN-8:** “Plan mode never changes the tool list or the system prompt, so switching it keeps
|
|
29
|
+
the cached prefix. Its refusals happen before approvals and no approval can lift them.” This
|
|
30
|
+
proposal changes the tool-list part: an attended plan request may expose the question tools that
|
|
31
|
+
ordinary runs omit. Plan refusals remain before approvals. The stable system prompt remains
|
|
32
|
+
unchanged; provider cache effects of the tool-list difference are not assumed.
|
|
33
|
+
|
|
34
|
+
## Proposal
|
|
35
|
+
|
|
36
|
+
1. New, ordinary interactive runs do not expose the Harness-owned `ask_user` tool. This is enforced
|
|
37
|
+
while the Harness resolves the run's callable tools, before the capability set is frozen, so a
|
|
38
|
+
caller cannot restore it by adding its name to `tools.allow` or a wider requested capability set.
|
|
39
|
+
2. An attended `plan: true` run may expose `ask_user`. Explicitly narrower caller capabilities
|
|
40
|
+
still win. Automatic, probe, improver, and reflection runs do not receive a question tool.
|
|
41
|
+
3. In the Harness terminal, ordinary mode does not activate `ask_user` or its terminal-specific
|
|
42
|
+
`ask_user_question` counterpart. A plan request may temporarily activate both from the registered
|
|
43
|
+
tool inventory; the normal active-tool set is restored when planning succeeds, fails, or is interrupted.
|
|
44
|
+
4. Keep the `ask-user` built-in required and non-switchable. Do not add an attachment, preference,
|
|
45
|
+
or per-run UI toggle. Approval prompts for gated actions remain available in normal mode; this
|
|
46
|
+
proposal only removes model-initiated question forms. A model can still state an assumption or
|
|
47
|
+
ask in ordinary reply text.
|
|
48
|
+
5. Preserve the existing run capability pinning contract. A continuation keeps its earlier frozen
|
|
49
|
+
capability set, even when that set contains a question tool; suppression applies to newly resolved
|
|
50
|
+
ordinary runs. If that snapshot includes `ask_user`, an automatic or probe/improver/reflection
|
|
51
|
+
continuation is rejected with `continuation_mismatch` rather than narrowing the snapshot or
|
|
52
|
+
allowing an unattended question. Update `INV-RUN-8` to document the plan-mode tool-list exception
|
|
53
|
+
and update the session and terminal contracts plus the parity register.
|
|
54
|
+
|
|
55
|
+
This proposal concerns Harness-owned question tools. It does not blacklist arbitrary third-party
|
|
56
|
+
extensions that independently implement a question interface under another tool name.
|
|
57
|
+
|
|
58
|
+
## Alternatives
|
|
59
|
+
|
|
60
|
+
- **Make `ask-user` switchable and default it off.** This would remove it in plan mode too unless
|
|
61
|
+
mode-specific overrides were added, and would contradict the requested fixed behavior. Making a
|
|
62
|
+
required Harness part optional also changes the plugin contract and `INV-PLG-9`.
|
|
63
|
+
- **Set `harnessTools: false`.** This hides unrelated Harness tools and is not a question-only
|
|
64
|
+
control.
|
|
65
|
+
- **Leave the tool visible but refuse calls outside plan mode.** The model would still see and may
|
|
66
|
+
call the tool in normal mode, receiving a refusal rather than having no question surface.
|
|
67
|
+
- **Do nothing.** Preserves current behavior, which does not meet the request.
|
|
68
|
+
|
|
69
|
+
## Consequences
|
|
70
|
+
|
|
71
|
+
- Newly resolved normal runs have a narrower frozen tool set. Attended plan runs may include
|
|
72
|
+
`ask_user` subject to their caller's capability set; this is the explicit exception to
|
|
73
|
+
`INV-RUN-8`.
|
|
74
|
+
- The terminal derives plan-safe tools from registered tools as well as its normal active-tool list,
|
|
75
|
+
then restores the ordinary list on success, failure or interruption.
|
|
76
|
+
- Tool-list changes may affect provider request caching. No cache-preservation claim is made; any
|
|
77
|
+
real-provider measurement follows `INV-PRM-8` and requires the account owner's permission.
|
|
78
|
+
- Existing stored runs and plugin attachments need no migration. Continuations retain the earlier
|
|
79
|
+
pinned tool set as required by `INV-RUN-2`.
|
|
80
|
+
- Gated tool approvals and plain-text questions remain possible. The guarantee is specifically
|
|
81
|
+
that the Harness-owned question tools are not callable in newly started normal runs.
|
|
82
|
+
|
|
83
|
+
## Migration
|
|
84
|
+
|
|
85
|
+
No protocol, storage schema, or attachment migration is required. New runs resolve the mode-specific
|
|
86
|
+
callable set before `freezeRun`; existing run records and their capability snapshots are unchanged.
|
|
87
|
+
Continuations preserve their original snapshot. The App needs no separate preference or UI; it
|
|
88
|
+
continues to call Harness, which enforces the selection. Its sidecar tests must verify the resulting
|
|
89
|
+
tool set.
|
|
90
|
+
|
|
91
|
+
## Checks
|
|
92
|
+
|
|
93
|
+
- SDK session tests prove normal runs omit `ask_user` even when requested, attended plan runs can
|
|
94
|
+
include it, narrower capability sets still exclude it, automatic/refinement/reflection runs do not
|
|
95
|
+
receive it, and continuation snapshots remain exact.
|
|
96
|
+
- Terminal tests prove normal active tools omit both question names, plan mode activates them, and
|
|
97
|
+
the normal set is restored after success, failure and interruption.
|
|
98
|
+
- Run Harness `npm run typecheck`, `npm test`, `npm run prove`, and the terminal question/plan
|
|
99
|
+
verification. After Harness implementation, run the App's typecheck, tests, layer check, and Rust
|
|
100
|
+
tests, including sidecar coverage of normal and plan tool lists.
|
|
101
|
+
- Use fake-provider tests by default. Any real provider cache check requires the account owner's
|
|
102
|
+
explicit permission.
|