@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,32 @@
|
|
|
1
|
+
# Xingular Agent Brave bridge
|
|
2
|
+
|
|
3
|
+
This unpacked extension lets Harness use Brave's existing tabs through a short-lived loopback connection. It does not enable remote debugging on your profile and does not use Native Messaging.
|
|
4
|
+
|
|
5
|
+
## Install and connect
|
|
6
|
+
|
|
7
|
+
1. In Brave, open `brave://extensions`, turn on **Developer mode**, and choose **Load unpacked**. Select this `browser-extension` folder. In a packaged App install, use the unpacked extension folder shown in App Browser settings.
|
|
8
|
+
2. Select **Brave profile** in Harness Browser settings. This uses your signed-in profile, so pages may contain private account information. Harness will not switch to the isolated browser if Brave disconnects.
|
|
9
|
+
3. Choose **Start bridge** (or the equivalent connection action) in Harness Browser settings. Copy the one-time `port:code` shown there; it expires after five minutes.
|
|
10
|
+
4. Open the Xingular Agent extension from Brave's toolbar, paste the code, and connect.
|
|
11
|
+
5. Open a normal tab on the site you want Harness to use. Open the extension popup and choose **Allow this site**. Repeat only for sites you want the agent to reach.
|
|
12
|
+
|
|
13
|
+
The extension records the exact origin you allow, including its port, and checks that record for each tab. Chrome's underlying host permission can cover every port on that host, but other origins remain blocked by the extension. Incognito is disabled. The extension does not request cookie or history access. Site permission is separate from Harness tool permissions and from the per-action approvals for sending, buying, deleting, account changes, or granting access.
|
|
14
|
+
|
|
15
|
+
## Pause and stop
|
|
16
|
+
|
|
17
|
+
The in-page badge appears on allowed tabs while the bridge is connected. **Pause** prevents new browser calls until resumed; an action already in flight may finish. **Stop** disconnects the extension and removes the badge. Removing a site's permission in the extension popup also makes its tabs unavailable.
|
|
18
|
+
|
|
19
|
+
A lost connection makes Brave browser calls fail with a reconnect message. Harness does not fall back to its isolated browser.
|
|
20
|
+
|
|
21
|
+
## Permission warning
|
|
22
|
+
|
|
23
|
+
Brave requires the extension's `debugger` permission to inspect accessibility structure, capture screenshots, and send real input to a tab. Brave may show a broad permission warning at install time. The extension uses that ability only for normal tabs on sites you separately allowed in its popup. Close DevTools on a tab if Brave refuses debugger attachment. Do not install an unpacked extension from a source you do not trust.
|
|
24
|
+
|
|
25
|
+
The bridge listens only on `127.0.0.1`, accepts pairing only from a browser extension origin, and requires a random bearer token for each later call. It rejects a mismatched Origin when one is supplied; extension service-worker requests may omit Origin. The bridge stores its token in the Harness state directory with owner-only file permissions. The pairing code is not a permanent credential. The extension stores the token locally so it can reconnect after a normal Harness restart; **Stop** revokes it. Because Chrome host permissions do not narrow to ports, the extension keeps exact allowed origins separately and checks that list before exposing tabs; its loopback bridge permission alone never authorizes a site.
|
|
26
|
+
|
|
27
|
+
## Limits
|
|
28
|
+
|
|
29
|
+
- Only `http` and `https` sites can be granted. Browser-internal pages and Incognito tabs are unavailable.
|
|
30
|
+
- `browser_upload` stays with the App's isolated WebKit browser and is not offered while Brave is selected.
|
|
31
|
+
- Brave may refuse control of a tab while DevTools or another debugger is attached.
|
|
32
|
+
- A tab that leaves a site you allowed becomes unavailable to the agent until you separately allow its new site.
|
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
importScripts('site-access.js')
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PORT = 38671
|
|
4
|
+
const MAX_TEXT = 100_000
|
|
5
|
+
const attached = new Set()
|
|
6
|
+
const generations = new Map()
|
|
7
|
+
const agentCreatedTabs = new Set()
|
|
8
|
+
const eventWaiters = new Map()
|
|
9
|
+
let pollTask = null
|
|
10
|
+
let pollRestartRequested = false
|
|
11
|
+
let bridgeOnline = false
|
|
12
|
+
|
|
13
|
+
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
|
|
14
|
+
const keyFor = id => String(id)
|
|
15
|
+
const send = (tabId, method, params = {}) => chrome.debugger.sendCommand({ tabId }, method, params)
|
|
16
|
+
|
|
17
|
+
async function saved() {
|
|
18
|
+
return chrome.storage.local.get(['bridgePort', 'bridgeToken', 'paused'])
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function siteAllowed(url) {
|
|
22
|
+
return XingularSiteAccess.allowed(url)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function tabAvailable(tab) {
|
|
26
|
+
if (!tab || tab.incognito || !Number.isInteger(tab.id)) return false
|
|
27
|
+
if (tab.url === 'about:blank' && agentCreatedTabs.has(tab.id)) return true
|
|
28
|
+
return siteAllowed(tab.url || '')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function listTabs() {
|
|
32
|
+
const tabs = await chrome.tabs.query({})
|
|
33
|
+
const result = []
|
|
34
|
+
for (const tab of tabs) {
|
|
35
|
+
if (!await tabAvailable(tab)) continue
|
|
36
|
+
result.push({
|
|
37
|
+
tabId: tab.id,
|
|
38
|
+
url: tab.url || 'about:blank',
|
|
39
|
+
title: tab.title || '',
|
|
40
|
+
active: tab.active === true,
|
|
41
|
+
generation: generations.get(keyFor(tab.id)) || 0
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
return result
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function tellTab(tabId, message) {
|
|
48
|
+
try {
|
|
49
|
+
await chrome.tabs.sendMessage(tabId, message)
|
|
50
|
+
} catch {}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function syncTab(tabId) {
|
|
54
|
+
const config = await saved()
|
|
55
|
+
const tab = await chrome.tabs.get(tabId).catch(() => null)
|
|
56
|
+
if (!bridgeOnline || !config.bridgeToken || !tab || !await tabAvailable(tab)) {
|
|
57
|
+
await tellTab(tabId, { type: 'clear' })
|
|
58
|
+
if (tab && !await tabAvailable(tab)) await detach(tabId)
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
await chrome.scripting.executeScript({ target: { tabId }, files: ['overlay.js'] })
|
|
63
|
+
await tellTab(tabId, { type: 'badge', paused: config.paused === true })
|
|
64
|
+
} catch {}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function syncAllTabs() {
|
|
68
|
+
const tabs = await chrome.tabs.query({})
|
|
69
|
+
for (const tab of tabs) if (Number.isInteger(tab.id)) await syncTab(tab.id)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function clearAllBadges() {
|
|
73
|
+
const tabs = await chrome.tabs.query({})
|
|
74
|
+
for (const tab of tabs) if (Number.isInteger(tab.id)) await tellTab(tab.id, { type: 'clear' })
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function nextGeneration(tabId) {
|
|
78
|
+
const key = keyFor(tabId)
|
|
79
|
+
const next = (generations.get(key) || 0) + 1
|
|
80
|
+
generations.set(key, next)
|
|
81
|
+
return next
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function attach(tabId) {
|
|
85
|
+
const tab = await chrome.tabs.get(tabId)
|
|
86
|
+
if (!await tabAvailable(tab)) throw new Error('This tab is not on a site you allowed in the Brave extension.')
|
|
87
|
+
if (attached.has(tabId)) return
|
|
88
|
+
try {
|
|
89
|
+
await chrome.debugger.attach({ tabId }, '1.3')
|
|
90
|
+
attached.add(tabId)
|
|
91
|
+
generations.set(keyFor(tabId), generations.get(keyFor(tabId)) || 0)
|
|
92
|
+
await send(tabId, 'Page.enable')
|
|
93
|
+
await send(tabId, 'Runtime.enable')
|
|
94
|
+
await send(tabId, 'DOM.enable')
|
|
95
|
+
await send(tabId, 'Accessibility.enable')
|
|
96
|
+
} catch (error) {
|
|
97
|
+
attached.delete(tabId)
|
|
98
|
+
const detail = String(error?.message || error)
|
|
99
|
+
if (/already attached|another debugger/i.test(detail)) throw new Error('Brave could not attach to this tab because another debugger is using it. Close DevTools on the tab and try again.')
|
|
100
|
+
throw new Error(`Brave could not attach to this tab: ${detail}`)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function detach(tabId) {
|
|
105
|
+
if (!attached.has(tabId)) return
|
|
106
|
+
attached.delete(tabId)
|
|
107
|
+
try {
|
|
108
|
+
await chrome.debugger.detach({ tabId })
|
|
109
|
+
} catch {}
|
|
110
|
+
nextGeneration(tabId)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function waitForTabComplete(tabId, timeout = 25_000) {
|
|
114
|
+
return new Promise(resolve => {
|
|
115
|
+
let settled = false
|
|
116
|
+
const finish = () => {
|
|
117
|
+
if (settled) return
|
|
118
|
+
settled = true
|
|
119
|
+
clearTimeout(timer)
|
|
120
|
+
chrome.tabs.onUpdated.removeListener(onUpdated)
|
|
121
|
+
resolve()
|
|
122
|
+
}
|
|
123
|
+
const onUpdated = (id, info) => { if (id === tabId && info.status === 'complete') finish() }
|
|
124
|
+
const timer = setTimeout(finish, timeout)
|
|
125
|
+
chrome.tabs.onUpdated.addListener(onUpdated)
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function waitForDebuggerEvent(tabId, method, timeout = 25_000) {
|
|
130
|
+
return new Promise(resolve => {
|
|
131
|
+
const key = `${tabId}:${method}`
|
|
132
|
+
let settled = false
|
|
133
|
+
const finish = () => {
|
|
134
|
+
if (settled) return
|
|
135
|
+
settled = true
|
|
136
|
+
clearTimeout(timer)
|
|
137
|
+
const entries = eventWaiters.get(key) || []
|
|
138
|
+
eventWaiters.set(key, entries.filter(entry => entry !== finish))
|
|
139
|
+
resolve()
|
|
140
|
+
}
|
|
141
|
+
const timer = setTimeout(finish, timeout)
|
|
142
|
+
const entries = eventWaiters.get(key) || []
|
|
143
|
+
entries.push(finish)
|
|
144
|
+
eventWaiters.set(key, entries)
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function notifyDebuggerEvent(tabId, method) {
|
|
149
|
+
const key = `${tabId}:${method}`
|
|
150
|
+
for (const finish of eventWaiters.get(key) || []) finish()
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function cdpValue(result) {
|
|
154
|
+
if (result?.exceptionDetails) throw new Error(result.exceptionDetails.exception?.description || result.exceptionDetails.text || 'The page operation failed.')
|
|
155
|
+
return result?.result?.value
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function resolveNode(tabId, backendDOMNodeId) {
|
|
159
|
+
const resolved = await send(tabId, 'DOM.resolveNode', { backendNodeId: backendDOMNodeId })
|
|
160
|
+
if (!resolved?.object?.objectId) throw new Error('That page element is no longer available. Take a fresh snapshot.')
|
|
161
|
+
return resolved.object.objectId
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async function callOnNode(tabId, backendDOMNodeId, functionDeclaration, args = []) {
|
|
165
|
+
const objectId = await resolveNode(tabId, backendDOMNodeId)
|
|
166
|
+
try {
|
|
167
|
+
const result = await send(tabId, 'Runtime.callFunctionOn', {
|
|
168
|
+
objectId,
|
|
169
|
+
functionDeclaration,
|
|
170
|
+
arguments: args,
|
|
171
|
+
returnByValue: true,
|
|
172
|
+
awaitPromise: true
|
|
173
|
+
})
|
|
174
|
+
return cdpValue(result)
|
|
175
|
+
} finally {
|
|
176
|
+
await send(tabId, 'Runtime.releaseObject', { objectId }).catch(() => {})
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async function boxFor(tabId, backendDOMNodeId) {
|
|
181
|
+
const result = await send(tabId, 'DOM.getBoxModel', { backendNodeId: backendDOMNodeId })
|
|
182
|
+
const quad = result?.model?.content
|
|
183
|
+
if (!Array.isArray(quad) || quad.length < 8) throw new Error('That page element is not visible.')
|
|
184
|
+
const xs = [quad[0], quad[2], quad[4], quad[6]]
|
|
185
|
+
const ys = [quad[1], quad[3], quad[5], quad[7]]
|
|
186
|
+
const x = (Math.min(...xs) + Math.max(...xs)) / 2
|
|
187
|
+
const y = (Math.min(...ys) + Math.max(...ys)) / 2
|
|
188
|
+
const width = Math.max(...xs) - Math.min(...xs)
|
|
189
|
+
const height = Math.max(...ys) - Math.min(...ys)
|
|
190
|
+
if (![x, y, width, height].every(Number.isFinite) || width <= 0 || height <= 0) throw new Error('That page element is not visible.')
|
|
191
|
+
return { x, y, width, height }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function keyInfo(input) {
|
|
195
|
+
const parts = input.split('+').map(part => part.trim()).filter(Boolean)
|
|
196
|
+
const key = parts.pop() || ''
|
|
197
|
+
const modifiers = new Set(parts.map(part => part.toLowerCase()))
|
|
198
|
+
const modifierBits = (modifiers.has('alt') ? 1 : 0) | (modifiers.has('control') || modifiers.has('ctrl') ? 2 : 0) | (modifiers.has('meta') || modifiers.has('command') || modifiers.has('cmd') ? 4 : 0) | (modifiers.has('shift') ? 8 : 0)
|
|
199
|
+
const named = {
|
|
200
|
+
Enter: ['Enter', 'Enter', 13], Escape: ['Escape', 'Escape', 27], Tab: ['Tab', 'Tab', 9],
|
|
201
|
+
Backspace: ['Backspace', 'Backspace', 8], Delete: ['Delete', 'Delete', 46],
|
|
202
|
+
ArrowDown: ['ArrowDown', 'ArrowDown', 40], ArrowUp: ['ArrowUp', 'ArrowUp', 38],
|
|
203
|
+
ArrowLeft: ['ArrowLeft', 'ArrowLeft', 37], ArrowRight: ['ArrowRight', 'ArrowRight', 39],
|
|
204
|
+
Home: ['Home', 'Home', 36], End: ['End', 'End', 35], PageDown: ['PageDown', 'PageDown', 34],
|
|
205
|
+
PageUp: ['PageUp', 'PageUp', 33], Space: [' ', 'Space', 32]
|
|
206
|
+
}
|
|
207
|
+
if (named[key]) return { key: named[key][0], code: named[key][1], keyCode: named[key][2], modifiers: modifierBits }
|
|
208
|
+
if (/^[a-z]$/i.test(key)) return { key: modifiers.has('shift') ? key.toUpperCase() : key.toLowerCase(), code: `Key${key.toUpperCase()}`, keyCode: key.toUpperCase().charCodeAt(0), modifiers: modifierBits }
|
|
209
|
+
if (/^F(?:[1-9]|1[0-2])$/.test(key)) return { key, code: key, keyCode: 111 + Number(key.slice(1)), modifiers: modifierBits }
|
|
210
|
+
throw new Error(`Brave does not recognize the key ${key}.`)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async function pressKey(tabId, input) {
|
|
214
|
+
const info = keyInfo(input)
|
|
215
|
+
await send(tabId, 'Input.dispatchKeyEvent', { type: 'keyDown', key: info.key, code: info.code, windowsVirtualKeyCode: info.keyCode, nativeVirtualKeyCode: info.keyCode, modifiers: info.modifiers })
|
|
216
|
+
await send(tabId, 'Input.dispatchKeyEvent', { type: 'keyUp', key: info.key, code: info.code, windowsVirtualKeyCode: info.keyCode, nativeVirtualKeyCode: info.keyCode, modifiers: info.modifiers })
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async function currentTab(tabId) {
|
|
220
|
+
const tab = await chrome.tabs.get(tabId).catch(() => null)
|
|
221
|
+
if (!tab || !await tabAvailable(tab)) throw new Error('This Brave tab is no longer available. It may have closed or moved to a site you have not allowed.')
|
|
222
|
+
return tab
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async function navigate(tabId, url) {
|
|
226
|
+
let target
|
|
227
|
+
try { target = new URL(url) } catch { throw new Error('Give a valid web address.') }
|
|
228
|
+
if (!['http:', 'https:'].includes(target.protocol)) throw new Error('Brave can only open http and https addresses.')
|
|
229
|
+
if (!await siteAllowed(target.href)) throw new Error(`Site access is not enabled for ${target.origin}. Use the Brave extension popup to allow this site first; nothing was done.`)
|
|
230
|
+
const wait = waitForTabComplete(tabId)
|
|
231
|
+
const result = await send(tabId, 'Page.navigate', { url: target.href })
|
|
232
|
+
if (result?.errorText) throw new Error(`Brave could not open the page: ${result.errorText}`)
|
|
233
|
+
await wait
|
|
234
|
+
return null
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async function accessibilityTree(tabId, depth) {
|
|
238
|
+
const result = await send(tabId, 'Accessibility.getFullAXTree', { depth: Math.max(1, Math.min(40, Number(depth) || 12)) })
|
|
239
|
+
const raw = Array.isArray(result?.nodes) ? result.nodes : []
|
|
240
|
+
const byId = new Map(raw.map(node => [String(node.nodeId), node]))
|
|
241
|
+
const hiddenIds = new Set()
|
|
242
|
+
const hiddenNames = new Set(['Xingular Agent browser controls', 'Pause browser control', 'Resume browser control', 'Stop browser control'])
|
|
243
|
+
const pending = raw.filter(node => hiddenNames.has(String(node.name?.value || ''))).map(node => String(node.nodeId))
|
|
244
|
+
while (pending.length) {
|
|
245
|
+
const id = pending.pop()
|
|
246
|
+
if (hiddenIds.has(id)) continue
|
|
247
|
+
hiddenIds.add(id)
|
|
248
|
+
const node = byId.get(id)
|
|
249
|
+
for (const childId of node?.childIds || []) pending.push(String(childId))
|
|
250
|
+
}
|
|
251
|
+
const children = new Map()
|
|
252
|
+
for (const node of raw) {
|
|
253
|
+
if (node.parentId) {
|
|
254
|
+
const siblings = children.get(node.parentId) || []
|
|
255
|
+
siblings.push(node.nodeId)
|
|
256
|
+
children.set(node.parentId, siblings)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return raw.filter(node => !hiddenIds.has(String(node.nodeId))).map(node => {
|
|
260
|
+
const level = node.properties?.find(property => property.name === 'level')?.value?.value
|
|
261
|
+
return {
|
|
262
|
+
nodeId: String(node.nodeId),
|
|
263
|
+
parentId: node.parentId ? String(node.parentId) : undefined,
|
|
264
|
+
childIds: (node.childIds || children.get(node.nodeId) || []).map(String),
|
|
265
|
+
role: String(node.role?.value || 'text'),
|
|
266
|
+
name: String(node.name?.value || ''),
|
|
267
|
+
level: Number.isInteger(level) ? level : undefined,
|
|
268
|
+
backendDOMNodeId: Number.isInteger(node.backendDOMNodeId) ? node.backendDOMNodeId : undefined,
|
|
269
|
+
ignored: node.ignored === true
|
|
270
|
+
}
|
|
271
|
+
})
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async function executeElement(tabId, operation) {
|
|
275
|
+
if (!Number.isInteger(operation.generation) || operation.generation !== (generations.get(keyFor(tabId)) || 0)) throw new Error(`The page in b${Number(tabId).toString(36)} changed since its snapshot. Take browser_snapshot again.`)
|
|
276
|
+
const backendDOMNodeId = Number(operation.backendDOMNodeId)
|
|
277
|
+
if (!Number.isInteger(backendDOMNodeId)) throw new Error('Take browser_snapshot and choose one of its refs.')
|
|
278
|
+
const method = operation.method
|
|
279
|
+
if (method === 'click') {
|
|
280
|
+
const button = ['right', 'middle'].includes(operation.button) ? operation.button : 'left'
|
|
281
|
+
const { x, y } = await boxFor(tabId, backendDOMNodeId)
|
|
282
|
+
const count = operation.double === true ? 2 : 1
|
|
283
|
+
for (let index = 1; index <= count; index++) {
|
|
284
|
+
await send(tabId, 'Input.dispatchMouseEvent', { type: 'mouseMoved', x, y, button })
|
|
285
|
+
await send(tabId, 'Input.dispatchMouseEvent', { type: 'mousePressed', x, y, button, clickCount: index })
|
|
286
|
+
await send(tabId, 'Input.dispatchMouseEvent', { type: 'mouseReleased', x, y, button, clickCount: index })
|
|
287
|
+
}
|
|
288
|
+
await tellTab(tabId, { type: 'pulse', x, y })
|
|
289
|
+
return null
|
|
290
|
+
}
|
|
291
|
+
if (method === 'evaluate') {
|
|
292
|
+
const declaration = typeof operation.functionDeclaration === 'string' ? operation.functionDeclaration.slice(0, 4000) : ''
|
|
293
|
+
if (!declaration.startsWith('function(){ return (')) throw new Error('This page check is not supported.')
|
|
294
|
+
return callOnNode(tabId, backendDOMNodeId, declaration)
|
|
295
|
+
}
|
|
296
|
+
if (method === 'fill') {
|
|
297
|
+
const sensitivity = await callOnNode(tabId, backendDOMNodeId, `function(){
|
|
298
|
+
const type=(this.getAttribute('type')||'').toLowerCase();
|
|
299
|
+
const autocomplete=(this.getAttribute('autocomplete')||'').toLowerCase();
|
|
300
|
+
return type==='password' || /cc-|one-time-code|current-password|new-password/.test(autocomplete) || /card number|security code|password|one.?time/i.test((this.getAttribute('aria-label')||'')+' '+(this.getAttribute('name')||'')+' '+(this.getAttribute('placeholder')||''));
|
|
301
|
+
}`)
|
|
302
|
+
if (sensitivity) throw new Error('That field takes a password, a card number or a code. Ask the user to fill it themselves.')
|
|
303
|
+
const accepted = await callOnNode(tabId, backendDOMNodeId, `function(){
|
|
304
|
+
if (!(this instanceof HTMLInputElement || this instanceof HTMLTextAreaElement || this.isContentEditable)) return false;
|
|
305
|
+
this.focus();
|
|
306
|
+
if (typeof this.select === 'function') this.select();
|
|
307
|
+
return true;
|
|
308
|
+
}`)
|
|
309
|
+
if (!accepted) throw new Error('That ref is not a text field.')
|
|
310
|
+
await send(tabId, 'Input.dispatchKeyEvent', { type: 'keyDown', key: 'a', code: 'KeyA', modifiers: 2, windowsVirtualKeyCode: 65, nativeVirtualKeyCode: 65 })
|
|
311
|
+
await send(tabId, 'Input.dispatchKeyEvent', { type: 'keyUp', key: 'a', code: 'KeyA', modifiers: 2, windowsVirtualKeyCode: 65, nativeVirtualKeyCode: 65 })
|
|
312
|
+
await send(tabId, 'Input.insertText', { text: String(operation.text || '') })
|
|
313
|
+
return null
|
|
314
|
+
}
|
|
315
|
+
if (method === 'press') {
|
|
316
|
+
if (Number.isInteger(backendDOMNodeId)) await callOnNode(tabId, backendDOMNodeId, 'function(){ this.focus(); return true; }')
|
|
317
|
+
await pressKey(tabId, String(operation.key || ''))
|
|
318
|
+
return null
|
|
319
|
+
}
|
|
320
|
+
if (method === 'select') {
|
|
321
|
+
const values = Array.isArray(operation.values) ? operation.values.filter(value => typeof value === 'string').slice(0, 100) : []
|
|
322
|
+
const result = await callOnNode(tabId, backendDOMNodeId, `function(values){
|
|
323
|
+
if (!(this instanceof HTMLSelectElement)) return null;
|
|
324
|
+
const wanted=new Set(values);
|
|
325
|
+
for (const option of this.options) option.selected=wanted.has(option.value);
|
|
326
|
+
this.dispatchEvent(new Event('input',{bubbles:true}));
|
|
327
|
+
this.dispatchEvent(new Event('change',{bubbles:true}));
|
|
328
|
+
return Array.from(this.selectedOptions, option=>option.value);
|
|
329
|
+
}`, [{ value: values }])
|
|
330
|
+
if (!Array.isArray(result)) throw new Error('That ref is not a select menu.')
|
|
331
|
+
return result
|
|
332
|
+
}
|
|
333
|
+
if (method === 'scrollIntoView') {
|
|
334
|
+
await callOnNode(tabId, backendDOMNodeId, 'function(){ this.scrollIntoView({block:"center",inline:"center"}); return true; }')
|
|
335
|
+
return null
|
|
336
|
+
}
|
|
337
|
+
throw new Error('Brave does not support that element operation.')
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
async function execute(operation) {
|
|
341
|
+
if (!operation || typeof operation !== 'object' || Array.isArray(operation)) throw new Error('Invalid browser request.')
|
|
342
|
+
const op = operation.op
|
|
343
|
+
if (op === 'tabs.list') return listTabs()
|
|
344
|
+
if (op === 'tabs.create') {
|
|
345
|
+
const tab = await chrome.tabs.create({ url: 'about:blank', active: true })
|
|
346
|
+
agentCreatedTabs.add(tab.id)
|
|
347
|
+
generations.set(keyFor(tab.id), 0)
|
|
348
|
+
return tab.id
|
|
349
|
+
}
|
|
350
|
+
if (op === 'tabs.activate') {
|
|
351
|
+
const tabId = Number(operation.tabId)
|
|
352
|
+
const tab = await currentTab(tabId)
|
|
353
|
+
await chrome.tabs.update(tab.id, { active: true })
|
|
354
|
+
return true
|
|
355
|
+
}
|
|
356
|
+
if (op === 'tabs.close') {
|
|
357
|
+
const tabId = Number(operation.tabId)
|
|
358
|
+
await currentTab(tabId)
|
|
359
|
+
await chrome.tabs.remove(tabId)
|
|
360
|
+
return true
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const tabId = Number(operation.tabId)
|
|
364
|
+
if (!Number.isInteger(tabId)) throw new Error('The browser request did not name a tab.')
|
|
365
|
+
await currentTab(tabId)
|
|
366
|
+
await attach(tabId)
|
|
367
|
+
if (op === 'page.navigate') return navigate(tabId, String(operation.url || ''))
|
|
368
|
+
if (op === 'page.back' || op === 'page.forward') {
|
|
369
|
+
const history = await send(tabId, 'Page.getNavigationHistory')
|
|
370
|
+
const offset = op === 'page.back' ? -1 : 1
|
|
371
|
+
const entry = history.entries?.[history.currentIndex + offset]
|
|
372
|
+
if (!entry) return null
|
|
373
|
+
const wait = waitForTabComplete(tabId)
|
|
374
|
+
await send(tabId, 'Page.navigateToHistoryEntry', { entryId: entry.id })
|
|
375
|
+
await wait
|
|
376
|
+
return null
|
|
377
|
+
}
|
|
378
|
+
if (op === 'page.reload') {
|
|
379
|
+
const wait = waitForTabComplete(tabId)
|
|
380
|
+
await send(tabId, 'Page.reload', { ignoreCache: false })
|
|
381
|
+
await wait
|
|
382
|
+
return null
|
|
383
|
+
}
|
|
384
|
+
if (op === 'page.snapshot') {
|
|
385
|
+
const nodes = await accessibilityTree(tabId, operation.depth)
|
|
386
|
+
const generation = nextGeneration(tabId)
|
|
387
|
+
return { nodes, generation }
|
|
388
|
+
}
|
|
389
|
+
if (op === 'page.text' || op === 'page.containsText') {
|
|
390
|
+
const result = await send(tabId, 'Runtime.evaluate', {
|
|
391
|
+
expression: 'JSON.stringify({title:document.title||"",text:document.body?.innerText||""})',
|
|
392
|
+
returnByValue: true,
|
|
393
|
+
awaitPromise: true
|
|
394
|
+
})
|
|
395
|
+
let value
|
|
396
|
+
try { value = JSON.parse(String(cdpValue(result) || '{}')) } catch { value = { title: '', text: '' } }
|
|
397
|
+
const pageText = String(value.text || '').slice(0, MAX_TEXT)
|
|
398
|
+
if (op === 'page.containsText') return pageText.includes(String(operation.text || '').slice(0, 1000))
|
|
399
|
+
return { title: String(value.title || '').slice(0, 1000), text: pageText }
|
|
400
|
+
}
|
|
401
|
+
if (op === 'page.evaluate') {
|
|
402
|
+
const expression = typeof operation.expression === 'string' ? operation.expression.slice(0, 4000) : ''
|
|
403
|
+
if (!expression) throw new Error('The page check is empty.')
|
|
404
|
+
const result = await send(tabId, 'Runtime.evaluate', { expression, returnByValue: true, awaitPromise: true })
|
|
405
|
+
return cdpValue(result)
|
|
406
|
+
}
|
|
407
|
+
if (op === 'page.screenshot') {
|
|
408
|
+
if (Number.isInteger(operation.backendDOMNodeId) && (!Number.isInteger(operation.generation) || operation.generation !== (generations.get(keyFor(tabId)) || 0))) throw new Error('The page changed since its snapshot. Take browser_snapshot again.')
|
|
409
|
+
const quality = Math.max(10, Math.min(95, Number(operation.quality) || 70))
|
|
410
|
+
const params = { format: 'jpeg', quality, fromSurface: true, captureBeyondViewport: false }
|
|
411
|
+
if (Number.isInteger(operation.backendDOMNodeId)) {
|
|
412
|
+
const box = await boxFor(tabId, Number(operation.backendDOMNodeId))
|
|
413
|
+
params.clip = { x: Math.max(0, box.x - box.width / 2), y: Math.max(0, box.y - box.height / 2), width: box.width, height: box.height, scale: 1 }
|
|
414
|
+
}
|
|
415
|
+
const result = await send(tabId, 'Page.captureScreenshot', params)
|
|
416
|
+
return { data: result.data }
|
|
417
|
+
}
|
|
418
|
+
if (op === 'page.press') {
|
|
419
|
+
await pressKey(tabId, String(operation.key || ''))
|
|
420
|
+
return null
|
|
421
|
+
}
|
|
422
|
+
if (op === 'page.scroll') {
|
|
423
|
+
const x = Number.isFinite(operation.x) ? Number(operation.x) : 0
|
|
424
|
+
const y = Number.isFinite(operation.y) ? Number(operation.y) : 650
|
|
425
|
+
await send(tabId, 'Input.dispatchMouseEvent', { type: 'mouseWheel', x: 640, y: 400, deltaX: x, deltaY: y })
|
|
426
|
+
return null
|
|
427
|
+
}
|
|
428
|
+
if (op === 'page.element') return executeElement(tabId, operation)
|
|
429
|
+
throw new Error('Brave does not support that browser operation.')
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
async function bridgeFetch(path, init = {}) {
|
|
433
|
+
const config = await saved()
|
|
434
|
+
if (!Number.isInteger(config.bridgePort) || typeof config.bridgeToken !== 'string') throw new Error('The extension is not paired with the Harness.')
|
|
435
|
+
const response = await fetch(`http://127.0.0.1:${config.bridgePort}${path}`, {
|
|
436
|
+
...init,
|
|
437
|
+
cache: 'no-store',
|
|
438
|
+
headers: { ...(init.headers || {}), Authorization: `Bearer ${config.bridgeToken}` }
|
|
439
|
+
})
|
|
440
|
+
return response
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
async function startPoller() {
|
|
444
|
+
if (pollTask) {
|
|
445
|
+
pollRestartRequested = true
|
|
446
|
+
return
|
|
447
|
+
}
|
|
448
|
+
pollTask = (async () => {
|
|
449
|
+
while (true) {
|
|
450
|
+
const config = await saved()
|
|
451
|
+
if (!Number.isInteger(config.bridgePort) || typeof config.bridgeToken !== 'string') {
|
|
452
|
+
bridgeOnline = false
|
|
453
|
+
await clearAllBadges()
|
|
454
|
+
break
|
|
455
|
+
}
|
|
456
|
+
try {
|
|
457
|
+
const response = await bridgeFetch('/poll')
|
|
458
|
+
if (response.status === 410) {
|
|
459
|
+
await chrome.storage.local.remove(['bridgePort', 'bridgeToken', 'paused'])
|
|
460
|
+
bridgeOnline = false
|
|
461
|
+
await clearAllBadges()
|
|
462
|
+
break
|
|
463
|
+
}
|
|
464
|
+
if (response.status === 204) {
|
|
465
|
+
bridgeOnline = true
|
|
466
|
+
await syncAllTabs()
|
|
467
|
+
continue
|
|
468
|
+
}
|
|
469
|
+
if (!response.ok) {
|
|
470
|
+
bridgeOnline = false
|
|
471
|
+
await clearAllBadges()
|
|
472
|
+
await sleep(1200)
|
|
473
|
+
continue
|
|
474
|
+
}
|
|
475
|
+
bridgeOnline = true
|
|
476
|
+
const packet = await response.json()
|
|
477
|
+
let result
|
|
478
|
+
try { result = { ok: true, value: await execute(packet.operation) } }
|
|
479
|
+
catch (error) { result = { ok: false, error: String(error?.message || error).split('\n')[0] } }
|
|
480
|
+
await bridgeFetch('/reply', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: packet.id, result }) })
|
|
481
|
+
await syncAllTabs()
|
|
482
|
+
} catch {
|
|
483
|
+
bridgeOnline = false
|
|
484
|
+
await clearAllBadges()
|
|
485
|
+
await sleep(1500)
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
})().finally(() => {
|
|
489
|
+
pollTask = null
|
|
490
|
+
if (pollRestartRequested) {
|
|
491
|
+
pollRestartRequested = false
|
|
492
|
+
void startPoller()
|
|
493
|
+
}
|
|
494
|
+
})
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
async function pair(code, port) {
|
|
498
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535 || typeof code !== 'string' || !/^[0-9A-F]{12}$/i.test(code)) throw new Error('Enter the pairing code shown in Harness Browser settings.')
|
|
499
|
+
const response = await fetch(`http://127.0.0.1:${port}/pair`, {
|
|
500
|
+
method: 'POST',
|
|
501
|
+
cache: 'no-store',
|
|
502
|
+
headers: { 'Content-Type': 'application/json' },
|
|
503
|
+
body: JSON.stringify({ code })
|
|
504
|
+
})
|
|
505
|
+
const value = await response.json().catch(() => ({}))
|
|
506
|
+
if (!response.ok || typeof value.token !== 'string') throw new Error(response.status === 403 ? 'That pairing code is wrong or expired. Start a new one in Harness Browser settings.' : 'Could not reach the Harness bridge. Start it in Browser settings and try again.')
|
|
507
|
+
await chrome.storage.local.set({ bridgePort: port, bridgeToken: value.token, paused: false })
|
|
508
|
+
bridgeOnline = false
|
|
509
|
+
void startPoller()
|
|
510
|
+
await clearAllBadges()
|
|
511
|
+
return { paired: true }
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
async function control(action) {
|
|
515
|
+
const response = await bridgeFetch('/control', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action }) })
|
|
516
|
+
const result = await response.json().catch(() => ({}))
|
|
517
|
+
if (!response.ok) throw new Error('The Harness bridge is no longer available.')
|
|
518
|
+
if (action === 'stop') {
|
|
519
|
+
await chrome.storage.local.remove(['bridgePort', 'bridgeToken', 'paused'])
|
|
520
|
+
bridgeOnline = false
|
|
521
|
+
await clearAllBadges()
|
|
522
|
+
} else {
|
|
523
|
+
await chrome.storage.local.set({ paused: action === 'pause' })
|
|
524
|
+
await syncAllTabs()
|
|
525
|
+
}
|
|
526
|
+
return result.status
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
async function status() {
|
|
530
|
+
const config = await saved()
|
|
531
|
+
if (!config.bridgeToken || !Number.isInteger(config.bridgePort)) {
|
|
532
|
+
bridgeOnline = false
|
|
533
|
+
await clearAllBadges()
|
|
534
|
+
return { paired: false, connected: false, paused: false, state: 'disconnected' }
|
|
535
|
+
}
|
|
536
|
+
try {
|
|
537
|
+
const response = await bridgeFetch('/status')
|
|
538
|
+
if (!response.ok) return { paired: true, connected: false, paused: config.paused === true, state: 'waiting' }
|
|
539
|
+
const value = await response.json()
|
|
540
|
+
bridgeOnline = value.connected === true
|
|
541
|
+
if (!bridgeOnline) await clearAllBadges()
|
|
542
|
+
return value
|
|
543
|
+
} catch {
|
|
544
|
+
bridgeOnline = false
|
|
545
|
+
await clearAllBadges()
|
|
546
|
+
return { paired: true, connected: false, paused: config.paused === true, state: 'waiting' }
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
async function onMessage(message, sender) {
|
|
551
|
+
if (message?.type === 'status') return status()
|
|
552
|
+
if (message?.type === 'pair') return pair(message.code, Number(message.port))
|
|
553
|
+
if (message?.type === 'control') {
|
|
554
|
+
const action = message.action
|
|
555
|
+
if (!['pause', 'resume', 'stop'].includes(action)) throw new Error('Unknown control action.')
|
|
556
|
+
if (sender.tab && !await tabAvailable(sender.tab)) throw new Error('This tab is not allowed to control the Brave bridge.')
|
|
557
|
+
return control(action)
|
|
558
|
+
}
|
|
559
|
+
if (message?.type === 'site-access-changed') {
|
|
560
|
+
await syncAllTabs()
|
|
561
|
+
return { ok: true }
|
|
562
|
+
}
|
|
563
|
+
if (message?.type === 'page-changed') {
|
|
564
|
+
const tabId = sender.tab?.id
|
|
565
|
+
if (Number.isInteger(tabId)) nextGeneration(tabId)
|
|
566
|
+
return { ok: true }
|
|
567
|
+
}
|
|
568
|
+
throw new Error('Unknown extension message.')
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
572
|
+
onMessage(message, sender).then(value => sendResponse({ ok: true, value })).catch(error => sendResponse({ ok: false, error: String(error?.message || error) }))
|
|
573
|
+
return true
|
|
574
|
+
})
|
|
575
|
+
|
|
576
|
+
chrome.debugger.onEvent.addListener((source, method, params) => {
|
|
577
|
+
if (!Number.isInteger(source.tabId)) return
|
|
578
|
+
const tabId = source.tabId
|
|
579
|
+
notifyDebuggerEvent(tabId, method)
|
|
580
|
+
if (method === 'Page.frameNavigated' && !params?.frame?.parentId) nextGeneration(tabId)
|
|
581
|
+
})
|
|
582
|
+
|
|
583
|
+
chrome.debugger.onDetach.addListener(source => {
|
|
584
|
+
if (!Number.isInteger(source.tabId)) return
|
|
585
|
+
attached.delete(source.tabId)
|
|
586
|
+
nextGeneration(source.tabId)
|
|
587
|
+
})
|
|
588
|
+
|
|
589
|
+
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
|
|
590
|
+
if (changeInfo.url && tab.url) {
|
|
591
|
+
if (XingularSiteAccess.originOf(tab.url) && agentCreatedTabs.has(tabId)) agentCreatedTabs.delete(tabId)
|
|
592
|
+
nextGeneration(tabId)
|
|
593
|
+
}
|
|
594
|
+
if (changeInfo.status === 'complete' || changeInfo.url) void syncTab(tabId)
|
|
595
|
+
})
|
|
596
|
+
|
|
597
|
+
chrome.tabs.onRemoved.addListener(tabId => {
|
|
598
|
+
agentCreatedTabs.delete(tabId)
|
|
599
|
+
generations.delete(keyFor(tabId))
|
|
600
|
+
void detach(tabId)
|
|
601
|
+
})
|
|
602
|
+
|
|
603
|
+
chrome.permissions.onRemoved.addListener(permissions => {
|
|
604
|
+
void (async () => {
|
|
605
|
+
await XingularSiteAccess.forgetRemoved(permissions)
|
|
606
|
+
await syncAllTabs()
|
|
607
|
+
})()
|
|
608
|
+
})
|
|
609
|
+
|
|
610
|
+
chrome.runtime.onStartup.addListener(() => { void startPoller() })
|
|
611
|
+
chrome.runtime.onInstalled.addListener(() => { void startPoller() })
|
|
612
|
+
void startPoller()
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": 3,
|
|
3
|
+
"name": "Xingular Agent — Brave bridge",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Connect Xingular Agent to normal Brave tabs on sites you explicitly allow.",
|
|
6
|
+
"minimum_chrome_version": "109",
|
|
7
|
+
"incognito": "not_allowed",
|
|
8
|
+
"permissions": ["debugger", "tabs", "storage", "scripting"],
|
|
9
|
+
"host_permissions": ["http://127.0.0.1/*"],
|
|
10
|
+
"optional_host_permissions": ["http://*/*", "https://*/*"],
|
|
11
|
+
"background": { "service_worker": "background.js" },
|
|
12
|
+
"action": {
|
|
13
|
+
"default_title": "Xingular Agent",
|
|
14
|
+
"default_popup": "popup.html"
|
|
15
|
+
}
|
|
16
|
+
}
|