@xingular/harness 2.0.0 → 2.0.1-unstable
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 +635 -0
- package/LICENSE +202 -0
- package/NOTICE.md +50 -0
- package/README.md +241 -90
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/browser-extension/README.md +32 -0
- package/browser-extension/background.js +612 -0
- package/browser-extension/manifest.json +16 -0
- package/browser-extension/overlay.js +97 -0
- package/browser-extension/popup.css +19 -0
- package/browser-extension/popup.html +30 -0
- package/browser-extension/popup.js +101 -0
- package/browser-extension/site-access.js +63 -0
- package/builtin/skills/plugin-authoring/SKILL.md +53 -0
- package/dist/cli.js +32851 -17155
- package/dist/sdk/accounts/accounts.d.ts +195 -0
- package/dist/sdk/accounts/accounts.js +821 -0
- package/dist/sdk/accounts/choices.d.ts +41 -0
- package/dist/sdk/accounts/choices.js +89 -0
- package/dist/sdk/accounts/env.d.ts +78 -0
- package/dist/sdk/accounts/env.js +294 -0
- package/dist/sdk/accounts/secrets.d.ts +28 -0
- package/dist/sdk/accounts/secrets.js +147 -0
- package/dist/sdk/accounts/store.d.ts +139 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/agents/builtin.d.ts +2 -0
- package/dist/sdk/agents/builtin.js +50 -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 +27 -0
- package/dist/sdk/agents/planResearch.js +82 -0
- package/dist/sdk/agents/profiles.d.ts +93 -0
- package/dist/sdk/agents/profiles.js +289 -0
- package/dist/sdk/annotations/bridge.d.ts +44 -0
- package/dist/sdk/annotations/bridge.js +268 -0
- package/dist/sdk/annotations/capture.d.ts +158 -0
- package/dist/sdk/annotations/capture.js +409 -0
- package/dist/sdk/annotations/delivery.d.ts +79 -0
- package/dist/sdk/annotations/delivery.js +163 -0
- package/dist/sdk/annotations/inspect.d.ts +10 -0
- package/dist/sdk/annotations/inspect.js +34 -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 +8 -0
- package/dist/sdk/annotations/part.js +126 -0
- package/dist/sdk/annotations/queue.d.ts +4 -0
- package/dist/sdk/annotations/queue.js +45 -0
- package/dist/sdk/annotations/serverMethods.d.ts +3 -0
- package/dist/sdk/annotations/serverMethods.js +66 -0
- package/dist/sdk/annotations/store.d.ts +159 -0
- package/dist/sdk/annotations/store.js +404 -0
- package/dist/sdk/browser/backend.d.ts +16 -0
- package/dist/sdk/browser/backend.js +17 -0
- package/dist/sdk/browser/config.d.ts +19 -0
- package/dist/sdk/browser/config.js +23 -0
- package/dist/sdk/browser/contracts.d.ts +19 -0
- package/dist/sdk/browser/contracts.js +116 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/extension/bridge.d.ts +55 -0
- package/dist/sdk/browser/extension/bridge.js +336 -0
- package/dist/sdk/browser/extension/session.d.ts +50 -0
- package/dist/sdk/browser/extension/session.js +321 -0
- package/dist/sdk/browser/index.d.ts +33 -0
- package/dist/sdk/browser/index.js +105 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/serverMethods.d.ts +3 -0
- package/dist/sdk/browser/serverMethods.js +10 -0
- package/dist/sdk/browser/session.d.ts +85 -0
- package/dist/sdk/browser/session.js +228 -0
- package/dist/sdk/browser/tools.d.ts +102 -0
- package/dist/sdk/browser/tools.js +257 -0
- package/dist/sdk/capabilities/api.d.ts +22 -0
- package/dist/sdk/capabilities/api.js +54 -0
- package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
- package/dist/sdk/capabilities/runSnapshot.js +53 -0
- package/dist/sdk/capabilities/types.d.ts +29 -0
- package/dist/sdk/capabilities/types.js +1 -0
- package/dist/sdk/cli.d.ts +2 -0
- package/dist/sdk/cli.js +172 -0
- package/dist/sdk/commands/extensionOwners.d.ts +4 -0
- package/dist/sdk/commands/extensionOwners.js +17 -0
- package/dist/sdk/commands/list.d.ts +3 -0
- package/dist/sdk/commands/list.js +90 -0
- package/dist/sdk/commands/promptLoader.d.ts +5 -0
- package/dist/sdk/commands/promptLoader.js +76 -0
- package/dist/sdk/commands/promptRoutes.d.ts +13 -0
- package/dist/sdk/commands/promptRoutes.js +46 -0
- package/dist/sdk/commands/registry.d.ts +299 -0
- package/dist/sdk/commands/registry.js +54 -0
- package/dist/sdk/commands/routes.d.ts +16 -0
- package/dist/sdk/commands/routes.js +33 -0
- package/dist/sdk/commands/runtimeRouter.d.ts +4 -0
- package/dist/sdk/commands/runtimeRouter.js +48 -0
- package/dist/sdk/computer/boundary.d.ts +40 -0
- package/dist/sdk/computer/boundary.js +79 -0
- package/dist/sdk/computer/contracts.d.ts +127 -0
- package/dist/sdk/computer/contracts.js +13 -0
- package/dist/sdk/computer/control.d.ts +34 -0
- package/dist/sdk/computer/control.js +112 -0
- package/dist/sdk/computer/screenshot.d.ts +32 -0
- package/dist/sdk/computer/screenshot.js +35 -0
- package/dist/sdk/computer/terminalCapture.d.ts +26 -0
- package/dist/sdk/computer/terminalCapture.js +64 -0
- package/dist/sdk/computer/volatileImages.d.ts +9 -0
- package/dist/sdk/computer/volatileImages.js +50 -0
- package/dist/sdk/context/attribution.d.ts +18 -0
- package/dist/sdk/context/attribution.js +295 -0
- package/dist/sdk/context/runDetails.d.ts +16 -0
- package/dist/sdk/context/runDetails.js +22 -0
- package/dist/sdk/context/types.d.ts +94 -0
- package/dist/sdk/context/types.js +10 -0
- package/dist/sdk/core/bus.d.ts +23 -0
- package/dist/sdk/core/bus.js +76 -0
- package/dist/sdk/core/caller.d.ts +22 -0
- package/dist/sdk/core/caller.js +16 -0
- package/dist/sdk/core/changes.d.ts +15 -0
- package/dist/sdk/core/changes.js +15 -0
- package/dist/sdk/core/commandBudget.d.ts +23 -0
- package/dist/sdk/core/commandBudget.js +62 -0
- package/dist/sdk/core/effort.d.ts +2 -0
- package/dist/sdk/core/effort.js +1 -0
- package/dist/sdk/core/env.d.ts +18 -0
- package/dist/sdk/core/env.js +8 -0
- package/dist/sdk/core/errors.d.ts +15 -0
- package/dist/sdk/core/errors.js +24 -0
- package/dist/sdk/core/frontmatter.d.ts +12 -0
- package/dist/sdk/core/frontmatter.js +50 -0
- package/dist/sdk/core/fs.d.ts +18 -0
- package/dist/sdk/core/fs.js +106 -0
- package/dist/sdk/core/index.d.ts +24 -0
- package/dist/sdk/core/index.js +203 -0
- package/dist/sdk/core/interactiveProfile.d.ts +46 -0
- package/dist/sdk/core/interactiveProfile.js +143 -0
- package/dist/sdk/core/links.d.ts +51 -0
- package/dist/sdk/core/links.js +155 -0
- package/dist/sdk/core/path.d.ts +7 -0
- package/dist/sdk/core/path.js +79 -0
- package/dist/sdk/core/projects.d.ts +18 -0
- package/dist/sdk/core/projects.js +67 -0
- package/dist/sdk/core/secrets.d.ts +2 -0
- package/dist/sdk/core/secrets.js +5 -0
- package/dist/sdk/core/shell.d.ts +20 -0
- package/dist/sdk/core/shell.js +73 -0
- package/dist/sdk/core/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -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 +20 -0
- package/dist/sdk/core/workspaceBashTool.js +50 -0
- package/dist/sdk/core/workspaceSandbox.d.ts +41 -0
- package/dist/sdk/core/workspaceSandbox.js +360 -0
- package/dist/sdk/core/workspaceWriteOperations.d.ts +57 -0
- package/dist/sdk/core/workspaceWriteOperations.js +245 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +270 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +94 -0
- package/dist/sdk/doctor/serverMethods.d.ts +3 -0
- package/dist/sdk/doctor/serverMethods.js +8 -0
- package/dist/sdk/doctor/service.d.ts +23 -0
- package/dist/sdk/doctor/service.js +144 -0
- package/dist/sdk/doctor/types.d.ts +141 -0
- package/dist/sdk/doctor/types.js +29 -0
- package/dist/sdk/harness.d.ts +172 -0
- package/dist/sdk/harness.js +387 -0
- package/dist/sdk/history/lessonPrompt.d.ts +2 -0
- package/dist/sdk/history/lessonPrompt.js +15 -0
- package/dist/sdk/history/lessons.d.ts +52 -0
- package/dist/sdk/history/lessons.js +173 -0
- package/dist/sdk/history/recall.d.ts +68 -0
- package/dist/sdk/history/recall.js +199 -0
- package/dist/sdk/history/serverMethods.d.ts +3 -0
- package/dist/sdk/history/serverMethods.js +8 -0
- package/dist/sdk/history/trajectory.d.ts +7 -0
- package/dist/sdk/history/trajectory.js +218 -0
- package/dist/sdk/hub/catalog.json +123 -0
- package/dist/sdk/hub/cli.d.ts +7 -0
- package/dist/sdk/hub/cli.js +81 -0
- package/dist/sdk/hub/hub.d.ts +74 -0
- package/dist/sdk/hub/hub.js +476 -0
- package/dist/sdk/hub/schema.d.ts +280 -0
- package/dist/sdk/hub/schema.js +78 -0
- package/dist/sdk/hub/serverMethods.d.ts +3 -0
- package/dist/sdk/hub/serverMethods.js +11 -0
- package/dist/sdk/index.d.ts +80 -0
- package/dist/sdk/index.js +60 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +676 -0
- package/dist/sdk/mcp/manager.d.ts +26 -0
- package/dist/sdk/mcp/manager.js +124 -0
- package/dist/sdk/mcp/oauth.d.ts +35 -0
- package/dist/sdk/mcp/oauth.js +171 -0
- package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
- package/dist/sdk/mcp/scopeMigration.js +198 -0
- package/dist/sdk/mcp/serverMethods.d.ts +3 -0
- package/dist/sdk/mcp/serverMethods.js +22 -0
- package/dist/sdk/mcp/service.d.ts +160 -0
- package/dist/sdk/mcp/service.js +510 -0
- package/dist/sdk/mcp/types.d.ts +131 -0
- package/dist/sdk/mcp/types.js +49 -0
- package/dist/sdk/pi/retryPolicy.d.ts +19 -0
- package/dist/sdk/pi/retryPolicy.js +11 -0
- package/dist/sdk/pi/runtime.d.ts +14 -0
- package/dist/sdk/pi/runtime.js +31 -0
- package/dist/sdk/plugins/api.d.ts +66 -0
- package/dist/sdk/plugins/api.js +155 -0
- package/dist/sdk/plugins/attachments.d.ts +46 -0
- package/dist/sdk/plugins/attachments.js +111 -0
- package/dist/sdk/plugins/builtin.d.ts +7 -0
- package/dist/sdk/plugins/builtin.js +182 -0
- package/dist/sdk/plugins/builtinRegistry.d.ts +62 -0
- package/dist/sdk/plugins/builtinRegistry.js +77 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +197 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +188 -0
- package/dist/sdk/plugins/commandPrefix.d.ts +8 -0
- package/dist/sdk/plugins/commandPrefix.js +21 -0
- package/dist/sdk/plugins/discover.d.ts +48 -0
- package/dist/sdk/plugins/discover.js +230 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +119 -0
- package/dist/sdk/plugins/hooks.d.ts +94 -0
- package/dist/sdk/plugins/hooks.js +162 -0
- package/dist/sdk/plugins/identity.d.ts +19 -0
- package/dist/sdk/plugins/identity.js +48 -0
- package/dist/sdk/plugins/install.d.ts +24 -0
- package/dist/sdk/plugins/install.js +160 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +111 -0
- package/dist/sdk/plugins/manifest.d.ts +21 -0
- package/dist/sdk/plugins/manifest.js +94 -0
- package/dist/sdk/plugins/plugins.d.ts +106 -0
- package/dist/sdk/plugins/plugins.js +165 -0
- package/dist/sdk/plugins/proposals.d.ts +17 -0
- package/dist/sdk/plugins/proposals.js +147 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -0
- package/dist/sdk/plugins/surfaces.d.ts +5 -0
- package/dist/sdk/plugins/surfaces.js +11 -0
- package/dist/sdk/plugins/trust.d.ts +44 -0
- package/dist/sdk/plugins/trust.js +120 -0
- package/dist/sdk/plugins/types.d.ts +174 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +245 -0
- package/dist/sdk/prompt/compile.js +535 -0
- package/dist/sdk/prompt/reporting.d.ts +2 -0
- package/dist/sdk/prompt/reporting.js +94 -0
- package/dist/sdk/prompt/standard.d.ts +32 -0
- package/dist/sdk/prompt/standard.js +76 -0
- package/dist/sdk/refine/cli.d.ts +4 -0
- package/dist/sdk/refine/cli.js +186 -0
- package/dist/sdk/refine/demo.d.ts +21 -0
- package/dist/sdk/refine/demo.js +114 -0
- package/dist/sdk/refine/evidence.d.ts +55 -0
- package/dist/sdk/refine/evidence.js +330 -0
- package/dist/sdk/refine/host.d.ts +59 -0
- package/dist/sdk/refine/host.js +105 -0
- package/dist/sdk/refine/ledger.d.ts +48 -0
- package/dist/sdk/refine/ledger.js +76 -0
- package/dist/sdk/refine/library.d.ts +55 -0
- package/dist/sdk/refine/library.js +177 -0
- package/dist/sdk/refine/pi.d.ts +72 -0
- package/dist/sdk/refine/pi.js +248 -0
- package/dist/sdk/refine/prompts.d.ts +60 -0
- package/dist/sdk/refine/prompts.js +434 -0
- package/dist/sdk/refine/recursion.d.ts +113 -0
- package/dist/sdk/refine/recursion.js +258 -0
- package/dist/sdk/refine/runner.d.ts +83 -0
- package/dist/sdk/refine/runner.js +151 -0
- package/dist/sdk/refine/selection.d.ts +57 -0
- package/dist/sdk/refine/selection.js +251 -0
- package/dist/sdk/refine/serverMethods.d.ts +3 -0
- package/dist/sdk/refine/serverMethods.js +23 -0
- package/dist/sdk/refine/service.d.ts +115 -0
- package/dist/sdk/refine/service.js +280 -0
- package/dist/sdk/refine/suite.d.ts +67 -0
- package/dist/sdk/refine/suite.js +174 -0
- package/dist/sdk/refine/trajectory.d.ts +9 -0
- package/dist/sdk/refine/trajectory.js +73 -0
- package/dist/sdk/refine/types.d.ts +93 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/remote/addresses.d.ts +19 -0
- package/dist/sdk/remote/addresses.js +52 -0
- package/dist/sdk/remote/pairing.d.ts +59 -0
- package/dist/sdk/remote/pairing.js +160 -0
- package/dist/sdk/remote/seal.d.ts +28 -0
- package/dist/sdk/remote/seal.js +84 -0
- package/dist/sdk/remote/server.d.ts +28 -0
- package/dist/sdk/remote/server.js +158 -0
- package/dist/sdk/remote/service.d.ts +125 -0
- package/dist/sdk/remote/service.js +330 -0
- package/dist/sdk/remote/webClient.d.ts +4 -0
- package/dist/sdk/remote/webClient.js +452 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +365 -0
- package/dist/sdk/server/params.d.ts +4 -0
- package/dist/sdk/server/params.js +11 -0
- package/dist/sdk/server/remote.d.ts +19 -0
- package/dist/sdk/server/remote.js +109 -0
- package/dist/sdk/server/rpc.d.ts +20 -0
- package/dist/sdk/server/rpc.js +102 -0
- package/dist/sdk/server/serve.d.ts +13 -0
- package/dist/sdk/server/serve.js +25 -0
- package/dist/sdk/server/socket.d.ts +28 -0
- package/dist/sdk/server/socket.js +122 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/checkpoint.d.ts +7 -0
- package/dist/sdk/sessions/checkpoint.js +41 -0
- package/dist/sdk/sessions/compactionCheckpoint.d.ts +18 -0
- package/dist/sdk/sessions/compactionCheckpoint.js +79 -0
- package/dist/sdk/sessions/completionCheck.d.ts +51 -0
- package/dist/sdk/sessions/completionCheck.js +161 -0
- package/dist/sdk/sessions/continuation.d.ts +53 -0
- package/dist/sdk/sessions/continuation.js +90 -0
- package/dist/sdk/sessions/contracts.d.ts +991 -0
- package/dist/sdk/sessions/contracts.js +545 -0
- package/dist/sdk/sessions/control.d.ts +72 -0
- package/dist/sdk/sessions/control.js +158 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/goal.d.ts +145 -0
- package/dist/sdk/sessions/goal.js +405 -0
- package/dist/sdk/sessions/goalLoop.d.ts +37 -0
- package/dist/sdk/sessions/goalLoop.js +125 -0
- package/dist/sdk/sessions/goalPrompts.d.ts +4 -0
- package/dist/sdk/sessions/goalPrompts.js +93 -0
- package/dist/sdk/sessions/goalStop.d.ts +27 -0
- package/dist/sdk/sessions/goalStop.js +41 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/initialBash.d.ts +7 -0
- package/dist/sdk/sessions/initialBash.js +7 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/live.d.ts +101 -0
- package/dist/sdk/sessions/live.js +265 -0
- package/dist/sdk/sessions/planMode.d.ts +116 -0
- package/dist/sdk/sessions/planMode.js +281 -0
- package/dist/sdk/sessions/policy.d.ts +43 -0
- package/dist/sdk/sessions/policy.js +1 -0
- package/dist/sdk/sessions/pricing.d.ts +34 -0
- package/dist/sdk/sessions/pricing.js +40 -0
- package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
- package/dist/sdk/sessions/reasoningSummaries.js +61 -0
- package/dist/sdk/sessions/registry.d.ts +124 -0
- package/dist/sdk/sessions/registry.js +392 -0
- package/dist/sdk/sessions/runIndex.d.ts +21 -0
- package/dist/sdk/sessions/runIndex.js +65 -0
- package/dist/sdk/sessions/runStore.d.ts +82 -0
- package/dist/sdk/sessions/runStore.js +393 -0
- package/dist/sdk/sessions/runner.d.ts +291 -0
- package/dist/sdk/sessions/runner.js +1040 -0
- package/dist/sdk/sessions/sessionState.d.ts +13 -0
- package/dist/sdk/sessions/sessionState.js +31 -0
- package/dist/sdk/sessions/sessions.d.ts +238 -0
- package/dist/sdk/sessions/sessions.js +923 -0
- 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/stallWatch.d.ts +35 -0
- package/dist/sdk/sessions/stallWatch.js +42 -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 +88 -0
- package/dist/sdk/sessions/subagentService.js +546 -0
- package/dist/sdk/sessions/subagents.d.ts +98 -0
- package/dist/sdk/sessions/subagents.js +136 -0
- package/dist/sdk/sessions/workSlice.d.ts +167 -0
- package/dist/sdk/sessions/workSlice.js +266 -0
- package/dist/sdk/sessions/workspaceBoundary.d.ts +15 -0
- package/dist/sdk/sessions/workspaceBoundary.js +46 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -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/cli.d.ts +20 -0
- package/dist/sdk/terminal/cli.js +121 -0
- package/dist/sdk/terminal/client.d.ts +20 -0
- package/dist/sdk/terminal/client.js +148 -0
- package/dist/sdk/terminal/commandHelp.d.ts +17 -0
- package/dist/sdk/terminal/commandHelp.js +20 -0
- package/dist/sdk/terminal/control.d.ts +4 -0
- package/dist/sdk/terminal/control.js +25 -0
- package/dist/sdk/terminal/controller.d.ts +136 -0
- package/dist/sdk/terminal/controller.js +579 -0
- package/dist/sdk/terminal/credentialStore.d.ts +4 -0
- package/dist/sdk/terminal/credentialStore.js +33 -0
- package/dist/sdk/terminal/daemon.d.ts +44 -0
- package/dist/sdk/terminal/daemon.js +264 -0
- package/dist/sdk/terminal/hubMenu.d.ts +10 -0
- package/dist/sdk/terminal/hubMenu.js +34 -0
- package/dist/sdk/terminal/launch.d.ts +5 -0
- package/dist/sdk/terminal/launch.js +27 -0
- package/dist/sdk/terminal/liveTerminal.d.ts +96 -0
- package/dist/sdk/terminal/liveTerminal.js +436 -0
- package/dist/sdk/terminal/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/opentui/ansi.d.ts +25 -0
- package/dist/sdk/terminal/opentui/ansi.js +192 -0
- package/dist/sdk/terminal/opentui/model.d.ts +163 -0
- package/dist/sdk/terminal/opentui/model.js +484 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.js +54 -0
- package/dist/sdk/terminal/opentui/theme.d.ts +47 -0
- package/dist/sdk/terminal/opentui/theme.js +93 -0
- package/dist/sdk/terminal/piExtension.d.ts +12 -0
- package/dist/sdk/terminal/piExtension.js +847 -0
- package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
- package/dist/sdk/terminal/pluginMenu.js +101 -0
- package/dist/sdk/terminal/socket.d.ts +73 -0
- package/dist/sdk/terminal/socket.js +287 -0
- package/dist/sdk/terminal/standalone.d.ts +52 -0
- package/dist/sdk/terminal/standalone.js +329 -0
- package/dist/sdk/terminal/subagentMonitor.d.ts +62 -0
- package/dist/sdk/terminal/subagentMonitor.js +176 -0
- package/dist/sdk/terminal/terminals.d.ts +312 -0
- package/dist/sdk/terminal/terminals.js +1782 -0
- package/dist/sdk/terminal/toolName.d.ts +6 -0
- package/dist/sdk/terminal/toolName.js +12 -0
- package/dist/sdk/terminal/trajectory.d.ts +15 -0
- package/dist/sdk/terminal/trajectory.js +38 -0
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +7 -0
- package/dist/sdk/terminal/tui/annotateCommand.js +36 -0
- package/dist/sdk/terminal/tui/annotateSend.d.ts +30 -0
- package/dist/sdk/terminal/tui/annotateSend.js +40 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +68 -0
- package/dist/sdk/terminal/tui/chrome.js +182 -0
- package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
- package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +16 -0
- package/dist/sdk/terminal/tui/commandPages.js +136 -0
- package/dist/sdk/terminal/tui/commands.d.ts +71 -0
- package/dist/sdk/terminal/tui/commands.js +496 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +81 -0
- package/dist/sdk/terminal/tui/dialogs.js +372 -0
- package/dist/sdk/terminal/tui/goalCommand.d.ts +19 -0
- package/dist/sdk/terminal/tui/goalCommand.js +83 -0
- package/dist/sdk/terminal/tui/harnessRuntime.d.ts +8 -0
- package/dist/sdk/terminal/tui/harnessRuntime.js +771 -0
- package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
- package/dist/sdk/terminal/tui/keybindings.js +49 -0
- package/dist/sdk/terminal/tui/list.d.ts +86 -0
- package/dist/sdk/terminal/tui/list.js +278 -0
- package/dist/sdk/terminal/tui/markdown.d.ts +16 -0
- package/dist/sdk/terminal/tui/markdown.js +55 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +61 -0
- package/dist/sdk/terminal/tui/modeChoices.js +95 -0
- package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
- package/dist/sdk/terminal/tui/modelPicker.js +150 -0
- package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
- package/dist/sdk/terminal/tui/mouse.js +3 -0
- package/dist/sdk/terminal/tui/mouseReport.d.ts +30 -0
- package/dist/sdk/terminal/tui/mouseReport.js +80 -0
- package/dist/sdk/terminal/tui/page.d.ts +17 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +30 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +183 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.js +193 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +148 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.js +576 -0
- package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
- package/dist/sdk/terminal/tui/pages/browserPage.js +739 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
- package/dist/sdk/terminal/tui/pages/contextPage.d.ts +91 -0
- package/dist/sdk/terminal/tui/pages/contextPage.js +585 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
- package/dist/sdk/terminal/tui/pages/followUpQueuePage.d.ts +34 -0
- package/dist/sdk/terminal/tui/pages/followUpQueuePage.js +130 -0
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +52 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +292 -0
- package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
- package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +65 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +519 -0
- package/dist/sdk/terminal/tui/pages/remoteControlPage.d.ts +32 -0
- package/dist/sdk/terminal/tui/pages/remoteControlPage.js +170 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +24 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +155 -0
- package/dist/sdk/terminal/tui/pages/textPage.d.ts +17 -0
- package/dist/sdk/terminal/tui/pages/textPage.js +52 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +66 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +490 -0
- package/dist/sdk/terminal/tui/pages/usagePage.d.ts +45 -0
- package/dist/sdk/terminal/tui/pages/usagePage.js +397 -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 +17 -0
- package/dist/sdk/terminal/tui/piAdapter.js +46 -0
- package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
- package/dist/sdk/terminal/tui/planMode.js +2 -0
- package/dist/sdk/terminal/tui/pluginCommands.d.ts +16 -0
- package/dist/sdk/terminal/tui/pluginCommands.js +41 -0
- package/dist/sdk/terminal/tui/qr.d.ts +4 -0
- package/dist/sdk/terminal/tui/qr.js +35 -0
- package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
- package/dist/sdk/terminal/tui/questionPicker.js +150 -0
- package/dist/sdk/terminal/tui/questions.d.ts +21 -0
- package/dist/sdk/terminal/tui/questions.js +42 -0
- package/dist/sdk/terminal/tui/runtime.d.ts +117 -0
- package/dist/sdk/terminal/tui/runtime.js +544 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +61 -0
- package/dist/sdk/terminal/tui/selection.d.ts +16 -0
- package/dist/sdk/terminal/tui/selection.js +16 -0
- package/dist/sdk/terminal/tui/sessionPicker.d.ts +40 -0
- package/dist/sdk/terminal/tui/sessionPicker.js +141 -0
- package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
- package/dist/sdk/terminal/tui/sessionUi.js +30 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
- package/dist/sdk/terminal/tui/settingsModel.js +195 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +57 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +241 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +28 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +63 -0
- package/dist/sdk/terminal/tui/status.d.ts +18 -0
- package/dist/sdk/terminal/tui/status.js +67 -0
- package/dist/sdk/terminal/tui/theme.d.ts +54 -0
- package/dist/sdk/terminal/tui/theme.js +185 -0
- package/dist/sdk/terminal/tui/thinkingLevels.d.ts +11 -0
- package/dist/sdk/terminal/tui/thinkingLevels.js +31 -0
- package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
- package/dist/sdk/terminal/tui/treeModel.js +483 -0
- package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
- package/dist/sdk/terminal/tui/treePicker.js +251 -0
- package/dist/sdk/terminal/tui/ui.d.ts +49 -0
- package/dist/sdk/terminal/tui/ui.js +149 -0
- package/dist/sdk/terminal/tui/variantCommands.d.ts +32 -0
- package/dist/sdk/terminal/tui/variantCommands.js +359 -0
- package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/terminal/variantControl.d.ts +24 -0
- package/dist/sdk/terminal/variantControl.js +145 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +92 -0
- package/dist/sdk/tools/defaultSkills.d.ts +23 -0
- package/dist/sdk/tools/defaultSkills.js +46 -0
- package/dist/sdk/tools/definitions.d.ts +32 -0
- package/dist/sdk/tools/definitions.js +133 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +92 -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 +8 -0
- package/dist/sdk/tools/harnessTools.js +20 -0
- package/dist/sdk/tools/sessionName.d.ts +16 -0
- package/dist/sdk/tools/sessionName.js +78 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +63 -0
- package/dist/sdk/tools/todo.d.ts +15 -0
- package/dist/sdk/tools/todo.js +66 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -0
- 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/variant/components.d.ts +34 -0
- package/dist/sdk/variant/components.js +230 -0
- package/dist/sdk/variant/materialise.d.ts +66 -0
- package/dist/sdk/variant/materialise.js +81 -0
- package/dist/sdk/variant/migrate.d.ts +4 -0
- package/dist/sdk/variant/migrate.js +41 -0
- package/dist/sdk/variant/seed.d.ts +20 -0
- package/dist/sdk/variant/seed.js +116 -0
- package/dist/sdk/variant/store.d.ts +114 -0
- package/dist/sdk/variant/store.js +256 -0
- package/dist/sdk/variant/surface.d.ts +56 -0
- package/dist/sdk/variant/surface.js +81 -0
- package/dist/sdk/variant/trust.d.ts +27 -0
- package/dist/sdk/variant/trust.js +64 -0
- package/dist/sdk/variant/variant.d.ts +71 -0
- package/dist/sdk/variant/variant.js +331 -0
- package/dist/sdk/web/markdown.d.ts +10 -0
- package/dist/sdk/web/markdown.js +66 -0
- package/dist/sdk/web/part.d.ts +10 -0
- package/dist/sdk/web/part.js +6 -0
- package/dist/sdk/web/safeRequest.d.ts +34 -0
- package/dist/sdk/web/safeRequest.js +175 -0
- package/dist/sdk/web/search.d.ts +53 -0
- package/dist/sdk/web/search.js +168 -0
- package/dist/sdk/web/serverMethods.d.ts +3 -0
- package/dist/sdk/web/serverMethods.js +7 -0
- package/dist/sdk/web/text.d.ts +2 -0
- package/dist/sdk/web/text.js +7 -0
- package/dist/sdk/web/tools.d.ts +22 -0
- package/dist/sdk/web/tools.js +195 -0
- package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
- package/dist/sdk/wiki/notes.d.ts +68 -0
- package/dist/sdk/wiki/notes.js +297 -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 +18 -0
- package/dist/sdk/worktrees/git.js +89 -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/snapshot.d.ts +16 -0
- package/dist/sdk/worktrees/snapshot.js +83 -0
- package/dist/sdk/worktrees/types.d.ts +91 -0
- package/dist/sdk/worktrees/types.js +1 -0
- package/dist/sdk/world/actions.d.ts +23 -0
- package/dist/sdk/world/actions.js +31 -0
- package/dist/sdk/world/cli.d.ts +12 -0
- package/dist/sdk/world/cli.js +166 -0
- package/dist/sdk/world/images.d.ts +20 -0
- package/dist/sdk/world/images.js +48 -0
- package/dist/sdk/world/untrusted.d.ts +12 -0
- package/dist/sdk/world/untrusted.js +20 -0
- package/dist/sdk/world/world.d.ts +75 -0
- package/dist/sdk/world/world.js +117 -0
- package/dist/terminal-opentui.js +30986 -0
- package/dist/terminal-pi.js +3008 -610
- package/docs/README.md +45 -1
- package/docs/architecture/00-overview.md +171 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +505 -0
- package/docs/architecture/03-variants.md +122 -0
- package/docs/architecture/04-prompt.md +277 -0
- package/docs/architecture/05-refinement.md +134 -0
- package/docs/architecture/06-plugins-and-capabilities.md +208 -0
- package/docs/architecture/07-tools-and-gate.md +245 -0
- package/docs/architecture/08-memory-and-history.md +100 -0
- package/docs/architecture/09-accounts-and-connectors.md +153 -0
- package/docs/architecture/10-server-protocol.md +403 -0
- package/docs/architecture/11-terminal.md +555 -0
- package/docs/architecture/12-storage.md +118 -0
- package/docs/architecture/13-world-tools.md +114 -0
- package/docs/architecture/14-surfaces-and-parity.md +151 -0
- package/docs/architecture/15-remote-control.md +120 -0
- package/docs/architecture/README.md +143 -0
- package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
- package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
- package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
- package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
- package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +72 -0
- package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
- package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
- package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
- package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
- package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
- package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
- 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 +183 -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 +96 -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 +260 -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/PROP-0044-work-slice-defaults.md +93 -0
- package/docs/architecture/proposals/PROP-0045-rename-checklist-to-todo.md +132 -0
- package/docs/architecture/proposals/PROP-0046-progress-aware-stall-guards.md +82 -0
- package/docs/architecture/proposals/PROP-0047-plugins-hub-separation.md +122 -0
- package/docs/architecture/proposals/PROP-0048-simple-annotate.md +85 -0
- package/docs/architecture/proposals/PROP-0049-context-attribution.md +415 -0
- package/docs/architecture/proposals/PROP-0050-run-stop-codes-and-refusals.md +30 -0
- package/docs/architecture/proposals/PROP-0051-unfinished-run-handoff.md +110 -0
- package/docs/architecture/proposals/PROP-0052-terminal-refine-and-variant-switch.md +111 -0
- package/docs/architecture/proposals/README.md +123 -0
- package/docs/decisions/ADR-0001-owned-terminal.md +10 -3
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +3 -1
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +3 -2
- package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
- package/docs/decisions/ADR-0007-reporting-section.md +33 -0
- package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +41 -0
- package/docs/decisions/ADR-0009-xharness-command.md +39 -0
- package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
- package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
- package/docs/decisions/ADR-0012-native-session-names.md +34 -0
- package/docs/decisions/ADR-0013-doctor.md +27 -0
- package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
- 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 +62 -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 +35 -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/decisions/ADR-0039-progress-aware-stall-guards.md +43 -0
- package/docs/decisions/ADR-0040-architecture-change-workflow.md +31 -0
- package/docs/decisions/ADR-0041-plugins-hub-separation.md +41 -0
- package/docs/decisions/ADR-0042-windows-shell-without-sandbox.md +40 -0
- package/docs/decisions/ADR-0043-parents-continue-stopped-subagents.md +49 -0
- package/docs/decisions/ADR-0044-annotations-pending-or-sent.md +24 -0
- package/docs/decisions/ADR-0045-default-plugin-authoring-skill.md +9 -0
- package/docs/decisions/ADR-0046-hash-bound-plugin-proposals.md +20 -0
- package/docs/decisions/ADR-0047-links-open-with-the-os-handler.md +47 -0
- package/docs/decisions/ADR-0048-required-skills-from-a-message.md +42 -0
- package/docs/decisions/ADR-0050-approved-window-screenshots.md +19 -0
- package/docs/decisions/ADR-0051-terminal-decision-wait.md +10 -0
- package/docs/decisions/ADR-0052-per-profile-subagent-budgets.md +25 -0
- package/docs/decisions/ADR-0053-no-repeated-work-guard.md +45 -0
- package/docs/decisions/ADR-0054-terminal-reply-heartbeat-and-stall.md +52 -0
- package/docs/decisions/ADR-0055-plan-output-repair.md +51 -0
- package/docs/decisions/ADR-0056-remote-control.md +53 -0
- package/docs/decisions/ADR-0057-structured-plan-outcomes.md +39 -0
- package/docs/decisions/ADR-0058-ask-user-only-plan-clarification.md +36 -0
- package/docs/decisions/ADR-0059-run-diagnostic-evidence.md +35 -0
- package/docs/decisions/ADR-0060-approvals-are-controls.md +40 -0
- package/docs/decisions/ADR-0061-strict-plugin-command-namespaces.md +41 -0
- package/docs/decisions/ADR-0062-shared-account-state.md +67 -0
- package/docs/decisions/ADR-0063-unfinished-work-handoffs.md +34 -0
- package/docs/decisions/ADR-0064-account-model-fallback-on-resume.md +79 -0
- package/docs/decisions/ADR-0065-variant-switch-at-turn-boundaries.md +31 -0
- package/docs/decisions/ADR-0066-guided-refinement-from-turn-snapshots.md +37 -0
- package/docs/decisions/ADR-0067-cache-stable-compaction-checkpoint.md +54 -0
- package/docs/decisions/ADR-0068-scope-and-completion-report.md +60 -0
- package/docs/decisions/ADR-0069-stop-gate-and-finish.md +136 -0
- package/docs/decisions/ADR-0070-terminal-slice-continuation.md +49 -0
- package/docs/decisions/ADR-0071-completion-check.md +104 -0
- package/docs/decisions/ADR-0072-codex-prompts-and-goal.md +108 -0
- package/docs/decisions/ADR-0073-large-reporting-prompt.md +89 -0
- package/docs/decisions/ADR-0074-report-content-not-report-blocks.md +90 -0
- package/docs/decisions/ADR-0075-no-todo-gate.md +84 -0
- package/docs/decisions/ADR-0076-codex-final-answer-verbatim.md +98 -0
- package/docs/decisions/ADR-0077-plan-runs-may-conclude-no-plan-needed.md +120 -0
- package/docs/decisions/ADR-0078-child-aware-stall-watch.md +46 -0
- package/docs/decisions/ADR-0079-phase-led-reporting-guidance.md +72 -0
- package/docs/decisions/ADR-0080-fixed-width-question-sketch-canvas.md +50 -0
- package/docs/decisions/ADR-0081-no-work-slice-budget-by-default.md +36 -0
- package/docs/decisions/ADR-0082-connected-brave-browser.md +72 -0
- package/docs/decisions/ADR-0083-one-live-session-runtime.md +256 -0
- package/docs/doctor.md +95 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
- 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 +46 -0
- package/docs/features/automations/README.md +41 -0
- package/docs/features/cores/README.md +39 -0
- package/docs/features/google-harness2/README.md +52 -0
- package/docs/features/integrations/README.md +40 -0
- package/docs/features/interfaces/README.md +29 -0
- package/docs/features/memory/README.md +28 -0
- 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 +158 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/1.1.1.md +28 -0
- package/docs/releases/1.2.0.md +49 -0
- package/docs/releases/1.3.0.md +21 -0
- package/docs/releases/1.3.1-unstable.1.md +8 -0
- package/docs/releases/1.3.1-unstable.2.md +11 -0
- package/docs/releases/1.3.1-unstable.3.md +54 -0
- package/docs/releases/1.3.1-unstable.4.md +56 -0
- package/docs/releases/1.3.1-unstable.5.md +53 -0
- package/docs/releases/1.3.1-unstable.6.md +31 -0
- package/docs/releases/1.3.1-unstable.7.md +17 -0
- package/docs/releases/1.3.1-unstable.8.md +19 -0
- package/docs/releases/1.3.1-unstable.9.md +54 -0
- package/docs/releases/1.4.0-unstable.md +25 -0
- package/docs/releases/1.5.0-unstable.md +32 -0
- package/docs/releases/1.5.1-unstable.md +24 -0
- package/docs/releases/1.6.0-unstable.md +59 -0
- package/docs/releases/2.0.1-unstable.md +63 -0
- package/docs/releases/4.0.0.md +47 -0
- package/docs/releases/README.md +49 -0
- package/docs/study/00-index.md +112 -0
- package/docs/study/STUDY-0003-long-horizon-runs.md +210 -0
- package/docs/study/STUDY-0004-turn-end-controls.md +130 -0
- package/docs/study/STUDY-0005-skill-installation-guidance.md +146 -0
- package/docs/study/STUDY-0006-reporting-prompts.md +119 -0
- package/docs/study/STUDY-0007-claude-code-prompt.md +162 -0
- package/docs/study/STUDY-0008-browser-control.md +281 -0
- package/docs/study/STUDY-0009-claude-code-reporting.md +205 -0
- package/docs/study/arms/00-matrix.md +20 -0
- package/docs/study/arms/01-system-prompt.md +211 -0
- package/docs/study/arms/02-tools.md +79 -0
- package/docs/study/arms/03-subagents.md +90 -0
- package/docs/study/arms/04-skills.md +81 -0
- package/docs/study/arms/05-context-management.md +90 -0
- package/docs/study/arms/06-memory.md +90 -0
- package/docs/study/arms/07-governance.md +71 -0
- package/docs/study/arms/08-execution.md +69 -0
- package/docs/study/arms/09-observability.md +60 -0
- package/docs/study/arms/10-refinement.md +110 -0
- package/docs/study/autonomous-engineering-sources.md +277 -0
- package/docs/study/autonomy-sources.md +147 -0
- package/docs/study/btw-comparison.md +37 -0
- package/docs/study/feature-gap-review.md +42 -0
- package/docs/study/insights.md +123 -0
- package/docs/study/proactive-autonomy.md +408 -0
- package/docs/study/roadmap.md +72 -0
- package/docs/study/sources/claude-code.md +56 -0
- package/docs/study/sources/deepseek-harness.md +102 -0
- package/docs/study/sources/harness2.md +50 -0
- package/docs/study/sources/kimi-cli.md +42 -0
- package/docs/study/sources/omp.md +93 -0
- package/docs/study/sources/opencode.md +43 -0
- package/docs/study/sources/openhands.md +46 -0
- package/docs/study/sources/smolagents.md +40 -0
- package/docs/study/sources/swe-agent.md +34 -0
- package/docs/study/tui-resource-browser.md +78 -0
- package/docs/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +887 -109
- package/package.json +46 -13
- package/src/accounts/accounts.test.ts +0 -419
- package/src/accounts/accounts.ts +0 -760
- package/src/accounts/env.test.ts +0 -95
- package/src/accounts/env.ts +0 -338
- package/src/accounts/secrets.ts +0 -50
- package/src/accounts/store.ts +0 -338
- package/src/capabilities/api.ts +0 -75
- package/src/capabilities/runSnapshot.ts +0 -59
- package/src/capabilities/types.ts +0 -34
- package/src/cli.ts +0 -118
- package/src/core/bus.test.ts +0 -22
- package/src/core/bus.ts +0 -49
- package/src/core/changes.ts +0 -33
- package/src/core/env.ts +0 -27
- package/src/core/errors.ts +0 -32
- package/src/core/frontmatter.ts +0 -47
- package/src/core/fs.test.ts +0 -38
- package/src/core/fs.ts +0 -92
- package/src/core/index.ts +0 -193
- package/src/core/path.test.ts +0 -14
- package/src/core/path.ts +0 -79
- package/src/core/projects.ts +0 -90
- package/src/core/text.ts +0 -39
- package/src/harness.ts +0 -322
- package/src/hub/catalog.json +0 -123
- package/src/hub/cli.ts +0 -59
- package/src/hub/hub.test.ts +0 -205
- package/src/hub/hub.ts +0 -256
- package/src/hub/schema.ts +0 -81
- package/src/index.ts +0 -80
- package/src/mcp/connections.ts +0 -641
- package/src/mcp/manager.ts +0 -130
- package/src/mcp/oauth.ts +0 -195
- package/src/mcp/scopeMigration.test.ts +0 -79
- package/src/mcp/scopeMigration.ts +0 -204
- package/src/mcp/service.test.ts +0 -422
- package/src/mcp/service.ts +0 -560
- package/src/mcp/types.ts +0 -118
- package/src/memory/api.test.ts +0 -82
- package/src/memory/api.ts +0 -303
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -408
- package/src/memory/caller.ts +0 -69
- package/src/memory/curation.test.ts +0 -206
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -64
- package/src/memory/facts.test.ts +0 -41
- package/src/memory/facts.ts +0 -248
- package/src/memory/graph.ts +0 -103
- package/src/memory/health.test.ts +0 -130
- package/src/memory/health.ts +0 -74
- package/src/memory/maintainer.ts +0 -272
- package/src/memory/maintenance.test.ts +0 -192
- package/src/memory/maintenance.ts +0 -679
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -150
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -584
- package/src/memory/recall.test.ts +0 -115
- package/src/memory/recall.ts +0 -279
- package/src/memory/references.ts +0 -77
- package/src/memory/runContext.ts +0 -93
- package/src/memory/secrets.ts +0 -6
- package/src/memory/store.test.ts +0 -66
- package/src/memory/store.ts +0 -385
- package/src/memory/trajectory.test.ts +0 -178
- package/src/memory/trajectory.ts +0 -220
- package/src/memory/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -423
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -117
- package/src/plugins/api.ts +0 -181
- package/src/plugins/attachments.test.ts +0 -84
- package/src/plugins/attachments.ts +0 -141
- package/src/plugins/builtin.ts +0 -84
- package/src/plugins/catalogue.test.ts +0 -254
- package/src/plugins/catalogue.ts +0 -251
- package/src/plugins/cli.ts +0 -184
- package/src/plugins/discover.ts +0 -151
- package/src/plugins/firstParty.test.ts +0 -143
- package/src/plugins/firstParty.ts +0 -129
- package/src/plugins/hooks.test.ts +0 -250
- package/src/plugins/hooks.ts +0 -239
- package/src/plugins/identity.ts +0 -37
- package/src/plugins/install.test.ts +0 -107
- package/src/plugins/install.ts +0 -106
- package/src/plugins/inventory.ts +0 -123
- package/src/plugins/manifest.ts +0 -76
- package/src/plugins/plugins.test.ts +0 -205
- package/src/plugins/plugins.ts +0 -189
- package/src/plugins/proposal.ts +0 -121
- package/src/plugins/runtime.test.ts +0 -40
- package/src/plugins/runtime.ts +0 -82
- package/src/plugins/trust.ts +0 -142
- package/src/plugins/types.ts +0 -149
- package/src/prompt/compile.test.ts +0 -261
- package/src/prompt/compile.ts +0 -732
- package/src/server/methods.ts +0 -355
- package/src/server/remote.ts +0 -77
- package/src/server/rpc.ts +0 -116
- package/src/server/serve.ts +0 -28
- package/src/server/server.test.ts +0 -193
- package/src/sessions/approvals.test.ts +0 -49
- package/src/sessions/approvals.ts +0 -140
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -233
- package/src/sessions/extensionSession.test.ts +0 -74
- package/src/sessions/extensionUi.test.ts +0 -65
- package/src/sessions/extensionUi.ts +0 -102
- package/src/sessions/history.ts +0 -51
- package/src/sessions/lineageJoin.ts +0 -75
- package/src/sessions/policy.ts +0 -36
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/questionBatches.test.ts +0 -110
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -412
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -346
- package/src/sessions/runner.ts +0 -610
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -588
- package/src/sessions/sessions.ts +0 -331
- package/src/sessions/subagentService.test.ts +0 -159
- package/src/sessions/subagentService.ts +0 -236
- package/src/sessions/subagents.ts +0 -97
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -413
- package/src/terminal/accountsMenu.test.ts +0 -225
- package/src/terminal/accountsMenu.ts +0 -382
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/control.test.ts +0 -23
- package/src/terminal/control.ts +0 -23
- package/src/terminal/controller.ts +0 -354
- package/src/terminal/hubMenu.ts +0 -24
- package/src/terminal/launch.test.ts +0 -25
- package/src/terminal/launch.ts +0 -48
- package/src/terminal/piExtension.lifecycle.test.ts +0 -55
- package/src/terminal/piExtension.ts +0 -295
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -94
- package/src/terminal/socket.ts +0 -256
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -165
- package/src/terminal/terminal.test.ts +0 -534
- package/src/terminal/terminals.ts +0 -661
- package/src/terminal/trajectory.test.ts +0 -66
- package/src/terminal/trajectory.ts +0 -44
- package/src/terminal/tui/application.test.ts +0 -290
- package/src/terminal/tui/application.ts +0 -653
- package/src/terminal/tui/commands.test.ts +0 -278
- package/src/terminal/tui/commands.ts +0 -443
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -113
- package/src/terminal/tui/editor.ts +0 -109
- package/src/terminal/tui/keybindings.test.ts +0 -30
- package/src/terminal/tui/keybindings.ts +0 -59
- package/src/terminal/tui/piAdapter.ts +0 -62
- package/src/terminal/tui/planMode.test.ts +0 -10
- package/src/terminal/tui/planMode.ts +0 -12
- package/src/terminal/tui/presentation.test.ts +0 -79
- package/src/terminal/tui/questions.test.ts +0 -41
- package/src/terminal/tui/questions.ts +0 -47
- package/src/terminal/tui/runtime.socket.test.ts +0 -178
- package/src/terminal/tui/runtime.test.ts +0 -225
- package/src/terminal/tui/runtime.ts +0 -403
- package/src/terminal/tui/screen.test.ts +0 -143
- package/src/terminal/tui/screen.ts +0 -121
- package/src/terminal/tui/sessionUi.ts +0 -24
- package/src/terminal/tui/settings.test.ts +0 -150
- package/src/terminal/tui/settings.ts +0 -188
- package/src/terminal/tui/skillInvocation.test.ts +0 -71
- package/src/terminal/tui/skillInvocation.ts +0 -51
- package/src/terminal/tui/status.test.ts +0 -48
- package/src/terminal/tui/status.ts +0 -82
- package/src/terminal/tui/theme.ts +0 -185
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/trajectoryPanel.test.ts +0 -99
- package/src/terminal/tui/trajectoryPanel.ts +0 -226
- package/src/terminal/tui/transcript.test.ts +0 -39
- package/src/terminal/tui/transcript.ts +0 -135
- package/src/terminal/tui/ui.test.ts +0 -313
- package/src/terminal/tui/ui.ts +0 -166
- package/src/terminal/tui/welcome.ts +0 -102
- package/src/terminal/tui/workingStatus.test.ts +0 -44
- package/src/terminal/tui/workingStatus.ts +0 -238
- package/src/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -228
- package/src/tools/maintenance.ts +0 -29
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- package/src/tools/registryWrite.test.ts +0 -101
- package/src/tools/registryWrite.ts +0 -182
- package/src/tools/spawnSubagent.ts +0 -47
- package/src/tools/types.ts +0 -41
- package/src/web/safeRequest.ts +0 -171
- package/src/web/text.ts +0 -53
- package/src/web/tools.ts +0 -134
- package/src/web/web.test.ts +0 -141
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { createAgentSession, createAgentSessionRuntime, DefaultResourceLoader, ModelRuntime, resolveCliModel, SessionManager, SettingsManager } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { closeSync, existsSync, openSync, readSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import terminalExtension from "../piExtension.js";
|
|
5
|
+
import { withTransientRetry } from "../../pi/retryPolicy.js";
|
|
6
|
+
import { GoalController } from "../../sessions/goal.js";
|
|
7
|
+
import { terminalCredentialStore } from "../credentialStore.js";
|
|
8
|
+
import { normalModeTools, normalToolsForBranch, planModeTools, PLAN_TOOLS_ENTRY, QUESTION_TOOL_NAMES } from "./planMode.js";
|
|
9
|
+
import { claimTerminalControl, controlCall } from "../control.js";
|
|
10
|
+
import { observeProviderResponses } from "../../usage/limits/capture.js";
|
|
11
|
+
import { limitHeaders } from "../../usage/limits/normalize.js";
|
|
12
|
+
import { loadPiAdapter } from "./piAdapter.js";
|
|
13
|
+
import { loadPi } from "../../pi/runtime.js";
|
|
14
|
+
import { wrapPromptLoader } from "../../commands/promptLoader.js";
|
|
15
|
+
import { applyExtensionOwners } from "../../commands/extensionOwners.js";
|
|
16
|
+
import { installPluginCommandRouter } from "../../commands/runtimeRouter.js";
|
|
17
|
+
import { pluginCommandPrefix } from "../../plugins/commandPrefix.js";
|
|
18
|
+
import { sessionUiContext } from "./sessionUi.js";
|
|
19
|
+
import { ModeChoices } from "./modeChoices.js";
|
|
20
|
+
/** The launch specification comes from Terminals.prepare(), never from Pi's own discovery. */
|
|
21
|
+
export function parseTerminalArguments(args) {
|
|
22
|
+
const result = { appendSystemPrompt: [], extensions: [], skills: [], prompts: [], themes: [], sessionDir: '' };
|
|
23
|
+
const lists = {
|
|
24
|
+
'--append-system-prompt': result.appendSystemPrompt, '--extension': result.extensions,
|
|
25
|
+
'--skill': result.skills, '--prompt-template': result.prompts, '--theme': result.themes
|
|
26
|
+
};
|
|
27
|
+
const flags = new Set(['--no-extensions', '--no-skills', '--no-prompt-templates', '--no-themes']);
|
|
28
|
+
for (let index = 0; index < args.length; index++) {
|
|
29
|
+
const argument = args[index];
|
|
30
|
+
if (flags.has(argument))
|
|
31
|
+
continue;
|
|
32
|
+
if (!(argument in lists) && !['--session-dir', '--session', '--model'].includes(argument)) {
|
|
33
|
+
throw new Error(`Unsupported prepared terminal argument: ${argument}`);
|
|
34
|
+
}
|
|
35
|
+
const value = args[++index];
|
|
36
|
+
if (!value || value.startsWith('--'))
|
|
37
|
+
throw new Error(`${argument} needs a value.`);
|
|
38
|
+
if (argument in lists)
|
|
39
|
+
lists[argument].push(value);
|
|
40
|
+
else if (argument === '--session-dir')
|
|
41
|
+
result.sessionDir = value;
|
|
42
|
+
else if (argument === '--session')
|
|
43
|
+
result.session = value;
|
|
44
|
+
else
|
|
45
|
+
result.model = value;
|
|
46
|
+
}
|
|
47
|
+
if (!result.sessionDir)
|
|
48
|
+
throw new Error('The Harness terminal requires its prepared --session-dir.');
|
|
49
|
+
if (!result.extensions.length)
|
|
50
|
+
throw new Error('The Harness terminal requires its prepared bridge extension.');
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/** Saved native history stays in the prepared project folder, including symlink targets. */
|
|
54
|
+
export function assertTerminalHistoryPath(path, sessionDirectory) {
|
|
55
|
+
const within = relative(realpathSync(sessionDirectory), realpathSync(path));
|
|
56
|
+
if (!within || within === '..' || within.startsWith(`..${sep}`) || isAbsolute(within)) {
|
|
57
|
+
throw new Error('Resume only from this terminal history folder. Use /import for another native session file in this working folder.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Inspect the header before any native switch/import can invalidate a session or copy a file. */
|
|
61
|
+
export function assertTerminalSessionScope(path, cwd, cwdOverride) {
|
|
62
|
+
if (cwdOverride !== undefined && realpathSync(resolve(cwdOverride)) !== realpathSync(cwd)) {
|
|
63
|
+
throw new Error('Resume this conversation in a terminal opened for its own working folder.');
|
|
64
|
+
}
|
|
65
|
+
const descriptor = openSync(path, 'r');
|
|
66
|
+
let first;
|
|
67
|
+
try {
|
|
68
|
+
const buffer = Buffer.alloc(65_536);
|
|
69
|
+
const size = readSync(descriptor, buffer, 0, buffer.length, 0);
|
|
70
|
+
const text = buffer.subarray(0, size).toString('utf8').replace(/^\uFEFF/, '');
|
|
71
|
+
const newline = text.indexOf('\n');
|
|
72
|
+
if (newline === -1 && size === buffer.length)
|
|
73
|
+
throw new Error('The native session header is too large.');
|
|
74
|
+
first = newline === -1 ? text : text.slice(0, newline);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
closeSync(descriptor);
|
|
78
|
+
}
|
|
79
|
+
let header;
|
|
80
|
+
try {
|
|
81
|
+
header = JSON.parse(first);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
throw new Error('This file does not have a readable native session header.');
|
|
85
|
+
}
|
|
86
|
+
if (header.type !== 'session' || !header.cwd || !isAbsolute(header.cwd)) {
|
|
87
|
+
throw new Error('The native session must record its original absolute working folder.');
|
|
88
|
+
}
|
|
89
|
+
if (realpathSync(header.cwd) !== realpathSync(cwd)) {
|
|
90
|
+
throw new Error('This conversation belongs to another working folder. Open its terminal to keep project permissions and context isolated.');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The model a conversation's own history names: the last model change, else the model that answered
|
|
95
|
+
* last. A conversation with no message yet has nothing to continue and names nothing.
|
|
96
|
+
*/
|
|
97
|
+
function recordedModel(branch) {
|
|
98
|
+
if (!branch.some(entry => entry.type === 'message' && (entry.message.role === 'user' || entry.message.role === 'assistant')))
|
|
99
|
+
return undefined;
|
|
100
|
+
for (let index = branch.length - 1; index >= 0; index -= 1) {
|
|
101
|
+
const entry = branch[index];
|
|
102
|
+
if (entry.type === 'model_change')
|
|
103
|
+
return { provider: entry.provider, modelId: entry.modelId };
|
|
104
|
+
// A routed virtual response names the physical model that answered it, not the selection.
|
|
105
|
+
if (entry.type === 'message' && entry.message.role === 'assistant' && entry.message.api !== 'pi-virtual') {
|
|
106
|
+
return { provider: entry.message.provider, modelId: entry.message.model };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
export async function createTerminalRuntime(args, host) {
|
|
112
|
+
const prepared = parseTerminalArguments(args);
|
|
113
|
+
const cwd = realpathSync(process.cwd());
|
|
114
|
+
const agentDirValue = process.env.PI_CODING_AGENT_DIR;
|
|
115
|
+
if (!agentDirValue || !isAbsolute(agentDirValue))
|
|
116
|
+
throw new Error('The Harness terminal requires its isolated account directory.');
|
|
117
|
+
const agentDir = realpathSync(agentDirValue);
|
|
118
|
+
const sessionDirectory = realpathSync(resolve(cwd, prepared.sessionDir));
|
|
119
|
+
// Pi writes a session file only after its first message, so a restart before that has nothing to resume.
|
|
120
|
+
const resume = prepared.session && existsSync(resolve(cwd, prepared.session)) ? resolve(cwd, prepared.session) : null;
|
|
121
|
+
if (resume) {
|
|
122
|
+
assertTerminalHistoryPath(resume, sessionDirectory);
|
|
123
|
+
assertTerminalSessionScope(resume, cwd);
|
|
124
|
+
}
|
|
125
|
+
const pi = await loadPi();
|
|
126
|
+
// Claim before loading any plugin code and retain it in the trusted process across reloads.
|
|
127
|
+
await claimTerminalControl();
|
|
128
|
+
const identity = await controlCall('accounts.session').catch(() => null);
|
|
129
|
+
const account = identity && typeof identity.accountId === 'string' && typeof identity.label === 'string'
|
|
130
|
+
? Object.freeze({ accountId: identity.accountId, label: identity.label }) : null;
|
|
131
|
+
await loadPiAdapter();
|
|
132
|
+
// Credentials live in the host's store, read and refreshed under its lock (`terminalCredentialStore`).
|
|
133
|
+
const modelRuntime = await ModelRuntime.create({ credentials: terminalCredentialStore(), modelsPath: join(agentDir, 'models.json') });
|
|
134
|
+
// This process makes the model requests, so it is where response headers are seen. Only the
|
|
135
|
+
// limit-bearing headers cross the socket, and the parent throttles what it stores.
|
|
136
|
+
observeProviderResponses(modelRuntime, (provider, response) => {
|
|
137
|
+
const headers = limitHeaders(response.headers);
|
|
138
|
+
if (!Object.keys(headers).length)
|
|
139
|
+
return;
|
|
140
|
+
void controlCall('terminal.usage.headers', { provider, status: response.status, headers }).catch(() => undefined);
|
|
141
|
+
});
|
|
142
|
+
const listeners = new Set();
|
|
143
|
+
const changes = new Set();
|
|
144
|
+
const beforeChanges = new Set();
|
|
145
|
+
let unsubscribe;
|
|
146
|
+
let changing = false;
|
|
147
|
+
let disposed = false;
|
|
148
|
+
let uiGeneration = 0;
|
|
149
|
+
let deviceIdPromise = null;
|
|
150
|
+
const installationDeviceId = () => {
|
|
151
|
+
if (!deviceIdPromise) {
|
|
152
|
+
deviceIdPromise = controlCall('accounts.deviceId').catch((error) => {
|
|
153
|
+
deviceIdPromise = null;
|
|
154
|
+
throw error;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return deviceIdPromise;
|
|
158
|
+
};
|
|
159
|
+
const currentUi = () => {
|
|
160
|
+
const generation = uiGeneration;
|
|
161
|
+
return sessionUiContext(host.ui, () => !disposed && generation === uiGeneration);
|
|
162
|
+
};
|
|
163
|
+
const planRun = { active: false, allowedTools: new Set() };
|
|
164
|
+
const goal = new GoalController();
|
|
165
|
+
let currentMode = 'normal';
|
|
166
|
+
let pendingApply = false;
|
|
167
|
+
const choiceStore = {
|
|
168
|
+
read: () => controlCall('accounts.choices.get'),
|
|
169
|
+
write: (mode, patch) => controlCall('accounts.choices.set', { mode, ...patch })
|
|
170
|
+
};
|
|
171
|
+
const modeChoices = new ModeChoices(choiceStore);
|
|
172
|
+
// A selection is recorded against the mode it was made in; a one-shot plan run is always plan.
|
|
173
|
+
const recordingMode = () => (planRun.active ? 'plan' : currentMode);
|
|
174
|
+
const modelFor = (reference) => resolveCliModel({ cliModel: reference, modelRuntime }).model;
|
|
175
|
+
/** A model this account can use: offered by its catalogue and holding credentials. Never a request. */
|
|
176
|
+
const usableModel = async (reference) => {
|
|
177
|
+
const model = modelFor(reference);
|
|
178
|
+
return model && await modelRuntime.checkAuth(model.provider) ? model : undefined;
|
|
179
|
+
};
|
|
180
|
+
// The level Pi resolves when no mode has saved an effort: the model's own default, then the account's.
|
|
181
|
+
const defaultEffort = (session) => {
|
|
182
|
+
const model = session.model;
|
|
183
|
+
return ((model ? session.settingsManager.getModelThinkingLevel(model.provider, model.id) : undefined)
|
|
184
|
+
?? session.settingsManager.getDefaultThinkingLevel() ?? 'medium');
|
|
185
|
+
};
|
|
186
|
+
const applyMode = () => modeChoices.apply(native.session, currentMode, modelFor, defaultEffort(native.session));
|
|
187
|
+
// Pi rebuilds the active tools from the transcript, where the last recorded set may be a plan's.
|
|
188
|
+
const restoreNormalTools = (session) => {
|
|
189
|
+
const recorded = normalToolsForBranch(session.sessionManager.getBranch());
|
|
190
|
+
session.setActiveToolsByName(normalModeTools(recorded ?? session.getActiveToolNames()));
|
|
191
|
+
};
|
|
192
|
+
const restoreChoice = async (session, previous) => {
|
|
193
|
+
if (previous.model && (session.model?.provider !== previous.model.provider || session.model?.id !== previous.model.id)) {
|
|
194
|
+
await session.setModel(previous.model, { persist: false }).catch(() => undefined);
|
|
195
|
+
}
|
|
196
|
+
session.setThinkingLevel(previous.effort, { persist: false });
|
|
197
|
+
};
|
|
198
|
+
// A conversation written on another account can name a model this one cannot use. The account's own
|
|
199
|
+
// newest choice decides then, and the conversation records it so the next resume is settled. A
|
|
200
|
+
// fallback never fails the start: whatever is wrong with the choice, Pi's own fallback remains.
|
|
201
|
+
const recoverModel = async (session) => {
|
|
202
|
+
// An explicit launch model is the host's decision for this session, and a reading that fails is no reason to change one.
|
|
203
|
+
if (prepared.model)
|
|
204
|
+
return null;
|
|
205
|
+
const recorded = recordedModel(session.sessionManager.getBranch());
|
|
206
|
+
if (!recorded)
|
|
207
|
+
return null;
|
|
208
|
+
const reference = `${recorded.provider}/${recorded.modelId}`;
|
|
209
|
+
if (await usableModel(reference).catch(() => undefined))
|
|
210
|
+
return null;
|
|
211
|
+
const applied = await modeChoices.useFallback(session, currentMode, usableModel, defaultEffort(session)).catch(() => null);
|
|
212
|
+
return applied ? { recorded: reference, ...applied } : null;
|
|
213
|
+
};
|
|
214
|
+
let native;
|
|
215
|
+
const factory = async ({ cwd: targetCwd, sessionManager, sessionStartEvent }) => {
|
|
216
|
+
if (realpathSync(targetCwd) !== cwd)
|
|
217
|
+
throw new Error('A native session cannot change this terminal working folder.');
|
|
218
|
+
const settingsManager = withTransientRetry(SettingsManager.create(cwd, agentDir));
|
|
219
|
+
const resourceLoader = new DefaultResourceLoader({
|
|
220
|
+
cwd, agentDir,
|
|
221
|
+
// The real settings still control models and tools; empty discovery settings prevent a
|
|
222
|
+
// second resource decision outside the Harness's trusted prepare() result.
|
|
223
|
+
settingsManager: SettingsManager.inMemory({}),
|
|
224
|
+
noExtensions: true, noSkills: true, noPromptTemplates: true, noThemes: true,
|
|
225
|
+
additionalExtensionPaths: prepared.extensions.slice(0, -1),
|
|
226
|
+
additionalSkillPaths: prepared.skills, additionalPromptTemplatePaths: prepared.prompts,
|
|
227
|
+
additionalThemePaths: prepared.themes,
|
|
228
|
+
extensionFactories: [
|
|
229
|
+
{ name: 'harness-terminal-bridge', factory: pi => terminalExtension(pi, planRun, () => native.session, goal), hidden: true },
|
|
230
|
+
// A model picked in the terminal reaches Pi as this event. A restore is not a pick.
|
|
231
|
+
{ name: 'harness-mode-choices', factory: pi => { pi.on('model_select', event => { if (event.source !== 'restore')
|
|
232
|
+
void modeChoices.record(recordingMode(), { model: `${event.model.provider}/${event.model.id}` }); }); }, hidden: true },
|
|
233
|
+
// The bridge registers parent capabilities when delegation is available. Runs without
|
|
234
|
+
// delegation still need the same frozen snapshot, after the bridge has begun the run.
|
|
235
|
+
{ name: 'harness-run-capabilities', factory: pi => {
|
|
236
|
+
pi.on('before_agent_start', async () => {
|
|
237
|
+
if (!pi.getAllTools().some(tool => tool.name === 'spawn_subagent')) {
|
|
238
|
+
const snapshot = await controlCall('terminal.subagents.register', { tools: pi.getActiveTools(), plan: planRun.active });
|
|
239
|
+
if (Array.isArray(snapshot.connectors))
|
|
240
|
+
planRun.connectors = snapshot.connectors;
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}, hidden: true }
|
|
244
|
+
],
|
|
245
|
+
appendSystemPromptOverride: (base) => [...base, ...prepared.appendSystemPrompt]
|
|
246
|
+
});
|
|
247
|
+
let resourceOwners = [];
|
|
248
|
+
const barePrompts = new Set();
|
|
249
|
+
const reloadResources = resourceLoader.reload.bind(resourceLoader);
|
|
250
|
+
resourceLoader.reload = async (options) => {
|
|
251
|
+
// Recheck the host's exact package trust and attachment identities before every load,
|
|
252
|
+
// including the reload performed internally by AgentSession.reload().
|
|
253
|
+
const selected = await controlCall('terminal.resources', {}, 30_000);
|
|
254
|
+
resourceOwners = selected.resourceOwners ?? [];
|
|
255
|
+
await reloadResources(options);
|
|
256
|
+
applyExtensionOwners(resourceLoader, resourceOwners);
|
|
257
|
+
await wrapPromptLoader(pi, resourceLoader, resourceOwners, prepared.prompts, cwd, agentDir, () => (native?.session?.extensionRunner.getRegisteredCommands() ?? []).map(command => {
|
|
258
|
+
const source = command.sourceInfo;
|
|
259
|
+
return { prefix: pluginCommandPrefix(source), name: command.name, owner: source.origin === 'package' ? `package:${source.baseDir ?? source.source}` : `extension:${source.path}`, path: source.path };
|
|
260
|
+
}), barePrompts);
|
|
261
|
+
};
|
|
262
|
+
await resourceLoader.reload();
|
|
263
|
+
const errors = resourceLoader.getExtensions().errors;
|
|
264
|
+
if (errors.length)
|
|
265
|
+
throw new Error(errors.map((error) => `${error.path}: ${error.error}`).join('\n'));
|
|
266
|
+
let selected;
|
|
267
|
+
if (prepared.model && sessionStartEvent?.reason === 'startup') {
|
|
268
|
+
selected = resolveCliModel({ cliModel: prepared.model, modelRuntime });
|
|
269
|
+
if (selected.error || !selected.model)
|
|
270
|
+
throw new Error(selected.error ?? `Model ${prepared.model} is unavailable.`);
|
|
271
|
+
}
|
|
272
|
+
// A fresh conversation starts on this account's latest normal-mode choice. A resumed one keeps its history,
|
|
273
|
+
// and an explicit --model wins. A saved model the account cannot use is skipped.
|
|
274
|
+
const fresh = !prepared.model && (sessionStartEvent?.reason === 'new' || (sessionStartEvent?.reason === 'startup' && !resume));
|
|
275
|
+
const saved = fresh ? modeChoices.resolve('normal') : {};
|
|
276
|
+
if (fresh && saved.model) {
|
|
277
|
+
const chosen = resolveCliModel({ cliModel: saved.model, modelRuntime });
|
|
278
|
+
if (chosen.model && !chosen.error && await modelRuntime.checkAuth(chosen.model.provider))
|
|
279
|
+
selected = chosen;
|
|
280
|
+
}
|
|
281
|
+
const thinkingLevel = selected?.thinkingLevel ?? (fresh ? saved.effort : undefined);
|
|
282
|
+
const created = await createAgentSession({
|
|
283
|
+
cwd, agentDir, modelRuntime, settingsManager, resourceLoader, sessionManager, sessionStartEvent,
|
|
284
|
+
...(selected?.model ? { model: selected.model } : {}),
|
|
285
|
+
...(thinkingLevel ? { thinkingLevel } : {})
|
|
286
|
+
});
|
|
287
|
+
installPluginCommandRouter(created.session, resourceOwners, barePrompts);
|
|
288
|
+
restoreNormalTools(created.session);
|
|
289
|
+
const services = { cwd, agentDir, modelRuntime, settingsManager, resourceLoader, diagnostics: [] };
|
|
290
|
+
host.resources?.(services);
|
|
291
|
+
return { ...created, services, diagnostics: services.diagnostics };
|
|
292
|
+
};
|
|
293
|
+
await modeChoices.load();
|
|
294
|
+
native = await createAgentSessionRuntime(factory, {
|
|
295
|
+
cwd, agentDir,
|
|
296
|
+
sessionManager: resume ? SessionManager.open(resume, sessionDirectory) : SessionManager.create(cwd, sessionDirectory),
|
|
297
|
+
sessionStartEvent: { type: 'session_start', reason: 'startup' }
|
|
298
|
+
});
|
|
299
|
+
const before = () => {
|
|
300
|
+
uiGeneration += 1;
|
|
301
|
+
unsubscribe?.();
|
|
302
|
+
unsubscribe = undefined;
|
|
303
|
+
for (const listener of beforeChanges)
|
|
304
|
+
listener();
|
|
305
|
+
};
|
|
306
|
+
const announce = async () => {
|
|
307
|
+
for (const listener of changes)
|
|
308
|
+
await listener(native.session);
|
|
309
|
+
host.changed();
|
|
310
|
+
};
|
|
311
|
+
const exclusive = async (action) => {
|
|
312
|
+
if (disposed)
|
|
313
|
+
throw new Error('The terminal runtime has closed.');
|
|
314
|
+
if (changing)
|
|
315
|
+
throw new Error('A native session change is already in progress.');
|
|
316
|
+
if (!native.session.isIdle)
|
|
317
|
+
throw new Error('Stop the current response before changing or reloading this session.');
|
|
318
|
+
changing = true;
|
|
319
|
+
try {
|
|
320
|
+
await controlCall('terminal.resources', {}, 30_000);
|
|
321
|
+
// A model or effort a switch restores belongs to the session's history, not to a choice the person made.
|
|
322
|
+
return await modeChoices.quietly(action);
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
changing = false;
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
const decide = async (call, params) => {
|
|
329
|
+
if (disposed)
|
|
330
|
+
throw new Error('The terminal runtime has closed.');
|
|
331
|
+
await controlCall(call, params);
|
|
332
|
+
};
|
|
333
|
+
const runtime = {
|
|
334
|
+
async pending() {
|
|
335
|
+
if (disposed)
|
|
336
|
+
return [];
|
|
337
|
+
return (await controlCall('terminal.pending')).requests;
|
|
338
|
+
},
|
|
339
|
+
approve: (requestId, decision, alwaysAllowTool = false) => decide('terminal.approve', { requestId, decision, alwaysAllow: alwaysAllowTool }),
|
|
340
|
+
async permissions() {
|
|
341
|
+
if (disposed)
|
|
342
|
+
return { full: false, globalTools: [] };
|
|
343
|
+
return controlCall('terminal.permissions.get');
|
|
344
|
+
},
|
|
345
|
+
setFullPermission: async (enabled) => { await decide('terminal.permissions.setFull', { enabled }); },
|
|
346
|
+
setGlobalTool: async (tool, allowed) => { await decide('terminal.permissions.setTool', { tool, allowed }); },
|
|
347
|
+
answer: (requestId, answer) => decide('terminal.answer', { requestId, answer }),
|
|
348
|
+
answerBatch: (batchId, answers) => decide('terminal.answers', { batchId, answers }),
|
|
349
|
+
snapshot() {
|
|
350
|
+
const session = native.session;
|
|
351
|
+
const usage = session.getContextUsage();
|
|
352
|
+
const model = session.model?.id === 'unknown' ? undefined : session.model;
|
|
353
|
+
return Object.freeze({
|
|
354
|
+
sessionId: session.sessionId, sessionFile: session.sessionFile, name: session.sessionName,
|
|
355
|
+
cwd, account,
|
|
356
|
+
model: model ? Object.freeze({ id: model.id, provider: model.provider, name: model.name, reasoning: model.reasoning, contextWindow: model.contextWindow }) : undefined,
|
|
357
|
+
thinkingLevel: session.thinkingLevel, isStreaming: session.isStreaming, idle: session.isIdle,
|
|
358
|
+
hasUserMessages: session.state.messages.some(message => message.role === 'user'),
|
|
359
|
+
hideThinking: session.settingsManager.getHideThinkingBlock(),
|
|
360
|
+
context: Object.freeze({ percent: usage?.percent ?? null, window: usage?.contextWindow ?? model?.contextWindow ?? 0 }),
|
|
361
|
+
costUsd: session.getSessionStats().cost,
|
|
362
|
+
subscription: model ? session.modelRuntime.isUsingSubscription(model.provider) : false,
|
|
363
|
+
queue: Object.freeze({ steering: Object.freeze([...session.getSteeringMessages()]), followUp: Object.freeze([...session.getFollowUpMessages()]) })
|
|
364
|
+
});
|
|
365
|
+
},
|
|
366
|
+
async submit(text, followUp = false, images) {
|
|
367
|
+
if (disposed)
|
|
368
|
+
throw new Error('The terminal runtime has closed.');
|
|
369
|
+
if (changing)
|
|
370
|
+
throw new Error('Wait for the native session change to finish before submitting.');
|
|
371
|
+
const input = text.trimStart().startsWith('/') ? text.trimStart() : text;
|
|
372
|
+
await native.session.prompt(input, {
|
|
373
|
+
...(native.session.isStreaming ? { streamingBehavior: followUp ? 'followUp' : 'steer' } : {}),
|
|
374
|
+
...(images?.length ? { images } : {})
|
|
375
|
+
});
|
|
376
|
+
},
|
|
377
|
+
async submitPlan(text, images) {
|
|
378
|
+
if (disposed)
|
|
379
|
+
throw new Error('The terminal runtime has closed.');
|
|
380
|
+
if (changing)
|
|
381
|
+
throw new Error('Wait for the native session change to finish before submitting.');
|
|
382
|
+
if (!text.trim())
|
|
383
|
+
throw new Error('Use /plan <plan brief>.');
|
|
384
|
+
const session = native.session;
|
|
385
|
+
if (!session.isIdle)
|
|
386
|
+
throw new Error('A plan request must wait until the current response settles.');
|
|
387
|
+
const originalTools = session.getActiveToolNames();
|
|
388
|
+
const registeredQuestions = session.getAllTools().map(tool => tool.name).filter(name => QUESTION_TOOL_NAMES.has(name));
|
|
389
|
+
const allowedTools = planModeTools(originalTools, [], registeredQuestions);
|
|
390
|
+
// The session's own model and effort come back once the plan is done.
|
|
391
|
+
const previous = { model: session.model, effort: session.thinkingLevel };
|
|
392
|
+
planRun.allowedTools = new Set(allowedTools);
|
|
393
|
+
planRun.active = true;
|
|
394
|
+
try {
|
|
395
|
+
session.sessionManager.appendCustomEntry(PLAN_TOOLS_ENTRY, { phase: 'begin', normal: originalTools });
|
|
396
|
+
session.setActiveToolsByName(allowedTools);
|
|
397
|
+
await modeChoices.apply(session, 'plan', modelFor, defaultEffort(session));
|
|
398
|
+
await session.prompt(text, { expandPromptTemplates: false, ...(images?.length ? { images } : {}) });
|
|
399
|
+
}
|
|
400
|
+
finally {
|
|
401
|
+
planRun.active = false;
|
|
402
|
+
planRun.allowedTools = new Set();
|
|
403
|
+
if (!disposed && native.session === session) {
|
|
404
|
+
session.setActiveToolsByName(originalTools);
|
|
405
|
+
session.sessionManager.appendCustomEntry(PLAN_TOOLS_ENTRY, { phase: 'end' });
|
|
406
|
+
await modeChoices.quietly(() => restoreChoice(session, previous));
|
|
407
|
+
if (pendingApply) {
|
|
408
|
+
pendingApply = false;
|
|
409
|
+
await applyMode();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
async setMode(mode) {
|
|
415
|
+
if (disposed)
|
|
416
|
+
throw new Error('The terminal runtime has closed.');
|
|
417
|
+
currentMode = mode;
|
|
418
|
+
// A switch during a running turn waits for it to settle, so the turn keeps the model it started with.
|
|
419
|
+
if (native.session.isIdle && !planRun.active)
|
|
420
|
+
await applyMode();
|
|
421
|
+
else
|
|
422
|
+
pendingApply = true;
|
|
423
|
+
},
|
|
424
|
+
get session() { return native.session; },
|
|
425
|
+
get services() { return native.services; },
|
|
426
|
+
cwd, sessionDirectory,
|
|
427
|
+
subscribe(listener) { listeners.add(listener); return () => { listeners.delete(listener); }; },
|
|
428
|
+
onSessionChange(listener) { changes.add(listener); return () => { changes.delete(listener); }; },
|
|
429
|
+
onBeforeSessionChange(listener) { beforeChanges.add(listener); return () => { beforeChanges.delete(listener); }; },
|
|
430
|
+
newSession: (options) => exclusive(async () => {
|
|
431
|
+
// Re-read the choices so a new conversation starts on what was chosen most recently.
|
|
432
|
+
await modeChoices.load();
|
|
433
|
+
return native.newSession(options);
|
|
434
|
+
}),
|
|
435
|
+
switchSession: (path, options) => exclusive(async () => {
|
|
436
|
+
const target = resolve(cwd, path);
|
|
437
|
+
assertTerminalHistoryPath(target, sessionDirectory);
|
|
438
|
+
assertTerminalSessionScope(target, cwd, options?.cwdOverride);
|
|
439
|
+
return native.switchSession(target, options);
|
|
440
|
+
}),
|
|
441
|
+
fork: (entryId, options) => exclusive(() => native.fork(entryId, options)),
|
|
442
|
+
navigateTree: (targetId, options) => exclusive(async () => {
|
|
443
|
+
const result = await native.session.navigateTree(targetId, options);
|
|
444
|
+
if (!result.cancelled && !planRun.active)
|
|
445
|
+
restoreNormalTools(native.session);
|
|
446
|
+
if (!result.cancelled)
|
|
447
|
+
await announce();
|
|
448
|
+
return result;
|
|
449
|
+
}),
|
|
450
|
+
importFromJsonl: (path, cwdOverride) => exclusive(async () => {
|
|
451
|
+
const target = resolve(cwd, path);
|
|
452
|
+
assertTerminalSessionScope(target, cwd, cwdOverride);
|
|
453
|
+
return native.importFromJsonl(target, cwdOverride);
|
|
454
|
+
}),
|
|
455
|
+
installationDeviceId,
|
|
456
|
+
reload: () => exclusive(async () => {
|
|
457
|
+
// Refuse a revoked or changed resource set before tearing down the currently usable UI.
|
|
458
|
+
await controlCall('terminal.resources', {}, 30_000);
|
|
459
|
+
await runtime.interrupt();
|
|
460
|
+
before();
|
|
461
|
+
await native.session.reload({ beforeSessionStart: async () => {
|
|
462
|
+
native.session.extensionRunner.setUIContext(currentUi(), 'tui');
|
|
463
|
+
observeSession();
|
|
464
|
+
await announce();
|
|
465
|
+
} });
|
|
466
|
+
host.changed();
|
|
467
|
+
}),
|
|
468
|
+
goal,
|
|
469
|
+
async interrupt() {
|
|
470
|
+
// The person stopping a running goal pauses it, as in Codex; /goal resume continues.
|
|
471
|
+
if (goal.active() && !native.session.isIdle)
|
|
472
|
+
goal.pause();
|
|
473
|
+
// Bash executions use their own abort controllers, outside Pi's agent tool loop.
|
|
474
|
+
native.session.abortBash();
|
|
475
|
+
// Socket-backed questions and approvals must settle before Pi can finish aborting tools.
|
|
476
|
+
await controlCall('terminal.interrupt', {}, 15_000).catch(() => { });
|
|
477
|
+
await native.session.abort();
|
|
478
|
+
},
|
|
479
|
+
async dispose() {
|
|
480
|
+
if (disposed)
|
|
481
|
+
return;
|
|
482
|
+
disposed = true;
|
|
483
|
+
try {
|
|
484
|
+
await runtime.interrupt();
|
|
485
|
+
await native.dispose();
|
|
486
|
+
}
|
|
487
|
+
finally {
|
|
488
|
+
unsubscribe?.();
|
|
489
|
+
listeners.clear();
|
|
490
|
+
changes.clear();
|
|
491
|
+
beforeChanges.clear();
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
const observeSession = () => {
|
|
496
|
+
unsubscribe?.();
|
|
497
|
+
unsubscribe = native.session.subscribe(event => {
|
|
498
|
+
if (event.type === 'thinking_level_changed')
|
|
499
|
+
void modeChoices.record(recordingMode(), { effort: event.level });
|
|
500
|
+
if (event.type === 'agent_settled' && pendingApply && !planRun.active) {
|
|
501
|
+
pendingApply = false;
|
|
502
|
+
void applyMode().catch(() => undefined);
|
|
503
|
+
}
|
|
504
|
+
for (const listener of listeners)
|
|
505
|
+
listener(event);
|
|
506
|
+
host.changed();
|
|
507
|
+
});
|
|
508
|
+
};
|
|
509
|
+
const bind = async () => {
|
|
510
|
+
const session = native.session;
|
|
511
|
+
observeSession();
|
|
512
|
+
await session.bindExtensions({
|
|
513
|
+
uiContext: currentUi(), mode: 'tui', shutdownHandler: () => host.shutdown(),
|
|
514
|
+
abortHandler: () => { void runtime.interrupt().catch((error) => host.notify(error instanceof Error ? error.message : String(error))); },
|
|
515
|
+
onError: (error) => host.notify(`${error.event}: ${error.error}`),
|
|
516
|
+
commandContextActions: {
|
|
517
|
+
waitForIdle: () => native.session.waitForIdle(),
|
|
518
|
+
newSession: (options) => runtime.newSession(options),
|
|
519
|
+
switchSession: (path, options) => runtime.switchSession(path, options),
|
|
520
|
+
fork: (entryId, options) => runtime.fork(entryId, options),
|
|
521
|
+
navigateTree: (targetId, options) => runtime.navigateTree(targetId, options),
|
|
522
|
+
reload: () => runtime.reload()
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
const recovered = await recoverModel(session);
|
|
526
|
+
await announce();
|
|
527
|
+
if (recovered) {
|
|
528
|
+
const effort = recovered.effort ? ` at ${recovered.effort} effort` : '';
|
|
529
|
+
host.notify(`This account cannot use ${recovered.recorded}. Started on ${recovered.reference}${effort}, your latest choice on this account.`);
|
|
530
|
+
}
|
|
531
|
+
else if (native.modelFallbackMessage)
|
|
532
|
+
host.notify(native.modelFallbackMessage);
|
|
533
|
+
};
|
|
534
|
+
native.setBeforeSessionInvalidate(before);
|
|
535
|
+
native.setRebindSession(bind);
|
|
536
|
+
try {
|
|
537
|
+
await bind();
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
await runtime.dispose();
|
|
541
|
+
throw error;
|
|
542
|
+
}
|
|
543
|
+
return runtime;
|
|
544
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Theme } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
export declare const SEARCH_GLYPH = "\u2315";
|
|
3
|
+
export declare const SEARCH_PLACEHOLDER = "Type to search";
|
|
4
|
+
export declare const SEARCH_FIELD_ROWS = 5;
|
|
5
|
+
export declare function searchFieldRowsFor(availableRows: number): number;
|
|
6
|
+
export declare class SearchField {
|
|
7
|
+
private readonly theme;
|
|
8
|
+
private readonly input;
|
|
9
|
+
constructor(theme: () => Theme, placeholder?: string);
|
|
10
|
+
get value(): string;
|
|
11
|
+
set focused(value: boolean);
|
|
12
|
+
/** Presets the text, for a command that was given something to search for. */
|
|
13
|
+
setValue(text: string): void;
|
|
14
|
+
/** Empties the field; says whether there was anything to empty. */
|
|
15
|
+
clear(): boolean;
|
|
16
|
+
/** Takes typed text, paste, Backspace and Ctrl+U. Says whether the text changed. */
|
|
17
|
+
handleInput(data: string): boolean;
|
|
18
|
+
invalidate(): void;
|
|
19
|
+
/** One row, `width` cells: the glyph, the text or placeholder, and `note` at the right edge. */
|
|
20
|
+
render(width: number, note?: string): string;
|
|
21
|
+
renderLines(width: number, note?: string, rows?: number): string[];
|
|
22
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';
|
|
2
|
+
import { MouseSafeInput } from "./mouseReport.js";
|
|
3
|
+
export const SEARCH_GLYPH = '⌕';
|
|
4
|
+
export const SEARCH_PLACEHOLDER = 'Type to search';
|
|
5
|
+
export const SEARCH_FIELD_ROWS = 5;
|
|
6
|
+
export function searchFieldRowsFor(availableRows) {
|
|
7
|
+
const fieldRoom = Math.max(0, Math.floor(availableRows) - 1);
|
|
8
|
+
if (fieldRoom >= SEARCH_FIELD_ROWS)
|
|
9
|
+
return SEARCH_FIELD_ROWS;
|
|
10
|
+
return fieldRoom >= 3 ? 3 : 1;
|
|
11
|
+
}
|
|
12
|
+
const SCREEN_KEYS = ['left', 'right', 'up', 'down', 'enter', 'tab', 'shift+tab', 'escape', 'pageUp', 'pageDown', 'home', 'end'];
|
|
13
|
+
export class SearchField {
|
|
14
|
+
theme;
|
|
15
|
+
input;
|
|
16
|
+
constructor(theme, placeholder = SEARCH_PLACEHOLDER) {
|
|
17
|
+
this.theme = theme;
|
|
18
|
+
this.input = new MouseSafeInput({ prompt: '', placeholder, placeholderStyle: text => this.theme().fg('dim', text) });
|
|
19
|
+
}
|
|
20
|
+
get value() { return this.input.getValue(); }
|
|
21
|
+
set focused(value) { this.input.focused = value; }
|
|
22
|
+
/** Presets the text, for a command that was given something to search for. */
|
|
23
|
+
setValue(text) { this.input.setValue(text); }
|
|
24
|
+
/** Empties the field; says whether there was anything to empty. */
|
|
25
|
+
clear() {
|
|
26
|
+
if (!this.value)
|
|
27
|
+
return false;
|
|
28
|
+
this.input.setValue('');
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
/** Takes typed text, paste, Backspace and Ctrl+U. Says whether the text changed. */
|
|
32
|
+
handleInput(data) {
|
|
33
|
+
if (SCREEN_KEYS.some(key => matchesKey(data, key)))
|
|
34
|
+
return false;
|
|
35
|
+
const before = this.value;
|
|
36
|
+
this.input.handleInput(data);
|
|
37
|
+
return this.value !== before;
|
|
38
|
+
}
|
|
39
|
+
invalidate() { this.input.invalidate(); }
|
|
40
|
+
/** One row, `width` cells: the glyph, the text or placeholder, and `note` at the right edge. */
|
|
41
|
+
render(width, note = '') {
|
|
42
|
+
if (width < 1)
|
|
43
|
+
return '';
|
|
44
|
+
const theme = this.theme();
|
|
45
|
+
const glyph = theme.fg('text', `${SEARCH_GLYPH} `);
|
|
46
|
+
const room = Math.max(0, width - visibleWidth(glyph));
|
|
47
|
+
const shownNote = note && room > visibleWidth(note) + 8 ? note : '';
|
|
48
|
+
const field = this.input.render(Math.max(1, room - (shownNote ? visibleWidth(shownNote) + 1 : 0)))[0] ?? '';
|
|
49
|
+
return truncateToWidth(glyph + field + (shownNote ? ' ' + theme.fg('muted', shownNote) : ''), width, '');
|
|
50
|
+
}
|
|
51
|
+
renderLines(width, note = '', rows = SEARCH_FIELD_ROWS) {
|
|
52
|
+
if (width < 1)
|
|
53
|
+
return [];
|
|
54
|
+
if (rows < 3)
|
|
55
|
+
return [this.render(width, note)];
|
|
56
|
+
const rule = this.theme().fg('border', '─'.repeat(width));
|
|
57
|
+
return rows >= SEARCH_FIELD_ROWS
|
|
58
|
+
? ['', rule, this.render(width, note), rule, '']
|
|
59
|
+
: [rule, this.render(width, note), rule];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One selection palette for every terminal surface. A selected row is a muted blue field with
|
|
3
|
+
* explicit near-white text, so the accent colour never sits on the selection background.
|
|
4
|
+
*/
|
|
5
|
+
export declare const SELECTION_COLORS: {
|
|
6
|
+
readonly dark: {
|
|
7
|
+
readonly background: "#1b314d";
|
|
8
|
+
readonly text: "#f4f8ff";
|
|
9
|
+
readonly muted: "#c4d3e6";
|
|
10
|
+
};
|
|
11
|
+
readonly light: {
|
|
12
|
+
readonly background: "#dbe8fa";
|
|
13
|
+
readonly text: "#10233a";
|
|
14
|
+
readonly muted: "#455a72";
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One selection palette for every terminal surface. A selected row is a muted blue field with
|
|
3
|
+
* explicit near-white text, so the accent colour never sits on the selection background.
|
|
4
|
+
*/
|
|
5
|
+
export const SELECTION_COLORS = {
|
|
6
|
+
dark: {
|
|
7
|
+
background: '#1b314d',
|
|
8
|
+
text: '#f4f8ff',
|
|
9
|
+
muted: '#c4d3e6'
|
|
10
|
+
},
|
|
11
|
+
light: {
|
|
12
|
+
background: '#dbe8fa',
|
|
13
|
+
text: '#10233a',
|
|
14
|
+
muted: '#455a72'
|
|
15
|
+
}
|
|
16
|
+
};
|