@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,383 @@
|
|
|
1
|
+
// One `pi` command running in a terminal, as the harness sees it. The terminal itself belongs
|
|
2
|
+
// to whoever embeds the harness; this follows the native process through its extension's
|
|
3
|
+
// telemetry (never by reading the screen), turns each native turn into a run, and answers the
|
|
4
|
+
// extension's questions about policy, approvals, and what to do next.
|
|
5
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
6
|
+
import { HarnessError } from "../core/errors.js";
|
|
7
|
+
import { runStatusSchema } from "../sessions/contracts.js";
|
|
8
|
+
import { briefTitle } from "../sessions/subagents.js";
|
|
9
|
+
import { SubagentMonitor } from "./subagentMonitor.js";
|
|
10
|
+
const READY_TIMEOUT_MS = 90_000;
|
|
11
|
+
const ACK_TIMEOUT_MS = 25_000;
|
|
12
|
+
export class TerminalController {
|
|
13
|
+
hooks;
|
|
14
|
+
run = null;
|
|
15
|
+
pending = new Map();
|
|
16
|
+
subagents = new SubagentMonitor();
|
|
17
|
+
ready = false;
|
|
18
|
+
disposed = false;
|
|
19
|
+
dirty = false;
|
|
20
|
+
multilineDraft = false;
|
|
21
|
+
startupError = null;
|
|
22
|
+
startupPhase = 'Waiting for the native extension';
|
|
23
|
+
delivery = null;
|
|
24
|
+
nativeId;
|
|
25
|
+
seen = new Map();
|
|
26
|
+
commands = [];
|
|
27
|
+
constructor(hooks) {
|
|
28
|
+
this.hooks = hooks;
|
|
29
|
+
this.nativeId = hooks.nativeSessionId;
|
|
30
|
+
}
|
|
31
|
+
get nativeSessionId() {
|
|
32
|
+
return this.nativeId;
|
|
33
|
+
}
|
|
34
|
+
get activeRun() {
|
|
35
|
+
return this.run && !this.run.finished ? this.run : null;
|
|
36
|
+
}
|
|
37
|
+
state() {
|
|
38
|
+
return { ready: this.ready, dirty: this.dirty, active: !!this.activeRun || !!this.delivery };
|
|
39
|
+
}
|
|
40
|
+
requestId(nativeId) {
|
|
41
|
+
return createHash('sha256').update(`${this.hooks.sessionId}:${this.run?.runId}:${nativeId}`).digest('hex');
|
|
42
|
+
}
|
|
43
|
+
begin(nativeTurnId, text) {
|
|
44
|
+
if (this.startupError)
|
|
45
|
+
throw new Error(this.startupError);
|
|
46
|
+
this.dirty = false;
|
|
47
|
+
this.multilineDraft = false;
|
|
48
|
+
if (this.run && !this.run.finished)
|
|
49
|
+
return this.run;
|
|
50
|
+
const delivery = this.delivery;
|
|
51
|
+
if (delivery && text && delivery.text !== text)
|
|
52
|
+
throw new Error('The native prompt did not match the reserved delivery. Inspect the terminal before continuing.');
|
|
53
|
+
const run = this.hooks.begin({ reservedRunId: delivery?.runId ?? null, nativeTurnId, text });
|
|
54
|
+
this.run = run;
|
|
55
|
+
this.subagents.begin(run.runId);
|
|
56
|
+
run.onInterrupt(() => void this.commands.push({ type: 'interrupt' }));
|
|
57
|
+
if (text)
|
|
58
|
+
run.emit('message.completed', { messageId: nativeTurnId, role: 'user', text });
|
|
59
|
+
delivery?.resolve();
|
|
60
|
+
this.delivery = null;
|
|
61
|
+
return run;
|
|
62
|
+
}
|
|
63
|
+
finish(outcome, message) {
|
|
64
|
+
const runId = this.run?.runId;
|
|
65
|
+
this.run?.finish(outcome, message ? { code: 'terminal_attention', message } : undefined);
|
|
66
|
+
this.subagents.clear(runId);
|
|
67
|
+
this.run = null;
|
|
68
|
+
this.seen.clear();
|
|
69
|
+
this.pending.clear();
|
|
70
|
+
}
|
|
71
|
+
/** Hands the native process an instruction and waits until it acknowledges the prompt. */
|
|
72
|
+
async send(runId, text) {
|
|
73
|
+
if (this.disposed)
|
|
74
|
+
throw new HarnessError('terminal_not_ready', 'Reopen the terminal before sending instructions.');
|
|
75
|
+
if (this.activeRun || this.delivery)
|
|
76
|
+
throw new HarnessError('session_busy', 'This terminal has an active task or delivery.');
|
|
77
|
+
const deadline = Date.now() + READY_TIMEOUT_MS;
|
|
78
|
+
while (!this.ready && !this.startupError && !this.disposed && Date.now() < deadline)
|
|
79
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
80
|
+
if (this.disposed)
|
|
81
|
+
throw new HarnessError('terminal_not_ready', 'The terminal stopped during initialization.');
|
|
82
|
+
if (this.startupError)
|
|
83
|
+
throw new HarnessError('terminal_not_ready', this.startupError);
|
|
84
|
+
if (!this.ready)
|
|
85
|
+
throw new HarnessError('terminal_not_ready', `The native telemetry handshake is missing (${this.startupPhase}). Inspect the terminal sign-in or trust screen.`);
|
|
86
|
+
if (this.dirty)
|
|
87
|
+
throw new HarnessError('terminal_has_draft', 'The terminal contains user input. Submit or clear it before handing back control.');
|
|
88
|
+
let timer;
|
|
89
|
+
const ack = new Promise((resolve, reject) => {
|
|
90
|
+
timer = setTimeout(() => reject(new HarnessError('delivery_uncertain', 'The native prompt acknowledgement was not received. Inspect the terminal; this instruction will not be resent.')), ACK_TIMEOUT_MS);
|
|
91
|
+
this.delivery = { runId, text, resolve, reject };
|
|
92
|
+
});
|
|
93
|
+
// Delivery can fail while the native process is still starting the turn. Observe it immediately.
|
|
94
|
+
void ack.catch(() => { });
|
|
95
|
+
try {
|
|
96
|
+
this.commands.push({ type: 'send', text });
|
|
97
|
+
await ack;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
this.ready = false;
|
|
101
|
+
this.startupError = error instanceof Error ? error.message : String(error);
|
|
102
|
+
this.delivery = null;
|
|
103
|
+
this.commands.length = 0;
|
|
104
|
+
this.commands.push({ type: 'interrupt' });
|
|
105
|
+
this.finish('failed', this.startupError);
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** What the person typed into the terminal, so an instruction is never sent over their draft. */
|
|
113
|
+
onInput(data) {
|
|
114
|
+
if (!this.ready || this.activeRun || data === '\u0003')
|
|
115
|
+
return;
|
|
116
|
+
if (data.includes('\n') || data.includes('\r'))
|
|
117
|
+
this.multilineDraft = true;
|
|
118
|
+
this.dirty = data !== '\u0015' || this.multilineDraft;
|
|
119
|
+
}
|
|
120
|
+
/** The native process hung up while it was waiting for a decision. */
|
|
121
|
+
disconnected() {
|
|
122
|
+
if (this.disposed)
|
|
123
|
+
return;
|
|
124
|
+
this.ready = false;
|
|
125
|
+
this.commands.push({ type: 'interrupt' });
|
|
126
|
+
this.finish('failed', 'The native decision callback disconnected. Inspect the terminal before continuing.');
|
|
127
|
+
}
|
|
128
|
+
/** Project registry-owned questions, including grouped requests, into the terminal inbox. */
|
|
129
|
+
observe(event, descendant = false) {
|
|
130
|
+
if (this.disposed || !this.activeRun || (!descendant && event.runId !== this.activeRun.runId))
|
|
131
|
+
return;
|
|
132
|
+
if (event.type === 'question.requested') {
|
|
133
|
+
const payload = event.payload;
|
|
134
|
+
this.pending.set(String(payload.questionId), { ...payload, type: 'question', requestId: payload.questionId, runId: event.runId });
|
|
135
|
+
}
|
|
136
|
+
else if (descendant && event.type === 'approval.requested') {
|
|
137
|
+
const payload = event.payload;
|
|
138
|
+
if (!payload.automatic)
|
|
139
|
+
this.pending.set(String(payload.approvalId), { ...payload, type: 'approval', requestId: payload.approvalId, runId: event.runId });
|
|
140
|
+
}
|
|
141
|
+
else if (event.type === 'approval.resolved') {
|
|
142
|
+
this.pending.delete(String(event.payload.approvalId));
|
|
143
|
+
}
|
|
144
|
+
else if (event.type === 'question.answered') {
|
|
145
|
+
this.pending.delete(String(event.payload.questionId));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** A child event that belongs to the active terminal parent run. */
|
|
149
|
+
observeSubagent(parentRunId, run, event, profile = null) {
|
|
150
|
+
if (this.disposed || this.activeRun?.runId !== parentRunId || run.relation !== 'subagent')
|
|
151
|
+
return;
|
|
152
|
+
this.subagents.observe(parentRunId, {
|
|
153
|
+
id: run.id,
|
|
154
|
+
parentRunId: run.parentRunId,
|
|
155
|
+
relation: 'subagent',
|
|
156
|
+
title: run.title ?? briefTitle(run.goal),
|
|
157
|
+
goal: run.goal,
|
|
158
|
+
status: runStatusSchema.parse(run.status),
|
|
159
|
+
startedAt: run.startedAt,
|
|
160
|
+
endedAt: run.endedAt,
|
|
161
|
+
profile
|
|
162
|
+
}, event);
|
|
163
|
+
}
|
|
164
|
+
/** Read-only child activity for the active run. */
|
|
165
|
+
subagentSnapshot() {
|
|
166
|
+
const run = this.activeRun;
|
|
167
|
+
return run ? this.subagents.snapshot(run.runId) : [];
|
|
168
|
+
}
|
|
169
|
+
/** The socket grants this interface only to the process that owns terminal input. */
|
|
170
|
+
async control(call, data) {
|
|
171
|
+
if (this.disposed)
|
|
172
|
+
throw new HarnessError('terminal_not_ready', 'This terminal has ended.');
|
|
173
|
+
if (call === 'terminal.draft') {
|
|
174
|
+
this.dirty = data.dirty === true;
|
|
175
|
+
this.multilineDraft = false;
|
|
176
|
+
return {};
|
|
177
|
+
}
|
|
178
|
+
if (call === 'terminal.pending')
|
|
179
|
+
return { requests: [...this.pending.values()] };
|
|
180
|
+
if (call === 'terminal.interrupt')
|
|
181
|
+
return this.activeRun && this.hooks.interrupt ? this.hooks.interrupt(this.activeRun.runId) : {};
|
|
182
|
+
if (call === 'terminal.policy') {
|
|
183
|
+
const run = this.activeRun;
|
|
184
|
+
if (!run || typeof data.tool !== 'string' || !data.tool)
|
|
185
|
+
throw new HarnessError('invalid_request', 'An active run and tool name are required.');
|
|
186
|
+
return this.hooks.policy(run, data.tool, data.args ?? {});
|
|
187
|
+
}
|
|
188
|
+
if (call === 'terminal.approval')
|
|
189
|
+
return this.requestNativeApproval(data);
|
|
190
|
+
if (call === 'terminal.answers' && this.hooks.answerQuestions) {
|
|
191
|
+
const run = this.activeRun;
|
|
192
|
+
const batchId = String(data.batchId ?? '');
|
|
193
|
+
const requests = [...this.pending.values()].filter(request => request.batchId === batchId);
|
|
194
|
+
if (!run || !batchId || !requests.length || !Array.isArray(data.answers))
|
|
195
|
+
throw new HarnessError('invalid_request', 'This question batch is no longer pending.');
|
|
196
|
+
this.hooks.answerQuestions(String(requests[0].runId ?? run.runId), batchId, data.answers);
|
|
197
|
+
return {};
|
|
198
|
+
}
|
|
199
|
+
const requestId = String(data.requestId ?? '');
|
|
200
|
+
const request = this.pending.get(requestId);
|
|
201
|
+
const run = this.activeRun;
|
|
202
|
+
if (!request || !run)
|
|
203
|
+
throw new HarnessError('invalid_request', 'This terminal decision is no longer pending.');
|
|
204
|
+
if (call === 'terminal.approve' && request.type === 'approval' && this.hooks.resolveApproval) {
|
|
205
|
+
if (data.decision !== 'approved' && data.decision !== 'denied')
|
|
206
|
+
throw new HarnessError('invalid_request', 'Choose approve or deny.');
|
|
207
|
+
const alwaysAllow = data.alwaysAllow === true;
|
|
208
|
+
if (alwaysAllow && request.rememberable !== true)
|
|
209
|
+
throw new HarnessError('invalid_request', 'This approval cannot be remembered for other sessions.');
|
|
210
|
+
let decision = data.decision;
|
|
211
|
+
if (decision === 'approved' && request.direct === true) {
|
|
212
|
+
const operation = request.operation;
|
|
213
|
+
const tool = typeof operation?.tool === 'string' ? operation.tool : '';
|
|
214
|
+
const current = await this.hooks.policy(run, tool, operation?.args ?? {});
|
|
215
|
+
if (!current.allowed && !current.requiresApproval)
|
|
216
|
+
decision = 'denied';
|
|
217
|
+
if (alwaysAllow && current.rememberable !== true) {
|
|
218
|
+
request.rememberable = false;
|
|
219
|
+
throw new HarnessError('invalid_request', 'This tool can no longer be allowed across sessions. Review the approval again.');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (decision === 'approved' && alwaysAllow)
|
|
223
|
+
this.hooks.allowToolGlobally(String(request.target ?? ''));
|
|
224
|
+
this.hooks.resolveApproval(String(request.runId ?? run.runId), requestId, decision);
|
|
225
|
+
return {};
|
|
226
|
+
}
|
|
227
|
+
if (call === 'terminal.answer' && request.type === 'question' && this.hooks.answerQuestion) {
|
|
228
|
+
if (!data.answer || !Array.isArray(data.answer.selected))
|
|
229
|
+
throw new HarnessError('invalid_request', 'A question answer is required.');
|
|
230
|
+
this.hooks.answerQuestion(String(request.runId ?? run.runId), requestId, data.answer);
|
|
231
|
+
return {};
|
|
232
|
+
}
|
|
233
|
+
throw new HarnessError('unknown_method', `Unknown terminal control ${call}.`);
|
|
234
|
+
}
|
|
235
|
+
async requestNativeApproval(data) {
|
|
236
|
+
const run = this.activeRun;
|
|
237
|
+
const requestId = typeof data.requestId === 'string' ? data.requestId : '';
|
|
238
|
+
const tool = typeof data.tool === 'string' ? data.tool : '';
|
|
239
|
+
if (!run || !requestId || !tool)
|
|
240
|
+
throw new HarnessError('invalid_request', 'An active run, request id, and tool name are required.');
|
|
241
|
+
const args = data.args && typeof data.args === 'object' && !Array.isArray(data.args) ? data.args : {};
|
|
242
|
+
const policy = await this.hooks.policy(run, tool, args);
|
|
243
|
+
if (!policy.allowed && !policy.requiresApproval)
|
|
244
|
+
return { decision: 'denied' };
|
|
245
|
+
if (policy.allowed && !policy.requiresApproval)
|
|
246
|
+
return { decision: 'approved' };
|
|
247
|
+
const key = this.requestId(`approval:${requestId}`);
|
|
248
|
+
const existing = this.seen.get(key);
|
|
249
|
+
if (existing)
|
|
250
|
+
return { decision: await existing };
|
|
251
|
+
const action = JSON.stringify(args);
|
|
252
|
+
const operation = { tool, args };
|
|
253
|
+
const response = run.requestApproval({
|
|
254
|
+
requestId: key,
|
|
255
|
+
target: tool,
|
|
256
|
+
action,
|
|
257
|
+
operation,
|
|
258
|
+
rememberable: policy.rememberable === true,
|
|
259
|
+
standing: policy.standing
|
|
260
|
+
});
|
|
261
|
+
this.pending.set(key, {
|
|
262
|
+
type: 'approval', requestId: key, runId: run.runId, target: tool, action,
|
|
263
|
+
operation, rememberable: policy.rememberable === true, direct: true
|
|
264
|
+
});
|
|
265
|
+
this.seen.set(key, response);
|
|
266
|
+
try {
|
|
267
|
+
return { decision: await response };
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
this.pending.delete(key);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async accept(event, data) {
|
|
274
|
+
if (this.disposed)
|
|
275
|
+
throw new Error('This terminal controller was disposed.');
|
|
276
|
+
if (event !== 'poll')
|
|
277
|
+
this.hooks.telemetry(event);
|
|
278
|
+
if (event === 'startup') {
|
|
279
|
+
this.startupPhase = String(data.phase);
|
|
280
|
+
return {};
|
|
281
|
+
}
|
|
282
|
+
if (event === 'startupFailed') {
|
|
283
|
+
this.startupError = String(data.reason ?? 'The native extension could not initialize.');
|
|
284
|
+
this.ready = false;
|
|
285
|
+
this.finish('failed', this.startupError);
|
|
286
|
+
return {};
|
|
287
|
+
}
|
|
288
|
+
if (event === 'poll')
|
|
289
|
+
return { command: this.commands.shift() ?? null };
|
|
290
|
+
if (event === 'ready') {
|
|
291
|
+
if (!this.ready) {
|
|
292
|
+
this.dirty = false;
|
|
293
|
+
this.multilineDraft = false;
|
|
294
|
+
}
|
|
295
|
+
this.ready = true;
|
|
296
|
+
if (typeof data.nativeSessionId === 'string' && data.nativeSessionId) {
|
|
297
|
+
this.nativeId = data.nativeSessionId;
|
|
298
|
+
this.hooks.native(data.nativeSessionId);
|
|
299
|
+
}
|
|
300
|
+
return {};
|
|
301
|
+
}
|
|
302
|
+
if (event === 'begin') {
|
|
303
|
+
const run = this.begin(String(data.turnId ?? randomUUID()), String(data.text ?? ''));
|
|
304
|
+
return { runId: run.runId };
|
|
305
|
+
}
|
|
306
|
+
if (event === 'shutdown') {
|
|
307
|
+
this.ready = false;
|
|
308
|
+
this.finish('interrupted');
|
|
309
|
+
return {};
|
|
310
|
+
}
|
|
311
|
+
if (event === 'settled') {
|
|
312
|
+
this.finish(data.aborted ? 'interrupted' : data.error ? 'failed' : 'completed', data.error ? String(data.error) : undefined);
|
|
313
|
+
return {};
|
|
314
|
+
}
|
|
315
|
+
const run = this.run;
|
|
316
|
+
if (!run)
|
|
317
|
+
throw new Error('Native telemetry arrived without an active turn.');
|
|
318
|
+
if (event === 'policy')
|
|
319
|
+
return this.hooks.policy(run, String(data.tool), data.args ?? {});
|
|
320
|
+
if (event === 'questions') {
|
|
321
|
+
if (!Array.isArray(data.questions) || !data.questions.length || data.questions.length > 5)
|
|
322
|
+
throw new HarnessError('invalid_request', 'Ask between one and five questions.');
|
|
323
|
+
const questions = data.questions.map(question => ({ ...question, requestId: randomUUID() }));
|
|
324
|
+
return run.requestAnswers(questions);
|
|
325
|
+
}
|
|
326
|
+
if (event === 'approval' || event === 'question') {
|
|
327
|
+
const key = this.requestId(`${event}:${String(data.requestId ?? JSON.stringify(data))}`);
|
|
328
|
+
const existing = this.seen.get(key);
|
|
329
|
+
if (existing)
|
|
330
|
+
return event === 'approval' ? { decision: await existing } : existing;
|
|
331
|
+
if (event === 'question') {
|
|
332
|
+
const summary = typeof data.summary === 'string' && data.summary.trim() ? data.summary.trim() : undefined;
|
|
333
|
+
const sketchMode = data.uiSketch === undefined ? {} : { uiSketch: data.uiSketch };
|
|
334
|
+
const response = run.requestAnswer({ requestId: key, ...(summary ? { summary } : {}), ...sketchMode, question: String(data.question ?? ''), options: data.options ?? [], multiSelect: !!data.multiSelect, allowText: true });
|
|
335
|
+
this.pending.set(key, { type: 'question', requestId: key, ...(summary ? { summary } : {}), ...sketchMode, question: String(data.question ?? ''), options: data.options ?? [], multiSelect: !!data.multiSelect });
|
|
336
|
+
this.seen.set(key, response);
|
|
337
|
+
return response.finally(() => this.pending.delete(key));
|
|
338
|
+
}
|
|
339
|
+
const response = run.requestApproval({
|
|
340
|
+
requestId: key,
|
|
341
|
+
target: String(data.target ?? 'Native action'),
|
|
342
|
+
action: String(data.action ?? '{}'),
|
|
343
|
+
operation: { tool: String(data.tool ?? data.target), args: data.args ?? {} },
|
|
344
|
+
rememberable: false
|
|
345
|
+
});
|
|
346
|
+
this.pending.set(key, { type: 'approval', requestId: key, target: String(data.target ?? 'Action'), action: String(data.action ?? '{}') });
|
|
347
|
+
this.seen.set(key, response);
|
|
348
|
+
try {
|
|
349
|
+
return { decision: await response };
|
|
350
|
+
}
|
|
351
|
+
finally {
|
|
352
|
+
this.pending.delete(key);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (event === 'usage')
|
|
356
|
+
run.emit('usage.updated', data);
|
|
357
|
+
else if (event === 'checklist')
|
|
358
|
+
run.emit('checklist.updated', { items: data.items });
|
|
359
|
+
else if (event === 'file')
|
|
360
|
+
run.emit('file.changed', data);
|
|
361
|
+
else if (event === 'message')
|
|
362
|
+
run.emit('message.completed', { messageId: data.id ?? randomUUID(), role: data.role ?? 'assistant', text: String(data.text) });
|
|
363
|
+
else if (event === 'tool') {
|
|
364
|
+
run.emit(data.phase === 'start' ? 'tool.started' : 'tool.completed', {
|
|
365
|
+
toolCallId: String(data.id),
|
|
366
|
+
name: String(data.name),
|
|
367
|
+
...(data.phase === 'start'
|
|
368
|
+
? { summary: String(data.summary ?? ''), ...(typeof data.input === 'string' ? { input: data.input.slice(0, 24_000) } : {}) }
|
|
369
|
+
: { ok: data.ok !== false, ...(typeof data.durationMs === 'number' ? { durationMs: data.durationMs } : {}), ...(typeof data.resultChars === 'number' ? { resultChars: data.resultChars } : {}), ...(typeof data.output === 'string' ? { output: data.output.slice(0, 24_000) } : {}), ...(data.outputTruncated === true ? { outputTruncated: true } : {}) })
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
return {};
|
|
373
|
+
}
|
|
374
|
+
dispose() {
|
|
375
|
+
if (this.disposed)
|
|
376
|
+
return;
|
|
377
|
+
this.disposed = true;
|
|
378
|
+
this.ready = false;
|
|
379
|
+
this.delivery?.reject(new Error('The terminal stopped before prompt acknowledgement.'));
|
|
380
|
+
this.delivery = null;
|
|
381
|
+
this.finish('interrupted');
|
|
382
|
+
}
|
|
383
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { HubOverview } from "../hub/schema.js";
|
|
2
|
+
import type { MenuCall, MenuUi } from "./pluginMenu.js";
|
|
3
|
+
type HubEntry = HubOverview['entries'][number];
|
|
4
|
+
/** What the person is told before installing: the entry, who published it, and what installing does. */
|
|
5
|
+
export declare function hubSummary(entry: HubEntry): string;
|
|
6
|
+
/** Asks, then installs exactly this version. A refusal or a failure is reported and changes nothing. */
|
|
7
|
+
export declare function installHubEntry(ui: MenuUi, call: MenuCall, entry: HubEntry): Promise<void>;
|
|
8
|
+
/** The terminal's catalog uses the same exact-version installer as embedding applications. */
|
|
9
|
+
export declare function runHubMenu(ui: MenuUi, call: MenuCall): Promise<void>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** What the person is told before installing: the entry, who published it, and what installing does. */
|
|
2
|
+
export function hubSummary(entry) {
|
|
3
|
+
return `${entry.description}\n\nPublisher: ${entry.publisher}\nLicense: ${entry.license}\nSource: ${entry.sourceUrl}\n\n${entry.delivery.kind === 'document' ? 'Saved as data for a compatible application. Nothing is created or enabled.' : 'Installed switched off. Code remains untrusted and approvals remain unchanged.'}`;
|
|
4
|
+
}
|
|
5
|
+
/** Asks, then installs exactly this version. A refusal or a failure is reported and changes nothing. */
|
|
6
|
+
export async function installHubEntry(ui, call, entry) {
|
|
7
|
+
if (!await ui.confirm(`Install ${entry.title} ${entry.version}?`, hubSummary(entry)))
|
|
8
|
+
return;
|
|
9
|
+
try {
|
|
10
|
+
const receipt = await call('hub.install', { id: entry.id, version: entry.version });
|
|
11
|
+
ui.notify(receipt.document ? 'Saved in this library for a compatible application.' : 'Installed, switched off. Use /plugins to review and attach it. Changes apply after restarting the session.', 'info');
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
ui.notify(error instanceof Error ? error.message : String(error), 'error');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** The terminal's catalog uses the same exact-version installer as embedding applications. */
|
|
18
|
+
export async function runHubMenu(ui, call) {
|
|
19
|
+
for (;;) {
|
|
20
|
+
const catalog = await call('hub.list');
|
|
21
|
+
const labels = catalog.entries.map((entry) => `${entry.title} · ${entry.category} · ${entry.id}@${entry.version}`);
|
|
22
|
+
const picked = await ui.select('Hub', [...labels, 'Refresh catalog', 'Done']);
|
|
23
|
+
if (picked === 'Refresh catalog') {
|
|
24
|
+
const refreshed = await call('hub.list', { refresh: true });
|
|
25
|
+
if (refreshed.error)
|
|
26
|
+
ui.notify(`${refreshed.error} Using ${refreshed.origin} content.`, 'warning');
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const entry = catalog.entries[labels.indexOf(picked ?? '')];
|
|
30
|
+
if (!entry)
|
|
31
|
+
return;
|
|
32
|
+
await installHubEntry(ui, call, entry);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function bashPath(path) {
|
|
2
|
+
const drive = /^([a-z]):[\\/](.*)$/i.exec(path);
|
|
3
|
+
if (drive)
|
|
4
|
+
return `/${drive[1].toLowerCase()}/${drive[2].replaceAll('\\', '/')}`;
|
|
5
|
+
if (path.startsWith('\\\\'))
|
|
6
|
+
return `//${path.slice(2).replaceAll('\\', '/')}`;
|
|
7
|
+
return path;
|
|
8
|
+
}
|
|
9
|
+
function shellQuote(value) {
|
|
10
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
11
|
+
}
|
|
12
|
+
/** Files Pi's Git Bash shell and native Windows shells use to call Harness subcommands. */
|
|
13
|
+
export function terminalCommandFiles(platform, node, cli, name, mode) {
|
|
14
|
+
const shellNode = platform === 'win32' ? bashPath(node) : node;
|
|
15
|
+
const shellCli = platform === 'win32' ? bashPath(cli) : cli;
|
|
16
|
+
const files = [{
|
|
17
|
+
name,
|
|
18
|
+
content: `#!/bin/sh\nexec ${shellQuote(shellNode)} ${shellQuote(shellCli)} ${mode} "$@"\n`
|
|
19
|
+
}];
|
|
20
|
+
if (platform === 'win32') {
|
|
21
|
+
files.push({
|
|
22
|
+
name: `${name}.cmd`,
|
|
23
|
+
content: `@echo off\r\n"%XINGULAR_HARNESS_NODE%" "%XINGULAR_HARNESS_CLI%" ${mode} %*\r\nexit /b %ERRORLEVEL%\r\n`
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return files;
|
|
27
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const LOG_READ_CHUNK_BYTES: number;
|
|
2
|
+
export interface HarnessLogInfo {
|
|
3
|
+
size: number | null;
|
|
4
|
+
}
|
|
5
|
+
export interface HarnessLogChunk {
|
|
6
|
+
data: string;
|
|
7
|
+
nextOffset: number;
|
|
8
|
+
}
|
|
9
|
+
/** Captures the byte length of the host-owned diagnostics file; callers never supply a path. */
|
|
10
|
+
export declare function harnessLogInfo(stateDir: string): HarnessLogInfo;
|
|
11
|
+
/** Reads one bounded range from the file size captured by `harnessLogInfo`. */
|
|
12
|
+
export declare function readHarnessLogChunk(stateDir: string, snapshotSize: number, offset: number): HarnessLogChunk;
|
|
13
|
+
/** Collects a fixed-size snapshot while keeping each socket reply bounded. */
|
|
14
|
+
export declare function readHarnessLogSnapshot(info: () => Promise<HarnessLogInfo>, chunk: (snapshotSize: number, offset: number) => Promise<HarnessLogChunk>): Promise<string>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { closeSync, openSync, readSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const LOG_READ_CHUNK_BYTES = 32 * 1024;
|
|
4
|
+
/** Captures the byte length of the host-owned diagnostics file; callers never supply a path. */
|
|
5
|
+
export function harnessLogInfo(stateDir) {
|
|
6
|
+
try {
|
|
7
|
+
const stat = statSync(join(stateDir, 'harness.log'));
|
|
8
|
+
if (!stat.isFile())
|
|
9
|
+
throw new Error('The Harness diagnostics path is not a regular file.');
|
|
10
|
+
return { size: stat.size };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (error.code === 'ENOENT')
|
|
14
|
+
return { size: null };
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Reads one bounded range from the file size captured by `harnessLogInfo`. */
|
|
19
|
+
export function readHarnessLogChunk(stateDir, snapshotSize, offset) {
|
|
20
|
+
if (!Number.isSafeInteger(snapshotSize) || snapshotSize < 0 || !Number.isSafeInteger(offset) || offset < 0 || offset >= snapshotSize) {
|
|
21
|
+
throw new Error('The Harness diagnostics snapshot range is invalid.');
|
|
22
|
+
}
|
|
23
|
+
const path = join(stateDir, 'harness.log');
|
|
24
|
+
const current = statSync(path);
|
|
25
|
+
if (!current.isFile() || current.size < snapshotSize)
|
|
26
|
+
throw new Error('The Harness diagnostics file changed while it was being read.');
|
|
27
|
+
const length = Math.min(LOG_READ_CHUNK_BYTES, snapshotSize - offset);
|
|
28
|
+
const buffer = Buffer.allocUnsafe(length);
|
|
29
|
+
const descriptor = openSync(path, 'r');
|
|
30
|
+
try {
|
|
31
|
+
const bytesRead = readSync(descriptor, buffer, 0, length, offset);
|
|
32
|
+
if (bytesRead !== length)
|
|
33
|
+
throw new Error('The Harness diagnostics file changed while it was being read.');
|
|
34
|
+
return { data: buffer.toString('base64'), nextOffset: offset + bytesRead };
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
closeSync(descriptor);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Collects a fixed-size snapshot while keeping each socket reply bounded. */
|
|
41
|
+
export async function readHarnessLogSnapshot(info, chunk) {
|
|
42
|
+
const { size } = await info();
|
|
43
|
+
if (size === null || size === 0)
|
|
44
|
+
return '';
|
|
45
|
+
if (!Number.isSafeInteger(size) || size < 0)
|
|
46
|
+
throw new Error('The Harness returned an invalid diagnostics file size.');
|
|
47
|
+
const buffers = [];
|
|
48
|
+
let offset = 0;
|
|
49
|
+
while (offset < size) {
|
|
50
|
+
const page = await chunk(size, offset);
|
|
51
|
+
const buffer = Buffer.from(page.data, 'base64');
|
|
52
|
+
if (!buffer.length || page.nextOffset !== offset + buffer.length || page.nextOffset > size) {
|
|
53
|
+
throw new Error('The Harness returned an invalid diagnostics file page.');
|
|
54
|
+
}
|
|
55
|
+
buffers.push(buffer);
|
|
56
|
+
offset = page.nextOffset;
|
|
57
|
+
}
|
|
58
|
+
return Buffer.concat(buffers).toString('utf8');
|
|
59
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type TerminalSubagentActivity } from "../subagentMonitor.js";
|
|
2
|
+
export type SubagentTone = 'success' | 'warning' | 'error' | 'muted' | 'accent';
|
|
3
|
+
/** One roster row: status mark, profile, session name, checklist progress, in that order. */
|
|
4
|
+
export interface SubagentRowView {
|
|
5
|
+
id: string;
|
|
6
|
+
mark: string;
|
|
7
|
+
tone: SubagentTone;
|
|
8
|
+
/** The profile name, or `subagent` for a copy of the parent. */
|
|
9
|
+
profile: string;
|
|
10
|
+
/** The profile's colour name (PROP-0029); null for a copy of the parent. */
|
|
11
|
+
color: string | null;
|
|
12
|
+
title: string;
|
|
13
|
+
/** `n of m tasks`, or null when the child wrote no checklist. */
|
|
14
|
+
tasks: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface SubagentRosterView {
|
|
17
|
+
rows: SubagentRowView[];
|
|
18
|
+
/** `+N more · /subagents` when rows were left out. */
|
|
19
|
+
overflow: string | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function subagentTasks(checklist: TerminalSubagentActivity['checklist']): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* The compact live roster shown under the status line: active children first, at most three
|
|
24
|
+
* rows. The session name is cut first when the terminal is narrow.
|
|
25
|
+
*/
|
|
26
|
+
export declare function subagentRoster(items: readonly TerminalSubagentActivity[], width: number, frame?: string): SubagentRosterView | null;
|
|
27
|
+
/** A row as plain text, the way it reads on screen. */
|
|
28
|
+
export declare function subagentRowText(row: SubagentRowView): string;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { stripTerminalSequences, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';
|
|
2
|
+
import { ACTIVE_SUBAGENT_STATUSES } from "../subagentMonitor.js";
|
|
3
|
+
import { getWorkingSpinnerFrames } from "../tui/workingStatus.js";
|
|
4
|
+
const MAX_VISIBLE_ROWS = 3;
|
|
5
|
+
const GAP = ' ';
|
|
6
|
+
/** Cuts plain text to a width; the cut adds no styling codes. */
|
|
7
|
+
function cut(text, width) {
|
|
8
|
+
return stripTerminalSequences(truncateToWidth(text, width, '…'));
|
|
9
|
+
}
|
|
10
|
+
function safe(text) {
|
|
11
|
+
return stripTerminalSequences(text).replace(/[\x00-\x1f\x7f]/g, ' ').replace(/\s+/g, ' ').trim();
|
|
12
|
+
}
|
|
13
|
+
function mark(status, frame) {
|
|
14
|
+
switch (status) {
|
|
15
|
+
case 'completed': return { mark: '✓', tone: 'success' };
|
|
16
|
+
case 'failed': return { mark: '✕', tone: 'error' };
|
|
17
|
+
case 'interrupted': return { mark: '!', tone: 'muted' };
|
|
18
|
+
case 'queued': return { mark: '○', tone: 'muted' };
|
|
19
|
+
case 'waiting_for_approval':
|
|
20
|
+
case 'waiting_for_input': return { mark: '●', tone: 'accent' };
|
|
21
|
+
case 'running': return { mark: frame, tone: 'warning' };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function subagentTasks(checklist) {
|
|
25
|
+
return checklist && checklist.total > 0 ? `${checklist.done} of ${checklist.total} tasks` : null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The compact live roster shown under the status line: active children first, at most three
|
|
29
|
+
* rows. The session name is cut first when the terminal is narrow.
|
|
30
|
+
*/
|
|
31
|
+
export function subagentRoster(items, width, frame = getWorkingSpinnerFrames()[0] ?? '') {
|
|
32
|
+
if (!items.length || width < 1)
|
|
33
|
+
return null;
|
|
34
|
+
const ordered = [...items].sort((left, right) => {
|
|
35
|
+
const active = Number(ACTIVE_SUBAGENT_STATUSES.has(right.status)) - Number(ACTIVE_SUBAGENT_STATUSES.has(left.status));
|
|
36
|
+
return active || left.startedAt.localeCompare(right.startedAt) || left.id.localeCompare(right.id);
|
|
37
|
+
});
|
|
38
|
+
const rows = ordered.slice(0, MAX_VISIBLE_ROWS).map((item) => {
|
|
39
|
+
const status = mark(item.status, frame);
|
|
40
|
+
const profile = cut(safe(item.profile?.name ?? '') || 'subagent', Math.max(1, Math.min(24, width - 2)));
|
|
41
|
+
const tasks = subagentTasks(item.checklist);
|
|
42
|
+
const used = 2 + visibleWidth(profile) + GAP.length + (tasks ? GAP.length + tasks.length : 0);
|
|
43
|
+
const title = cut(safe(item.title) || 'Subagent', Math.max(1, width - used));
|
|
44
|
+
return { id: item.id, mark: status.mark, tone: status.tone, profile, color: item.profile?.color ?? null, title, tasks };
|
|
45
|
+
});
|
|
46
|
+
const overflow = ordered.length - rows.length;
|
|
47
|
+
return { rows, overflow: overflow > 0 ? cut(`+${overflow} more · /subagents`, width) : null };
|
|
48
|
+
}
|
|
49
|
+
/** A row as plain text, the way it reads on screen. */
|
|
50
|
+
export function subagentRowText(row) {
|
|
51
|
+
return [`${row.mark} ${row.profile}`, row.title, row.tasks].filter(Boolean).join(GAP);
|
|
52
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AgentSession, ExtensionAPI } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
export interface TerminalPlanRunState {
|
|
3
|
+
active: boolean;
|
|
4
|
+
allowedTools: ReadonlySet<string>;
|
|
5
|
+
}
|
|
6
|
+
export default function (pi: ExtensionAPI, planRun?: TerminalPlanRunState, getSession?: () => AgentSession): Promise<void>;
|