@xingular/harness 0.1.7 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +125 -1
- package/LICENSE +202 -0
- package/NOTICE.md +22 -0
- package/README.md +239 -86
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +17853 -13114
- package/dist/sdk/accounts/accounts.d.ts +165 -0
- package/dist/sdk/accounts/accounts.js +730 -0
- package/dist/sdk/accounts/choices.d.ts +23 -0
- package/dist/sdk/accounts/choices.js +62 -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 +16 -0
- package/dist/sdk/accounts/secrets.js +40 -0
- package/dist/sdk/accounts/store.d.ts +114 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/agents/builtin.d.ts +2 -0
- package/dist/sdk/agents/builtin.js +34 -0
- package/dist/sdk/agents/narrow.d.ts +13 -0
- package/dist/sdk/agents/narrow.js +29 -0
- package/dist/sdk/agents/profiles.d.ts +80 -0
- package/dist/sdk/agents/profiles.js +221 -0
- package/dist/sdk/annotations/bridge.d.ts +42 -0
- package/dist/sdk/annotations/bridge.js +264 -0
- package/dist/sdk/annotations/capture.d.ts +116 -0
- package/dist/sdk/annotations/capture.js +308 -0
- package/dist/sdk/annotations/delivery.d.ts +72 -0
- package/dist/sdk/annotations/delivery.js +130 -0
- package/dist/sdk/annotations/inspect.d.ts +10 -0
- package/dist/sdk/annotations/inspect.js +33 -0
- package/dist/sdk/annotations/isolated.d.ts +6 -0
- package/dist/sdk/annotations/isolated.js +51 -0
- package/dist/sdk/annotations/pageScript.d.ts +28 -0
- package/dist/sdk/annotations/pageScript.js +570 -0
- package/dist/sdk/annotations/part.d.ts +10 -0
- package/dist/sdk/annotations/part.js +144 -0
- package/dist/sdk/annotations/queue.d.ts +4 -0
- package/dist/sdk/annotations/queue.js +40 -0
- package/dist/sdk/annotations/serverMethods.d.ts +3 -0
- package/dist/sdk/annotations/serverMethods.js +62 -0
- package/dist/sdk/annotations/store.d.ts +160 -0
- package/dist/sdk/annotations/store.js +386 -0
- package/dist/sdk/browser/config.d.ts +16 -0
- package/dist/sdk/browser/config.js +22 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/index.d.ts +28 -0
- package/dist/sdk/browser/index.js +72 -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 +7 -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 +8 -0
- package/dist/sdk/browser/tools.js +329 -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 +47 -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 +150 -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/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 +187 -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/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +208 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +92 -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 +148 -0
- package/dist/sdk/harness.js +338 -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 +216 -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 +474 -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 +73 -0
- package/dist/sdk/index.js +55 -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/runtime.d.ts +13 -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 +163 -0
- package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
- package/dist/sdk/plugins/builtinRegistry.js +49 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +196 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +188 -0
- package/dist/sdk/plugins/discover.d.ts +42 -0
- package/dist/sdk/plugins/discover.js +115 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +113 -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 +20 -0
- package/dist/sdk/plugins/install.js +110 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +110 -0
- package/dist/sdk/plugins/manifest.d.ts +13 -0
- package/dist/sdk/plugins/manifest.js +56 -0
- package/dist/sdk/plugins/plugins.d.ts +104 -0
- package/dist/sdk/plugins/plugins.js +164 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -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 +159 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +177 -0
- package/dist/sdk/prompt/compile.js +413 -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 +51 -0
- package/dist/sdk/refine/host.js +76 -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 +45 -0
- package/dist/sdk/refine/prompts.js +390 -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 +81 -0
- package/dist/sdk/refine/runner.js +150 -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 +20 -0
- package/dist/sdk/refine/service.d.ts +84 -0
- package/dist/sdk/refine/service.js +165 -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 +68 -0
- package/dist/sdk/refine/types.d.ts +77 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +293 -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 +84 -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 +10 -0
- package/dist/sdk/server/serve.js +18 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/continuation.d.ts +48 -0
- package/dist/sdk/sessions/continuation.js +85 -0
- package/dist/sdk/sessions/contracts.d.ts +551 -0
- package/dist/sdk/sessions/contracts.js +338 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/planMode.d.ts +39 -0
- package/dist/sdk/sessions/planMode.js +93 -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 +103 -0
- package/dist/sdk/sessions/registry.js +386 -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 +66 -0
- package/dist/sdk/sessions/runStore.js +337 -0
- package/dist/sdk/sessions/runner.d.ts +213 -0
- package/dist/sdk/sessions/runner.js +589 -0
- package/dist/sdk/sessions/sessions.d.ts +152 -0
- package/dist/sdk/sessions/sessions.js +461 -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/subagentServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/subagentServerMethods.js +41 -0
- package/dist/sdk/sessions/subagentService.d.ts +52 -0
- package/dist/sdk/sessions/subagentService.js +265 -0
- package/dist/sdk/sessions/subagents.d.ts +58 -0
- package/dist/sdk/sessions/subagents.js +87 -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 +186 -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 +15 -0
- package/dist/sdk/terminal/client.js +126 -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 +78 -0
- package/dist/sdk/terminal/controller.js +383 -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/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
- package/dist/sdk/terminal/piExtension.d.ts +6 -0
- package/dist/sdk/terminal/piExtension.js +377 -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 +20 -0
- package/dist/sdk/terminal/standalone.js +186 -0
- package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
- package/dist/sdk/terminal/subagentMonitor.js +121 -0
- package/dist/sdk/terminal/terminals.d.ts +212 -0
- package/dist/sdk/terminal/terminals.js +1108 -0
- package/dist/sdk/terminal/trajectory.d.ts +10 -0
- package/dist/sdk/terminal/trajectory.js +30 -0
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
- package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
- package/dist/sdk/terminal/tui/chrome.js +169 -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 +11 -0
- package/dist/sdk/terminal/tui/commandPages.js +111 -0
- package/dist/sdk/terminal/tui/commands.d.ts +46 -0
- package/dist/sdk/terminal/tui/commands.js +399 -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 +80 -0
- package/dist/sdk/terminal/tui/dialogs.js +370 -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 +73 -0
- package/dist/sdk/terminal/tui/list.js +196 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
- package/dist/sdk/terminal/tui/modeChoices.js +70 -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/page.d.ts +17 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +156 -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 +190 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
- package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
- package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -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/hubPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +128 -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/notesPage.d.ts +75 -0
- package/dist/sdk/terminal/tui/pages/notesPage.js +201 -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 +57 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -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 +23 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +65 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +450 -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 +18 -0
- package/dist/sdk/terminal/tui/piAdapter.js +48 -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 +14 -0
- package/dist/sdk/terminal/tui/pluginCommands.js +27 -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 +114 -0
- package/dist/sdk/terminal/tui/runtime.js +443 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +60 -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/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 +114 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +230 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +43 -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 +45 -0
- package/dist/sdk/terminal/tui/theme.js +176 -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/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +92 -0
- package/dist/sdk/tools/checklist.d.ts +9 -0
- package/dist/sdk/tools/checklist.js +54 -0
- package/dist/sdk/tools/definitions.d.ts +30 -0
- package/dist/sdk/tools/definitions.js +117 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +67 -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 +7 -0
- package/dist/sdk/tools/sessionName.js +31 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +58 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -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 +82 -0
- package/dist/sdk/variant/store.js +151 -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 +16 -0
- package/dist/sdk/worktrees/git.js +81 -0
- package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
- package/dist/sdk/worktrees/serverMethods.js +30 -0
- package/dist/sdk/worktrees/service.d.ts +73 -0
- package/dist/sdk/worktrees/service.js +483 -0
- package/dist/sdk/worktrees/setup.d.ts +23 -0
- package/dist/sdk/worktrees/setup.js +65 -0
- package/dist/sdk/worktrees/types.d.ts +91 -0
- package/dist/sdk/worktrees/types.js +1 -0
- package/dist/sdk/world/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 +67 -0
- package/dist/sdk/world/world.js +79 -0
- package/dist/terminal-opentui.js +20778 -0
- package/dist/terminal-pi.js +794 -518
- package/docs/README.md +42 -0
- 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 +203 -0
- package/docs/architecture/03-variants.md +103 -0
- package/docs/architecture/04-prompt.md +122 -0
- package/docs/architecture/05-refinement.md +107 -0
- package/docs/architecture/06-plugins-and-capabilities.md +129 -0
- package/docs/architecture/07-tools-and-gate.md +103 -0
- package/docs/architecture/08-memory-and-history.md +94 -0
- package/docs/architecture/09-accounts-and-connectors.md +98 -0
- package/docs/architecture/10-server-protocol.md +193 -0
- package/docs/architecture/11-terminal.md +261 -0
- package/docs/architecture/12-storage.md +75 -0
- package/docs/architecture/13-world-tools.md +45 -0
- package/docs/architecture/14-surfaces-and-parity.md +89 -0
- package/docs/architecture/README.md +125 -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 +70 -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 +127 -0
- package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
- package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
- package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
- package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
- package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
- package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
- package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
- package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
- package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
- package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
- package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
- package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
- package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
- package/docs/architecture/proposals/README.md +101 -0
- package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
- package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
- 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 +38 -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 +60 -0
- package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
- package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
- package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
- package/docs/doctor.md +80 -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/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/parity.md +78 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/4.0.0.md +46 -0
- package/docs/releases/README.md +41 -0
- package/docs/study/00-index.md +83 -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 +75 -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 +44 -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 +707 -58
- package/package.json +43 -13
- package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
- package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
- package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
- package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
- package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
- package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
- package/src/accounts/accounts.test.ts +0 -333
- package/src/accounts/accounts.ts +0 -658
- 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.ts +0 -34
- 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 -312
- 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 -75
- package/src/mcp/connections.ts +0 -614
- 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 -376
- package/src/mcp/service.ts +0 -549
- package/src/mcp/types.ts +0 -108
- 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 -163
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -59
- 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 -176
- package/src/memory/maintenance.ts +0 -518
- 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 -278
- 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/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -422
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -116
- 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 -82
- 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 -349
- 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 -174
- package/src/sessions/approvals.ts +0 -118
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -177
- 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 -381
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -332
- package/src/sessions/runner.ts +0 -604
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -549
- package/src/sessions/sessions.ts +0 -339
- 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 -291
- 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 -259
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -71
- package/src/terminal/socket.ts +0 -232
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -153
- package/src/terminal/terminal.test.ts +0 -399
- package/src/terminal/terminals.ts +0 -553
- package/src/terminal/tui/application.test.ts +0 -114
- package/src/terminal/tui/application.ts +0 -491
- package/src/terminal/tui/commands.test.ts +0 -218
- package/src/terminal/tui/commands.ts +0 -361
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -84
- package/src/terminal/tui/editor.ts +0 -79
- package/src/terminal/tui/keybindings.test.ts +0 -22
- package/src/terminal/tui/keybindings.ts +0 -50
- package/src/terminal/tui/piAdapter.ts +0 -62
- 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 -104
- package/src/terminal/tui/runtime.test.ts +0 -215
- package/src/terminal/tui/runtime.ts +0 -388
- 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/status.test.ts +0 -70
- package/src/terminal/tui/status.ts +0 -109
- package/src/terminal/tui/theme.ts +0 -174
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/transcript.test.ts +0 -25
- package/src/terminal/tui/transcript.ts +0 -124
- 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/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -187
- package/src/tools/maintenance.ts +0 -24
- 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 -92
- package/src/tools/types.ts +0 -39
- 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,30 @@
|
|
|
1
|
+
const dialogs = new Set(['select', 'input', 'editor', 'custom']);
|
|
2
|
+
/** Retained UI methods belong to the resource generation that received them. */
|
|
3
|
+
export function sessionUiContext(ui, current) {
|
|
4
|
+
return new Proxy(ui, {
|
|
5
|
+
get(target, key, receiver) {
|
|
6
|
+
const value = Reflect.get(target, key, receiver);
|
|
7
|
+
if (typeof value !== 'function')
|
|
8
|
+
return value;
|
|
9
|
+
return (...args) => {
|
|
10
|
+
if (current())
|
|
11
|
+
return Reflect.apply(value, target, args);
|
|
12
|
+
if (key === 'confirm')
|
|
13
|
+
return Promise.resolve(false);
|
|
14
|
+
if (dialogs.has(String(key)))
|
|
15
|
+
return Promise.resolve(undefined);
|
|
16
|
+
if (key === 'onTerminalInput')
|
|
17
|
+
return () => { };
|
|
18
|
+
if (key === 'setTheme')
|
|
19
|
+
return { success: false, error: 'This terminal session has ended.' };
|
|
20
|
+
if (key === 'getEditorText')
|
|
21
|
+
return '';
|
|
22
|
+
if (key === 'getToolsExpanded')
|
|
23
|
+
return false;
|
|
24
|
+
if (key === 'getAllThemes')
|
|
25
|
+
return [];
|
|
26
|
+
return undefined;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentSession, ExtensionUIContext } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import type { TerminalSettingItem } from "./pages/settingsPage.js";
|
|
3
|
+
export interface SettingsModelHost {
|
|
4
|
+
session(): AgentSession;
|
|
5
|
+
ui: ExtensionUIContext;
|
|
6
|
+
control<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
|
|
7
|
+
hotkeys?(): string;
|
|
8
|
+
refresh(): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function createSettingsModel(host: SettingsModelHost): {
|
|
11
|
+
items: () => TerminalSettingItem[];
|
|
12
|
+
apply: (id: string) => Promise<void>;
|
|
13
|
+
load: () => Promise<void>;
|
|
14
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
const PRIVATE_ACCESS_ID = 'browser.allowPrivate';
|
|
2
|
+
const GROUP_ORDER = ['Theme', 'Display', 'Images', 'Thinking', 'Recovery', 'Editor', 'Queues', 'Commands', 'Terminal', 'Keyboard', 'Compaction', 'Network'];
|
|
3
|
+
export function createSettingsModel(host) {
|
|
4
|
+
let browserSettings = null;
|
|
5
|
+
const booleans = (session) => {
|
|
6
|
+
const settings = session.settingsManager;
|
|
7
|
+
return [
|
|
8
|
+
['Auto compaction', () => session.autoCompactionEnabled, (value) => session.setAutoCompactionEnabled(value)],
|
|
9
|
+
['Auto retry', () => session.autoRetryEnabled, (value) => session.setAutoRetryEnabled(value)],
|
|
10
|
+
['Show images', () => settings.getShowImages(), (value) => settings.setShowImages(value)],
|
|
11
|
+
['Resize images', () => settings.getImageAutoResize(), (value) => settings.setImageAutoResize(value)],
|
|
12
|
+
['Block images', () => settings.getBlockImages(), (value) => settings.setBlockImages(value)],
|
|
13
|
+
['Skill commands', () => settings.getEnableSkillCommands(), (value) => settings.setEnableSkillCommands(value)],
|
|
14
|
+
['Hide thinking', () => settings.getHideThinkingBlock(), (value) => settings.setHideThinkingBlock(value)],
|
|
15
|
+
['Hardware cursor', () => settings.getShowHardwareCursor(), (value) => settings.setShowHardwareCursor(value)],
|
|
16
|
+
['Terminal progress', () => settings.getShowTerminalProgress(), (value) => settings.setShowTerminalProgress(value)]
|
|
17
|
+
];
|
|
18
|
+
};
|
|
19
|
+
const locations = [
|
|
20
|
+
['Context', 'Compaction'], ['Model', 'Recovery'], ['Appearance', 'Images'], ['Appearance', 'Images'],
|
|
21
|
+
['Context', 'Images'], ['Interaction', 'Commands'], ['Appearance', 'Display'], ['Interaction', 'Editor'],
|
|
22
|
+
['Interaction', 'Terminal'], ['Model', 'Thinking'], ['Interaction', 'Queues'], ['Interaction', 'Queues'],
|
|
23
|
+
['Appearance', 'Theme'], ['Interaction', 'Keyboard']
|
|
24
|
+
];
|
|
25
|
+
const descriptions = [
|
|
26
|
+
'Compact the context automatically when the session approaches its limit.', 'Retry eligible provider failures automatically.',
|
|
27
|
+
'Display actual image content returned by tools.', 'Resize image attachments before provider requests.',
|
|
28
|
+
'Block image attachments in provider requests.', 'Expose commands for the skills loaded in this session.',
|
|
29
|
+
'Collapse assistant thinking blocks in the transcript.', 'Display the terminal hardware cursor for editing and input methods.',
|
|
30
|
+
'Report active work through supported terminal progress controls.', 'Reasoning effort for the current model.',
|
|
31
|
+
'Delivery mode for messages that steer an active run.', 'Delivery mode for messages queued after a run.',
|
|
32
|
+
'Theme loaded from the trusted resource catalog.', 'View the current application keyboard bindings.'
|
|
33
|
+
];
|
|
34
|
+
/** One line per setting, `Label: value`; its position is the setting's id. */
|
|
35
|
+
const options = (session) => [
|
|
36
|
+
...booleans(session).map(([label, get]) => `${label}: ${get() ? 'on' : 'off'}`),
|
|
37
|
+
`Thinking: ${session.thinkingLevel}`, `Steering: ${session.steeringMode}`, `Follow-up: ${session.followUpMode}`,
|
|
38
|
+
`Theme: ${host.ui.theme.name}`, 'Keyboard controls'
|
|
39
|
+
];
|
|
40
|
+
function items() {
|
|
41
|
+
const result = options(host.session()).map((option, index) => {
|
|
42
|
+
const split = option.indexOf(':');
|
|
43
|
+
return { id: String(index), tab: locations[index][0], group: locations[index][1], label: split < 0 ? option : option.slice(0, split), value: split < 0 ? '' : option.slice(split + 1).trim(), description: descriptions[index] };
|
|
44
|
+
});
|
|
45
|
+
if (browserSettings)
|
|
46
|
+
result.push({
|
|
47
|
+
id: PRIVATE_ACCESS_ID,
|
|
48
|
+
tab: 'Browser',
|
|
49
|
+
group: 'Network',
|
|
50
|
+
label: 'Private address access',
|
|
51
|
+
value: browserSettings.allowPrivate ? 'On' : 'Off',
|
|
52
|
+
description: 'This device-wide setting affects agent browsing and annotation capture. When on, pages can reach localhost and private networks.'
|
|
53
|
+
});
|
|
54
|
+
return result.sort((a, b) => GROUP_ORDER.indexOf(a.group) - GROUP_ORDER.indexOf(b.group));
|
|
55
|
+
}
|
|
56
|
+
async function load() {
|
|
57
|
+
const config = await host.control('terminal.browser.config');
|
|
58
|
+
if (!config || typeof config.allowPrivate !== 'boolean')
|
|
59
|
+
throw new Error('The Harness returned invalid browser settings.');
|
|
60
|
+
browserSettings = { allowPrivate: config.allowPrivate };
|
|
61
|
+
}
|
|
62
|
+
async function apply(id) {
|
|
63
|
+
if (id === PRIVATE_ACCESS_ID) {
|
|
64
|
+
if (!browserSettings)
|
|
65
|
+
return;
|
|
66
|
+
const allowPrivate = !browserSettings.allowPrivate;
|
|
67
|
+
if (allowPrivate && !await host.ui.confirm('Allow private network addresses?', 'This device-wide setting lets pages opened by agent browsing and annotation capture reach localhost and private networks.'))
|
|
68
|
+
return;
|
|
69
|
+
const saved = await host.control('terminal.browser.configure', { allowPrivate });
|
|
70
|
+
if (!saved || typeof saved.allowPrivate !== 'boolean')
|
|
71
|
+
throw new Error('The Harness returned invalid browser settings.');
|
|
72
|
+
browserSettings = { allowPrivate: saved.allowPrivate };
|
|
73
|
+
host.refresh();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const session = host.session();
|
|
77
|
+
const index = Number(id);
|
|
78
|
+
const switches = booleans(session);
|
|
79
|
+
const selected = options(session)[index];
|
|
80
|
+
if (selected === undefined)
|
|
81
|
+
return;
|
|
82
|
+
if (index < switches.length) {
|
|
83
|
+
const [, get, set] = switches[index];
|
|
84
|
+
set(!get());
|
|
85
|
+
}
|
|
86
|
+
else if (selected.startsWith('Thinking:')) {
|
|
87
|
+
const level = await host.ui.select('Thinking effort', session.getAvailableThinkingLevels());
|
|
88
|
+
if (level)
|
|
89
|
+
session.setThinkingLevel(level, { persist: true });
|
|
90
|
+
}
|
|
91
|
+
else if (selected.startsWith('Steering:') || selected.startsWith('Follow-up:')) {
|
|
92
|
+
const mode = await host.ui.select('Queue delivery', ['all', 'one-at-a-time']);
|
|
93
|
+
if (mode === 'all' || mode === 'one-at-a-time') {
|
|
94
|
+
if (selected.startsWith('Steering:'))
|
|
95
|
+
session.setSteeringMode(mode);
|
|
96
|
+
else
|
|
97
|
+
session.setFollowUpMode(mode);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (selected.startsWith('Theme:')) {
|
|
101
|
+
const theme = await host.ui.select('Theme', host.ui.getAllThemes().map(item => item.name));
|
|
102
|
+
if (theme) {
|
|
103
|
+
const result = host.ui.setTheme(theme);
|
|
104
|
+
if (!result.success)
|
|
105
|
+
throw new Error(result.error);
|
|
106
|
+
session.settingsManager.setTheme(theme);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else
|
|
110
|
+
host.ui.notify(host.hotkeys?.() ?? 'Use /help for commands. Keyboard bindings are managed by the terminal application.', 'info');
|
|
111
|
+
host.refresh();
|
|
112
|
+
}
|
|
113
|
+
return { items, apply, load };
|
|
114
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Theme } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { type Component } from '@earendil-works/pi-tui';
|
|
3
|
+
import type { SideQuestionContext, SideQuestionRead } from "../../sessions/sideQuestions.js";
|
|
4
|
+
export type SideState = 'thinking' | 'answered' | 'failed';
|
|
5
|
+
type SideQuestionStart = {
|
|
6
|
+
runId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
nativeSessionId: string | null;
|
|
9
|
+
};
|
|
10
|
+
/** Visible native history and tool activity, with hidden reasoning and image bytes omitted. */
|
|
11
|
+
export declare function sideQuestionSnapshot(messages: readonly unknown[], running: boolean): string;
|
|
12
|
+
export interface SideQuestionOptions {
|
|
13
|
+
context(): SideQuestionContext;
|
|
14
|
+
start(question: string, context: SideQuestionContext): Promise<SideQuestionStart>;
|
|
15
|
+
read(runId: string, afterSequence: number): Promise<SideQuestionRead>;
|
|
16
|
+
interrupt(runId: string): Promise<unknown>;
|
|
17
|
+
copyText(text: string): Promise<void>;
|
|
18
|
+
theme(): Theme;
|
|
19
|
+
/** Puts the dock above the composer, or takes it away. */
|
|
20
|
+
mount(dock: Component | undefined): void;
|
|
21
|
+
changed(): void;
|
|
22
|
+
}
|
|
23
|
+
export declare class SideQuestion {
|
|
24
|
+
private readonly options;
|
|
25
|
+
private runId;
|
|
26
|
+
private generation;
|
|
27
|
+
private pollTimer;
|
|
28
|
+
private question;
|
|
29
|
+
private answerText;
|
|
30
|
+
private error;
|
|
31
|
+
private current;
|
|
32
|
+
private startedAt;
|
|
33
|
+
private afterSequence;
|
|
34
|
+
private answerOffset;
|
|
35
|
+
private readonly dock;
|
|
36
|
+
constructor(options: SideQuestionOptions);
|
|
37
|
+
get visible(): boolean;
|
|
38
|
+
get state(): SideState | undefined;
|
|
39
|
+
get answer(): string;
|
|
40
|
+
/** Asks one question, replacing any earlier one. Empty text dismisses. */
|
|
41
|
+
ask(question: string): Promise<void>;
|
|
42
|
+
/** Scrolls the answer while it is longer than the dock. */
|
|
43
|
+
scroll(direction: 'up' | 'down'): void;
|
|
44
|
+
/** Copies the whole side answer, including any lines outside the dock. */
|
|
45
|
+
copyAnswer(): Promise<void>;
|
|
46
|
+
/** Interrupts a running side question and removes the dock. */
|
|
47
|
+
dismiss(): Promise<void>;
|
|
48
|
+
private poll;
|
|
49
|
+
private release;
|
|
50
|
+
/** The dock: question, a scrollable answer window, and a hint for browsing or copying. */
|
|
51
|
+
private render;
|
|
52
|
+
}
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { truncateToWidth, visibleWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
|
|
2
|
+
import { contentWidth, footerRow, neutralRule, padded, safeText } from "./chrome.js";
|
|
3
|
+
import { getWorkingSpinnerFrames, SPINNER_INTERVAL_MS, spinnerFrameAt } from "./workingStatus.js";
|
|
4
|
+
const QUESTION_ROWS = 2;
|
|
5
|
+
const ANSWER_ROWS = 8;
|
|
6
|
+
const MAX_CLIENT_CONTEXT_CHARS = 300_000;
|
|
7
|
+
const POLL_INTERVAL_MS = 160;
|
|
8
|
+
function blocks(content) {
|
|
9
|
+
if (typeof content === 'string')
|
|
10
|
+
return [{ type: 'text', text: content }];
|
|
11
|
+
return Array.isArray(content) ? content.filter((block) => typeof block === 'object' && block !== null) : [];
|
|
12
|
+
}
|
|
13
|
+
function contentText(content) {
|
|
14
|
+
return blocks(content).filter(block => block.type === 'text' && typeof block.text === 'string').map(block => String(block.text)).join('\n').trim();
|
|
15
|
+
}
|
|
16
|
+
function serialized(value) {
|
|
17
|
+
if (typeof value === 'string')
|
|
18
|
+
return value;
|
|
19
|
+
try {
|
|
20
|
+
return JSON.stringify(value) ?? '';
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return '[unavailable]';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Visible native history and tool activity, with hidden reasoning and image bytes omitted. */
|
|
27
|
+
export function sideQuestionSnapshot(messages, running) {
|
|
28
|
+
const lines = [];
|
|
29
|
+
for (const message of messages) {
|
|
30
|
+
if (!message || typeof message !== 'object')
|
|
31
|
+
continue;
|
|
32
|
+
const item = message;
|
|
33
|
+
const parts = blocks(item.content);
|
|
34
|
+
if (item.role === 'user' || item.role === 'assistant') {
|
|
35
|
+
const text = parts.filter(block => block.type === 'text' && typeof block.text === 'string').map(block => String(block.text)).join('\n').trim();
|
|
36
|
+
if (text)
|
|
37
|
+
lines.push(`${item.role === 'user' ? 'User' : 'Assistant'}:\n${safeText(text)}`);
|
|
38
|
+
for (const call of parts.filter(block => block.type === 'toolCall')) {
|
|
39
|
+
const name = typeof call.name === 'string' ? call.name : 'unknown tool';
|
|
40
|
+
lines.push(`Assistant tool call (${name}):\n${safeText(serialized(call.arguments))}`);
|
|
41
|
+
}
|
|
42
|
+
if (parts.some(block => block.type === 'image'))
|
|
43
|
+
lines.push(`${item.role === 'user' ? 'User' : 'Assistant'} attached an image; image bytes are omitted.`);
|
|
44
|
+
}
|
|
45
|
+
else if (item.role === 'toolResult') {
|
|
46
|
+
const name = typeof item.toolName === 'string' ? item.toolName : typeof item.name === 'string' ? item.name : 'unknown tool';
|
|
47
|
+
const output = contentText(item.content);
|
|
48
|
+
lines.push(`Tool result (${name}${typeof item.toolCallId === 'string' ? `, ${item.toolCallId}` : ''}):\n${safeText(output || '(no text result)')}`);
|
|
49
|
+
if (parts.some(block => block.type === 'image'))
|
|
50
|
+
lines.push('Tool result also contained an image; image bytes are omitted.');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!lines.length)
|
|
54
|
+
lines.push('(No visible conversation messages yet.)');
|
|
55
|
+
if (running)
|
|
56
|
+
lines.push('The main reply is still running; its latest message may be unfinished.');
|
|
57
|
+
const full = lines.join('\n\n');
|
|
58
|
+
return full.length > MAX_CLIENT_CONTEXT_CHARS
|
|
59
|
+
? `[Earlier visible context omitted to fit the side-question request.]\n\n${full.slice(-MAX_CLIENT_CONTEXT_CHARS)}`
|
|
60
|
+
: full;
|
|
61
|
+
}
|
|
62
|
+
function payload(event) {
|
|
63
|
+
return event.payload && typeof event.payload === 'object' ? event.payload : {};
|
|
64
|
+
}
|
|
65
|
+
export class SideQuestion {
|
|
66
|
+
options;
|
|
67
|
+
runId;
|
|
68
|
+
generation = 0;
|
|
69
|
+
pollTimer;
|
|
70
|
+
question = '';
|
|
71
|
+
answerText = '';
|
|
72
|
+
error;
|
|
73
|
+
current;
|
|
74
|
+
startedAt = 0;
|
|
75
|
+
afterSequence = -1;
|
|
76
|
+
answerOffset = 0;
|
|
77
|
+
dock;
|
|
78
|
+
constructor(options) {
|
|
79
|
+
this.options = options;
|
|
80
|
+
this.dock = { invalidate: () => { }, render: width => this.render(width) };
|
|
81
|
+
}
|
|
82
|
+
get visible() { return this.current !== undefined; }
|
|
83
|
+
get state() { return this.current; }
|
|
84
|
+
get answer() { return this.answerText; }
|
|
85
|
+
/** Asks one question, replacing any earlier one. Empty text dismisses. */
|
|
86
|
+
async ask(question) {
|
|
87
|
+
const text = question.trim();
|
|
88
|
+
if (!text) {
|
|
89
|
+
await this.dismiss();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const generation = ++this.generation;
|
|
93
|
+
await this.release();
|
|
94
|
+
this.question = text;
|
|
95
|
+
this.startedAt = Date.now();
|
|
96
|
+
this.answerText = '';
|
|
97
|
+
this.error = undefined;
|
|
98
|
+
this.answerOffset = 0;
|
|
99
|
+
this.afterSequence = -1;
|
|
100
|
+
this.current = 'thinking';
|
|
101
|
+
this.options.mount(this.dock);
|
|
102
|
+
this.options.changed();
|
|
103
|
+
try {
|
|
104
|
+
const started = await this.options.start(text, this.options.context());
|
|
105
|
+
if (generation !== this.generation) {
|
|
106
|
+
await this.options.interrupt(started.runId).catch(() => undefined);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.runId = started.runId;
|
|
110
|
+
void this.poll(generation);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (generation !== this.generation)
|
|
114
|
+
return;
|
|
115
|
+
this.current = 'failed';
|
|
116
|
+
this.error = error instanceof Error ? error.message : String(error);
|
|
117
|
+
this.options.changed();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Scrolls the answer while it is longer than the dock. */
|
|
121
|
+
scroll(direction) {
|
|
122
|
+
const step = Math.max(1, ANSWER_ROWS - 2);
|
|
123
|
+
this.answerOffset = Math.max(0, this.answerOffset + (direction === 'up' ? -step : step));
|
|
124
|
+
this.options.changed();
|
|
125
|
+
}
|
|
126
|
+
/** Copies the whole side answer, including any lines outside the dock. */
|
|
127
|
+
async copyAnswer() {
|
|
128
|
+
if (this.answerText)
|
|
129
|
+
await this.options.copyText(this.answerText);
|
|
130
|
+
}
|
|
131
|
+
/** Interrupts a running side question and removes the dock. */
|
|
132
|
+
async dismiss() {
|
|
133
|
+
this.generation++;
|
|
134
|
+
await this.release();
|
|
135
|
+
this.current = undefined;
|
|
136
|
+
this.options.mount(undefined);
|
|
137
|
+
this.options.changed();
|
|
138
|
+
}
|
|
139
|
+
async poll(generation) {
|
|
140
|
+
const runId = this.runId;
|
|
141
|
+
if (!runId || generation !== this.generation)
|
|
142
|
+
return;
|
|
143
|
+
try {
|
|
144
|
+
const result = await this.options.read(runId, this.afterSequence);
|
|
145
|
+
if (generation !== this.generation)
|
|
146
|
+
return;
|
|
147
|
+
for (const event of result.events) {
|
|
148
|
+
this.afterSequence = Math.max(this.afterSequence, event.sequence);
|
|
149
|
+
const data = payload(event);
|
|
150
|
+
if (event.type === 'message.delta' && typeof data.text === 'string')
|
|
151
|
+
this.answerText += data.text;
|
|
152
|
+
if (event.type === 'message.completed' && data.role === 'assistant' && typeof data.text === 'string')
|
|
153
|
+
this.answerText = data.text;
|
|
154
|
+
if (event.type === 'failed')
|
|
155
|
+
this.error = typeof data.message === 'string' ? data.message : 'The side question failed.';
|
|
156
|
+
if (event.type === 'status.changed' && data.status === 'failed')
|
|
157
|
+
this.error = typeof data.reason === 'string' ? data.reason : 'The side question failed.';
|
|
158
|
+
if (event.type === 'status.changed' && data.status === 'interrupted')
|
|
159
|
+
this.error = 'The side question was interrupted.';
|
|
160
|
+
if (event.type === 'completed')
|
|
161
|
+
this.current = 'answered';
|
|
162
|
+
if (event.type === 'failed' || event.type === 'status.changed' && ['failed', 'interrupted'].includes(String(data.status)))
|
|
163
|
+
this.current = 'failed';
|
|
164
|
+
}
|
|
165
|
+
if (result.run.status === 'completed')
|
|
166
|
+
this.current = 'answered';
|
|
167
|
+
if (result.run.status === 'failed' || result.run.status === 'interrupted') {
|
|
168
|
+
this.current = 'failed';
|
|
169
|
+
this.error ??= result.run.terminalReason ?? 'The side question did not complete.';
|
|
170
|
+
}
|
|
171
|
+
this.options.changed();
|
|
172
|
+
if (this.current === 'thinking')
|
|
173
|
+
this.pollTimer = setTimeout(() => { void this.poll(generation); }, POLL_INTERVAL_MS);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (generation !== this.generation)
|
|
177
|
+
return;
|
|
178
|
+
this.current = 'failed';
|
|
179
|
+
this.error = error instanceof Error ? error.message : String(error);
|
|
180
|
+
this.options.changed();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async release() {
|
|
184
|
+
if (this.pollTimer)
|
|
185
|
+
clearTimeout(this.pollTimer);
|
|
186
|
+
this.pollTimer = undefined;
|
|
187
|
+
const runId = this.runId;
|
|
188
|
+
this.runId = undefined;
|
|
189
|
+
if (!runId || this.current !== 'thinking')
|
|
190
|
+
return;
|
|
191
|
+
try {
|
|
192
|
+
await this.options.interrupt(runId);
|
|
193
|
+
}
|
|
194
|
+
catch { /* The dock can still be dismissed if a run already stopped. */ }
|
|
195
|
+
}
|
|
196
|
+
/** The dock: question, a scrollable answer window, and a hint for browsing or copying. */
|
|
197
|
+
render(width) {
|
|
198
|
+
if (width < 1 || !this.current)
|
|
199
|
+
return [];
|
|
200
|
+
const theme = this.options.theme();
|
|
201
|
+
const inner = contentWidth(width);
|
|
202
|
+
const spinner = this.current === 'thinking'
|
|
203
|
+
? spinnerFrameAt(Date.now() - this.startedAt, getWorkingSpinnerFrames(process.env.TERM), SPINNER_INTERVAL_MS)
|
|
204
|
+
: '';
|
|
205
|
+
const marker = `${spinner ? `${spinner} ` : ''}/btw`;
|
|
206
|
+
const markerWidth = visibleWidth(marker) + 1;
|
|
207
|
+
const asked = wrapTextWithAnsi(safeText(this.question), Math.max(1, inner - markerWidth));
|
|
208
|
+
const question = asked.slice(0, QUESTION_ROWS).map((line, index) => {
|
|
209
|
+
const prefix = index === 0 ? `${theme.bold(theme.fg('accent', marker))} ` : ' '.repeat(markerWidth);
|
|
210
|
+
return prefix + theme.fg('muted', line);
|
|
211
|
+
});
|
|
212
|
+
if (asked.length > QUESTION_ROWS)
|
|
213
|
+
question[QUESTION_ROWS - 1] = truncateToWidth(question[QUESTION_ROWS - 1], inner - 1, '') + theme.fg('muted', '…');
|
|
214
|
+
const text = this.current === 'failed' ? `${this.answerText ? `${this.answerText}\n` : ''}${this.error ?? 'The side question failed.'}` : this.answerText;
|
|
215
|
+
const wrapped = text ? text.split('\n').flatMap(line => line ? wrapTextWithAnsi(safeText(line), inner) : ['']) : [];
|
|
216
|
+
const maxOffset = Math.max(0, wrapped.length - ANSWER_ROWS);
|
|
217
|
+
this.answerOffset = Math.min(this.answerOffset, maxOffset);
|
|
218
|
+
const shown = wrapped.slice(this.answerOffset, this.answerOffset + ANSWER_ROWS).map(line => this.current === 'failed' ? theme.fg('error', line) : line);
|
|
219
|
+
const before = this.answerOffset;
|
|
220
|
+
const after = Math.max(0, wrapped.length - before - shown.length);
|
|
221
|
+
const textHint = before || after ? `PgUp/PgDn browse · ${before ? `${before} above` : ''}${before && after ? ' · ' : ''}${after ? `${after} below` : ''} · ` : '';
|
|
222
|
+
return [
|
|
223
|
+
neutralRule(width, theme),
|
|
224
|
+
...question.map(line => padded(line, width)),
|
|
225
|
+
...(shown.length ? ['', ...shown.map(line => padded(line, width))] : []),
|
|
226
|
+
'',
|
|
227
|
+
footerRow(`${textHint}Ctrl+X copy · /btw or Esc dismiss`, width, theme)
|
|
228
|
+
].map(line => truncateToWidth(line, width, ''));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AutocompleteProvider } from '@earendil-works/pi-tui';
|
|
2
|
+
export interface SkillEntry {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
}
|
|
6
|
+
/** Rewrites a leading `$name` of a loaded skill into `/skill:name`. Anything else passes through, so `$5` stays text. */
|
|
7
|
+
export declare function expandSkillInvocation(text: string, skills: ReadonlySet<string>): string;
|
|
8
|
+
/** Offers the loaded skills at a `$` that starts a word. Every other completion is `base`'s. */
|
|
9
|
+
export declare function skillCompletions(base: AutocompleteProvider, skills: () => readonly SkillEntry[]): AutocompleteProvider;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Rewrites a leading `$name` of a loaded skill into `/skill:name`. Anything else passes through, so `$5` stays text. */
|
|
2
|
+
export function expandSkillInvocation(text, skills) {
|
|
3
|
+
const trimmed = text.trimStart();
|
|
4
|
+
const match = /^\$(\S+)(?=\s|$)/.exec(trimmed);
|
|
5
|
+
if (!match || !skills.has(match[1]))
|
|
6
|
+
return text;
|
|
7
|
+
return `/skill:${match[1]}${trimmed.slice(match[0].length)}`;
|
|
8
|
+
}
|
|
9
|
+
/** A `$` that starts a word, and the partial name after it, at the cursor. */
|
|
10
|
+
const SKILL_TOKEN = /(?:^|\s)\$([^\s$]*)$/;
|
|
11
|
+
/** A line whose first word is a skill invocation. */
|
|
12
|
+
const SKILL_LINE = /^\s*\$\S/;
|
|
13
|
+
/** Offers the loaded skills at a `$` that starts a word. Every other completion is `base`'s. */
|
|
14
|
+
export function skillCompletions(base, skills) {
|
|
15
|
+
return {
|
|
16
|
+
triggerCharacters: [...(base.triggerCharacters ?? []), '$'],
|
|
17
|
+
async getSuggestions(lines, cursorLine, cursorCol, options) {
|
|
18
|
+
const line = lines[cursorLine] ?? '';
|
|
19
|
+
const token = SKILL_TOKEN.exec(line.slice(0, cursorCol));
|
|
20
|
+
if (token) {
|
|
21
|
+
const partial = token[1];
|
|
22
|
+
const items = skills()
|
|
23
|
+
.filter((skill) => skill.name.startsWith(partial))
|
|
24
|
+
.map((skill) => ({ value: skill.name, label: `$${skill.name}`, description: skill.description }));
|
|
25
|
+
return items.length ? { items, prefix: `$${partial}` } : null;
|
|
26
|
+
}
|
|
27
|
+
// The arguments of a line that starts with a skill invocation are free text, not file paths.
|
|
28
|
+
if (SKILL_LINE.test(line))
|
|
29
|
+
return null;
|
|
30
|
+
return base.getSuggestions(lines, cursorLine, cursorCol, options);
|
|
31
|
+
},
|
|
32
|
+
applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
|
|
33
|
+
if (!prefix.startsWith('$'))
|
|
34
|
+
return base.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
|
|
35
|
+
const line = lines[cursorLine] ?? '';
|
|
36
|
+
const start = cursorCol - prefix.length;
|
|
37
|
+
const inserted = `$${item.value} `;
|
|
38
|
+
const newLines = [...lines];
|
|
39
|
+
newLines[cursorLine] = `${line.slice(0, start)}${inserted}${line.slice(cursorCol)}`;
|
|
40
|
+
return { lines: newLines, cursorLine, cursorCol: start + inserted.length };
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Theme } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
export interface BandState {
|
|
3
|
+
cwd: string;
|
|
4
|
+
model?: {
|
|
5
|
+
name: string;
|
|
6
|
+
reasoning: boolean;
|
|
7
|
+
contextWindow: number;
|
|
8
|
+
};
|
|
9
|
+
thinkingLevel: string;
|
|
10
|
+
branch: string | null;
|
|
11
|
+
account?: string;
|
|
12
|
+
inputTokens: number;
|
|
13
|
+
outputTokens: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function singleLine(text: string): string;
|
|
16
|
+
export declare function displayProjectName(cwd: string): string;
|
|
17
|
+
export declare function formatTokenCount(value: number): string;
|
|
18
|
+
export declare function renderStatusBand(state: BandState, width: number, theme: Theme): string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Presentation adapted from Oh My Pi 18.11.3's status line; it sits in the footer below the prompt frame.
|
|
2
|
+
// Upstream MIT license and evidence are recorded in NOTICE.md and docs/terminal-tui.md.
|
|
3
|
+
import { basename, sep } from 'node:path';
|
|
4
|
+
import { parseColor, stripTerminalSequences, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';
|
|
5
|
+
import { TITANIUM } from "./theme.js";
|
|
6
|
+
// OMP's shipped light theme supplies status colors separately from transcript colors.
|
|
7
|
+
const LIGHT_STATUS = {
|
|
8
|
+
...TITANIUM, darkTitanium: '#e0e0e0', electricBlue: '#875f87', subtleGray: '#808080',
|
|
9
|
+
brightAluminum: '#005f87', readoutGreen: '#005f00', titaniumGold: '#005f5f'
|
|
10
|
+
};
|
|
11
|
+
const palette = (theme) => theme.appearance === 'light' ? LIGHT_STATUS : TITANIUM;
|
|
12
|
+
export function singleLine(text) {
|
|
13
|
+
return stripTerminalSequences(text).replace(/[\x00-\x1f\x7f-\x9f]/g, ' ').replace(/ +/g, ' ').trim();
|
|
14
|
+
}
|
|
15
|
+
export function displayProjectName(cwd) {
|
|
16
|
+
return singleLine(basename(cwd) || cwd || sep);
|
|
17
|
+
}
|
|
18
|
+
export function formatTokenCount(value) {
|
|
19
|
+
const count = Math.max(0, Number.isFinite(value) ? Math.floor(value) : 0);
|
|
20
|
+
if (count >= 1_000_000_000)
|
|
21
|
+
return `${Math.floor(count / 1_000_000_000)}B`;
|
|
22
|
+
if (count >= 1_000_000)
|
|
23
|
+
return `${Math.floor(count / 1_000_000)}M`;
|
|
24
|
+
if (count >= 1_000)
|
|
25
|
+
return `${Math.floor(count / 1_000)}K`;
|
|
26
|
+
return count.toLocaleString('en-US');
|
|
27
|
+
}
|
|
28
|
+
function fitParts(parts, width) {
|
|
29
|
+
const fitted = parts.map(part => ({ ...part }));
|
|
30
|
+
const separator = ' | ';
|
|
31
|
+
const plain = () => fitted.map(part => part.text).join(separator);
|
|
32
|
+
while (fitted.length > 1 && visibleWidth(plain()) > width) {
|
|
33
|
+
const last = fitted[fitted.length - 1];
|
|
34
|
+
const otherWidth = visibleWidth(plain()) - visibleWidth(separator) - visibleWidth(last.text);
|
|
35
|
+
const available = width - otherWidth - visibleWidth(separator);
|
|
36
|
+
if (available > 0 && available < visibleWidth(last.text)) {
|
|
37
|
+
last.text = truncateToWidth(last.text, available, '', false);
|
|
38
|
+
if (visibleWidth(plain()) <= width)
|
|
39
|
+
return fitted;
|
|
40
|
+
}
|
|
41
|
+
fitted.pop();
|
|
42
|
+
}
|
|
43
|
+
if (fitted.length && visibleWidth(plain()) > width) {
|
|
44
|
+
fitted[0].text = truncateToWidth(fitted[0].text, width, '', false);
|
|
45
|
+
}
|
|
46
|
+
return fitted;
|
|
47
|
+
}
|
|
48
|
+
function color(theme, hex, text) {
|
|
49
|
+
return theme.style(text, { fg: parseColor(hex) });
|
|
50
|
+
}
|
|
51
|
+
export function renderStatusBand(state, width, theme) {
|
|
52
|
+
const size = Math.max(0, Math.floor(width));
|
|
53
|
+
if (!size)
|
|
54
|
+
return '';
|
|
55
|
+
const colors = palette(theme);
|
|
56
|
+
const model = state.model ? singleLine(state.model.name).replace(/^Claude /, '') || 'no-model' : 'no-model';
|
|
57
|
+
const account = singleLine(state.account ?? '') || 'account unknown';
|
|
58
|
+
const effort = singleLine(state.thinkingLevel) || 'off';
|
|
59
|
+
const parts = fitParts([
|
|
60
|
+
{ text: displayProjectName(state.cwd), color: colors.brightAluminum },
|
|
61
|
+
{ text: singleLine(state.branch ?? '') || '—', color: colors.readoutGreen },
|
|
62
|
+
{ text: `${account} · ${model} · ${effort}`, color: colors.electricBlue },
|
|
63
|
+
{ text: `↑ ${formatTokenCount(state.inputTokens)} ↓ ${formatTokenCount(state.outputTokens)}`, color: colors.titaniumGold }
|
|
64
|
+
], size);
|
|
65
|
+
const separator = color(theme, colors.subtleGray, ' | ');
|
|
66
|
+
return parts.map(part => color(theme, part.color, part.text)).join(separator);
|
|
67
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Adapted from @oh-my-pi/pi-tui 18.11.3 (https://github.com/can1357/oh-my-pi).
|
|
3
|
+
*
|
|
4
|
+
* MIT License
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 Mario Zechner
|
|
7
|
+
* Copyright (c) 2025-2026 Can Bölük
|
|
8
|
+
* Copyright (c) 2026 Stencil Labs, Inc.
|
|
9
|
+
*
|
|
10
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
* in the Software without restriction, including without limitation the rights
|
|
13
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
* furnished to do so, subject to the following conditions:
|
|
16
|
+
*
|
|
17
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
* copies or substantial portions of the Software.
|
|
19
|
+
*
|
|
20
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
* SOFTWARE.
|
|
27
|
+
*/
|
|
28
|
+
import { Theme } from '@earendil-works/pi-coding-agent';
|
|
29
|
+
export declare const TITANIUM: {
|
|
30
|
+
readonly brushedTitanium: "#151820";
|
|
31
|
+
readonly darkTitanium: "#0f1216";
|
|
32
|
+
readonly electricBlue: "#00b4ff";
|
|
33
|
+
readonly deepBlue: "#0082b3";
|
|
34
|
+
readonly titaniumGold: "#d4c090";
|
|
35
|
+
readonly brightAluminum: "#e8ecf4";
|
|
36
|
+
readonly dimAluminum: "#9ca3b0";
|
|
37
|
+
readonly warningAmber: "#ffb347";
|
|
38
|
+
readonly readoutGreen: "#00ff88";
|
|
39
|
+
readonly alertRed: "#ff4757";
|
|
40
|
+
readonly subtleGray: "#2a3038";
|
|
41
|
+
};
|
|
42
|
+
export declare function createHarnessTheme(base: Theme): Theme;
|
|
43
|
+
export declare function createHarnessLightTheme(base: Theme): Theme;
|
|
44
|
+
export declare function composerRuleColor(theme: Theme): string;
|
|
45
|
+
export declare function autocompleteRuleColor(theme: Theme): string;
|