@xingular/harness 2.0.0 → 2.0.1-unstable
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +635 -0
- package/LICENSE +202 -0
- package/NOTICE.md +50 -0
- package/README.md +241 -90
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/browser-extension/README.md +32 -0
- package/browser-extension/background.js +612 -0
- package/browser-extension/manifest.json +16 -0
- package/browser-extension/overlay.js +97 -0
- package/browser-extension/popup.css +19 -0
- package/browser-extension/popup.html +30 -0
- package/browser-extension/popup.js +101 -0
- package/browser-extension/site-access.js +63 -0
- package/builtin/skills/plugin-authoring/SKILL.md +53 -0
- package/dist/cli.js +32851 -17155
- package/dist/sdk/accounts/accounts.d.ts +195 -0
- package/dist/sdk/accounts/accounts.js +821 -0
- package/dist/sdk/accounts/choices.d.ts +41 -0
- package/dist/sdk/accounts/choices.js +89 -0
- package/dist/sdk/accounts/env.d.ts +78 -0
- package/dist/sdk/accounts/env.js +294 -0
- package/dist/sdk/accounts/secrets.d.ts +28 -0
- package/dist/sdk/accounts/secrets.js +147 -0
- package/dist/sdk/accounts/store.d.ts +139 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/agents/builtin.d.ts +2 -0
- package/dist/sdk/agents/builtin.js +50 -0
- package/dist/sdk/agents/narrow.d.ts +13 -0
- package/dist/sdk/agents/narrow.js +29 -0
- package/dist/sdk/agents/planResearch.d.ts +27 -0
- package/dist/sdk/agents/planResearch.js +82 -0
- package/dist/sdk/agents/profiles.d.ts +93 -0
- package/dist/sdk/agents/profiles.js +289 -0
- package/dist/sdk/annotations/bridge.d.ts +44 -0
- package/dist/sdk/annotations/bridge.js +268 -0
- package/dist/sdk/annotations/capture.d.ts +158 -0
- package/dist/sdk/annotations/capture.js +409 -0
- package/dist/sdk/annotations/delivery.d.ts +79 -0
- package/dist/sdk/annotations/delivery.js +163 -0
- package/dist/sdk/annotations/inspect.d.ts +10 -0
- package/dist/sdk/annotations/inspect.js +34 -0
- package/dist/sdk/annotations/isolated.d.ts +6 -0
- package/dist/sdk/annotations/isolated.js +51 -0
- package/dist/sdk/annotations/pageScript.d.ts +28 -0
- package/dist/sdk/annotations/pageScript.js +871 -0
- package/dist/sdk/annotations/part.d.ts +8 -0
- package/dist/sdk/annotations/part.js +126 -0
- package/dist/sdk/annotations/queue.d.ts +4 -0
- package/dist/sdk/annotations/queue.js +45 -0
- package/dist/sdk/annotations/serverMethods.d.ts +3 -0
- package/dist/sdk/annotations/serverMethods.js +66 -0
- package/dist/sdk/annotations/store.d.ts +159 -0
- package/dist/sdk/annotations/store.js +404 -0
- package/dist/sdk/browser/backend.d.ts +16 -0
- package/dist/sdk/browser/backend.js +17 -0
- package/dist/sdk/browser/config.d.ts +19 -0
- package/dist/sdk/browser/config.js +23 -0
- package/dist/sdk/browser/contracts.d.ts +19 -0
- package/dist/sdk/browser/contracts.js +116 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/extension/bridge.d.ts +55 -0
- package/dist/sdk/browser/extension/bridge.js +336 -0
- package/dist/sdk/browser/extension/session.d.ts +50 -0
- package/dist/sdk/browser/extension/session.js +321 -0
- package/dist/sdk/browser/index.d.ts +33 -0
- package/dist/sdk/browser/index.js +105 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/serverMethods.d.ts +3 -0
- package/dist/sdk/browser/serverMethods.js +10 -0
- package/dist/sdk/browser/session.d.ts +85 -0
- package/dist/sdk/browser/session.js +228 -0
- package/dist/sdk/browser/tools.d.ts +102 -0
- package/dist/sdk/browser/tools.js +257 -0
- package/dist/sdk/capabilities/api.d.ts +22 -0
- package/dist/sdk/capabilities/api.js +54 -0
- package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
- package/dist/sdk/capabilities/runSnapshot.js +53 -0
- package/dist/sdk/capabilities/types.d.ts +29 -0
- package/dist/sdk/capabilities/types.js +1 -0
- package/dist/sdk/cli.d.ts +2 -0
- package/dist/sdk/cli.js +172 -0
- package/dist/sdk/commands/extensionOwners.d.ts +4 -0
- package/dist/sdk/commands/extensionOwners.js +17 -0
- package/dist/sdk/commands/list.d.ts +3 -0
- package/dist/sdk/commands/list.js +90 -0
- package/dist/sdk/commands/promptLoader.d.ts +5 -0
- package/dist/sdk/commands/promptLoader.js +76 -0
- package/dist/sdk/commands/promptRoutes.d.ts +13 -0
- package/dist/sdk/commands/promptRoutes.js +46 -0
- package/dist/sdk/commands/registry.d.ts +299 -0
- package/dist/sdk/commands/registry.js +54 -0
- package/dist/sdk/commands/routes.d.ts +16 -0
- package/dist/sdk/commands/routes.js +33 -0
- package/dist/sdk/commands/runtimeRouter.d.ts +4 -0
- package/dist/sdk/commands/runtimeRouter.js +48 -0
- package/dist/sdk/computer/boundary.d.ts +40 -0
- package/dist/sdk/computer/boundary.js +79 -0
- package/dist/sdk/computer/contracts.d.ts +127 -0
- package/dist/sdk/computer/contracts.js +13 -0
- package/dist/sdk/computer/control.d.ts +34 -0
- package/dist/sdk/computer/control.js +112 -0
- package/dist/sdk/computer/screenshot.d.ts +32 -0
- package/dist/sdk/computer/screenshot.js +35 -0
- package/dist/sdk/computer/terminalCapture.d.ts +26 -0
- package/dist/sdk/computer/terminalCapture.js +64 -0
- package/dist/sdk/computer/volatileImages.d.ts +9 -0
- package/dist/sdk/computer/volatileImages.js +50 -0
- package/dist/sdk/context/attribution.d.ts +18 -0
- package/dist/sdk/context/attribution.js +295 -0
- package/dist/sdk/context/runDetails.d.ts +16 -0
- package/dist/sdk/context/runDetails.js +22 -0
- package/dist/sdk/context/types.d.ts +94 -0
- package/dist/sdk/context/types.js +10 -0
- package/dist/sdk/core/bus.d.ts +23 -0
- package/dist/sdk/core/bus.js +76 -0
- package/dist/sdk/core/caller.d.ts +22 -0
- package/dist/sdk/core/caller.js +16 -0
- package/dist/sdk/core/changes.d.ts +15 -0
- package/dist/sdk/core/changes.js +15 -0
- package/dist/sdk/core/commandBudget.d.ts +23 -0
- package/dist/sdk/core/commandBudget.js +62 -0
- package/dist/sdk/core/effort.d.ts +2 -0
- package/dist/sdk/core/effort.js +1 -0
- package/dist/sdk/core/env.d.ts +18 -0
- package/dist/sdk/core/env.js +8 -0
- package/dist/sdk/core/errors.d.ts +15 -0
- package/dist/sdk/core/errors.js +24 -0
- package/dist/sdk/core/frontmatter.d.ts +12 -0
- package/dist/sdk/core/frontmatter.js +50 -0
- package/dist/sdk/core/fs.d.ts +18 -0
- package/dist/sdk/core/fs.js +106 -0
- package/dist/sdk/core/index.d.ts +24 -0
- package/dist/sdk/core/index.js +203 -0
- package/dist/sdk/core/interactiveProfile.d.ts +46 -0
- package/dist/sdk/core/interactiveProfile.js +143 -0
- package/dist/sdk/core/links.d.ts +51 -0
- package/dist/sdk/core/links.js +155 -0
- package/dist/sdk/core/path.d.ts +7 -0
- package/dist/sdk/core/path.js +79 -0
- package/dist/sdk/core/projects.d.ts +18 -0
- package/dist/sdk/core/projects.js +67 -0
- package/dist/sdk/core/secrets.d.ts +2 -0
- package/dist/sdk/core/secrets.js +5 -0
- package/dist/sdk/core/shell.d.ts +20 -0
- package/dist/sdk/core/shell.js +73 -0
- package/dist/sdk/core/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -0
- package/dist/sdk/core/workspace.d.ts +13 -0
- package/dist/sdk/core/workspace.js +88 -0
- package/dist/sdk/core/workspaceBashTool.d.ts +20 -0
- package/dist/sdk/core/workspaceBashTool.js +50 -0
- package/dist/sdk/core/workspaceSandbox.d.ts +41 -0
- package/dist/sdk/core/workspaceSandbox.js +360 -0
- package/dist/sdk/core/workspaceWriteOperations.d.ts +57 -0
- package/dist/sdk/core/workspaceWriteOperations.js +245 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +270 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +94 -0
- package/dist/sdk/doctor/serverMethods.d.ts +3 -0
- package/dist/sdk/doctor/serverMethods.js +8 -0
- package/dist/sdk/doctor/service.d.ts +23 -0
- package/dist/sdk/doctor/service.js +144 -0
- package/dist/sdk/doctor/types.d.ts +141 -0
- package/dist/sdk/doctor/types.js +29 -0
- package/dist/sdk/harness.d.ts +172 -0
- package/dist/sdk/harness.js +387 -0
- package/dist/sdk/history/lessonPrompt.d.ts +2 -0
- package/dist/sdk/history/lessonPrompt.js +15 -0
- package/dist/sdk/history/lessons.d.ts +52 -0
- package/dist/sdk/history/lessons.js +173 -0
- package/dist/sdk/history/recall.d.ts +68 -0
- package/dist/sdk/history/recall.js +199 -0
- package/dist/sdk/history/serverMethods.d.ts +3 -0
- package/dist/sdk/history/serverMethods.js +8 -0
- package/dist/sdk/history/trajectory.d.ts +7 -0
- package/dist/sdk/history/trajectory.js +218 -0
- package/dist/sdk/hub/catalog.json +123 -0
- package/dist/sdk/hub/cli.d.ts +7 -0
- package/dist/sdk/hub/cli.js +81 -0
- package/dist/sdk/hub/hub.d.ts +74 -0
- package/dist/sdk/hub/hub.js +476 -0
- package/dist/sdk/hub/schema.d.ts +280 -0
- package/dist/sdk/hub/schema.js +78 -0
- package/dist/sdk/hub/serverMethods.d.ts +3 -0
- package/dist/sdk/hub/serverMethods.js +11 -0
- package/dist/sdk/index.d.ts +80 -0
- package/dist/sdk/index.js +60 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +676 -0
- package/dist/sdk/mcp/manager.d.ts +26 -0
- package/dist/sdk/mcp/manager.js +124 -0
- package/dist/sdk/mcp/oauth.d.ts +35 -0
- package/dist/sdk/mcp/oauth.js +171 -0
- package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
- package/dist/sdk/mcp/scopeMigration.js +198 -0
- package/dist/sdk/mcp/serverMethods.d.ts +3 -0
- package/dist/sdk/mcp/serverMethods.js +22 -0
- package/dist/sdk/mcp/service.d.ts +160 -0
- package/dist/sdk/mcp/service.js +510 -0
- package/dist/sdk/mcp/types.d.ts +131 -0
- package/dist/sdk/mcp/types.js +49 -0
- package/dist/sdk/pi/retryPolicy.d.ts +19 -0
- package/dist/sdk/pi/retryPolicy.js +11 -0
- package/dist/sdk/pi/runtime.d.ts +14 -0
- package/dist/sdk/pi/runtime.js +31 -0
- package/dist/sdk/plugins/api.d.ts +66 -0
- package/dist/sdk/plugins/api.js +155 -0
- package/dist/sdk/plugins/attachments.d.ts +46 -0
- package/dist/sdk/plugins/attachments.js +111 -0
- package/dist/sdk/plugins/builtin.d.ts +7 -0
- package/dist/sdk/plugins/builtin.js +182 -0
- package/dist/sdk/plugins/builtinRegistry.d.ts +62 -0
- package/dist/sdk/plugins/builtinRegistry.js +77 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +197 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +188 -0
- package/dist/sdk/plugins/commandPrefix.d.ts +8 -0
- package/dist/sdk/plugins/commandPrefix.js +21 -0
- package/dist/sdk/plugins/discover.d.ts +48 -0
- package/dist/sdk/plugins/discover.js +230 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +119 -0
- package/dist/sdk/plugins/hooks.d.ts +94 -0
- package/dist/sdk/plugins/hooks.js +162 -0
- package/dist/sdk/plugins/identity.d.ts +19 -0
- package/dist/sdk/plugins/identity.js +48 -0
- package/dist/sdk/plugins/install.d.ts +24 -0
- package/dist/sdk/plugins/install.js +160 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +111 -0
- package/dist/sdk/plugins/manifest.d.ts +21 -0
- package/dist/sdk/plugins/manifest.js +94 -0
- package/dist/sdk/plugins/plugins.d.ts +106 -0
- package/dist/sdk/plugins/plugins.js +165 -0
- package/dist/sdk/plugins/proposals.d.ts +17 -0
- package/dist/sdk/plugins/proposals.js +147 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -0
- package/dist/sdk/plugins/surfaces.d.ts +5 -0
- package/dist/sdk/plugins/surfaces.js +11 -0
- package/dist/sdk/plugins/trust.d.ts +44 -0
- package/dist/sdk/plugins/trust.js +120 -0
- package/dist/sdk/plugins/types.d.ts +174 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +245 -0
- package/dist/sdk/prompt/compile.js +535 -0
- package/dist/sdk/prompt/reporting.d.ts +2 -0
- package/dist/sdk/prompt/reporting.js +94 -0
- package/dist/sdk/prompt/standard.d.ts +32 -0
- package/dist/sdk/prompt/standard.js +76 -0
- package/dist/sdk/refine/cli.d.ts +4 -0
- package/dist/sdk/refine/cli.js +186 -0
- package/dist/sdk/refine/demo.d.ts +21 -0
- package/dist/sdk/refine/demo.js +114 -0
- package/dist/sdk/refine/evidence.d.ts +55 -0
- package/dist/sdk/refine/evidence.js +330 -0
- package/dist/sdk/refine/host.d.ts +59 -0
- package/dist/sdk/refine/host.js +105 -0
- package/dist/sdk/refine/ledger.d.ts +48 -0
- package/dist/sdk/refine/ledger.js +76 -0
- package/dist/sdk/refine/library.d.ts +55 -0
- package/dist/sdk/refine/library.js +177 -0
- package/dist/sdk/refine/pi.d.ts +72 -0
- package/dist/sdk/refine/pi.js +248 -0
- package/dist/sdk/refine/prompts.d.ts +60 -0
- package/dist/sdk/refine/prompts.js +434 -0
- package/dist/sdk/refine/recursion.d.ts +113 -0
- package/dist/sdk/refine/recursion.js +258 -0
- package/dist/sdk/refine/runner.d.ts +83 -0
- package/dist/sdk/refine/runner.js +151 -0
- package/dist/sdk/refine/selection.d.ts +57 -0
- package/dist/sdk/refine/selection.js +251 -0
- package/dist/sdk/refine/serverMethods.d.ts +3 -0
- package/dist/sdk/refine/serverMethods.js +23 -0
- package/dist/sdk/refine/service.d.ts +115 -0
- package/dist/sdk/refine/service.js +280 -0
- package/dist/sdk/refine/suite.d.ts +67 -0
- package/dist/sdk/refine/suite.js +174 -0
- package/dist/sdk/refine/trajectory.d.ts +9 -0
- package/dist/sdk/refine/trajectory.js +73 -0
- package/dist/sdk/refine/types.d.ts +93 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/remote/addresses.d.ts +19 -0
- package/dist/sdk/remote/addresses.js +52 -0
- package/dist/sdk/remote/pairing.d.ts +59 -0
- package/dist/sdk/remote/pairing.js +160 -0
- package/dist/sdk/remote/seal.d.ts +28 -0
- package/dist/sdk/remote/seal.js +84 -0
- package/dist/sdk/remote/server.d.ts +28 -0
- package/dist/sdk/remote/server.js +158 -0
- package/dist/sdk/remote/service.d.ts +125 -0
- package/dist/sdk/remote/service.js +330 -0
- package/dist/sdk/remote/webClient.d.ts +4 -0
- package/dist/sdk/remote/webClient.js +452 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +365 -0
- package/dist/sdk/server/params.d.ts +4 -0
- package/dist/sdk/server/params.js +11 -0
- package/dist/sdk/server/remote.d.ts +19 -0
- package/dist/sdk/server/remote.js +109 -0
- package/dist/sdk/server/rpc.d.ts +20 -0
- package/dist/sdk/server/rpc.js +102 -0
- package/dist/sdk/server/serve.d.ts +13 -0
- package/dist/sdk/server/serve.js +25 -0
- package/dist/sdk/server/socket.d.ts +28 -0
- package/dist/sdk/server/socket.js +122 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/checkpoint.d.ts +7 -0
- package/dist/sdk/sessions/checkpoint.js +41 -0
- package/dist/sdk/sessions/compactionCheckpoint.d.ts +18 -0
- package/dist/sdk/sessions/compactionCheckpoint.js +79 -0
- package/dist/sdk/sessions/completionCheck.d.ts +51 -0
- package/dist/sdk/sessions/completionCheck.js +161 -0
- package/dist/sdk/sessions/continuation.d.ts +53 -0
- package/dist/sdk/sessions/continuation.js +90 -0
- package/dist/sdk/sessions/contracts.d.ts +991 -0
- package/dist/sdk/sessions/contracts.js +545 -0
- package/dist/sdk/sessions/control.d.ts +72 -0
- package/dist/sdk/sessions/control.js +158 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/goal.d.ts +145 -0
- package/dist/sdk/sessions/goal.js +405 -0
- package/dist/sdk/sessions/goalLoop.d.ts +37 -0
- package/dist/sdk/sessions/goalLoop.js +125 -0
- package/dist/sdk/sessions/goalPrompts.d.ts +4 -0
- package/dist/sdk/sessions/goalPrompts.js +93 -0
- package/dist/sdk/sessions/goalStop.d.ts +27 -0
- package/dist/sdk/sessions/goalStop.js +41 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/initialBash.d.ts +7 -0
- package/dist/sdk/sessions/initialBash.js +7 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/live.d.ts +101 -0
- package/dist/sdk/sessions/live.js +265 -0
- package/dist/sdk/sessions/planMode.d.ts +116 -0
- package/dist/sdk/sessions/planMode.js +281 -0
- package/dist/sdk/sessions/policy.d.ts +43 -0
- package/dist/sdk/sessions/policy.js +1 -0
- package/dist/sdk/sessions/pricing.d.ts +34 -0
- package/dist/sdk/sessions/pricing.js +40 -0
- package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
- package/dist/sdk/sessions/reasoningSummaries.js +61 -0
- package/dist/sdk/sessions/registry.d.ts +124 -0
- package/dist/sdk/sessions/registry.js +392 -0
- package/dist/sdk/sessions/runIndex.d.ts +21 -0
- package/dist/sdk/sessions/runIndex.js +65 -0
- package/dist/sdk/sessions/runStore.d.ts +82 -0
- package/dist/sdk/sessions/runStore.js +393 -0
- package/dist/sdk/sessions/runner.d.ts +291 -0
- package/dist/sdk/sessions/runner.js +1040 -0
- package/dist/sdk/sessions/sessionState.d.ts +13 -0
- package/dist/sdk/sessions/sessionState.js +31 -0
- package/dist/sdk/sessions/sessions.d.ts +238 -0
- package/dist/sdk/sessions/sessions.js +923 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
- package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
- package/dist/sdk/sessions/sideQuestions.js +290 -0
- package/dist/sdk/sessions/stallWatch.d.ts +35 -0
- package/dist/sdk/sessions/stallWatch.js +42 -0
- package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/subagentServerMethods.js +41 -0
- package/dist/sdk/sessions/subagentService.d.ts +88 -0
- package/dist/sdk/sessions/subagentService.js +546 -0
- package/dist/sdk/sessions/subagents.d.ts +98 -0
- package/dist/sdk/sessions/subagents.js +136 -0
- package/dist/sdk/sessions/workSlice.d.ts +167 -0
- package/dist/sdk/sessions/workSlice.js +266 -0
- package/dist/sdk/sessions/workspaceBoundary.d.ts +15 -0
- package/dist/sdk/sessions/workspaceBoundary.js +46 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -0
- package/dist/sdk/terminal/browser.d.ts +62 -0
- package/dist/sdk/terminal/browser.js +41 -0
- package/dist/sdk/terminal/browserControl.d.ts +29 -0
- package/dist/sdk/terminal/browserControl.js +187 -0
- package/dist/sdk/terminal/cli.d.ts +20 -0
- package/dist/sdk/terminal/cli.js +121 -0
- package/dist/sdk/terminal/client.d.ts +20 -0
- package/dist/sdk/terminal/client.js +148 -0
- package/dist/sdk/terminal/commandHelp.d.ts +17 -0
- package/dist/sdk/terminal/commandHelp.js +20 -0
- package/dist/sdk/terminal/control.d.ts +4 -0
- package/dist/sdk/terminal/control.js +25 -0
- package/dist/sdk/terminal/controller.d.ts +136 -0
- package/dist/sdk/terminal/controller.js +579 -0
- package/dist/sdk/terminal/credentialStore.d.ts +4 -0
- package/dist/sdk/terminal/credentialStore.js +33 -0
- package/dist/sdk/terminal/daemon.d.ts +44 -0
- package/dist/sdk/terminal/daemon.js +264 -0
- package/dist/sdk/terminal/hubMenu.d.ts +10 -0
- package/dist/sdk/terminal/hubMenu.js +34 -0
- package/dist/sdk/terminal/launch.d.ts +5 -0
- package/dist/sdk/terminal/launch.js +27 -0
- package/dist/sdk/terminal/liveTerminal.d.ts +96 -0
- package/dist/sdk/terminal/liveTerminal.js +436 -0
- package/dist/sdk/terminal/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/opentui/ansi.d.ts +25 -0
- package/dist/sdk/terminal/opentui/ansi.js +192 -0
- package/dist/sdk/terminal/opentui/model.d.ts +163 -0
- package/dist/sdk/terminal/opentui/model.js +484 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.js +54 -0
- package/dist/sdk/terminal/opentui/theme.d.ts +47 -0
- package/dist/sdk/terminal/opentui/theme.js +93 -0
- package/dist/sdk/terminal/piExtension.d.ts +12 -0
- package/dist/sdk/terminal/piExtension.js +847 -0
- package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
- package/dist/sdk/terminal/pluginMenu.js +101 -0
- package/dist/sdk/terminal/socket.d.ts +73 -0
- package/dist/sdk/terminal/socket.js +287 -0
- package/dist/sdk/terminal/standalone.d.ts +52 -0
- package/dist/sdk/terminal/standalone.js +329 -0
- package/dist/sdk/terminal/subagentMonitor.d.ts +62 -0
- package/dist/sdk/terminal/subagentMonitor.js +176 -0
- package/dist/sdk/terminal/terminals.d.ts +312 -0
- package/dist/sdk/terminal/terminals.js +1782 -0
- package/dist/sdk/terminal/toolName.d.ts +6 -0
- package/dist/sdk/terminal/toolName.js +12 -0
- package/dist/sdk/terminal/trajectory.d.ts +15 -0
- package/dist/sdk/terminal/trajectory.js +38 -0
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +7 -0
- package/dist/sdk/terminal/tui/annotateCommand.js +36 -0
- package/dist/sdk/terminal/tui/annotateSend.d.ts +30 -0
- package/dist/sdk/terminal/tui/annotateSend.js +40 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +68 -0
- package/dist/sdk/terminal/tui/chrome.js +182 -0
- package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
- package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +16 -0
- package/dist/sdk/terminal/tui/commandPages.js +136 -0
- package/dist/sdk/terminal/tui/commands.d.ts +71 -0
- package/dist/sdk/terminal/tui/commands.js +496 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +81 -0
- package/dist/sdk/terminal/tui/dialogs.js +372 -0
- package/dist/sdk/terminal/tui/goalCommand.d.ts +19 -0
- package/dist/sdk/terminal/tui/goalCommand.js +83 -0
- package/dist/sdk/terminal/tui/harnessRuntime.d.ts +8 -0
- package/dist/sdk/terminal/tui/harnessRuntime.js +771 -0
- package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
- package/dist/sdk/terminal/tui/keybindings.js +49 -0
- package/dist/sdk/terminal/tui/list.d.ts +86 -0
- package/dist/sdk/terminal/tui/list.js +278 -0
- package/dist/sdk/terminal/tui/markdown.d.ts +16 -0
- package/dist/sdk/terminal/tui/markdown.js +55 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +61 -0
- package/dist/sdk/terminal/tui/modeChoices.js +95 -0
- package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
- package/dist/sdk/terminal/tui/modelPicker.js +150 -0
- package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
- package/dist/sdk/terminal/tui/mouse.js +3 -0
- package/dist/sdk/terminal/tui/mouseReport.d.ts +30 -0
- package/dist/sdk/terminal/tui/mouseReport.js +80 -0
- package/dist/sdk/terminal/tui/page.d.ts +17 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +30 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +183 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.js +193 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +148 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.js +576 -0
- package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
- package/dist/sdk/terminal/tui/pages/browserPage.js +739 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
- package/dist/sdk/terminal/tui/pages/contextPage.d.ts +91 -0
- package/dist/sdk/terminal/tui/pages/contextPage.js +585 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
- package/dist/sdk/terminal/tui/pages/followUpQueuePage.d.ts +34 -0
- package/dist/sdk/terminal/tui/pages/followUpQueuePage.js +130 -0
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +52 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +292 -0
- package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
- package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +65 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +519 -0
- package/dist/sdk/terminal/tui/pages/remoteControlPage.d.ts +32 -0
- package/dist/sdk/terminal/tui/pages/remoteControlPage.js +170 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +24 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +155 -0
- package/dist/sdk/terminal/tui/pages/textPage.d.ts +17 -0
- package/dist/sdk/terminal/tui/pages/textPage.js +52 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +66 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +490 -0
- package/dist/sdk/terminal/tui/pages/usagePage.d.ts +45 -0
- package/dist/sdk/terminal/tui/pages/usagePage.js +397 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
- package/dist/sdk/terminal/tui/piAdapter.d.ts +17 -0
- package/dist/sdk/terminal/tui/piAdapter.js +46 -0
- package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
- package/dist/sdk/terminal/tui/planMode.js +2 -0
- package/dist/sdk/terminal/tui/pluginCommands.d.ts +16 -0
- package/dist/sdk/terminal/tui/pluginCommands.js +41 -0
- package/dist/sdk/terminal/tui/qr.d.ts +4 -0
- package/dist/sdk/terminal/tui/qr.js +35 -0
- package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
- package/dist/sdk/terminal/tui/questionPicker.js +150 -0
- package/dist/sdk/terminal/tui/questions.d.ts +21 -0
- package/dist/sdk/terminal/tui/questions.js +42 -0
- package/dist/sdk/terminal/tui/runtime.d.ts +117 -0
- package/dist/sdk/terminal/tui/runtime.js +544 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +61 -0
- package/dist/sdk/terminal/tui/selection.d.ts +16 -0
- package/dist/sdk/terminal/tui/selection.js +16 -0
- package/dist/sdk/terminal/tui/sessionPicker.d.ts +40 -0
- package/dist/sdk/terminal/tui/sessionPicker.js +141 -0
- package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
- package/dist/sdk/terminal/tui/sessionUi.js +30 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
- package/dist/sdk/terminal/tui/settingsModel.js +195 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +57 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +241 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +28 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +63 -0
- package/dist/sdk/terminal/tui/status.d.ts +18 -0
- package/dist/sdk/terminal/tui/status.js +67 -0
- package/dist/sdk/terminal/tui/theme.d.ts +54 -0
- package/dist/sdk/terminal/tui/theme.js +185 -0
- package/dist/sdk/terminal/tui/thinkingLevels.d.ts +11 -0
- package/dist/sdk/terminal/tui/thinkingLevels.js +31 -0
- package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
- package/dist/sdk/terminal/tui/treeModel.js +483 -0
- package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
- package/dist/sdk/terminal/tui/treePicker.js +251 -0
- package/dist/sdk/terminal/tui/ui.d.ts +49 -0
- package/dist/sdk/terminal/tui/ui.js +149 -0
- package/dist/sdk/terminal/tui/variantCommands.d.ts +32 -0
- package/dist/sdk/terminal/tui/variantCommands.js +359 -0
- package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/terminal/variantControl.d.ts +24 -0
- package/dist/sdk/terminal/variantControl.js +145 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +92 -0
- package/dist/sdk/tools/defaultSkills.d.ts +23 -0
- package/dist/sdk/tools/defaultSkills.js +46 -0
- package/dist/sdk/tools/definitions.d.ts +32 -0
- package/dist/sdk/tools/definitions.js +133 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +92 -0
- package/dist/sdk/tools/getCapabilities.d.ts +31 -0
- package/dist/sdk/tools/getCapabilities.js +34 -0
- package/dist/sdk/tools/harnessTools.d.ts +8 -0
- package/dist/sdk/tools/harnessTools.js +20 -0
- package/dist/sdk/tools/sessionName.d.ts +16 -0
- package/dist/sdk/tools/sessionName.js +78 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +63 -0
- package/dist/sdk/tools/todo.d.ts +15 -0
- package/dist/sdk/tools/todo.js +66 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -0
- package/dist/sdk/usage/analytics.d.ts +20 -0
- package/dist/sdk/usage/analytics.js +151 -0
- package/dist/sdk/usage/ledger.d.ts +38 -0
- package/dist/sdk/usage/ledger.js +142 -0
- package/dist/sdk/usage/limits/adapters.d.ts +11 -0
- package/dist/sdk/usage/limits/adapters.js +349 -0
- package/dist/sdk/usage/limits/capture.d.ts +8 -0
- package/dist/sdk/usage/limits/capture.js +47 -0
- package/dist/sdk/usage/limits/http.d.ts +12 -0
- package/dist/sdk/usage/limits/http.js +51 -0
- package/dist/sdk/usage/limits/normalize.d.ts +15 -0
- package/dist/sdk/usage/limits/normalize.js +211 -0
- package/dist/sdk/usage/limits/service.d.ts +30 -0
- package/dist/sdk/usage/limits/service.js +176 -0
- package/dist/sdk/usage/limits/types.d.ts +65 -0
- package/dist/sdk/usage/limits/types.js +1 -0
- package/dist/sdk/usage/serverMethods.d.ts +3 -0
- package/dist/sdk/usage/serverMethods.js +22 -0
- package/dist/sdk/usage/service.d.ts +32 -0
- package/dist/sdk/usage/service.js +66 -0
- package/dist/sdk/usage/settings.d.ts +7 -0
- package/dist/sdk/usage/settings.js +28 -0
- package/dist/sdk/usage/types.d.ts +60 -0
- package/dist/sdk/usage/types.js +4 -0
- package/dist/sdk/variant/components.d.ts +34 -0
- package/dist/sdk/variant/components.js +230 -0
- package/dist/sdk/variant/materialise.d.ts +66 -0
- package/dist/sdk/variant/materialise.js +81 -0
- package/dist/sdk/variant/migrate.d.ts +4 -0
- package/dist/sdk/variant/migrate.js +41 -0
- package/dist/sdk/variant/seed.d.ts +20 -0
- package/dist/sdk/variant/seed.js +116 -0
- package/dist/sdk/variant/store.d.ts +114 -0
- package/dist/sdk/variant/store.js +256 -0
- package/dist/sdk/variant/surface.d.ts +56 -0
- package/dist/sdk/variant/surface.js +81 -0
- package/dist/sdk/variant/trust.d.ts +27 -0
- package/dist/sdk/variant/trust.js +64 -0
- package/dist/sdk/variant/variant.d.ts +71 -0
- package/dist/sdk/variant/variant.js +331 -0
- package/dist/sdk/web/markdown.d.ts +10 -0
- package/dist/sdk/web/markdown.js +66 -0
- package/dist/sdk/web/part.d.ts +10 -0
- package/dist/sdk/web/part.js +6 -0
- package/dist/sdk/web/safeRequest.d.ts +34 -0
- package/dist/sdk/web/safeRequest.js +175 -0
- package/dist/sdk/web/search.d.ts +53 -0
- package/dist/sdk/web/search.js +168 -0
- package/dist/sdk/web/serverMethods.d.ts +3 -0
- package/dist/sdk/web/serverMethods.js +7 -0
- package/dist/sdk/web/text.d.ts +2 -0
- package/dist/sdk/web/text.js +7 -0
- package/dist/sdk/web/tools.d.ts +22 -0
- package/dist/sdk/web/tools.js +195 -0
- package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
- package/dist/sdk/wiki/notes.d.ts +68 -0
- package/dist/sdk/wiki/notes.js +297 -0
- package/dist/sdk/wiki/serverMethods.d.ts +3 -0
- package/dist/sdk/wiki/serverMethods.js +26 -0
- package/dist/sdk/worktrees/cli.d.ts +11 -0
- package/dist/sdk/worktrees/cli.js +146 -0
- package/dist/sdk/worktrees/copy.d.ts +9 -0
- package/dist/sdk/worktrees/copy.js +111 -0
- package/dist/sdk/worktrees/git.d.ts +18 -0
- package/dist/sdk/worktrees/git.js +89 -0
- package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
- package/dist/sdk/worktrees/serverMethods.js +30 -0
- package/dist/sdk/worktrees/service.d.ts +73 -0
- package/dist/sdk/worktrees/service.js +483 -0
- package/dist/sdk/worktrees/setup.d.ts +23 -0
- package/dist/sdk/worktrees/setup.js +65 -0
- package/dist/sdk/worktrees/snapshot.d.ts +16 -0
- package/dist/sdk/worktrees/snapshot.js +83 -0
- package/dist/sdk/worktrees/types.d.ts +91 -0
- package/dist/sdk/worktrees/types.js +1 -0
- package/dist/sdk/world/actions.d.ts +23 -0
- package/dist/sdk/world/actions.js +31 -0
- package/dist/sdk/world/cli.d.ts +12 -0
- package/dist/sdk/world/cli.js +166 -0
- package/dist/sdk/world/images.d.ts +20 -0
- package/dist/sdk/world/images.js +48 -0
- package/dist/sdk/world/untrusted.d.ts +12 -0
- package/dist/sdk/world/untrusted.js +20 -0
- package/dist/sdk/world/world.d.ts +75 -0
- package/dist/sdk/world/world.js +117 -0
- package/dist/terminal-opentui.js +30986 -0
- package/dist/terminal-pi.js +3008 -610
- package/docs/README.md +45 -1
- package/docs/architecture/00-overview.md +171 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +505 -0
- package/docs/architecture/03-variants.md +122 -0
- package/docs/architecture/04-prompt.md +277 -0
- package/docs/architecture/05-refinement.md +134 -0
- package/docs/architecture/06-plugins-and-capabilities.md +208 -0
- package/docs/architecture/07-tools-and-gate.md +245 -0
- package/docs/architecture/08-memory-and-history.md +100 -0
- package/docs/architecture/09-accounts-and-connectors.md +153 -0
- package/docs/architecture/10-server-protocol.md +403 -0
- package/docs/architecture/11-terminal.md +555 -0
- package/docs/architecture/12-storage.md +118 -0
- package/docs/architecture/13-world-tools.md +114 -0
- package/docs/architecture/14-surfaces-and-parity.md +151 -0
- package/docs/architecture/15-remote-control.md +120 -0
- package/docs/architecture/README.md +143 -0
- package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
- package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
- package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
- package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
- package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +72 -0
- package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
- package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
- package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
- package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
- package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
- package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
- package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
- package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
- package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
- package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
- package/docs/architecture/proposals/PROP-0017-page-annotations.md +131 -0
- package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +183 -0
- package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
- package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
- package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
- package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
- package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
- package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
- package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
- package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +96 -0
- package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
- package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
- package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
- package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
- package/docs/architecture/proposals/PROP-0031-plugin-command-owner-namespaces.md +54 -0
- package/docs/architecture/proposals/PROP-0032-planning-quality.md +196 -0
- package/docs/architecture/proposals/PROP-0033-compaction-plan-checkpoints.md +75 -0
- package/docs/architecture/proposals/PROP-0034-conversation-fast-mode.md +120 -0
- package/docs/architecture/proposals/PROP-0035-retain-subagent-status.md +47 -0
- package/docs/architecture/proposals/PROP-0036-first-class-harness-commands.md +59 -0
- package/docs/architecture/proposals/PROP-0037-workspace-write-boundary.md +63 -0
- package/docs/architecture/proposals/PROP-0038-annotate-open-shadow-roots.md +73 -0
- package/docs/architecture/proposals/PROP-0039-workspace-boundary-hardening.md +139 -0
- package/docs/architecture/proposals/PROP-0040-one-launch-path.md +87 -0
- package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +260 -0
- package/docs/architecture/proposals/PROP-0042-usage-and-provider-limits.md +127 -0
- package/docs/architecture/proposals/PROP-0043-read-only-plan-bash.md +74 -0
- package/docs/architecture/proposals/PROP-0044-work-slice-defaults.md +93 -0
- package/docs/architecture/proposals/PROP-0045-rename-checklist-to-todo.md +132 -0
- package/docs/architecture/proposals/PROP-0046-progress-aware-stall-guards.md +82 -0
- package/docs/architecture/proposals/PROP-0047-plugins-hub-separation.md +122 -0
- package/docs/architecture/proposals/PROP-0048-simple-annotate.md +85 -0
- package/docs/architecture/proposals/PROP-0049-context-attribution.md +415 -0
- package/docs/architecture/proposals/PROP-0050-run-stop-codes-and-refusals.md +30 -0
- package/docs/architecture/proposals/PROP-0051-unfinished-run-handoff.md +110 -0
- package/docs/architecture/proposals/PROP-0052-terminal-refine-and-variant-switch.md +111 -0
- package/docs/architecture/proposals/README.md +123 -0
- package/docs/decisions/ADR-0001-owned-terminal.md +10 -3
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +3 -1
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +3 -2
- package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
- package/docs/decisions/ADR-0007-reporting-section.md +33 -0
- package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +41 -0
- package/docs/decisions/ADR-0009-xharness-command.md +39 -0
- package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
- package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
- package/docs/decisions/ADR-0012-native-session-names.md +34 -0
- package/docs/decisions/ADR-0013-doctor.md +27 -0
- package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
- package/docs/decisions/ADR-0015-resource-browser.md +28 -0
- package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
- package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
- package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
- package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
- package/docs/decisions/ADR-0020-page-annotations.md +37 -0
- package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
- package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
- package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
- package/docs/decisions/ADR-0024-xagent-command.md +40 -0
- package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
- package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
- package/docs/decisions/ADR-0027-connected-sketch-display.md +62 -0
- package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
- package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
- package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
- package/docs/decisions/ADR-0031-plugin-command-owner-namespaces.md +37 -0
- package/docs/decisions/ADR-0032-compaction-run-checkpoints.md +35 -0
- package/docs/decisions/ADR-0033-plan-mode-research-delegation.md +47 -0
- package/docs/decisions/ADR-0034-first-class-harness-terminal-commands.md +25 -0
- package/docs/decisions/ADR-0035-one-launch-path.md +40 -0
- package/docs/decisions/ADR-0036-workspace-write-operation-boundary.md +54 -0
- package/docs/decisions/ADR-0037-usage-ledger-and-provider-limits.md +44 -0
- package/docs/decisions/ADR-0038-plan-bash-os-read-only.md +29 -0
- package/docs/decisions/ADR-0039-progress-aware-stall-guards.md +43 -0
- package/docs/decisions/ADR-0040-architecture-change-workflow.md +31 -0
- package/docs/decisions/ADR-0041-plugins-hub-separation.md +41 -0
- package/docs/decisions/ADR-0042-windows-shell-without-sandbox.md +40 -0
- package/docs/decisions/ADR-0043-parents-continue-stopped-subagents.md +49 -0
- package/docs/decisions/ADR-0044-annotations-pending-or-sent.md +24 -0
- package/docs/decisions/ADR-0045-default-plugin-authoring-skill.md +9 -0
- package/docs/decisions/ADR-0046-hash-bound-plugin-proposals.md +20 -0
- package/docs/decisions/ADR-0047-links-open-with-the-os-handler.md +47 -0
- package/docs/decisions/ADR-0048-required-skills-from-a-message.md +42 -0
- package/docs/decisions/ADR-0050-approved-window-screenshots.md +19 -0
- package/docs/decisions/ADR-0051-terminal-decision-wait.md +10 -0
- package/docs/decisions/ADR-0052-per-profile-subagent-budgets.md +25 -0
- package/docs/decisions/ADR-0053-no-repeated-work-guard.md +45 -0
- package/docs/decisions/ADR-0054-terminal-reply-heartbeat-and-stall.md +52 -0
- package/docs/decisions/ADR-0055-plan-output-repair.md +51 -0
- package/docs/decisions/ADR-0056-remote-control.md +53 -0
- package/docs/decisions/ADR-0057-structured-plan-outcomes.md +39 -0
- package/docs/decisions/ADR-0058-ask-user-only-plan-clarification.md +36 -0
- package/docs/decisions/ADR-0059-run-diagnostic-evidence.md +35 -0
- package/docs/decisions/ADR-0060-approvals-are-controls.md +40 -0
- package/docs/decisions/ADR-0061-strict-plugin-command-namespaces.md +41 -0
- package/docs/decisions/ADR-0062-shared-account-state.md +67 -0
- package/docs/decisions/ADR-0063-unfinished-work-handoffs.md +34 -0
- package/docs/decisions/ADR-0064-account-model-fallback-on-resume.md +79 -0
- package/docs/decisions/ADR-0065-variant-switch-at-turn-boundaries.md +31 -0
- package/docs/decisions/ADR-0066-guided-refinement-from-turn-snapshots.md +37 -0
- package/docs/decisions/ADR-0067-cache-stable-compaction-checkpoint.md +54 -0
- package/docs/decisions/ADR-0068-scope-and-completion-report.md +60 -0
- package/docs/decisions/ADR-0069-stop-gate-and-finish.md +136 -0
- package/docs/decisions/ADR-0070-terminal-slice-continuation.md +49 -0
- package/docs/decisions/ADR-0071-completion-check.md +104 -0
- package/docs/decisions/ADR-0072-codex-prompts-and-goal.md +108 -0
- package/docs/decisions/ADR-0073-large-reporting-prompt.md +89 -0
- package/docs/decisions/ADR-0074-report-content-not-report-blocks.md +90 -0
- package/docs/decisions/ADR-0075-no-todo-gate.md +84 -0
- package/docs/decisions/ADR-0076-codex-final-answer-verbatim.md +98 -0
- package/docs/decisions/ADR-0077-plan-runs-may-conclude-no-plan-needed.md +120 -0
- package/docs/decisions/ADR-0078-child-aware-stall-watch.md +46 -0
- package/docs/decisions/ADR-0079-phase-led-reporting-guidance.md +72 -0
- package/docs/decisions/ADR-0080-fixed-width-question-sketch-canvas.md +50 -0
- package/docs/decisions/ADR-0081-no-work-slice-budget-by-default.md +36 -0
- package/docs/decisions/ADR-0082-connected-brave-browser.md +72 -0
- package/docs/decisions/ADR-0083-one-live-session-runtime.md +256 -0
- package/docs/doctor.md +95 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
- package/docs/experiments/EXP-0003-performance-audit/data/session-runtime-replication.json +420 -0
- package/docs/experiments/EXP-0003-performance-audit/data/session-runtime.json +420 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-compact.json +376 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-history.json +422 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-question.json +95 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-wide.json +1036 -0
- package/docs/experiments/EXP-0003-performance-audit/plan.md +109 -0
- package/docs/experiments/EXP-0003-performance-audit/results.md +151 -0
- package/docs/features/README.md +46 -0
- package/docs/features/automations/README.md +41 -0
- package/docs/features/cores/README.md +39 -0
- package/docs/features/google-harness2/README.md +52 -0
- package/docs/features/integrations/README.md +40 -0
- package/docs/features/interfaces/README.md +29 -0
- package/docs/features/memory/README.md +28 -0
- package/docs/future-work.md +48 -0
- package/docs/handoff-2026-10-25-app-parity-and-solo-tabs.md +202 -0
- package/docs/parity.md +158 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/1.1.1.md +28 -0
- package/docs/releases/1.2.0.md +49 -0
- package/docs/releases/1.3.0.md +21 -0
- package/docs/releases/1.3.1-unstable.1.md +8 -0
- package/docs/releases/1.3.1-unstable.2.md +11 -0
- package/docs/releases/1.3.1-unstable.3.md +54 -0
- package/docs/releases/1.3.1-unstable.4.md +56 -0
- package/docs/releases/1.3.1-unstable.5.md +53 -0
- package/docs/releases/1.3.1-unstable.6.md +31 -0
- package/docs/releases/1.3.1-unstable.7.md +17 -0
- package/docs/releases/1.3.1-unstable.8.md +19 -0
- package/docs/releases/1.3.1-unstable.9.md +54 -0
- package/docs/releases/1.4.0-unstable.md +25 -0
- package/docs/releases/1.5.0-unstable.md +32 -0
- package/docs/releases/1.5.1-unstable.md +24 -0
- package/docs/releases/1.6.0-unstable.md +59 -0
- package/docs/releases/2.0.1-unstable.md +63 -0
- package/docs/releases/4.0.0.md +47 -0
- package/docs/releases/README.md +49 -0
- package/docs/study/00-index.md +112 -0
- package/docs/study/STUDY-0003-long-horizon-runs.md +210 -0
- package/docs/study/STUDY-0004-turn-end-controls.md +130 -0
- package/docs/study/STUDY-0005-skill-installation-guidance.md +146 -0
- package/docs/study/STUDY-0006-reporting-prompts.md +119 -0
- package/docs/study/STUDY-0007-claude-code-prompt.md +162 -0
- package/docs/study/STUDY-0008-browser-control.md +281 -0
- package/docs/study/STUDY-0009-claude-code-reporting.md +205 -0
- package/docs/study/arms/00-matrix.md +20 -0
- package/docs/study/arms/01-system-prompt.md +211 -0
- package/docs/study/arms/02-tools.md +79 -0
- package/docs/study/arms/03-subagents.md +90 -0
- package/docs/study/arms/04-skills.md +81 -0
- package/docs/study/arms/05-context-management.md +90 -0
- package/docs/study/arms/06-memory.md +90 -0
- package/docs/study/arms/07-governance.md +71 -0
- package/docs/study/arms/08-execution.md +69 -0
- package/docs/study/arms/09-observability.md +60 -0
- package/docs/study/arms/10-refinement.md +110 -0
- package/docs/study/autonomous-engineering-sources.md +277 -0
- package/docs/study/autonomy-sources.md +147 -0
- package/docs/study/btw-comparison.md +37 -0
- package/docs/study/feature-gap-review.md +42 -0
- package/docs/study/insights.md +123 -0
- package/docs/study/proactive-autonomy.md +408 -0
- package/docs/study/roadmap.md +72 -0
- package/docs/study/sources/claude-code.md +56 -0
- package/docs/study/sources/deepseek-harness.md +102 -0
- package/docs/study/sources/harness2.md +50 -0
- package/docs/study/sources/kimi-cli.md +42 -0
- package/docs/study/sources/omp.md +93 -0
- package/docs/study/sources/opencode.md +43 -0
- package/docs/study/sources/openhands.md +46 -0
- package/docs/study/sources/smolagents.md +40 -0
- package/docs/study/sources/swe-agent.md +34 -0
- package/docs/study/tui-resource-browser.md +78 -0
- package/docs/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +887 -109
- package/package.json +46 -13
- package/src/accounts/accounts.test.ts +0 -419
- package/src/accounts/accounts.ts +0 -760
- package/src/accounts/env.test.ts +0 -95
- package/src/accounts/env.ts +0 -338
- package/src/accounts/secrets.ts +0 -50
- package/src/accounts/store.ts +0 -338
- package/src/capabilities/api.ts +0 -75
- package/src/capabilities/runSnapshot.ts +0 -59
- package/src/capabilities/types.ts +0 -34
- package/src/cli.ts +0 -118
- package/src/core/bus.test.ts +0 -22
- package/src/core/bus.ts +0 -49
- package/src/core/changes.ts +0 -33
- package/src/core/env.ts +0 -27
- package/src/core/errors.ts +0 -32
- package/src/core/frontmatter.ts +0 -47
- package/src/core/fs.test.ts +0 -38
- package/src/core/fs.ts +0 -92
- package/src/core/index.ts +0 -193
- package/src/core/path.test.ts +0 -14
- package/src/core/path.ts +0 -79
- package/src/core/projects.ts +0 -90
- package/src/core/text.ts +0 -39
- package/src/harness.ts +0 -322
- package/src/hub/catalog.json +0 -123
- package/src/hub/cli.ts +0 -59
- package/src/hub/hub.test.ts +0 -205
- package/src/hub/hub.ts +0 -256
- package/src/hub/schema.ts +0 -81
- package/src/index.ts +0 -80
- package/src/mcp/connections.ts +0 -641
- package/src/mcp/manager.ts +0 -130
- package/src/mcp/oauth.ts +0 -195
- package/src/mcp/scopeMigration.test.ts +0 -79
- package/src/mcp/scopeMigration.ts +0 -204
- package/src/mcp/service.test.ts +0 -422
- package/src/mcp/service.ts +0 -560
- package/src/mcp/types.ts +0 -118
- package/src/memory/api.test.ts +0 -82
- package/src/memory/api.ts +0 -303
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -408
- package/src/memory/caller.ts +0 -69
- package/src/memory/curation.test.ts +0 -206
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -64
- package/src/memory/facts.test.ts +0 -41
- package/src/memory/facts.ts +0 -248
- package/src/memory/graph.ts +0 -103
- package/src/memory/health.test.ts +0 -130
- package/src/memory/health.ts +0 -74
- package/src/memory/maintainer.ts +0 -272
- package/src/memory/maintenance.test.ts +0 -192
- package/src/memory/maintenance.ts +0 -679
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -150
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -584
- package/src/memory/recall.test.ts +0 -115
- package/src/memory/recall.ts +0 -279
- package/src/memory/references.ts +0 -77
- package/src/memory/runContext.ts +0 -93
- package/src/memory/secrets.ts +0 -6
- package/src/memory/store.test.ts +0 -66
- package/src/memory/store.ts +0 -385
- package/src/memory/trajectory.test.ts +0 -178
- package/src/memory/trajectory.ts +0 -220
- package/src/memory/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -423
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -117
- package/src/plugins/api.ts +0 -181
- package/src/plugins/attachments.test.ts +0 -84
- package/src/plugins/attachments.ts +0 -141
- package/src/plugins/builtin.ts +0 -84
- package/src/plugins/catalogue.test.ts +0 -254
- package/src/plugins/catalogue.ts +0 -251
- package/src/plugins/cli.ts +0 -184
- package/src/plugins/discover.ts +0 -151
- package/src/plugins/firstParty.test.ts +0 -143
- package/src/plugins/firstParty.ts +0 -129
- package/src/plugins/hooks.test.ts +0 -250
- package/src/plugins/hooks.ts +0 -239
- package/src/plugins/identity.ts +0 -37
- package/src/plugins/install.test.ts +0 -107
- package/src/plugins/install.ts +0 -106
- package/src/plugins/inventory.ts +0 -123
- package/src/plugins/manifest.ts +0 -76
- package/src/plugins/plugins.test.ts +0 -205
- package/src/plugins/plugins.ts +0 -189
- package/src/plugins/proposal.ts +0 -121
- package/src/plugins/runtime.test.ts +0 -40
- package/src/plugins/runtime.ts +0 -82
- package/src/plugins/trust.ts +0 -142
- package/src/plugins/types.ts +0 -149
- package/src/prompt/compile.test.ts +0 -261
- package/src/prompt/compile.ts +0 -732
- package/src/server/methods.ts +0 -355
- package/src/server/remote.ts +0 -77
- package/src/server/rpc.ts +0 -116
- package/src/server/serve.ts +0 -28
- package/src/server/server.test.ts +0 -193
- package/src/sessions/approvals.test.ts +0 -49
- package/src/sessions/approvals.ts +0 -140
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -233
- package/src/sessions/extensionSession.test.ts +0 -74
- package/src/sessions/extensionUi.test.ts +0 -65
- package/src/sessions/extensionUi.ts +0 -102
- package/src/sessions/history.ts +0 -51
- package/src/sessions/lineageJoin.ts +0 -75
- package/src/sessions/policy.ts +0 -36
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/questionBatches.test.ts +0 -110
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -412
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -346
- package/src/sessions/runner.ts +0 -610
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -588
- package/src/sessions/sessions.ts +0 -331
- package/src/sessions/subagentService.test.ts +0 -159
- package/src/sessions/subagentService.ts +0 -236
- package/src/sessions/subagents.ts +0 -97
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -413
- package/src/terminal/accountsMenu.test.ts +0 -225
- package/src/terminal/accountsMenu.ts +0 -382
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/control.test.ts +0 -23
- package/src/terminal/control.ts +0 -23
- package/src/terminal/controller.ts +0 -354
- package/src/terminal/hubMenu.ts +0 -24
- package/src/terminal/launch.test.ts +0 -25
- package/src/terminal/launch.ts +0 -48
- package/src/terminal/piExtension.lifecycle.test.ts +0 -55
- package/src/terminal/piExtension.ts +0 -295
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -94
- package/src/terminal/socket.ts +0 -256
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -165
- package/src/terminal/terminal.test.ts +0 -534
- package/src/terminal/terminals.ts +0 -661
- package/src/terminal/trajectory.test.ts +0 -66
- package/src/terminal/trajectory.ts +0 -44
- package/src/terminal/tui/application.test.ts +0 -290
- package/src/terminal/tui/application.ts +0 -653
- package/src/terminal/tui/commands.test.ts +0 -278
- package/src/terminal/tui/commands.ts +0 -443
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -113
- package/src/terminal/tui/editor.ts +0 -109
- package/src/terminal/tui/keybindings.test.ts +0 -30
- package/src/terminal/tui/keybindings.ts +0 -59
- package/src/terminal/tui/piAdapter.ts +0 -62
- package/src/terminal/tui/planMode.test.ts +0 -10
- package/src/terminal/tui/planMode.ts +0 -12
- package/src/terminal/tui/presentation.test.ts +0 -79
- package/src/terminal/tui/questions.test.ts +0 -41
- package/src/terminal/tui/questions.ts +0 -47
- package/src/terminal/tui/runtime.socket.test.ts +0 -178
- package/src/terminal/tui/runtime.test.ts +0 -225
- package/src/terminal/tui/runtime.ts +0 -403
- package/src/terminal/tui/screen.test.ts +0 -143
- package/src/terminal/tui/screen.ts +0 -121
- package/src/terminal/tui/sessionUi.ts +0 -24
- package/src/terminal/tui/settings.test.ts +0 -150
- package/src/terminal/tui/settings.ts +0 -188
- package/src/terminal/tui/skillInvocation.test.ts +0 -71
- package/src/terminal/tui/skillInvocation.ts +0 -51
- package/src/terminal/tui/status.test.ts +0 -48
- package/src/terminal/tui/status.ts +0 -82
- package/src/terminal/tui/theme.ts +0 -185
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/trajectoryPanel.test.ts +0 -99
- package/src/terminal/tui/trajectoryPanel.ts +0 -226
- package/src/terminal/tui/transcript.test.ts +0 -39
- package/src/terminal/tui/transcript.ts +0 -135
- package/src/terminal/tui/ui.test.ts +0 -313
- package/src/terminal/tui/ui.ts +0 -166
- package/src/terminal/tui/welcome.ts +0 -102
- package/src/terminal/tui/workingStatus.test.ts +0 -44
- package/src/terminal/tui/workingStatus.ts +0 -238
- package/src/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -228
- package/src/tools/maintenance.ts +0 -29
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- package/src/tools/registryWrite.test.ts +0 -101
- package/src/tools/registryWrite.ts +0 -182
- package/src/tools/spawnSubagent.ts +0 -47
- package/src/tools/types.ts +0 -41
- package/src/web/safeRequest.ts +0 -171
- package/src/web/text.ts +0 -53
- package/src/web/tools.ts +0 -134
- package/src/web/web.test.ts +0 -141
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import type { SecretStore } from "../accounts/secrets.js";
|
|
2
|
+
import type { Bus } from "../core/bus.js";
|
|
3
|
+
import type { HarnessEnv } from "../core/env.js";
|
|
4
|
+
import type { CapabilitySet } from "../capabilities/types.js";
|
|
5
|
+
import type { CallerContext } from "../core/caller.js";
|
|
6
|
+
import type { ToolPolicy } from "../sessions/policy.js";
|
|
7
|
+
import type { RunRegistry } from "../sessions/registry.js";
|
|
8
|
+
import type { SessionBroker } from "../sessions/sessions.js";
|
|
9
|
+
import type { ToolSession, ToolSpec } from "../tools/types.js";
|
|
10
|
+
import { Connections } from "./connections.js";
|
|
11
|
+
import type { AppOAuthClients, Connection, McpTrace } from "./types.js";
|
|
12
|
+
/** A session's access to the broker. A terminal session presents `token`; an SDK session holds the object. */
|
|
13
|
+
export interface BrokerSession {
|
|
14
|
+
token: string;
|
|
15
|
+
sessionId: string;
|
|
16
|
+
runId: string | null;
|
|
17
|
+
caller: CallerContext;
|
|
18
|
+
/** Only reads are permitted. */
|
|
19
|
+
readOnly: boolean;
|
|
20
|
+
depth: number;
|
|
21
|
+
/** The run's immutable tool and connector set. */
|
|
22
|
+
capabilities?: CapabilitySet;
|
|
23
|
+
}
|
|
24
|
+
export interface BrokerTool {
|
|
25
|
+
name: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
inputSchema?: unknown;
|
|
28
|
+
}
|
|
29
|
+
/** Tools the embedding application offers through the broker, beside connected apps. */
|
|
30
|
+
export interface BrokeredTools {
|
|
31
|
+
list(session: BrokerSession): Promise<BrokerTool[]>;
|
|
32
|
+
has(name: string): boolean;
|
|
33
|
+
/** The tool's result as the application returns it: text, `{ text, image? }`, or structured data. */
|
|
34
|
+
call(session: BrokerSession, name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
35
|
+
/** Changes whenever the offered tools may have changed. */
|
|
36
|
+
revision?(session: BrokerSession): Promise<unknown>;
|
|
37
|
+
/** A sentence added to the discovery tool's description, e.g. where the application lists the rest of its tools. */
|
|
38
|
+
discoveryNote?: string;
|
|
39
|
+
}
|
|
40
|
+
interface ListedTool extends BrokerTool {
|
|
41
|
+
connectionId: string;
|
|
42
|
+
tool: string;
|
|
43
|
+
origin?: 'app';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A tool listing a model can scan: a name and one line each. Input schemas are the bulk of a
|
|
47
|
+
* discovery reply, so they come back for one named tool at a time.
|
|
48
|
+
*/
|
|
49
|
+
export declare function compactTools<T extends BrokerTool>(tools: readonly T[], tool?: string): Array<Omit<T, 'inputSchema'> | T>;
|
|
50
|
+
/** Most tools one listing returns. A server with hundreds of tools would otherwise make every discovery call a very large input. */
|
|
51
|
+
export declare const TOOL_PAGE = 40;
|
|
52
|
+
/**
|
|
53
|
+
* One page of a tool listing: names and summaries only, optionally filtered by a
|
|
54
|
+
* case-insensitive `query` over name and description. `more` and `nextOffset` appear when
|
|
55
|
+
* entries remain.
|
|
56
|
+
*/
|
|
57
|
+
export declare function pageTools<T extends BrokerTool>(tools: readonly T[], options?: {
|
|
58
|
+
query?: string;
|
|
59
|
+
offset?: number;
|
|
60
|
+
limit?: number;
|
|
61
|
+
}): {
|
|
62
|
+
more?: number | undefined;
|
|
63
|
+
nextOffset?: number | undefined;
|
|
64
|
+
tools: (T | Omit<T, "inputSchema">)[];
|
|
65
|
+
total: number;
|
|
66
|
+
};
|
|
67
|
+
export interface ConnectedAppsOptions {
|
|
68
|
+
env: HarnessEnv;
|
|
69
|
+
stateDir: string;
|
|
70
|
+
secrets: SecretStore;
|
|
71
|
+
bus: Bus;
|
|
72
|
+
runs: RunRegistry;
|
|
73
|
+
policy: ToolPolicy;
|
|
74
|
+
/** The application's own registered OAuth clients, if it has any. */
|
|
75
|
+
oauthClients?: AppOAuthClients;
|
|
76
|
+
}
|
|
77
|
+
export declare class ConnectedApps implements SessionBroker {
|
|
78
|
+
private readonly options;
|
|
79
|
+
readonly toolNames: readonly ["mcp_list_tools", "mcp_call_tool"];
|
|
80
|
+
readonly connections: Connections;
|
|
81
|
+
private readonly manager;
|
|
82
|
+
private readonly oauth;
|
|
83
|
+
private readonly grants;
|
|
84
|
+
private readonly proposals;
|
|
85
|
+
private readonly calls;
|
|
86
|
+
private brokered;
|
|
87
|
+
constructor(options: ConnectedAppsOptions);
|
|
88
|
+
/** Loads what is needed to redact results. Call once before sessions start. */
|
|
89
|
+
start(): Promise<void>;
|
|
90
|
+
/** Lets the application offer its own tools through `mcp_list_tools` and `mcp_call_tool`. */
|
|
91
|
+
expose(tools: BrokeredTools): void;
|
|
92
|
+
/** Gives a session access to the broker. The token is what a process outside the harness presents. */
|
|
93
|
+
grant(input: Omit<BrokerSession, 'token'>): BrokerSession;
|
|
94
|
+
session(token: string): BrokerSession;
|
|
95
|
+
revokeSession(sessionId: string): void;
|
|
96
|
+
/** A run ended: its grants, previews, and open client sessions go with it. */
|
|
97
|
+
revokeRun(runId: string, sessionId: string): void;
|
|
98
|
+
private activeRun;
|
|
99
|
+
private valid;
|
|
100
|
+
private reachable;
|
|
101
|
+
/** A diagnostic lists only the selected server; it never calls a connector tool. */
|
|
102
|
+
diagnosticList(session: BrokerSession, connectionId: string, signal: AbortSignal): Promise<number>;
|
|
103
|
+
/** The application's tools and every reachable connection's tools, with the connections that could not be read. */
|
|
104
|
+
list(session: BrokerSession): Promise<{
|
|
105
|
+
tools: ListedTool[];
|
|
106
|
+
errors: {
|
|
107
|
+
connection: string;
|
|
108
|
+
message: string;
|
|
109
|
+
}[];
|
|
110
|
+
}>;
|
|
111
|
+
private connectionFailed;
|
|
112
|
+
/** Runs one tool by the name `list` gave it. */
|
|
113
|
+
invoke(session: BrokerSession, alias: string, args: Record<string, unknown>): Promise<unknown>;
|
|
114
|
+
/** Checks scope, asks for approval when the call is not a read, and returns how to reach the connection. */
|
|
115
|
+
private authorize;
|
|
116
|
+
/** Records what an authorized call returned: a redacted trace with its sources, and the tool's outcome. */
|
|
117
|
+
private completed;
|
|
118
|
+
/** What a run retrieved from connected apps, in order. */
|
|
119
|
+
runContext(runId: string): McpTrace[];
|
|
120
|
+
/** Changes whenever what a session can discover may have changed. */
|
|
121
|
+
revision(session: BrokerSession): Promise<unknown>;
|
|
122
|
+
tools(session: ToolSession, options: {
|
|
123
|
+
readOnly: boolean;
|
|
124
|
+
}): ToolSpec[];
|
|
125
|
+
/** `mcp_list_tools` and `mcp_call_tool` bound to a granted session. */
|
|
126
|
+
brokerTools(session: BrokerSession): ToolSpec[];
|
|
127
|
+
save(input: Parameters<Connections['save']>[0]): Promise<Connection>;
|
|
128
|
+
remove(connectionId: string): Promise<void>;
|
|
129
|
+
private cancelConnection;
|
|
130
|
+
/** Connects once and records what the server offers, or why it could not be reached. */
|
|
131
|
+
test(connectionId: string): Promise<Connection>;
|
|
132
|
+
/** Signs in with the provider in a browser. Only a person starts this; a session that finds an expired sign-in reports it. */
|
|
133
|
+
signIn(connectionId: string): Promise<Connection>;
|
|
134
|
+
/** The catalog entries this application can sign in for, so a client need not be added by hand. */
|
|
135
|
+
appClients(): {
|
|
136
|
+
catalogIds: string[];
|
|
137
|
+
};
|
|
138
|
+
signOut(connectionId: string): Promise<Connection>;
|
|
139
|
+
/** Reads one retrieved source again from the Xingular Workspace connection it came from. */
|
|
140
|
+
refreshSource(runId: string, traceId: string, sourceUri: string): Promise<unknown>;
|
|
141
|
+
/** Gives one agent exactly these connections, if its creator may reach each of them. */
|
|
142
|
+
setAgentScope(creator: {
|
|
143
|
+
agentId?: string | null;
|
|
144
|
+
projectId?: string | null;
|
|
145
|
+
}, agentId: string, ids: readonly string[]): Connection[];
|
|
146
|
+
/**
|
|
147
|
+
* A call with no session and nobody to ask, made by a plugin's hook. It reaches a connection
|
|
148
|
+
* only when it is on for everyone, and a tool only when a person marked it to run without asking.
|
|
149
|
+
*/
|
|
150
|
+
callUnattended(reference: string, tool: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
151
|
+
/** Switches one saved connection on or off for everyone, one agent, or one project. */
|
|
152
|
+
attach(connectionId: string, scope: {
|
|
153
|
+
agentId?: string | null;
|
|
154
|
+
projectId?: string | null;
|
|
155
|
+
}, on: boolean): void;
|
|
156
|
+
/** Forgets an agent that no longer exists. */
|
|
157
|
+
removeAgentScope(agentId: string): void;
|
|
158
|
+
close(): Promise<void>;
|
|
159
|
+
}
|
|
160
|
+
export {};
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
// Connected apps as sessions use them: which connections a session may reach, the two broker
|
|
2
|
+
// tools every such session gets, approval of anything that is not a read, and a redacted record
|
|
3
|
+
// of what each call returned.
|
|
4
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { HarnessError, invalid, notFound } from "../core/errors.js";
|
|
7
|
+
import { newId, now, readJson, writeJson } from "../core/fs.js";
|
|
8
|
+
import { charCount, takeChars } from "../core/text.js";
|
|
9
|
+
import { findRun, runDir } from "../sessions/runStore.js";
|
|
10
|
+
import { allowed, Connections, webUrl } from "./connections.js";
|
|
11
|
+
import { isSignInRequired, McpManager, signInRequired } from "./manager.js";
|
|
12
|
+
import { signIn } from "./oauth.js";
|
|
13
|
+
const TOOL_SUMMARY_CHARS = 160;
|
|
14
|
+
/**
|
|
15
|
+
* A tool listing a model can scan: a name and one line each. Input schemas are the bulk of a
|
|
16
|
+
* discovery reply, so they come back for one named tool at a time.
|
|
17
|
+
*/
|
|
18
|
+
export function compactTools(tools, tool) {
|
|
19
|
+
if (tool)
|
|
20
|
+
return tools.filter((entry) => entry.name === tool);
|
|
21
|
+
return tools.map(({ inputSchema: _schema, ...entry }) => ({
|
|
22
|
+
...entry,
|
|
23
|
+
...(entry.description && entry.description.length > TOOL_SUMMARY_CHARS ? { description: `${entry.description.slice(0, TOOL_SUMMARY_CHARS).trimEnd()}…` } : {})
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
/** Most tools one listing returns. A server with hundreds of tools would otherwise make every discovery call a very large input. */
|
|
27
|
+
export const TOOL_PAGE = 40;
|
|
28
|
+
/**
|
|
29
|
+
* One page of a tool listing: names and summaries only, optionally filtered by a
|
|
30
|
+
* case-insensitive `query` over name and description. `more` and `nextOffset` appear when
|
|
31
|
+
* entries remain.
|
|
32
|
+
*/
|
|
33
|
+
export function pageTools(tools, options = {}) {
|
|
34
|
+
const query = options.query?.trim().toLowerCase();
|
|
35
|
+
const matching = query ? tools.filter((tool) => tool.name.toLowerCase().includes(query) || (tool.description ?? '').toLowerCase().includes(query)) : tools;
|
|
36
|
+
const offset = Math.max(0, Math.floor(options.offset ?? 0));
|
|
37
|
+
const limit = Math.max(1, Math.min(Math.floor(options.limit ?? TOOL_PAGE), 100));
|
|
38
|
+
const page = compactTools(matching.slice(offset, offset + limit));
|
|
39
|
+
const next = offset + page.length;
|
|
40
|
+
return { tools: page, total: matching.length, ...(next < matching.length ? { more: matching.length - next, nextOffset: next } : {}) };
|
|
41
|
+
}
|
|
42
|
+
const WORKSPACE_READS = new Set([
|
|
43
|
+
'x_workspace_status', 'x_workspace_context', 'x_workspace_search', 'x_workspace_note_list', 'x_workspace_note_read', 'x_workspace_project_list', 'x_workspace_project_get',
|
|
44
|
+
'x_workspace_task_list', 'x_workspace_task_get', 'x_workspace_milestone_list', 'x_workspace_milestone_get', 'x_workspace_update_list', 'x_workspace_update_get',
|
|
45
|
+
'x_workspace_meeting_list', 'x_workspace_meeting_get', 'x_workspace_resource_list', 'x_workspace_resource_get', 'x_workspace_resource_preview'
|
|
46
|
+
]);
|
|
47
|
+
/** The scope a plugin hook's connections are opened under: they belong to no session. */
|
|
48
|
+
const UNATTENDED_SCOPE = 'plugin-hooks';
|
|
49
|
+
export class ConnectedApps {
|
|
50
|
+
options;
|
|
51
|
+
toolNames = ['mcp_list_tools', 'mcp_call_tool'];
|
|
52
|
+
connections;
|
|
53
|
+
manager;
|
|
54
|
+
oauth;
|
|
55
|
+
grants = new Map();
|
|
56
|
+
proposals = new Map();
|
|
57
|
+
calls = new Map();
|
|
58
|
+
brokered = null;
|
|
59
|
+
constructor(options) {
|
|
60
|
+
this.options = options;
|
|
61
|
+
this.connections = new Connections(options.stateDir, options.secrets, options.bus, () => options.env.root, options.oauthClients ?? null);
|
|
62
|
+
this.oauth = {
|
|
63
|
+
clientName: options.env.productName,
|
|
64
|
+
load: (id) => this.connections.oauthLoad(id),
|
|
65
|
+
save: (id, state) => this.connections.oauthSave(id, state),
|
|
66
|
+
openUrl: (url) => {
|
|
67
|
+
if (!webUrl(url))
|
|
68
|
+
throw invalid('The sign-in page must be an https:// address.');
|
|
69
|
+
// The application shows the page; the harness never opens a browser by itself.
|
|
70
|
+
options.bus.emit({ type: 'connections.openUrl', url });
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
this.manager = new McpManager(this.oauth);
|
|
74
|
+
}
|
|
75
|
+
/** Loads what is needed to redact results. Call once before sessions start. */
|
|
76
|
+
start() {
|
|
77
|
+
return this.connections.refreshSecrets();
|
|
78
|
+
}
|
|
79
|
+
/** Lets the application offer its own tools through `mcp_list_tools` and `mcp_call_tool`. */
|
|
80
|
+
expose(tools) {
|
|
81
|
+
this.brokered = tools;
|
|
82
|
+
}
|
|
83
|
+
// ---- Grants -----------------------------------------------------------------------------
|
|
84
|
+
/** Gives a session access to the broker. The token is what a process outside the harness presents. */
|
|
85
|
+
grant(input) {
|
|
86
|
+
const session = { ...input, token: `${newId()}${newId()}` };
|
|
87
|
+
this.grants.set(session.token, session);
|
|
88
|
+
return session;
|
|
89
|
+
}
|
|
90
|
+
session(token) {
|
|
91
|
+
const session = this.grants.get(token);
|
|
92
|
+
if (!session)
|
|
93
|
+
throw new HarnessError('mcp_unauthorized', 'This MCP session is no longer authorized.');
|
|
94
|
+
return session;
|
|
95
|
+
}
|
|
96
|
+
revokeSession(sessionId) {
|
|
97
|
+
for (const [token, session] of this.grants)
|
|
98
|
+
if (session.sessionId === sessionId)
|
|
99
|
+
this.grants.delete(token);
|
|
100
|
+
for (const [key, proposal] of this.proposals)
|
|
101
|
+
if (proposal.sessionId === sessionId)
|
|
102
|
+
this.proposals.delete(key);
|
|
103
|
+
}
|
|
104
|
+
/** A run ended: its grants, previews, and open client sessions go with it. */
|
|
105
|
+
revokeRun(runId, sessionId) {
|
|
106
|
+
for (const [token, session] of this.grants)
|
|
107
|
+
if (session.runId === runId)
|
|
108
|
+
this.grants.delete(token);
|
|
109
|
+
for (const [key, proposal] of this.proposals)
|
|
110
|
+
if (proposal.runId === runId)
|
|
111
|
+
this.proposals.delete(key);
|
|
112
|
+
void this.manager.close(undefined, sessionId);
|
|
113
|
+
}
|
|
114
|
+
activeRun(session) {
|
|
115
|
+
const run = (session.runId ? this.options.runs.active(session.runId) : null) ?? this.options.runs.activeForSession(session.sessionId);
|
|
116
|
+
if (!run)
|
|
117
|
+
throw new HarnessError('run_not_active', 'The requesting run has ended.');
|
|
118
|
+
return run;
|
|
119
|
+
}
|
|
120
|
+
valid(session) {
|
|
121
|
+
if (this.grants.get(session.token) !== session)
|
|
122
|
+
throw new HarnessError('mcp_unauthorized', 'This MCP session is no longer authorized.');
|
|
123
|
+
}
|
|
124
|
+
// ---- What a session may reach ---------------------------------------------------------------
|
|
125
|
+
async reachable(session) {
|
|
126
|
+
const scoped = this.connections.forScope({ agentId: session.caller.agentId, projectId: session.caller.projectId });
|
|
127
|
+
const frozen = session.capabilities ? scoped.filter((connection) => session.capabilities.connectors.includes(connection.id)) : scoped;
|
|
128
|
+
const policy = this.options.policy.connections;
|
|
129
|
+
// Nothing to narrow: the application is not asked.
|
|
130
|
+
if (!policy || !frozen.length)
|
|
131
|
+
return frozen;
|
|
132
|
+
const ids = await policy({ sessionId: session.sessionId, runId: session.runId, caller: session.caller, connectionIds: frozen.map((connection) => connection.id) });
|
|
133
|
+
return frozen.filter((connection) => ids.includes(connection.id));
|
|
134
|
+
}
|
|
135
|
+
/** A diagnostic lists only the selected server; it never calls a connector tool. */
|
|
136
|
+
async diagnosticList(session, connectionId, signal) {
|
|
137
|
+
this.valid(session);
|
|
138
|
+
const connection = (await this.reachable(session)).find(item => item.id === connectionId);
|
|
139
|
+
if (!connection)
|
|
140
|
+
throw new HarnessError('doctor_blocked', 'The selected connector is outside this scope.');
|
|
141
|
+
signal.throwIfAborted();
|
|
142
|
+
const cancel = () => { void this.manager.close(connectionId, session.sessionId); };
|
|
143
|
+
signal.addEventListener('abort', cancel, { once: true });
|
|
144
|
+
try {
|
|
145
|
+
const config = await this.connections.launch(connection);
|
|
146
|
+
const client = await this.manager.client(session.sessionId, config);
|
|
147
|
+
signal.throwIfAborted();
|
|
148
|
+
return (await client.listTools({}, { signal, timeout: 15_000 })).tools.length;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
signal.removeEventListener('abort', cancel);
|
|
152
|
+
await this.manager.close(connectionId, session.sessionId);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** The application's tools and every reachable connection's tools, with the connections that could not be read. */
|
|
156
|
+
async list(session) {
|
|
157
|
+
const own = (await this.brokered?.list(session)) ?? [];
|
|
158
|
+
const discovered = await Promise.all((await this.reachable(session)).map(async (connection) => {
|
|
159
|
+
const tools = [];
|
|
160
|
+
let config = null;
|
|
161
|
+
try {
|
|
162
|
+
config = await this.connections.launch(connection);
|
|
163
|
+
const client = await this.manager.client(session.sessionId, config);
|
|
164
|
+
for (const tool of (await client.listTools({}, { timeout: 15000 })).tools) {
|
|
165
|
+
const alias = `mcp_${createHash('sha256').update(`${connection.id}:${tool.name}`).digest('hex').slice(0, 12)}_${tool.name.replace(/[^a-zA-Z0-9_]/g, '_').slice(0, 40)}`;
|
|
166
|
+
tools.push({ name: alias, description: `${connection.name}: ${tool.description ?? tool.name}`, inputSchema: tool.inputSchema, connectionId: connection.id, tool: tool.name });
|
|
167
|
+
}
|
|
168
|
+
if (client.getServerCapabilities()?.resources) {
|
|
169
|
+
for (const operation of ['list', 'read']) {
|
|
170
|
+
tools.push({
|
|
171
|
+
name: `mcp_${connection.id.replace(/-/g, '').slice(0, 12)}_resources_${operation}`,
|
|
172
|
+
description: `${connection.name}: ${operation} MCP resources`,
|
|
173
|
+
inputSchema: { type: 'object', properties: operation === 'read' ? { uri: { type: 'string' } } : {}, ...(operation === 'read' ? { required: ['uri'] } : {}) },
|
|
174
|
+
connectionId: connection.id,
|
|
175
|
+
tool: `resources/${operation}`
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return { tools, errors: [] };
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const unauthorized = isSignInRequired(error);
|
|
183
|
+
const message = unauthorized ? signInRequired(connection).message : `${connection.name} could not load its tools. Check its scope in Capability → Connectors.`;
|
|
184
|
+
if (unauthorized)
|
|
185
|
+
await this.manager.close(connection.id, session.sessionId);
|
|
186
|
+
this.connectionFailed(connection.id, unauthorized);
|
|
187
|
+
return { tools: [], errors: [{ connection: connection.name, message }] };
|
|
188
|
+
}
|
|
189
|
+
}));
|
|
190
|
+
return {
|
|
191
|
+
tools: [...own.map((tool) => ({ ...tool, origin: 'app', connectionId: '__app__', tool: tool.name })), ...discovered.flatMap((entry) => entry.tools)],
|
|
192
|
+
errors: discovered.flatMap((entry) => entry.errors)
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
connectionFailed(connectionId, unauthorized) {
|
|
196
|
+
try {
|
|
197
|
+
this.connections.update(connectionId, (item) => {
|
|
198
|
+
if (item.auth === 'oauth' && unauthorized) {
|
|
199
|
+
item.authState = 'expired';
|
|
200
|
+
item.error = `${item.name} needs you to sign in again.`;
|
|
201
|
+
}
|
|
202
|
+
else if (item.kind === 'remote') {
|
|
203
|
+
item.error = `${item.name} could not load its tools. Check its address and sign-in, then test or reconnect.`;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
item.error = `${item.name} could not load its tools. Check its executable and arguments, then test or reconnect.`;
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
this.connections.changed();
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// The connection was removed while it was being read.
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// ---- Calling ------------------------------------------------------------------------------
|
|
216
|
+
/** Runs one tool by the name `list` gave it. */
|
|
217
|
+
async invoke(session, alias, args) {
|
|
218
|
+
if (this.brokered?.has(alias)) {
|
|
219
|
+
const result = await this.brokered.call(session, alias, args);
|
|
220
|
+
const output = result;
|
|
221
|
+
return {
|
|
222
|
+
content: [{ type: 'text', text: output?.text ?? (typeof result === 'string' ? result : JSON.stringify(result)) }, ...(output?.image ? [{ type: 'image', ...output.image }] : [])],
|
|
223
|
+
...(!output?.image && result && typeof result === 'object' ? { structuredContent: Array.isArray(result) ? { result } : result } : {})
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const tool = (await this.list(session)).tools.find((candidate) => candidate.name === alias);
|
|
227
|
+
if (!tool)
|
|
228
|
+
throw new HarnessError('mcp_tool_unavailable', 'This MCP tool is unavailable or its connection was disabled.');
|
|
229
|
+
const toolCallId = randomUUID();
|
|
230
|
+
const config = await this.authorize(session, tool.connectionId, tool.tool, args, toolCallId);
|
|
231
|
+
try {
|
|
232
|
+
const client = await this.manager.client(session.sessionId, config);
|
|
233
|
+
const result = tool.tool === 'resources/list' ? await client.listResources() : tool.tool === 'resources/read' ? await client.readResource({ uri: String(args.uri) }) : await client.callTool({ name: tool.tool, arguments: args }, { timeout: 60000 });
|
|
234
|
+
this.completed(toolCallId, tool.tool, { result });
|
|
235
|
+
return result;
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
const message = error instanceof Error ? error.message : 'MCP call failed';
|
|
239
|
+
this.completed(toolCallId, tool.tool, { error: tool.tool === 'x_workspace_mutation_apply' ? 'Workspace apply did not return a confirmed result. Do not retry automatically; read the affected record to verify its state.' : message });
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/** Checks scope, asks for approval when the call is not a read, and returns how to reach the connection. */
|
|
244
|
+
async authorize(session, connectionId, tool, args, toolCallId) {
|
|
245
|
+
const run = this.activeRun(session);
|
|
246
|
+
const record = findRun(this.options.env.root, run.runId);
|
|
247
|
+
if (record) {
|
|
248
|
+
const scope = await this.options.policy.scope?.({ run: record, caller: session.caller, tool: 'connected_app', args });
|
|
249
|
+
if (scope && scope.automatic && !scope.allowed)
|
|
250
|
+
throw new HarnessError('outside_work_scope', scope.reason ?? 'Outside the approved work scope.');
|
|
251
|
+
}
|
|
252
|
+
const denied = () => new HarnessError('mcp_access_denied', 'This connection is disabled or unavailable to this agent.');
|
|
253
|
+
const connection = (await this.reachable(session)).find((item) => item.id === connectionId);
|
|
254
|
+
if (!connection)
|
|
255
|
+
throw denied();
|
|
256
|
+
const workspace = connection.kind === 'workspace';
|
|
257
|
+
const preview = workspace && tool === 'x_workspace_mutation_preview';
|
|
258
|
+
const apply = workspace && tool === 'x_workspace_mutation_apply';
|
|
259
|
+
const isRead = (workspace && WORKSPACE_READS.has(tool)) || (!apply && !preview && connection.readTools.includes(tool));
|
|
260
|
+
if (session.readOnly && !isRead)
|
|
261
|
+
throw new HarnessError('mcp_read_only', 'This session only permits reads from connected apps.');
|
|
262
|
+
let proposal;
|
|
263
|
+
if (apply) {
|
|
264
|
+
const approvalToken = typeof args.approvalToken === 'string' ? args.approvalToken : '';
|
|
265
|
+
const saved = this.proposals.get(approvalToken);
|
|
266
|
+
this.proposals.delete(approvalToken);
|
|
267
|
+
if (!saved)
|
|
268
|
+
throw new HarnessError('mcp_preview_required', 'Create a fresh preview in this run before applying.');
|
|
269
|
+
if (saved.sessionId !== session.sessionId || saved.runId !== run.runId || saved.connectionId !== connectionId || saved.expiresAt <= now())
|
|
270
|
+
throw new HarnessError('mcp_preview_required', 'This preview belongs to another run or has expired.');
|
|
271
|
+
proposal = saved.data;
|
|
272
|
+
}
|
|
273
|
+
run.emit('tool.started', { toolCallId, name: tool, summary: connection.name });
|
|
274
|
+
if (!isRead && !preview) {
|
|
275
|
+
const action = JSON.stringify(proposal ?? this.connections.scrub(args, connection.id), null, 2);
|
|
276
|
+
const decision = await run.requestApproval({ requestId: `mcp-${newId()}`, target: connection.name, action: `${tool}\n${action}`, standing: 'switch', timeoutMs: 300_000 });
|
|
277
|
+
if (decision !== 'approved') {
|
|
278
|
+
run.emit('tool.completed', { toolCallId, name: tool, ok: false });
|
|
279
|
+
throw new HarnessError('mcp_denied', 'The user denied the MCP operation or its approval expired.');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Access may have been revoked, or the run ended, while the request was waiting.
|
|
283
|
+
const current = (await this.reachable(session)).find((item) => item.id === connectionId);
|
|
284
|
+
if (!current)
|
|
285
|
+
throw new HarnessError('mcp_access_denied', 'Connection access was revoked while waiting.');
|
|
286
|
+
this.valid(session);
|
|
287
|
+
this.activeRun(session);
|
|
288
|
+
this.calls.set(toolCallId, { session, connection: current, runId: run.runId });
|
|
289
|
+
return this.connections.launch(current);
|
|
290
|
+
}
|
|
291
|
+
/** Records what an authorized call returned: a redacted trace with its sources, and the tool's outcome. */
|
|
292
|
+
completed(toolCallId, tool, outcome) {
|
|
293
|
+
const call = this.calls.get(toolCallId);
|
|
294
|
+
if (!call)
|
|
295
|
+
return;
|
|
296
|
+
this.calls.delete(toolCallId);
|
|
297
|
+
const { connection, session, runId } = call;
|
|
298
|
+
const result = (outcome.result ?? null);
|
|
299
|
+
const structured = result?.structuredContent;
|
|
300
|
+
const live = this.grants.get(session.token) === session && this.options.runs.active(runId) !== null;
|
|
301
|
+
if (tool === 'x_workspace_mutation_preview' && live && typeof structured?.data?.approvalToken === 'string') {
|
|
302
|
+
this.proposals.set(structured.data.approvalToken, { runId, sessionId: session.sessionId, connectionId: connection.id, data: this.connections.scrub(structured.data, connection.id), expiresAt: typeof structured.data.expiresAt === 'string' ? structured.data.expiresAt : '' });
|
|
303
|
+
}
|
|
304
|
+
const ok = outcome.error === undefined && result?.isError !== true;
|
|
305
|
+
const cleaned = this.connections.scrub(result, connection.id);
|
|
306
|
+
const raw = outcome.error === undefined ? JSON.stringify(cleaned) : String(this.connections.scrub(outcome.error, connection.id));
|
|
307
|
+
const found = cleaned?.structuredContent?.sources;
|
|
308
|
+
const sources = (Array.isArray(found) ? found : [])
|
|
309
|
+
.flatMap((source) => {
|
|
310
|
+
if (!source || typeof source.id !== 'string' || typeof source.title !== 'string' || typeof source.uri !== 'string')
|
|
311
|
+
return [];
|
|
312
|
+
const value = { id: source.id, title: source.title, uri: source.uri, path: typeof source.path === 'string' ? source.path : null };
|
|
313
|
+
for (const field of ['revision', 'excerpt', 'projectId'])
|
|
314
|
+
if (typeof source[field] === 'string')
|
|
315
|
+
value[field] = takeChars(source[field], 2000);
|
|
316
|
+
return [value];
|
|
317
|
+
})
|
|
318
|
+
.slice(0, 100);
|
|
319
|
+
const trace = { id: toolCallId, connectionId: connection.id, connectionName: connection.name, tool, at: now(), ok, summary: tool, result: takeChars(raw, 24000), sources, truncated: charCount(raw) > 24000 || structured?.truncated === true };
|
|
320
|
+
try {
|
|
321
|
+
const file = join(runDir(this.options.env.root, runId), 'mcp-context.json');
|
|
322
|
+
writeJson(file, [...(readJson(file) ?? []), trace]);
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
// The call happened; a trace that cannot be written does not undo it.
|
|
326
|
+
}
|
|
327
|
+
this.options.runs.active(runId)?.emit('tool.completed', { toolCallId, name: tool, ok });
|
|
328
|
+
}
|
|
329
|
+
/** What a run retrieved from connected apps, in order. */
|
|
330
|
+
runContext(runId) {
|
|
331
|
+
return readJson(join(runDir(this.options.env.root, runId), 'mcp-context.json')) ?? [];
|
|
332
|
+
}
|
|
333
|
+
/** Changes whenever what a session can discover may have changed. */
|
|
334
|
+
async revision(session) {
|
|
335
|
+
return { connections: this.connections.revision(), tools: (await this.brokered?.revision?.(session)) ?? null };
|
|
336
|
+
}
|
|
337
|
+
// ---- The two tools a session gets -------------------------------------------------------------
|
|
338
|
+
tools(session, options) {
|
|
339
|
+
const granted = this.grant({ sessionId: session.run.sessionId, runId: session.run.runId, caller: session.caller, readOnly: options.readOnly, depth: session.depth, capabilities: session.capabilities });
|
|
340
|
+
return this.brokerTools(granted);
|
|
341
|
+
}
|
|
342
|
+
/** `mcp_list_tools` and `mcp_call_tool` bound to a granted session. */
|
|
343
|
+
brokerTools(session) {
|
|
344
|
+
return [
|
|
345
|
+
{
|
|
346
|
+
name: 'mcp_list_tools',
|
|
347
|
+
label: 'App and connector tools',
|
|
348
|
+
description: `Discover enabled ${this.options.env.productName} app operations and connector tools by name. Pass tool to get one tool with its input schema.${this.brokered?.discoveryNote ? ` ${this.brokered.discoveryNote}` : ''}`,
|
|
349
|
+
parameters: (Type) => Type.Object({
|
|
350
|
+
tool: Type.Optional(Type.String({ description: 'One tool name, to get its input schema.' })),
|
|
351
|
+
query: Type.Optional(Type.String({ description: 'Only tools whose name or description contains this text.' })),
|
|
352
|
+
offset: Type.Optional(Type.Integer({ minimum: 0, description: 'Where to continue a long list (nextOffset from the previous page).' }))
|
|
353
|
+
}),
|
|
354
|
+
execute: async (input) => {
|
|
355
|
+
const listed = await this.list(session);
|
|
356
|
+
const wanted = typeof input.tool === 'string' && input.tool ? input.tool : undefined;
|
|
357
|
+
if (wanted)
|
|
358
|
+
return JSON.stringify({ ...listed, tools: compactTools(listed.tools, wanted) });
|
|
359
|
+
const page = pageTools(listed.tools, { query: typeof input.query === 'string' ? input.query : undefined, offset: typeof input.offset === 'number' ? input.offset : undefined });
|
|
360
|
+
return JSON.stringify({ ...listed, ...page, note: `Names and summaries only. Call mcp_list_tools with tool for the input schema before the first call to that tool.${page.more ? ' More tools match: pass offset, and query to narrow the list.' : ''}` });
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
name: 'mcp_call_tool',
|
|
365
|
+
label: 'Use connector',
|
|
366
|
+
description: 'Invoke an enabled app or connector tool returned by mcp_list_tools. Current settings are checked on every call. Changes require approval.',
|
|
367
|
+
parameters: (Type) => Type.Object({ name: Type.String(), arguments: Type.Record(Type.String(), Type.Unknown()) }),
|
|
368
|
+
execute: async (input) => JSON.stringify(await this.invoke(session, String(input.name), (input.arguments ?? {})))
|
|
369
|
+
}
|
|
370
|
+
];
|
|
371
|
+
}
|
|
372
|
+
// ---- What a person does on the Connections screen ---------------------------------------------
|
|
373
|
+
async save(input) {
|
|
374
|
+
const connection = await this.connections.save(input);
|
|
375
|
+
this.cancelConnection(connection.id);
|
|
376
|
+
return connection;
|
|
377
|
+
}
|
|
378
|
+
async remove(connectionId) {
|
|
379
|
+
await this.connections.remove(connectionId);
|
|
380
|
+
this.cancelConnection(connectionId);
|
|
381
|
+
}
|
|
382
|
+
cancelConnection(connectionId) {
|
|
383
|
+
for (const [key, proposal] of this.proposals)
|
|
384
|
+
if (proposal.connectionId === connectionId)
|
|
385
|
+
this.proposals.delete(key);
|
|
386
|
+
void this.manager.close(connectionId);
|
|
387
|
+
}
|
|
388
|
+
/** Connects once and records what the server offers, or why it could not be reached. */
|
|
389
|
+
async test(connectionId) {
|
|
390
|
+
const connection = this.connections.find(connectionId);
|
|
391
|
+
let probed = null;
|
|
392
|
+
let failure = null;
|
|
393
|
+
try {
|
|
394
|
+
probed = await this.manager.probe(await this.connections.launch(connection));
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
failure = error;
|
|
398
|
+
}
|
|
399
|
+
if (JSON.stringify(this.connections.find(connectionId)) !== JSON.stringify(connection))
|
|
400
|
+
throw new HarnessError('mcp_config_changed', 'Connection changed during its test. Test the saved connection again.');
|
|
401
|
+
const updated = this.connections.update(connectionId, (item) => {
|
|
402
|
+
item.checkedAt = now();
|
|
403
|
+
if (probed) {
|
|
404
|
+
item.serverName = probed.serverName;
|
|
405
|
+
item.tools = probed.tools;
|
|
406
|
+
item.error = null;
|
|
407
|
+
if (item.kind === 'workspace' && !item.expectedVaultId)
|
|
408
|
+
item.expectedVaultId = probed.vaultId;
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
if (isSignInRequired(failure) && item.auth === 'oauth' && item.authState === 'signed_in')
|
|
412
|
+
item.authState = 'expired';
|
|
413
|
+
item.error = failure instanceof Error ? failure.message : String(failure);
|
|
414
|
+
item.tools = [];
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
this.connections.changed();
|
|
418
|
+
return updated;
|
|
419
|
+
}
|
|
420
|
+
/** Signs in with the provider in a browser. Only a person starts this; a session that finds an expired sign-in reports it. */
|
|
421
|
+
async signIn(connectionId) {
|
|
422
|
+
const connection = this.connections.find(connectionId);
|
|
423
|
+
if (connection.kind !== 'remote' || connection.auth !== 'oauth')
|
|
424
|
+
throw invalid('This connection does not use browser sign-in.');
|
|
425
|
+
if (!(await this.connections.hasSignInClient(connection))) {
|
|
426
|
+
throw invalid(connection.oauthClient === 'app'
|
|
427
|
+
? 'This connector has no app sign-in in this build. Enable its OAuth client or use your own client.'
|
|
428
|
+
: 'Add your OAuth client ID before signing in.');
|
|
429
|
+
}
|
|
430
|
+
await signIn(this.oauth, (await this.connections.launch(connection)));
|
|
431
|
+
const updated = this.connections.update(connectionId, (item) => Object.assign(item, { authState: 'signed_in', error: null }));
|
|
432
|
+
await this.manager.close(connectionId);
|
|
433
|
+
this.connections.changed();
|
|
434
|
+
return updated;
|
|
435
|
+
}
|
|
436
|
+
/** The catalog entries this application can sign in for, so a client need not be added by hand. */
|
|
437
|
+
appClients() {
|
|
438
|
+
return { catalogIds: this.connections.availableAppClients() };
|
|
439
|
+
}
|
|
440
|
+
async signOut(connectionId) {
|
|
441
|
+
const updated = await this.connections.signOut(connectionId);
|
|
442
|
+
this.cancelConnection(connectionId);
|
|
443
|
+
return updated;
|
|
444
|
+
}
|
|
445
|
+
/** Reads one retrieved source again from the Xingular Workspace connection it came from. */
|
|
446
|
+
async refreshSource(runId, traceId, sourceUri) {
|
|
447
|
+
const trace = this.runContext(runId).find((entry) => entry.id === traceId);
|
|
448
|
+
if (!trace)
|
|
449
|
+
throw notFound('Retrieved context');
|
|
450
|
+
const source = trace.sources.find((entry) => entry.uri === sourceUri);
|
|
451
|
+
if (!source)
|
|
452
|
+
throw notFound('Source');
|
|
453
|
+
const connection = this.connections.list().find((item) => item.enabled && item.kind === 'workspace' && item.id === trace.connectionId);
|
|
454
|
+
if (!connection)
|
|
455
|
+
throw new HarnessError('mcp_access_denied', 'Enable the original Xingular Workspace connection to refresh this source.');
|
|
456
|
+
const kind = sourceUri.split('/')[3] ?? '';
|
|
457
|
+
const [tool, args] = kind.startsWith('note')
|
|
458
|
+
? ['x_workspace_note_read', { path: source.path ?? source.id }]
|
|
459
|
+
: kind.startsWith('task')
|
|
460
|
+
? ['x_workspace_task_get', { id: source.id }]
|
|
461
|
+
: kind.startsWith('project')
|
|
462
|
+
? ['x_workspace_project_get', { id: source.id }]
|
|
463
|
+
: kind.startsWith('resource')
|
|
464
|
+
? ['x_workspace_resource_get', { id: source.id }]
|
|
465
|
+
: ['x_workspace_context', { query: source.title || source.id }];
|
|
466
|
+
return this.connections.scrub(await this.manager.readSource(await this.connections.launch(connection), tool, args), connection.id);
|
|
467
|
+
}
|
|
468
|
+
/** Gives one agent exactly these connections, if its creator may reach each of them. */
|
|
469
|
+
setAgentScope(creator, agentId, ids) {
|
|
470
|
+
const all = this.connections.list();
|
|
471
|
+
for (const id of ids) {
|
|
472
|
+
const connection = all.find((item) => item.id === id);
|
|
473
|
+
if (!connection)
|
|
474
|
+
throw notFound('Connection');
|
|
475
|
+
if (!allowed(connection, creator))
|
|
476
|
+
throw new HarnessError('required_connections_unavailable', `${connection.name} is disabled or outside your connection scope.`);
|
|
477
|
+
}
|
|
478
|
+
return this.connections.setAgentScope(agentId, ids);
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* A call with no session and nobody to ask, made by a plugin's hook. It reaches a connection
|
|
482
|
+
* only when it is on for everyone, and a tool only when a person marked it to run without asking.
|
|
483
|
+
*/
|
|
484
|
+
async callUnattended(reference, tool, args = {}) {
|
|
485
|
+
const connection = this.connections.list().find((item) => item.id === reference || item.name === reference);
|
|
486
|
+
if (!connection || !allowed(connection, {}))
|
|
487
|
+
throw new HarnessError('mcp_access_denied', `There is no connected app called "${reference}" that is on for everyone.`);
|
|
488
|
+
// A change to the first-party workspace is previewed and approved by a person, never run from a hook.
|
|
489
|
+
if (!connection.readTools.includes(tool) || tool.startsWith('x_workspace_mutation')) {
|
|
490
|
+
throw new HarnessError('mcp_denied', `${connection.name} asks before running "${tool}". Mark it to run without asking in the connection's settings to let a plugin use it.`);
|
|
491
|
+
}
|
|
492
|
+
const client = await this.manager.client(UNATTENDED_SCOPE, await this.connections.launch(connection));
|
|
493
|
+
return client.callTool({ name: tool, arguments: args }, { timeout: 60000 });
|
|
494
|
+
}
|
|
495
|
+
/** Switches one saved connection on or off for everyone, one agent, or one project. */
|
|
496
|
+
attach(connectionId, scope, on) {
|
|
497
|
+
const connection = this.connections.find(connectionId);
|
|
498
|
+
if (!connection.enabled)
|
|
499
|
+
throw invalid(`${connection.name} is switched off. Switch it on in its own settings first.`);
|
|
500
|
+
this.connections.setScope(connectionId, scope, on);
|
|
501
|
+
}
|
|
502
|
+
/** Forgets an agent that no longer exists. */
|
|
503
|
+
removeAgentScope(agentId) {
|
|
504
|
+
this.connections.removeAgentScope(agentId);
|
|
505
|
+
}
|
|
506
|
+
async close() {
|
|
507
|
+
await this.manager.close(undefined, UNATTENDED_SCOPE).catch(() => undefined);
|
|
508
|
+
await this.manager.close();
|
|
509
|
+
}
|
|
510
|
+
}
|