@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,186 @@
|
|
|
1
|
+
import { constants, closeSync, fstatSync, lstatSync, openSync, readFileSync, readdirSync, realpathSync } from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
4
|
+
import { invalid } from "../core/errors.js";
|
|
5
|
+
import { connectionInputSchema } from "../mcp/types.js";
|
|
6
|
+
import * as library from "../variant/components.js";
|
|
7
|
+
import { PI_SURFACE, componentOf } from "../variant/surface.js";
|
|
8
|
+
import { headVariant } from "../variant/store.js";
|
|
9
|
+
const MAX_CONTENT = 256 * 1024;
|
|
10
|
+
export function isWithinBoundary(boundary, file, pathApi = path) {
|
|
11
|
+
const within = pathApi.relative(boundary, file);
|
|
12
|
+
return within !== '..' && !within.startsWith(`..${pathApi.sep}`) && !pathApi.isAbsolute(within);
|
|
13
|
+
}
|
|
14
|
+
function readText(path) {
|
|
15
|
+
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
16
|
+
try {
|
|
17
|
+
const stat = fstatSync(fd);
|
|
18
|
+
if (!stat.isFile() || stat.size > MAX_CONTENT)
|
|
19
|
+
throw invalid('Preview requires a regular text file smaller than 256 KiB.');
|
|
20
|
+
return readFileSync(fd, 'utf8');
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
closeSync(fd);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Only the protected terminal control route calls this adapter. It never loads discovered code. */
|
|
27
|
+
export class BrowserControl {
|
|
28
|
+
options;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.options = options;
|
|
31
|
+
}
|
|
32
|
+
async snapshot(refresh = false) {
|
|
33
|
+
const { root, pinned, apps } = this.options;
|
|
34
|
+
const plugins = await this.options.plugins();
|
|
35
|
+
const scope = pinned?.scope ?? null;
|
|
36
|
+
const latest = scope ? headVariant(root, scope) : null;
|
|
37
|
+
const items = [];
|
|
38
|
+
const add = (item) => items.push(item);
|
|
39
|
+
for (const [id, name, description] of [
|
|
40
|
+
['runtime', 'Runtime and recording', 'The foundation runs sessions and records their events. Changes require a release.'],
|
|
41
|
+
['prompt', 'Prompt compiler', 'Assembles the stable prompt and context updates. Variant c1–c4 supply configurable instructions.'],
|
|
42
|
+
['loader', 'Resource loader', 'Selects plugins and their contributions. Discovered code waits for exact-code trust.'],
|
|
43
|
+
['gate', 'Tool approval gate', 'Checks capabilities, policy and approvals for every tool call. Availability never grants authorization.'],
|
|
44
|
+
['accounts', 'Accounts and secrets', 'Keeps account identities isolated and credentials in the secret store.'],
|
|
45
|
+
['surface', 'Variant surface', 'Defines c1–c8, validation and immutable versions. Only a validated variant version may change.']
|
|
46
|
+
])
|
|
47
|
+
add({ id: `foundation:${id}`, section: 'foundation', name: name, description: description, owner: 'Foundation', origin: 'Built-in', status: 'Read-only' });
|
|
48
|
+
for (const plugin of plugins) {
|
|
49
|
+
add({ id: `plugin:${plugin.id}`, section: 'plugins', name: plugin.title, description: plugin.description,
|
|
50
|
+
owner: plugin.title, origin: plugin.source, status: plugin.required ? 'Required' : plugin.trust === 'untrusted' ? 'Needs trust' : 'Saved configuration',
|
|
51
|
+
pluginId: plugin.id, path: plugin.path ?? undefined, required: plugin.required });
|
|
52
|
+
for (const entry of plugin.contributions) {
|
|
53
|
+
if (!['skill', 'tool', 'command', 'instruction'].includes(entry.kind))
|
|
54
|
+
continue;
|
|
55
|
+
if ((entry.kind === 'command' || entry.kind === 'instruction') && !entry.path)
|
|
56
|
+
continue;
|
|
57
|
+
const section = entry.kind === 'skill' ? 'skills' : entry.kind === 'tool' ? 'tools' : 'library';
|
|
58
|
+
add({ id: `contribution:${entry.id}`, section, name: entry.name, description: entry.description,
|
|
59
|
+
owner: plugin.title, origin: plugin.source, pluginId: plugin.id, contributionId: entry.id,
|
|
60
|
+
path: entry.path ?? undefined, scope: entry.scope, status: entry.state === 'off' ? 'Disabled' : entry.state === 'untrusted' ? 'Needs trust' : 'Enabled for future sessions',
|
|
61
|
+
read: Boolean(entry.path && ['skill', 'command', 'instruction'].includes(entry.kind)) });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const item of library.list(root)) {
|
|
65
|
+
const added = Boolean(latest && library.isInVariant(root, latest.variant, item.id));
|
|
66
|
+
const existing = items.find(existing => existing.path === item.path);
|
|
67
|
+
if (existing) {
|
|
68
|
+
existing.componentId = item.id;
|
|
69
|
+
existing.added = added;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
add({ id: `library:${item.id}`, section: item.kind === 'skills' ? 'skills' : 'library', name: item.name,
|
|
73
|
+
description: item.description, owner: 'Reusable library', origin: item.builtin ? 'Built-in library' : 'Local library', path: item.path,
|
|
74
|
+
componentId: item.id, added, status: added ? 'Saved in latest variant' : 'Library only', read: true });
|
|
75
|
+
}
|
|
76
|
+
const paths = new Set([...Object.keys(pinned?.files ?? {}), ...Object.keys(latest?.variant ?? {})]);
|
|
77
|
+
for (const path of [...paths].sort()) {
|
|
78
|
+
const component = PI_SURFACE.components.find(entry => entry.id === componentOf(PI_SURFACE, path));
|
|
79
|
+
if (!component)
|
|
80
|
+
continue;
|
|
81
|
+
const current = pinned?.files[path];
|
|
82
|
+
const future = latest?.variant[path];
|
|
83
|
+
const status = !latest || current === future ? 'Pinned version' : current === undefined ? 'Added in latest' : future === undefined ? 'Removed in latest' : 'Changed in latest';
|
|
84
|
+
add({ id: `variant:${path}`, section: 'variant', name: path, description: `c${component.index} · ${component.title}: ${component.description}`,
|
|
85
|
+
owner: 'Variant', origin: 'Variant', status, read: true });
|
|
86
|
+
if (/^skills\/[^/]+\/SKILL\.md$/.test(path) && current !== undefined) {
|
|
87
|
+
const name = path.split('/')[1];
|
|
88
|
+
const fullPath = join(pinned.dir, path);
|
|
89
|
+
if (!items.some(item => item.section === 'skills' && item.path === fullPath))
|
|
90
|
+
add({ id: `variant-skill:${path}`, section: 'skills', name,
|
|
91
|
+
description: /^description:\s*(.+)$/m.exec(current)?.[1] ?? '', owner: 'Variant', origin: 'Variant', status: 'Prepared for this session',
|
|
92
|
+
path: fullPath, read: true });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const connections = apps.connections.list().map(connection => ({ ...connection,
|
|
96
|
+
error: connection.error ? String(apps.connections.scrub(connection.error, connection.id)) : null,
|
|
97
|
+
tools: apps.connections.scrub(connection.tools, connection.id) }));
|
|
98
|
+
for (const connection of connections)
|
|
99
|
+
add({ id: `connection:${connection.id}`, section: 'connections', name: connection.name || connection.id,
|
|
100
|
+
description: `${connection.kind === 'remote' ? 'Remote HTTP' : 'Local stdio'} MCP · ${connection.tools.length} tools${connection.checkedAt ? ` · last checked ${connection.checkedAt}` : ' · never tested'}`,
|
|
101
|
+
owner: 'Connected apps', origin: connection.kind === 'remote' ? 'Remote' : 'Local', connectionId: connection.id,
|
|
102
|
+
scope: connection.global ? 'Everywhere' : connection.projectIds.join(', ') || 'No project scope',
|
|
103
|
+
status: !connection.enabled ? 'Disabled' : connection.auth === 'oauth' && connection.authState !== 'signed_in' ? 'Sign in required' : connection.error ? 'Last check failed' : connection.checkedAt ? 'Last check passed' : 'Not tested' });
|
|
104
|
+
return { items, plugins, connections, variant: { scope, pinned: pinned?.fingerprint ?? null, latest: latest?.fingerprint ?? null,
|
|
105
|
+
writable: this.options.writable && Boolean(scope && latest) }, hub: this.options.hub ? await this.options.hub.list(refresh) : null };
|
|
106
|
+
}
|
|
107
|
+
async read(id, latestVersion = false) {
|
|
108
|
+
const { root, pinned } = this.options;
|
|
109
|
+
const snapshot = await this.snapshot();
|
|
110
|
+
const item = snapshot.items.find(entry => entry.id === id);
|
|
111
|
+
if (!item?.read)
|
|
112
|
+
throw invalid('This resource has no inspectable content.');
|
|
113
|
+
if (id.startsWith('variant:') || id.startsWith('variant-skill:')) {
|
|
114
|
+
const path = id.slice(id.indexOf(':') + 1);
|
|
115
|
+
const files = latestVersion && pinned?.scope ? headVariant(root, pinned.scope)?.variant : pinned?.files;
|
|
116
|
+
const content = files?.[path] ?? '(File absent in this version.)';
|
|
117
|
+
return { content: content.length > MAX_CONTENT ? content.slice(0, MAX_CONTENT) + '\n[Preview truncated.]' : content };
|
|
118
|
+
}
|
|
119
|
+
if (!item.path)
|
|
120
|
+
throw invalid('This resource has no file.');
|
|
121
|
+
const plugin = snapshot.plugins.find(plugin => plugin.id === item.pluginId);
|
|
122
|
+
const registryItem = item.componentId ? library.list(root).find(entry => entry.id === item.componentId) : undefined;
|
|
123
|
+
const boundary = realpathSync(registryItem && !registryItem.builtin ? join(root, 'registry') : plugin?.path ?? dirname(item.path));
|
|
124
|
+
const file = realpathSync(item.path);
|
|
125
|
+
if (!isWithinBoundary(boundary, file))
|
|
126
|
+
throw invalid('Resource is outside its owner folder.');
|
|
127
|
+
return { content: readText(file) };
|
|
128
|
+
}
|
|
129
|
+
importSkill(input) {
|
|
130
|
+
const start = resolve(this.options.cwd, input);
|
|
131
|
+
const folder = lstatSync(start).isDirectory() ? start : dirname(start);
|
|
132
|
+
if (start !== folder && basename(start) !== 'SKILL.md')
|
|
133
|
+
throw invalid('Choose a skill folder or its SKILL.md.');
|
|
134
|
+
const files = [];
|
|
135
|
+
let bytes = 0;
|
|
136
|
+
let directories = 0;
|
|
137
|
+
const visit = (directory, depth = 0) => {
|
|
138
|
+
if (++directories > 100 || depth > 16)
|
|
139
|
+
throw invalid('Skill import exceeds its directory limit.');
|
|
140
|
+
for (const name of readdirSync(directory)) {
|
|
141
|
+
if (name.startsWith('.'))
|
|
142
|
+
continue;
|
|
143
|
+
const path = join(directory, name);
|
|
144
|
+
const stat = lstatSync(path);
|
|
145
|
+
if (stat.isSymbolicLink())
|
|
146
|
+
throw invalid('Skill imports cannot contain symbolic links.');
|
|
147
|
+
if (stat.isDirectory()) {
|
|
148
|
+
visit(path, depth + 1);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (!stat.isFile() || files.length >= 100 || stat.size > 10 * 1024 * 1024)
|
|
152
|
+
throw invalid('Skill import exceeds its file limit.');
|
|
153
|
+
bytes += stat.size;
|
|
154
|
+
if (bytes > 10 * 1024 * 1024)
|
|
155
|
+
throw invalid('Skill import exceeds 10 MiB.');
|
|
156
|
+
files.push({ path: relative(folder, path), content: readFileSync(path).toString('base64'), encoding: 'base64' });
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
if (lstatSync(folder).isSymbolicLink())
|
|
160
|
+
throw invalid('Choose a regular skill folder.');
|
|
161
|
+
visit(folder);
|
|
162
|
+
library.importItems(this.options.root, 'skills', [{ name: basename(folder), files }]);
|
|
163
|
+
}
|
|
164
|
+
async connection(action, params) {
|
|
165
|
+
const apps = this.options.apps;
|
|
166
|
+
if (action === 'appClients')
|
|
167
|
+
return apps.appClients();
|
|
168
|
+
if (action === 'save')
|
|
169
|
+
return apps.save(connectionInputSchema.parse(params.input));
|
|
170
|
+
const id = typeof params.id === 'string' ? params.id : '';
|
|
171
|
+
if (!apps.connections.list().some(connection => connection.id === id))
|
|
172
|
+
throw invalid('Unknown connection.');
|
|
173
|
+
if (action === 'test') {
|
|
174
|
+
const result = await apps.test(id);
|
|
175
|
+
return { ...result, error: result.error ? String(apps.connections.scrub(result.error, id)) : null,
|
|
176
|
+
tools: apps.connections.scrub(result.tools, id) };
|
|
177
|
+
}
|
|
178
|
+
if (action === 'signIn')
|
|
179
|
+
return apps.signIn(id);
|
|
180
|
+
if (action === 'signOut')
|
|
181
|
+
return apps.signOut(id);
|
|
182
|
+
if (action === 'remove')
|
|
183
|
+
return apps.remove(id);
|
|
184
|
+
throw invalid('Unknown connection action.');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HarnessCall } from "../tools/definitions.js";
|
|
2
|
+
export declare const WIKI_COMMAND = "xagent-wiki";
|
|
3
|
+
export declare const APPS_COMMAND = "xagent-mcp";
|
|
4
|
+
export declare const USAGE = "Usage: xagent-wiki <command> [arguments]\n\n search <query> [--project SLUG] Search the Wiki's project notes\n read <path> Read one note, e.g. projects/<slug>/decisions\n list [project slug | library] List notes\n write <path> <text | -> Save a note (when this session may write the Wiki)\n skill [name] Load one of your skills, or list them\n history <query> [--scope all] [--since YYYY-MM-DD]\n Search earlier conversations and runs (also: recall)\n history-read <run id> Read one earlier run (also: recall-read)\n";
|
|
5
|
+
export declare const APPS_USAGE = "Usage: xagent-mcp <command>\n\n list The app and connected-app tools this session may use\n call <tool-name> '<JSON arguments>'\n Use one of them\n";
|
|
6
|
+
export type CliCommand = {
|
|
7
|
+
kind: 'call';
|
|
8
|
+
call: HarnessCall;
|
|
9
|
+
params: Record<string, unknown>;
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'help';
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'stdin-write';
|
|
14
|
+
path: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function parseCli(argv: string[]): CliCommand;
|
|
17
|
+
/** Runs `xagent-wiki <argv>`; returns the exit code. */
|
|
18
|
+
export declare function runWikiCli(argv: string[]): Promise<number>;
|
|
19
|
+
/** Runs `xagent-mcp <argv>`; returns the exit code. */
|
|
20
|
+
export declare function runAppsCli(argv: string[]): Promise<number>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { connectionFromEnv, socketCall } from "./client.js";
|
|
2
|
+
export const WIKI_COMMAND = 'xagent-wiki';
|
|
3
|
+
export const APPS_COMMAND = 'xagent-mcp';
|
|
4
|
+
export const USAGE = `Usage: ${WIKI_COMMAND} <command> [arguments]
|
|
5
|
+
|
|
6
|
+
search <query> [--project SLUG] Search the Wiki's project notes
|
|
7
|
+
read <path> Read one note, e.g. projects/<slug>/decisions
|
|
8
|
+
list [project slug | library] List notes
|
|
9
|
+
write <path> <text | -> Save a note (when this session may write the Wiki)
|
|
10
|
+
skill [name] Load one of your skills, or list them
|
|
11
|
+
history <query> [--scope all] [--since YYYY-MM-DD]
|
|
12
|
+
Search earlier conversations and runs (also: recall)
|
|
13
|
+
history-read <run id> Read one earlier run (also: recall-read)
|
|
14
|
+
`;
|
|
15
|
+
export const APPS_USAGE = `Usage: ${APPS_COMMAND} <command>
|
|
16
|
+
|
|
17
|
+
list The app and connected-app tools this session may use
|
|
18
|
+
call <tool-name> '<JSON arguments>'
|
|
19
|
+
Use one of them
|
|
20
|
+
`;
|
|
21
|
+
function options(args) {
|
|
22
|
+
const positional = [];
|
|
23
|
+
const flags = {};
|
|
24
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
25
|
+
const arg = args[index];
|
|
26
|
+
if (arg.startsWith('--') && index + 1 < args.length) {
|
|
27
|
+
flags[arg.slice(2)] = args[index + 1];
|
|
28
|
+
index += 1;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
positional.push(arg);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { positional, flags };
|
|
35
|
+
}
|
|
36
|
+
export function parseCli(argv) {
|
|
37
|
+
const [command, ...rest] = argv;
|
|
38
|
+
const { positional, flags } = options(rest);
|
|
39
|
+
const joined = positional.join(' ').trim();
|
|
40
|
+
switch (command) {
|
|
41
|
+
case 'search':
|
|
42
|
+
if (!joined)
|
|
43
|
+
return { kind: 'help' };
|
|
44
|
+
return { kind: 'call', call: 'wiki.search', params: { query: joined, ...(flags.project ? { project: flags.project } : {}) } };
|
|
45
|
+
case 'read':
|
|
46
|
+
if (!joined)
|
|
47
|
+
return { kind: 'help' };
|
|
48
|
+
return { kind: 'call', call: 'wiki.read', params: { path: joined } };
|
|
49
|
+
case 'list':
|
|
50
|
+
return { kind: 'call', call: 'wiki.list', params: joined ? { project: joined } : {} };
|
|
51
|
+
case 'write': {
|
|
52
|
+
const [path, ...words] = positional;
|
|
53
|
+
if (!path)
|
|
54
|
+
return { kind: 'help' };
|
|
55
|
+
if (words.join(' ').trim() === '-')
|
|
56
|
+
return { kind: 'stdin-write', path };
|
|
57
|
+
if (!words.length)
|
|
58
|
+
return { kind: 'help' };
|
|
59
|
+
return { kind: 'call', call: 'wiki.write', params: { path, text: words.join(' ') } };
|
|
60
|
+
}
|
|
61
|
+
case 'skill':
|
|
62
|
+
return { kind: 'call', call: 'skill.load', params: joined ? { name: joined } : {} };
|
|
63
|
+
case 'history':
|
|
64
|
+
case 'recall':
|
|
65
|
+
if (!joined)
|
|
66
|
+
return { kind: 'help' };
|
|
67
|
+
return { kind: 'call', call: 'recall.search', params: { query: joined, ...(flags.scope ? { scope: flags.scope } : {}), ...(flags.since ? { since: flags.since } : {}) } };
|
|
68
|
+
case 'history-read':
|
|
69
|
+
case 'recall-read':
|
|
70
|
+
if (!joined)
|
|
71
|
+
return { kind: 'help' };
|
|
72
|
+
return { kind: 'call', call: 'recall.read', params: { run: joined } };
|
|
73
|
+
default:
|
|
74
|
+
return { kind: 'help' };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function readStdin() {
|
|
78
|
+
let text = '';
|
|
79
|
+
for await (const chunk of process.stdin)
|
|
80
|
+
text += chunk.toString();
|
|
81
|
+
return text;
|
|
82
|
+
}
|
|
83
|
+
const errorText = (error) => (error instanceof Error ? error.message : String(error));
|
|
84
|
+
/** Runs `xagent-wiki <argv>`; returns the exit code. */
|
|
85
|
+
export async function runWikiCli(argv) {
|
|
86
|
+
const command = parseCli(argv);
|
|
87
|
+
if (command.kind === 'help') {
|
|
88
|
+
process.stdout.write(USAGE);
|
|
89
|
+
return argv.length ? 2 : 0;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const connection = connectionFromEnv();
|
|
93
|
+
const result = command.kind === 'stdin-write'
|
|
94
|
+
? await socketCall(connection, 'wiki.write', { path: command.path, text: await readStdin() })
|
|
95
|
+
: await socketCall(connection, command.call, command.params);
|
|
96
|
+
process.stdout.write(`${typeof result === 'string' ? result : JSON.stringify(result)}\n`);
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
process.stderr.write(`${errorText(error)}\n`);
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Runs `xagent-mcp <argv>`; returns the exit code. */
|
|
105
|
+
export async function runAppsCli(argv) {
|
|
106
|
+
const [command, name, args] = argv;
|
|
107
|
+
if (command !== 'list' && !(command === 'call' && name)) {
|
|
108
|
+
process.stdout.write(APPS_USAGE);
|
|
109
|
+
return argv.length ? 2 : 0;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const connection = connectionFromEnv();
|
|
113
|
+
const result = command === 'list' ? await socketCall(connection, 'mcp.list', {}, 90_000) : await socketCall(connection, 'mcp.call', { name, args: JSON.parse(args ?? '{}') }, 1_230_000);
|
|
114
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
process.stderr.write(`${errorText(error)}\n`);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const SOCKET_ENV = "XINGULAR_HARNESS_SOCKET";
|
|
2
|
+
export declare const TOKEN_ENV = "XINGULAR_HARNESS_TOKEN";
|
|
3
|
+
export declare class SocketError extends Error {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
constructor(code: string, message: string);
|
|
6
|
+
}
|
|
7
|
+
export interface SocketConnection {
|
|
8
|
+
socket: string;
|
|
9
|
+
token: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function connectionFromEnv(env?: NodeJS.ProcessEnv): SocketConnection;
|
|
12
|
+
/** A memory, Wiki, recall, or connected-app call made on behalf of the session that owns the token. */
|
|
13
|
+
export declare function socketCall<T = unknown>(connection: SocketConnection, call: string, params?: Record<string, unknown>, timeoutMs?: number, control?: string): Promise<T>;
|
|
14
|
+
/** Telemetry and decisions from the native `pi` process. Approvals may wait on a person, so the default wait is long. */
|
|
15
|
+
export declare function terminalCall<T = Record<string, unknown>>(event: string, data?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// How a process outside the harness (the `pi` command's extension, the `xagent-wiki` and
|
|
2
|
+
// `xagent-mcp` commands) reaches it: newline-delimited JSON requests and replies on the session
|
|
3
|
+
// socket, authorized by the token the harness put in its environment. A reply leaves its connection
|
|
4
|
+
// open for the next request, so the terminal's frequent small calls do not each open a socket.
|
|
5
|
+
import { createConnection } from 'node:net';
|
|
6
|
+
export const SOCKET_ENV = 'XINGULAR_HARNESS_SOCKET';
|
|
7
|
+
export const TOKEN_ENV = 'XINGULAR_HARNESS_TOKEN';
|
|
8
|
+
export class SocketError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(code, message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function connectionFromEnv(env = process.env) {
|
|
16
|
+
const socket = env[SOCKET_ENV];
|
|
17
|
+
const token = env[TOKEN_ENV];
|
|
18
|
+
if (!socket || !token)
|
|
19
|
+
throw new SocketError('not_configured', `This command only works inside a terminal session the harness started (${SOCKET_ENV} and ${TOKEN_ENV} are not set).`);
|
|
20
|
+
return { socket, token };
|
|
21
|
+
}
|
|
22
|
+
const MAX_IDLE_PER_SOCKET = 4;
|
|
23
|
+
/** Open connections waiting for their next request, per socket path. Idle ones never keep a process alive. */
|
|
24
|
+
const idle = new Map();
|
|
25
|
+
function takeIdle(path) {
|
|
26
|
+
const entries = idle.get(path);
|
|
27
|
+
const entry = entries?.values().next().value;
|
|
28
|
+
if (!entries || !entry)
|
|
29
|
+
return undefined;
|
|
30
|
+
entries.delete(entry);
|
|
31
|
+
entry.stream.off('close', entry.drop);
|
|
32
|
+
entry.stream.off('error', entry.drop);
|
|
33
|
+
entry.stream.ref();
|
|
34
|
+
return entry.stream;
|
|
35
|
+
}
|
|
36
|
+
function putIdle(path, stream) {
|
|
37
|
+
const entries = idle.get(path) ?? new Set();
|
|
38
|
+
if (stream.destroyed || entries.size >= MAX_IDLE_PER_SOCKET) {
|
|
39
|
+
stream.end();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const entry = { stream, drop: () => { entries.delete(entry); stream.destroy(); } };
|
|
43
|
+
stream.once('close', entry.drop);
|
|
44
|
+
stream.on('error', entry.drop);
|
|
45
|
+
stream.unref();
|
|
46
|
+
entries.add(entry);
|
|
47
|
+
idle.set(path, entries);
|
|
48
|
+
}
|
|
49
|
+
function request(connection, body, what, timeoutMs) {
|
|
50
|
+
const reused = takeIdle(connection.socket);
|
|
51
|
+
return attempt(connection, body, what, timeoutMs, reused).catch((error) => {
|
|
52
|
+
// An idle connection the harness had already closed fails before any reply; one fresh retry.
|
|
53
|
+
if (reused && error instanceof StaleConnection)
|
|
54
|
+
return attempt(connection, body, what, timeoutMs, undefined);
|
|
55
|
+
throw error;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
class StaleConnection extends Error {
|
|
59
|
+
}
|
|
60
|
+
function attempt(connection, body, what, timeoutMs, reused) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
const stream = reused ?? createConnection(connection.socket);
|
|
63
|
+
let buffer = '';
|
|
64
|
+
let replied = false;
|
|
65
|
+
let settled = false;
|
|
66
|
+
const send = () => stream.write(`${JSON.stringify({ token: connection.token, ...body, keep: true })}\n`);
|
|
67
|
+
const onData = (chunk) => {
|
|
68
|
+
replied = true;
|
|
69
|
+
buffer += chunk.toString('utf8');
|
|
70
|
+
const newline = buffer.indexOf('\n');
|
|
71
|
+
if (newline < 0)
|
|
72
|
+
return;
|
|
73
|
+
const rest = buffer.slice(newline + 1);
|
|
74
|
+
try {
|
|
75
|
+
const reply = JSON.parse(buffer.slice(0, newline));
|
|
76
|
+
if (reply.error) {
|
|
77
|
+
const error = typeof reply.error === 'string' ? { message: reply.error } : reply.error;
|
|
78
|
+
finish(() => reject(new SocketError(error.code ?? 'error', error.message ?? `${what} failed.`)), !rest);
|
|
79
|
+
}
|
|
80
|
+
else
|
|
81
|
+
finish(() => resolve(reply.result), !rest);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
finish(() => reject(new SocketError('invalid_reply', 'The harness sent an unreadable reply.')));
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const onError = (error) => finish(() => reject(reused && !replied ? new StaleConnection(error.message) : new SocketError('unavailable', `The harness is not reachable: ${error.message}.`)));
|
|
88
|
+
const onClose = () => finish(() => reject(reused && !replied ? new StaleConnection('closed') : new SocketError('unavailable', 'The harness closed the connection.')));
|
|
89
|
+
const finish = (action, keep = false) => {
|
|
90
|
+
if (settled)
|
|
91
|
+
return;
|
|
92
|
+
settled = true;
|
|
93
|
+
clearTimeout(timer);
|
|
94
|
+
stream.off('connect', send);
|
|
95
|
+
stream.off('data', onData);
|
|
96
|
+
stream.off('error', onError);
|
|
97
|
+
stream.off('close', onClose);
|
|
98
|
+
if (keep)
|
|
99
|
+
putIdle(connection.socket, stream);
|
|
100
|
+
else {
|
|
101
|
+
stream.on('error', () => { });
|
|
102
|
+
stream.end();
|
|
103
|
+
}
|
|
104
|
+
action();
|
|
105
|
+
};
|
|
106
|
+
const timer = setTimeout(() => {
|
|
107
|
+
stream.destroy();
|
|
108
|
+
finish(() => reject(new SocketError('timeout', `The harness did not answer ${what}.`)));
|
|
109
|
+
}, timeoutMs);
|
|
110
|
+
stream.on('data', onData);
|
|
111
|
+
stream.on('error', onError);
|
|
112
|
+
stream.on('close', onClose);
|
|
113
|
+
if (reused)
|
|
114
|
+
send();
|
|
115
|
+
else
|
|
116
|
+
stream.on('connect', send);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** A memory, Wiki, recall, or connected-app call made on behalf of the session that owns the token. */
|
|
120
|
+
export function socketCall(connection, call, params = {}, timeoutMs = 120_000, control) {
|
|
121
|
+
return request(connection, { call, params, ...(control ? { control } : {}) }, call, timeoutMs);
|
|
122
|
+
}
|
|
123
|
+
/** Telemetry and decisions from the native `pi` process. Approvals may wait on a person, so the default wait is long. */
|
|
124
|
+
export function terminalCall(event, data = {}, timeoutMs = 600_000) {
|
|
125
|
+
return request(connectionFromEnv(), { event, data }, event, timeoutMs);
|
|
126
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface TerminalCommandCompletion {
|
|
2
|
+
name: string;
|
|
3
|
+
aliases?: string[];
|
|
4
|
+
description?: string;
|
|
5
|
+
group: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TerminalCommandHelpEntry {
|
|
8
|
+
name: string;
|
|
9
|
+
aliases?: string[];
|
|
10
|
+
description?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function formatTerminalCommandLabel(name: string, aliases?: readonly string[]): string;
|
|
13
|
+
export interface TerminalCommandHelpGroup {
|
|
14
|
+
name: string;
|
|
15
|
+
commands: TerminalCommandHelpEntry[];
|
|
16
|
+
}
|
|
17
|
+
export declare function groupTerminalCommands(commands: readonly TerminalCommandCompletion[]): TerminalCommandHelpGroup[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function formatTerminalCommandLabel(name, aliases) {
|
|
2
|
+
return aliases?.length ? `${name} (${aliases.join(', ')})` : name;
|
|
3
|
+
}
|
|
4
|
+
const GROUP_ORDER = ['Core', 'Run', 'Model', 'Session', 'Inspect', 'Harness', 'Plugins', 'Extensions', 'Prompts'];
|
|
5
|
+
export function groupTerminalCommands(commands) {
|
|
6
|
+
const groups = new Map();
|
|
7
|
+
for (const command of commands) {
|
|
8
|
+
const group = groups.get(command.group) ?? [];
|
|
9
|
+
group.push({
|
|
10
|
+
name: command.name,
|
|
11
|
+
...(command.aliases?.length ? { aliases: command.aliases } : {}),
|
|
12
|
+
description: command.description
|
|
13
|
+
});
|
|
14
|
+
groups.set(command.group, group);
|
|
15
|
+
}
|
|
16
|
+
const order = new Map(GROUP_ORDER.map((name, index) => [name, index]));
|
|
17
|
+
return [...groups]
|
|
18
|
+
.sort(([left], [right]) => (order.get(left) ?? GROUP_ORDER.length) - (order.get(right) ?? GROUP_ORDER.length))
|
|
19
|
+
.map(([name, entries]) => ({ name, commands: entries }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type SocketConnection } from "./client.js";
|
|
2
|
+
/** A process owns the claim across native session replacement; it never enters the environment. */
|
|
3
|
+
export declare function claimTerminalControl(connection?: SocketConnection): Promise<string>;
|
|
4
|
+
export declare function controlCall<T = unknown>(call: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { connectionFromEnv, socketCall } from "./client.js";
|
|
2
|
+
const claims = new Map();
|
|
3
|
+
/** A process owns the claim across native session replacement; it never enters the environment. */
|
|
4
|
+
export function claimTerminalControl(connection = connectionFromEnv()) {
|
|
5
|
+
const identity = JSON.stringify([connection.socket, connection.token]);
|
|
6
|
+
let claim = claims.get(identity);
|
|
7
|
+
if (!claim) {
|
|
8
|
+
claim = socketCall(connection, 'control.claim', {}, 15_000).then(({ key }) => {
|
|
9
|
+
if (!key)
|
|
10
|
+
throw new Error('The terminal controller returned no control key.');
|
|
11
|
+
return key;
|
|
12
|
+
}).catch((error) => {
|
|
13
|
+
// A failed claim is retried by the next call; only a claim that succeeded is kept.
|
|
14
|
+
claims.delete(identity);
|
|
15
|
+
throw error;
|
|
16
|
+
});
|
|
17
|
+
claims.set(identity, claim);
|
|
18
|
+
}
|
|
19
|
+
return claim;
|
|
20
|
+
}
|
|
21
|
+
export async function controlCall(call, params = {}, timeoutMs = 120_000) {
|
|
22
|
+
const connection = connectionFromEnv();
|
|
23
|
+
const control = await claimTerminalControl(connection);
|
|
24
|
+
return socketCall(connection, call, params, timeoutMs, control);
|
|
25
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type RunEvent, type RunRecord } from "../sessions/contracts.js";
|
|
2
|
+
import type { ActiveRun, ApprovalDecision, QuestionAnswer } from "../sessions/registry.js";
|
|
3
|
+
import { type TerminalSubagentActivity, type TerminalSubagentProfile } from "./subagentMonitor.js";
|
|
4
|
+
export interface PolicyReply {
|
|
5
|
+
allowed: boolean;
|
|
6
|
+
reason?: string | null;
|
|
7
|
+
requiresApproval?: boolean;
|
|
8
|
+
rememberable?: boolean;
|
|
9
|
+
standing?: 'full' | 'switch' | 'none';
|
|
10
|
+
}
|
|
11
|
+
export interface ControllerHooks {
|
|
12
|
+
sessionId: string;
|
|
13
|
+
nativeSessionId: string | null;
|
|
14
|
+
/** Reserves or creates the run for a native turn and starts tracking it. */
|
|
15
|
+
begin(input: {
|
|
16
|
+
reservedRunId: string | null;
|
|
17
|
+
nativeTurnId: string;
|
|
18
|
+
text: string;
|
|
19
|
+
}): ActiveRun;
|
|
20
|
+
/** Whether a native tool call may run. */
|
|
21
|
+
policy(run: ActiveRun, tool: string, args: unknown): Promise<PolicyReply>;
|
|
22
|
+
/** Saves a user-selected tool grant in the shared local approval store. */
|
|
23
|
+
allowToolGlobally(target: string): void;
|
|
24
|
+
/** The native conversation identity changed. */
|
|
25
|
+
native(nativeSessionId: string): void;
|
|
26
|
+
telemetry(event: string): void;
|
|
27
|
+
interrupt?(runId: string): Promise<void>;
|
|
28
|
+
resolveApproval?(runId: string, requestId: string, decision: ApprovalDecision): void;
|
|
29
|
+
answerQuestion?(runId: string, requestId: string, answer: QuestionAnswer): void;
|
|
30
|
+
answerQuestions?(runId: string, batchId: string, answers: Array<{
|
|
31
|
+
questionId: string;
|
|
32
|
+
answer: QuestionAnswer;
|
|
33
|
+
}>): void;
|
|
34
|
+
}
|
|
35
|
+
export declare class TerminalController {
|
|
36
|
+
private readonly hooks;
|
|
37
|
+
private run;
|
|
38
|
+
private readonly pending;
|
|
39
|
+
private readonly subagents;
|
|
40
|
+
private ready;
|
|
41
|
+
private disposed;
|
|
42
|
+
private dirty;
|
|
43
|
+
private multilineDraft;
|
|
44
|
+
private startupError;
|
|
45
|
+
private startupPhase;
|
|
46
|
+
private delivery;
|
|
47
|
+
private nativeId;
|
|
48
|
+
private readonly seen;
|
|
49
|
+
private readonly commands;
|
|
50
|
+
constructor(hooks: ControllerHooks);
|
|
51
|
+
get nativeSessionId(): string | null;
|
|
52
|
+
get activeRun(): ActiveRun | null;
|
|
53
|
+
state(): {
|
|
54
|
+
ready: boolean;
|
|
55
|
+
dirty: boolean;
|
|
56
|
+
active: boolean;
|
|
57
|
+
};
|
|
58
|
+
private requestId;
|
|
59
|
+
private begin;
|
|
60
|
+
private finish;
|
|
61
|
+
/** Hands the native process an instruction and waits until it acknowledges the prompt. */
|
|
62
|
+
send(runId: string, text: string): Promise<void>;
|
|
63
|
+
/** What the person typed into the terminal, so an instruction is never sent over their draft. */
|
|
64
|
+
onInput(data: string): void;
|
|
65
|
+
/** The native process hung up while it was waiting for a decision. */
|
|
66
|
+
disconnected(): void;
|
|
67
|
+
/** Project registry-owned questions, including grouped requests, into the terminal inbox. */
|
|
68
|
+
observe(event: RunEvent, descendant?: boolean): void;
|
|
69
|
+
/** A child event that belongs to the active terminal parent run. */
|
|
70
|
+
observeSubagent(parentRunId: string, run: RunRecord, event: RunEvent, profile?: TerminalSubagentProfile | null): void;
|
|
71
|
+
/** Read-only child activity for the active run. */
|
|
72
|
+
subagentSnapshot(): TerminalSubagentActivity[];
|
|
73
|
+
/** The socket grants this interface only to the process that owns terminal input. */
|
|
74
|
+
control(call: string, data: Record<string, any>): Promise<unknown>;
|
|
75
|
+
private requestNativeApproval;
|
|
76
|
+
accept(event: string, data: Record<string, any>): Promise<unknown>;
|
|
77
|
+
dispose(): void;
|
|
78
|
+
}
|