@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,546 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { loadRun as loadCapabilities } from "../capabilities/runSnapshot.js";
|
|
4
|
+
import { HarnessError, invalid } from "../core/errors.js";
|
|
5
|
+
import { now } from "../core/fs.js";
|
|
6
|
+
import { takeChars } from "../core/text.js";
|
|
7
|
+
import { isActiveStatus } from "./contracts.js";
|
|
8
|
+
import { narrowForProfile } from "../agents/narrow.js";
|
|
9
|
+
import { planResearchEligibility } from "../agents/planResearch.js";
|
|
10
|
+
import { resolveProfile } from "../agents/profiles.js";
|
|
11
|
+
import { continuationOf } from "./continuation.js";
|
|
12
|
+
import { findRun, loadRun, readEvents, recordedSubagents, recordSubagent, saveRun } from "./runStore.js";
|
|
13
|
+
import { SPAWN_SUBAGENT, SUBAGENT_RELATION, SUBAGENT_OWNER, SUBAGENT_RECEIPT, SUBAGENT_RESULTS, UNPROFILED_SUBAGENT, briefTitle, continueHint, subagentHistory, subagentProfileKey, subagentProfileLimit, subagentQuota, subagentTitle } from "./subagents.js";
|
|
14
|
+
function until(promise, signal) {
|
|
15
|
+
if (signal.aborted) {
|
|
16
|
+
void promise.catch(() => { });
|
|
17
|
+
return Promise.reject(new HarnessError('run_not_active', 'The parent run stopped.'));
|
|
18
|
+
}
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const abort = () => reject(new HarnessError('run_not_active', 'The parent run stopped.'));
|
|
21
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
22
|
+
promise.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** One owner of native child execution and delivery, shared by SDK and terminal adapters. */
|
|
26
|
+
export class Subagents {
|
|
27
|
+
env;
|
|
28
|
+
runs;
|
|
29
|
+
launch;
|
|
30
|
+
options;
|
|
31
|
+
parents = new Map();
|
|
32
|
+
/** Child runs reserved synchronously at spawn, before their record exists, so parallel calls cannot overspend. */
|
|
33
|
+
reserved = new Map();
|
|
34
|
+
runtimeSettingsByRun = new Map();
|
|
35
|
+
constructor(env, runs, launch, options = {}) {
|
|
36
|
+
this.env = env;
|
|
37
|
+
this.runs = runs;
|
|
38
|
+
this.launch = launch;
|
|
39
|
+
this.options = options;
|
|
40
|
+
runs.listen((event) => {
|
|
41
|
+
if (event.type !== 'completed' && event.type !== 'failed' && !(event.type === 'status.changed' && event.payload.status === 'interrupted'))
|
|
42
|
+
return;
|
|
43
|
+
this.parents.get(event.runId)?.stopped.abort();
|
|
44
|
+
this.parents.delete(event.runId);
|
|
45
|
+
if (event.type !== 'completed')
|
|
46
|
+
for (const id of runs.activeRunIds()) {
|
|
47
|
+
const child = findRun(this.env.root, id);
|
|
48
|
+
if (child?.relation === SUBAGENT_RELATION && child.parentRunId === event.runId)
|
|
49
|
+
void runs.interrupt(id).catch(() => { });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Internal adapter contract: context comes from a live run, never from model arguments. */
|
|
54
|
+
register(input, accountId, capabilities, deferUntilPrompt = false) {
|
|
55
|
+
if (!this.runs.active(input.run.id))
|
|
56
|
+
throw new HarnessError('run_not_active', 'The parent run is not active.');
|
|
57
|
+
if (this.parents.has(input.run.id))
|
|
58
|
+
return;
|
|
59
|
+
const frozen = loadCapabilities(this.env.root, input.run.id);
|
|
60
|
+
if (!frozen)
|
|
61
|
+
throw invalid('A native parent requires a frozen capability snapshot.');
|
|
62
|
+
const ceiling = {
|
|
63
|
+
version: 1,
|
|
64
|
+
tools: capabilities.tools.filter(name => frozen.tools.includes(name)),
|
|
65
|
+
connectors: capabilities.connectors.filter(id => frozen.connectors.includes(id)),
|
|
66
|
+
contributions: capabilities.contributions.filter(id => frozen.contributions.includes(id))
|
|
67
|
+
};
|
|
68
|
+
let started;
|
|
69
|
+
const ready = new Promise(resolve => { started = resolve; });
|
|
70
|
+
if (!deferUntilPrompt)
|
|
71
|
+
started();
|
|
72
|
+
this.parents.set(input.run.id, { ready, started, input: structuredClone({ ...input, text: '', images: undefined, requiresImageInput: false, preamble: null, resume: null, live: undefined }), accountId, capabilities: ceiling, stopped: new AbortController(), recovered: new Set(), launching: new Map() });
|
|
73
|
+
}
|
|
74
|
+
runtimeSettings(runId) {
|
|
75
|
+
return this.runtimeSettingsByRun.get(runId) ?? null;
|
|
76
|
+
}
|
|
77
|
+
/** The budget for a run, or the foundation defaults when it has not registered one. */
|
|
78
|
+
quota(runId) {
|
|
79
|
+
return subagentQuota(this.parents.get(runId)?.input.subagents ?? undefined);
|
|
80
|
+
}
|
|
81
|
+
rememberRuntimeSettings(runId, settings) {
|
|
82
|
+
this.runtimeSettingsByRun.set(runId, settings);
|
|
83
|
+
if (this.runtimeSettingsByRun.size > 500) {
|
|
84
|
+
const oldest = this.runtimeSettingsByRun.keys().next().value;
|
|
85
|
+
if (oldest !== undefined)
|
|
86
|
+
this.runtimeSettingsByRun.delete(oldest);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
resolvedModel(runId, model, effort) {
|
|
90
|
+
const parent = this.parents.get(runId);
|
|
91
|
+
if (parent) {
|
|
92
|
+
parent.input.model = model;
|
|
93
|
+
parent.input.effort = effort ?? parent.input.effort;
|
|
94
|
+
}
|
|
95
|
+
const settings = this.runtimeSettingsByRun.get(runId);
|
|
96
|
+
if (settings)
|
|
97
|
+
this.rememberRuntimeSettings(runId, { model, effort: effort ?? settings.effort });
|
|
98
|
+
}
|
|
99
|
+
parent(runId) {
|
|
100
|
+
const parent = this.parents.get(runId);
|
|
101
|
+
if (!parent || !this.runs.active(runId))
|
|
102
|
+
throw new HarnessError('run_not_active', 'The parent run is not accepting subagents.');
|
|
103
|
+
return parent;
|
|
104
|
+
}
|
|
105
|
+
planSpawnCheck(parentRunId, args) {
|
|
106
|
+
const parent = this.parents.get(parentRunId);
|
|
107
|
+
if (!parent || !this.runs.active(parentRunId))
|
|
108
|
+
return { refusal: 'The parent run is not accepting subagents.' };
|
|
109
|
+
if (!parent.input.plan)
|
|
110
|
+
return { refusal: 'Read-only research delegation is available only during plan mode.' };
|
|
111
|
+
if (!parent.capabilities.tools.includes(SPAWN_SUBAGENT))
|
|
112
|
+
return { refusal: 'Subagents are not enabled for this run.' };
|
|
113
|
+
if (!args || typeof args !== 'object' || Array.isArray(args))
|
|
114
|
+
return { refusal: 'Plan-mode delegation requires a named, eligible read-only research profile.' };
|
|
115
|
+
let request = args;
|
|
116
|
+
if (request.continue !== undefined) {
|
|
117
|
+
// A continued child keeps its own profile; judge that profile.
|
|
118
|
+
const id = typeof request.continue === 'string' ? request.continue.trim() : '';
|
|
119
|
+
const record = id && this.owned(parentRunId, parent).has(id) ? findRun(this.env.root, id) : null;
|
|
120
|
+
if (!record?.profile)
|
|
121
|
+
return { refusal: 'Plan mode can continue only a stopped research subagent of this conversation that has a named profile.' };
|
|
122
|
+
if (request.agent !== undefined || request.tools !== undefined)
|
|
123
|
+
return { refusal: 'A continued subagent keeps its profile and tools; omit agent and tools.' };
|
|
124
|
+
request = { agent: record.profile };
|
|
125
|
+
}
|
|
126
|
+
if (typeof request.agent !== 'string' || !request.agent.trim())
|
|
127
|
+
return { refusal: 'Plan-mode delegation requires a named, eligible read-only research profile.' };
|
|
128
|
+
if (request.tools !== undefined && (!Array.isArray(request.tools) || request.tools.some(name => typeof name !== 'string'))) {
|
|
129
|
+
return { refusal: 'The optional tools field must be an array of tool names. Omit it to inherit the selected profile’s safe research intersection.' };
|
|
130
|
+
}
|
|
131
|
+
const profile = resolveProfile(this.env.root, parent.input.cwd, request.agent.trim(), parent.input.variant && 'dir' in parent.input.variant ? parent.input.variant.dir : null, parent.input.packageProfiles);
|
|
132
|
+
if (!profile)
|
|
133
|
+
return { refusal: `There is no agent profile named ${request.agent.trim()}.` };
|
|
134
|
+
const eligibility = planResearchEligibility(profile, {
|
|
135
|
+
frozenTools: parent.capabilities.tools,
|
|
136
|
+
contributions: parent.capabilities.contributions,
|
|
137
|
+
descriptors: this.options.descriptors?.() ?? []
|
|
138
|
+
}, request.tools);
|
|
139
|
+
return { refusal: eligibility.refusal, profile, eligibility };
|
|
140
|
+
}
|
|
141
|
+
/** The plan-mode per-call gate and spawn implementation share this eligibility check. */
|
|
142
|
+
planSpawnRefusal(parentRunId, args) {
|
|
143
|
+
return this.planSpawnCheck(parentRunId, args).refusal;
|
|
144
|
+
}
|
|
145
|
+
async spawn(request) {
|
|
146
|
+
const parent = this.parent(request.parentRunId);
|
|
147
|
+
const { input, accountId, capabilities } = parent;
|
|
148
|
+
if (!capabilities.tools.includes(SPAWN_SUBAGENT))
|
|
149
|
+
throw invalid('Subagents are not enabled for this run.');
|
|
150
|
+
if (request.continue !== undefined)
|
|
151
|
+
return this.continueChild(parent, request);
|
|
152
|
+
const brief = typeof request.brief === 'string' ? request.brief.trim() : '';
|
|
153
|
+
if (!brief)
|
|
154
|
+
throw invalid('Give the subagent a brief.');
|
|
155
|
+
const title = request.title === undefined ? briefTitle(brief) : subagentTitle(request.title);
|
|
156
|
+
if (!title)
|
|
157
|
+
throw invalid('Give the subagent a title of at most six words, with no control characters.');
|
|
158
|
+
if (request.wait !== undefined && typeof request.wait !== 'boolean')
|
|
159
|
+
throw invalid('wait must be a boolean.');
|
|
160
|
+
if (request.tools !== undefined && (!Array.isArray(request.tools) || request.tools.some((name) => typeof name !== 'string')))
|
|
161
|
+
throw invalid('Tools must be an array of tool names.');
|
|
162
|
+
let profile = null;
|
|
163
|
+
let planEligibility = null;
|
|
164
|
+
if (input.plan) {
|
|
165
|
+
const check = this.planSpawnCheck(request.parentRunId, request);
|
|
166
|
+
if (check.refusal || !check.profile || !check.eligibility)
|
|
167
|
+
throw invalid(check.refusal ?? 'The selected profile has no eligible research tools in this run.');
|
|
168
|
+
profile = check.profile;
|
|
169
|
+
planEligibility = check.eligibility;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const outside = request.tools?.filter((name) => !capabilities.tools.includes(name)) ?? [];
|
|
173
|
+
if (outside.length)
|
|
174
|
+
throw invalid(`A subagent cannot have tools you do not have: ${outside.join(', ')}.`);
|
|
175
|
+
if (request.agent !== undefined) {
|
|
176
|
+
if (typeof request.agent !== 'string' || !request.agent.trim())
|
|
177
|
+
throw invalid('agent must be the name of an agent profile.');
|
|
178
|
+
profile = resolveProfile(this.env.root, input.cwd, request.agent.trim(), input.variant && 'dir' in input.variant ? input.variant.dir : null, input.packageProfiles);
|
|
179
|
+
if (!profile)
|
|
180
|
+
throw invalid(`There is no agent profile named ${request.agent.trim()}.`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const quota = subagentQuota(input.subagents ?? undefined);
|
|
184
|
+
const runId = randomUUID();
|
|
185
|
+
const usage = this.usage(request.parentRunId);
|
|
186
|
+
const slot = (count, of = '') => `${count} ${of}subagent slot${count === 1 ? '' : 's'}`;
|
|
187
|
+
if (usage.total >= quota.children)
|
|
188
|
+
throw invalid(`This run has used its ${slot(quota.children)}. Do the remaining work yourself.`);
|
|
189
|
+
const profileKey = subagentProfileKey(profile?.name);
|
|
190
|
+
const profileLimit = subagentProfileLimit(quota, profileKey);
|
|
191
|
+
const profileUsed = usage.byProfile.get(profileKey) ?? 0;
|
|
192
|
+
if (profileUsed >= profileLimit) {
|
|
193
|
+
const label = profileKey === UNPROFILED_SUBAGENT ? 'unprofiled ' : `${profileKey} `;
|
|
194
|
+
throw invalid(`This run has used its ${slot(profileLimit, label)}. Do the remaining work yourself.`);
|
|
195
|
+
}
|
|
196
|
+
// Reserve before the first await so two tool calls in one message cannot both pass the check.
|
|
197
|
+
this.reserve(request.parentRunId, runId, profileKey);
|
|
198
|
+
try {
|
|
199
|
+
await until(parent.ready, parent.stopped.signal);
|
|
200
|
+
let variant = input.variant ?? null;
|
|
201
|
+
let launch = input.launch;
|
|
202
|
+
let model = input.model;
|
|
203
|
+
let effort = input.effort;
|
|
204
|
+
if (profile) {
|
|
205
|
+
// A variant's own subagent works from its definition alone; a profile keeps the parent's
|
|
206
|
+
// variant unless it names another one, or none.
|
|
207
|
+
if (profile.source === 'variant' || profile.variant === 'none')
|
|
208
|
+
variant = null;
|
|
209
|
+
else if (profile.variant)
|
|
210
|
+
variant = { scope: profile.variant.scope, version: profile.variant.version };
|
|
211
|
+
if (profile.model)
|
|
212
|
+
model = profile.model;
|
|
213
|
+
if (profile.effort)
|
|
214
|
+
effort = profile.effort;
|
|
215
|
+
launch = { ...(input.launch ?? {}), sections: [...(input.launch?.sections ?? []).filter((section) => section.id !== 'subagent'), { id: 'subagent', title: `Your role: ${profile.name}`, body: profile.instructions || profile.description, budget: 16_000, order: 22 }] };
|
|
216
|
+
}
|
|
217
|
+
const narrowed = input.plan
|
|
218
|
+
? { capabilities: planEligibility.capabilities, unavailable: planEligibility.unavailableTools }
|
|
219
|
+
: narrowForProfile(capabilities, profile, request.tools, this.options.descriptors?.() ?? []);
|
|
220
|
+
const childCapabilities = narrowed.capabilities;
|
|
221
|
+
const tools = childCapabilities.tools;
|
|
222
|
+
const sessionId = randomUUID();
|
|
223
|
+
const child = {
|
|
224
|
+
...input,
|
|
225
|
+
run: { ...input.run, ...(input.plan ? { worktreeId: null } : {}), id: runId, sessionId, parentRunId: request.parentRunId, relation: SUBAGENT_RELATION, goal: takeChars(brief, 4000), title, attachmentCount: 0, resumedFromRunId: null, handoffId: null, profile: profile?.name ?? null },
|
|
226
|
+
accountId, poolId: null, sessionDir: join(input.sessionDir, 'subagents', runId), resume: null,
|
|
227
|
+
text: brief, images: undefined, requiresImageInput: false, preamble: null,
|
|
228
|
+
caller: { ...input.caller, runId: undefined, sessionId },
|
|
229
|
+
tools: { allow: tools, gated: (input.tools.gated ?? []).filter((name) => tools.includes(name)) },
|
|
230
|
+
capabilities: childCapabilities, depth: (input.depth ?? 0) + 1,
|
|
231
|
+
variant, launch, model, effort,
|
|
232
|
+
...(input.plan ? { connections: false, subagents: null } : {})
|
|
233
|
+
};
|
|
234
|
+
const result = await this.launchChild(parent, request, child);
|
|
235
|
+
return { ...result, ...(profile ? { agent: profile.name } : {}), tools, ...(narrowed.unavailable.length ? { unavailableTools: narrowed.unavailable } : {}) };
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
this.release(request.parentRunId, runId);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** Records ownership, starts the child, and writes a failed record when it never opened. */
|
|
242
|
+
async launchChild(parent, request, child) {
|
|
243
|
+
const runId = child.run.id;
|
|
244
|
+
this.rememberRuntimeSettings(runId, { model: child.model ?? null, effort: child.effort ?? null });
|
|
245
|
+
recordSubagent(this.env.root, request.parentRunId, runId);
|
|
246
|
+
const started = this.launch(child).catch((error) => {
|
|
247
|
+
if (!findRun(this.env.root, runId)) {
|
|
248
|
+
const source = loadRun(this.env.root, request.parentRunId);
|
|
249
|
+
saveRun(this.env.root, { ...source, id: runId, sessionId: child.run.sessionId, parentRunId: request.parentRunId, relation: SUBAGENT_RELATION, nativeSessionId: null, resumedFromRunId: child.run.resumedFromRunId ?? null, handoffId: null, exitCode: null, goal: child.run.goal ?? null, title: child.run.title ?? null, attachmentCount: 0, status: 'failed', startedAt: now(), endedAt: now(), terminalReason: error instanceof HarnessError ? error.message : 'Subagent startup failed before its session opened.', profile: child.run.profile ?? null, model: child.model ?? null, effort: child.effort ?? null });
|
|
250
|
+
}
|
|
251
|
+
return { runId, nativeSessionId: null };
|
|
252
|
+
});
|
|
253
|
+
parent.launching.set(runId, started);
|
|
254
|
+
void started.finally(() => parent.launching.delete(runId));
|
|
255
|
+
const result = await until(started, parent.stopped.signal);
|
|
256
|
+
if (request.wait)
|
|
257
|
+
await this.wait({ parentRunId: request.parentRunId, runIds: [runId] });
|
|
258
|
+
return result;
|
|
259
|
+
}
|
|
260
|
+
/** The children this parent may read or continue: its own, and those recovered from its history. */
|
|
261
|
+
owned(parentRunId, parent) {
|
|
262
|
+
return new Set([...recordedSubagents(this.env.root, parentRunId), ...(parent?.recovered ?? [])]);
|
|
263
|
+
}
|
|
264
|
+
/** The run and the runs it was continued from, so a work-slice continuation keeps the budget. */
|
|
265
|
+
ancestry(runId) {
|
|
266
|
+
const chain = [];
|
|
267
|
+
const seen = new Set();
|
|
268
|
+
let current = runId;
|
|
269
|
+
while (current && !seen.has(current) && chain.length < 20) {
|
|
270
|
+
seen.add(current);
|
|
271
|
+
chain.push(current);
|
|
272
|
+
current = findRun(this.env.root, current)?.resumedFromRunId ?? null;
|
|
273
|
+
}
|
|
274
|
+
return chain;
|
|
275
|
+
}
|
|
276
|
+
/** Distinct child conversations this run has started, plus slots reserved before their record exists. */
|
|
277
|
+
usage(parentRunId) {
|
|
278
|
+
const byProfile = new Map();
|
|
279
|
+
const seen = new Set();
|
|
280
|
+
let total = 0;
|
|
281
|
+
const add = (key) => {
|
|
282
|
+
total += 1;
|
|
283
|
+
byProfile.set(key, (byProfile.get(key) ?? 0) + 1);
|
|
284
|
+
};
|
|
285
|
+
for (const owner of this.ancestry(parentRunId)) {
|
|
286
|
+
for (const id of recordedSubagents(this.env.root, owner)) {
|
|
287
|
+
const record = findRun(this.env.root, id);
|
|
288
|
+
if (!record || record.relation !== SUBAGENT_RELATION)
|
|
289
|
+
continue;
|
|
290
|
+
// Continuing a stopped child opens a new run of the same conversation: one slot.
|
|
291
|
+
const first = this.firstLink(record).id;
|
|
292
|
+
if (seen.has(first))
|
|
293
|
+
continue;
|
|
294
|
+
seen.add(first);
|
|
295
|
+
add(subagentProfileKey(record.profile));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
const reserved = this.reserved.get(parentRunId);
|
|
299
|
+
if (reserved)
|
|
300
|
+
for (const [id, key] of reserved) {
|
|
301
|
+
if (seen.has(id) || findRun(this.env.root, id))
|
|
302
|
+
continue;
|
|
303
|
+
seen.add(id);
|
|
304
|
+
add(key);
|
|
305
|
+
}
|
|
306
|
+
return { total, byProfile };
|
|
307
|
+
}
|
|
308
|
+
reserve(parentRunId, runId, profile) {
|
|
309
|
+
const reserved = this.reserved.get(parentRunId) ?? new Map();
|
|
310
|
+
reserved.set(runId, profile);
|
|
311
|
+
this.reserved.set(parentRunId, reserved);
|
|
312
|
+
}
|
|
313
|
+
release(parentRunId, runId) {
|
|
314
|
+
const reserved = this.reserved.get(parentRunId);
|
|
315
|
+
if (!reserved)
|
|
316
|
+
return;
|
|
317
|
+
reserved.delete(runId);
|
|
318
|
+
if (!reserved.size)
|
|
319
|
+
this.reserved.delete(parentRunId);
|
|
320
|
+
}
|
|
321
|
+
/** The newest run in a continued child's chain, among the runs this parent owns. */
|
|
322
|
+
latestLink(start, owned) {
|
|
323
|
+
const records = [...owned].flatMap((id) => findRun(this.env.root, id) ?? []);
|
|
324
|
+
let latest = start;
|
|
325
|
+
const seen = new Set([start.id]);
|
|
326
|
+
for (;;) {
|
|
327
|
+
const next = records.filter((record) => record.resumedFromRunId === latest.id && !seen.has(record.id)).sort((left, right) => left.startedAt.localeCompare(right.startedAt)).at(-1);
|
|
328
|
+
if (!next)
|
|
329
|
+
return latest;
|
|
330
|
+
seen.add(next.id);
|
|
331
|
+
latest = next;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** The first run of a chain: its folder holds the child's history for every later link. */
|
|
335
|
+
firstLink(record) {
|
|
336
|
+
let first = record;
|
|
337
|
+
const seen = new Set([record.id]);
|
|
338
|
+
while (first.resumedFromRunId && !seen.has(first.resumedFromRunId)) {
|
|
339
|
+
const previous = findRun(this.env.root, first.resumedFromRunId);
|
|
340
|
+
if (!previous || previous.relation !== SUBAGENT_RELATION)
|
|
341
|
+
break;
|
|
342
|
+
seen.add(previous.id);
|
|
343
|
+
first = previous;
|
|
344
|
+
}
|
|
345
|
+
return first;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Continues a stopped child as a new child run with `continueFrom`: the same history, profile,
|
|
349
|
+
* account, variant version and capability set, which must still lie within the parent's.
|
|
350
|
+
*/
|
|
351
|
+
async continueChild(parent, request) {
|
|
352
|
+
const { root } = this.env;
|
|
353
|
+
const { input, accountId, capabilities } = parent;
|
|
354
|
+
const requested = typeof request.continue === 'string' ? request.continue.trim() : '';
|
|
355
|
+
if (!requested)
|
|
356
|
+
throw invalid('continue must be the run ID of a subagent that stopped.');
|
|
357
|
+
if (request.agent !== undefined || request.tools !== undefined)
|
|
358
|
+
throw invalid('A continued subagent keeps its profile and tools; omit agent and tools.');
|
|
359
|
+
if (request.brief !== undefined && typeof request.brief !== 'string')
|
|
360
|
+
throw invalid('brief must be text.');
|
|
361
|
+
if (request.wait !== undefined && typeof request.wait !== 'boolean')
|
|
362
|
+
throw invalid('wait must be a boolean.');
|
|
363
|
+
await until(parent.ready, parent.stopped.signal);
|
|
364
|
+
const owned = this.owned(request.parentRunId, parent);
|
|
365
|
+
const named = owned.has(requested) ? findRun(root, requested) : null;
|
|
366
|
+
if (!named || named.relation !== SUBAGENT_RELATION)
|
|
367
|
+
throw invalid('Continue only a subagent that this conversation started.');
|
|
368
|
+
const latest = this.latestLink(named, owned);
|
|
369
|
+
if (isActiveStatus(latest.status))
|
|
370
|
+
throw invalid(`Subagent ${latest.id} is still running; wait for it with wait_subagents.`);
|
|
371
|
+
if (latest.status === 'completed')
|
|
372
|
+
throw invalid(`Subagent ${latest.id} already finished and its result was delivered. Start a new subagent for more work.`);
|
|
373
|
+
const sessionDir = join(input.sessionDir, 'subagents', this.firstLink(latest).id);
|
|
374
|
+
const continuation = continuationOf(root, latest.id, sessionDir);
|
|
375
|
+
if (!continuation.resumable || !continuation.resume)
|
|
376
|
+
throw invalid(`Subagent ${latest.id} cannot be continued: ${continuation.reason === 'no_history' ? 'it stopped before its conversation started' : 'its saved conversation is missing'}. Start a new subagent instead.`);
|
|
377
|
+
if (continuation.accountId !== accountId)
|
|
378
|
+
throw invalid(`Subagent ${latest.id} ran on another account; start a new subagent instead.`);
|
|
379
|
+
const pinned = continuation.capabilities;
|
|
380
|
+
if (!pinned)
|
|
381
|
+
throw invalid(`Subagent ${latest.id} has no recorded capabilities; start a new subagent instead.`);
|
|
382
|
+
const missing = [
|
|
383
|
+
...pinned.tools.filter((name) => !capabilities.tools.includes(name)),
|
|
384
|
+
...pinned.connectors.filter((id) => !capabilities.connectors.includes(id)),
|
|
385
|
+
...pinned.contributions.filter((id) => !capabilities.contributions.includes(id))
|
|
386
|
+
];
|
|
387
|
+
if (missing.length)
|
|
388
|
+
throw invalid(`Subagent ${latest.id} needs capabilities you do not have in this run: ${missing.join(', ')}. Start a new subagent instead.`);
|
|
389
|
+
let profile = null;
|
|
390
|
+
if (latest.profile)
|
|
391
|
+
profile = resolveProfile(root, input.cwd, latest.profile, input.variant && 'dir' in input.variant ? input.variant.dir : null, input.packageProfiles);
|
|
392
|
+
if (input.plan) {
|
|
393
|
+
// A plan run continues only a research child whose pinned tools still qualify.
|
|
394
|
+
const check = latest.profile ? this.planSpawnCheck(request.parentRunId, { agent: latest.profile }) : { refusal: 'Plan mode can continue only a stopped research subagent that has a named profile.' };
|
|
395
|
+
if (check.refusal || !check.eligibility)
|
|
396
|
+
throw invalid(check.refusal ?? 'This subagent is not eligible for plan-mode research.');
|
|
397
|
+
const outside = pinned.tools.filter((name) => !check.eligibility.capabilities.tools.includes(name));
|
|
398
|
+
if (outside.length)
|
|
399
|
+
throw invalid(`Subagent ${latest.id} has tools plan mode does not allow: ${outside.join(', ')}.`);
|
|
400
|
+
}
|
|
401
|
+
const launch = profile
|
|
402
|
+
? { ...(input.launch ?? {}), sections: [...(input.launch?.sections ?? []).filter((section) => section.id !== 'subagent'), { id: 'subagent', title: `Your role: ${profile.name}`, body: profile.instructions || profile.description, budget: 16_000, order: 22 }] }
|
|
403
|
+
: input.launch;
|
|
404
|
+
const runId = randomUUID();
|
|
405
|
+
const child = {
|
|
406
|
+
...input,
|
|
407
|
+
run: { ...input.run, ...(input.plan ? { worktreeId: null } : {}), id: runId, sessionId: latest.sessionId, parentRunId: request.parentRunId, relation: SUBAGENT_RELATION, goal: latest.goal, title: latest.title ?? briefTitle(latest.goal), attachmentCount: 0, resumedFromRunId: latest.id, handoffId: null, profile: latest.profile ?? null },
|
|
408
|
+
accountId, poolId: null, sessionDir, resume: null, continueFrom: latest.id,
|
|
409
|
+
text: typeof request.brief === 'string' ? request.brief.trim() : '', images: undefined, requiresImageInput: false, preamble: null,
|
|
410
|
+
caller: { ...input.caller, runId: undefined, sessionId: latest.sessionId },
|
|
411
|
+
tools: { allow: pinned.tools, gated: (input.tools.gated ?? []).filter((name) => pinned.tools.includes(name)) },
|
|
412
|
+
capabilities: pinned, depth: (input.depth ?? 0) + 1,
|
|
413
|
+
variant: null, launch,
|
|
414
|
+
model: latest.model ?? input.model, effort: latest.effort ?? input.effort,
|
|
415
|
+
...(input.plan ? { connections: false, subagents: null } : {})
|
|
416
|
+
};
|
|
417
|
+
const result = await this.launchChild(parent, request, child);
|
|
418
|
+
return { ...result, continued: latest.id, ...(latest.profile ? { agent: latest.profile } : {}) };
|
|
419
|
+
}
|
|
420
|
+
selected(selection, parent) {
|
|
421
|
+
const owned = this.owned(selection.parentRunId, parent);
|
|
422
|
+
if (selection.runIds !== undefined && (!Array.isArray(selection.runIds) || selection.runIds.some((id) => typeof id !== 'string')))
|
|
423
|
+
throw invalid('runIds must be an array of child run IDs.');
|
|
424
|
+
const ids = [...new Set(selection.runIds ?? [...owned])];
|
|
425
|
+
if (ids.some((id) => !owned.has(id)))
|
|
426
|
+
throw invalid('Select only subagents owned by this parent.');
|
|
427
|
+
return ids;
|
|
428
|
+
}
|
|
429
|
+
results(selection) {
|
|
430
|
+
loadRun(this.env.root, selection.parentRunId);
|
|
431
|
+
const parent = this.parents.get(selection.parentRunId);
|
|
432
|
+
return this.selected(selection, parent).map((runId) => {
|
|
433
|
+
const run = findRun(this.env.root, runId);
|
|
434
|
+
const reply = run && readEvents(this.env.root, runId).filter((event) => event.type === 'message.completed' && event.payload.role === 'assistant').at(-1);
|
|
435
|
+
const payload = reply?.payload;
|
|
436
|
+
return { runId, status: run?.status ?? 'queued', text: takeChars(payload?.text ?? '', 16_000), terminalReason: run?.terminalReason ?? null };
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
async wait(selection, signal) {
|
|
440
|
+
const parent = this.parent(selection.parentRunId);
|
|
441
|
+
const ids = this.selected(selection, parent);
|
|
442
|
+
const abort = signal ? AbortSignal.any([signal, parent.stopped.signal]) : parent.stopped.signal;
|
|
443
|
+
await until(Promise.all(ids.map(async (id) => {
|
|
444
|
+
const starting = parent.launching.get(id);
|
|
445
|
+
if (starting)
|
|
446
|
+
await starting;
|
|
447
|
+
const run = findRun(this.env.root, id);
|
|
448
|
+
if (run && isActiveStatus(run.status))
|
|
449
|
+
await this.runs.wait(id, abort);
|
|
450
|
+
})), abort);
|
|
451
|
+
return this.results({ ...selection, runIds: ids });
|
|
452
|
+
}
|
|
453
|
+
/** Reconcile only owners present on the selected native branch, with matching account and caller. */
|
|
454
|
+
restore(parentRunId, history) {
|
|
455
|
+
const parent = this.parent(parentRunId);
|
|
456
|
+
const current = loadRun(this.env.root, parentRunId);
|
|
457
|
+
for (const owner of history.owners) {
|
|
458
|
+
if (owner === parentRunId)
|
|
459
|
+
continue;
|
|
460
|
+
const old = findRun(this.env.root, owner);
|
|
461
|
+
// The owner marker on this native branch is the lineage; a host may give each launch of the
|
|
462
|
+
// same conversation a new session id (INV-RUN-4).
|
|
463
|
+
if (!old || old.accountId !== current.accountId || old.agentId !== current.agentId || old.projectId !== current.projectId || old.workingDirectory !== current.workingDirectory || !old.nativeSessionId || old.nativeSessionId !== current.nativeSessionId)
|
|
464
|
+
continue;
|
|
465
|
+
for (const id of recordedSubagents(this.env.root, owner)) {
|
|
466
|
+
let child = findRun(this.env.root, id);
|
|
467
|
+
if (!child) {
|
|
468
|
+
// The process can die after reserving ownership but before sessions.run saves the child.
|
|
469
|
+
saveRun(this.env.root, { ...old, id, sessionId: id, parentRunId: owner, relation: SUBAGENT_RELATION, nativeSessionId: null, resumedFromRunId: null, handoffId: null, exitCode: null, goal: null, attachmentCount: 0, status: 'interrupted', startedAt: now(), endedAt: now(), terminalReason: 'Subagent startup was interrupted before its session opened.' });
|
|
470
|
+
child = findRun(this.env.root, id);
|
|
471
|
+
}
|
|
472
|
+
if (child?.parentRunId === owner && child.relation === SUBAGENT_RELATION && child.accountId === current.accountId)
|
|
473
|
+
parent.recovered.add(id);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
async delivery(parentRunId, history, settle, signal) {
|
|
478
|
+
const parent = this.parent(parentRunId);
|
|
479
|
+
this.restore(parentRunId, history);
|
|
480
|
+
if (settle) {
|
|
481
|
+
// A host may start another child while earlier children are settling.
|
|
482
|
+
for (;;) {
|
|
483
|
+
await this.wait({ parentRunId }, signal);
|
|
484
|
+
if (!parent.launching.size && this.results({ parentRunId }).every((result) => !isActiveStatus(result.status)))
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
const delivered = new Set(history.receipts.flatMap((receipt) => receipt.delivered ?? []));
|
|
489
|
+
const all = this.results({ parentRunId });
|
|
490
|
+
const records = new Map(all.map((result) => [result.runId, findRun(this.env.root, result.runId)]));
|
|
491
|
+
// A stopped child that was continued is reported through its continuation instead.
|
|
492
|
+
const superseded = new Set([...records.values()].flatMap((record) => record?.resumedFromRunId ? [record.resumedFromRunId] : []));
|
|
493
|
+
const pending = all.filter((result) => !isActiveStatus(result.status) && !delivered.has(result.runId) && !superseded.has(result.runId));
|
|
494
|
+
const chunks = [];
|
|
495
|
+
const ids = [];
|
|
496
|
+
let size = 0;
|
|
497
|
+
for (const result of pending) {
|
|
498
|
+
const record = records.get(result.runId);
|
|
499
|
+
const label = [record?.profile, record?.title].filter(Boolean).join(' · ');
|
|
500
|
+
const stopped = (result.status === 'interrupted' || result.status === 'failed') && continuationOf(this.env.root, result.runId).resumable;
|
|
501
|
+
const text = `Subagent run ${result.runId} · ${result.status}${label ? ` (${label})` : ''}\n${result.text || result.terminalReason || 'No written reply.'}${stopped ? `\nIt stopped before finishing. ${continueHint(result.runId)}` : ''}`;
|
|
502
|
+
if (size + text.length > 32_000 && ids.length)
|
|
503
|
+
break;
|
|
504
|
+
chunks.push(text);
|
|
505
|
+
ids.push(result.runId);
|
|
506
|
+
size += text.length;
|
|
507
|
+
}
|
|
508
|
+
return ids.length ? { text: chunks.join('\n\n'), receipt: { version: 1, ownerRunId: parentRunId, delivered: ids } } : null;
|
|
509
|
+
}
|
|
510
|
+
/** A broken adapter must fail visibly rather than complete with an undelivered child result. */
|
|
511
|
+
async verify(parentRunId, history) {
|
|
512
|
+
if (history)
|
|
513
|
+
this.restore(parentRunId, history);
|
|
514
|
+
await this.wait({ parentRunId });
|
|
515
|
+
if (history && await this.delivery(parentRunId, history, false))
|
|
516
|
+
throw new HarnessError('subagent_delivery_failed', 'A child result was not persisted in this conversation. Resume this reply to recover it.');
|
|
517
|
+
}
|
|
518
|
+
extension(runId) {
|
|
519
|
+
return { name: 'native-subagents', factory: (pi) => {
|
|
520
|
+
pi.on('before_agent_start', async (_event, ctx) => {
|
|
521
|
+
if (!this.parents.has(runId))
|
|
522
|
+
return;
|
|
523
|
+
const history = subagentHistory(ctx.sessionManager.getBranch());
|
|
524
|
+
this.restore(runId, history);
|
|
525
|
+
pi.appendEntry(SUBAGENT_OWNER, { runId });
|
|
526
|
+
this.parent(runId).started();
|
|
527
|
+
// Children an earlier reply left stopped are reported before the model answers, so it can
|
|
528
|
+
// continue them instead of starting over.
|
|
529
|
+
const notice = await this.delivery(runId, history, false);
|
|
530
|
+
if (notice)
|
|
531
|
+
return { message: { customType: SUBAGENT_RESULTS, content: notice.text, display: false, details: { [SUBAGENT_RECEIPT]: notice.receipt } } };
|
|
532
|
+
});
|
|
533
|
+
const deliver = async (event, ctx, settle) => {
|
|
534
|
+
if (!this.parents.has(runId) || (settle && event.outcome !== 'completed') || ctx.signal?.aborted)
|
|
535
|
+
return;
|
|
536
|
+
const history = subagentHistory([...ctx.sessionManager.getBranch(), ...event.entries]);
|
|
537
|
+
const result = await this.delivery(runId, history, settle, ctx.signal);
|
|
538
|
+
if (!result)
|
|
539
|
+
return;
|
|
540
|
+
return { entries: [...event.entries, { type: 'custom_message', customType: SUBAGENT_RESULTS, content: result.text, display: false, details: { [SUBAGENT_RECEIPT]: result.receipt } }], continue: true };
|
|
541
|
+
};
|
|
542
|
+
pi.on('turn_end', (event, ctx) => deliver(event, ctx, false));
|
|
543
|
+
pi.on('agent_before_settle', (event, ctx) => deliver(event, ctx, true));
|
|
544
|
+
} };
|
|
545
|
+
}
|
|
546
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export declare const SPAWN_SUBAGENT = "spawn_subagent";
|
|
2
|
+
export declare const WAIT_SUBAGENTS = "wait_subagents";
|
|
3
|
+
export declare const SUBAGENT_RELATION = "subagent";
|
|
4
|
+
/** How deep subagents may nest when the caller does not say. */
|
|
5
|
+
export declare const DEFAULT_SUBAGENT_DEPTH = 1;
|
|
6
|
+
export declare const MAX_SUBAGENT_DEPTH = 3;
|
|
7
|
+
export interface SubagentOptions {
|
|
8
|
+
/** Maximum consecutive native subagent levels below a caller (1 to 3). */
|
|
9
|
+
maxDepth?: number;
|
|
10
|
+
/** Distinct child conversations a run may start. */
|
|
11
|
+
maxChildren?: number;
|
|
12
|
+
/** Children a run may start from one named profile; a name it omits uses `maxOther`. */
|
|
13
|
+
maxByProfile?: Record<string, number>;
|
|
14
|
+
/** Children allowed from a named profile `maxByProfile` does not list. */
|
|
15
|
+
maxOther?: number;
|
|
16
|
+
/** Children allowed when the caller starts one with no profile. */
|
|
17
|
+
maxUnprofiled?: number;
|
|
18
|
+
}
|
|
19
|
+
/** How many distinct children a run may start when the caller does not say. */
|
|
20
|
+
export declare const DEFAULT_SUBAGENT_CHILDREN = 4;
|
|
21
|
+
/** The most a host may allow, so a mistyped setting cannot lift the budget entirely. */
|
|
22
|
+
export declare const MAX_SUBAGENT_CHILDREN = 50;
|
|
23
|
+
/** Foundation limits for the profiles the harness ships; `maxByProfile` overrides them. */
|
|
24
|
+
export declare const DEFAULT_SUBAGENT_PROFILE_CHILDREN: Readonly<Record<string, number>>;
|
|
25
|
+
export declare const DEFAULT_SUBAGENT_OTHER_PROFILE = 1;
|
|
26
|
+
export declare const DEFAULT_SUBAGENT_UNPROFILED = 1;
|
|
27
|
+
/** The bucket a child with no profile counts against. No profile name can be `*`. */
|
|
28
|
+
export declare const UNPROFILED_SUBAGENT = "*";
|
|
29
|
+
/** The children one run may start, by profile and in total. */
|
|
30
|
+
export interface SubagentQuota {
|
|
31
|
+
children: number;
|
|
32
|
+
profiles: Readonly<Record<string, number>>;
|
|
33
|
+
other: number;
|
|
34
|
+
unprofiled: number;
|
|
35
|
+
}
|
|
36
|
+
/** The effective budget: the caller's values merged over the foundation defaults. */
|
|
37
|
+
export declare function subagentQuota(options: SubagentOptions | undefined): SubagentQuota;
|
|
38
|
+
/** The bucket a child counts against: its profile name, or the unprofiled bucket. */
|
|
39
|
+
export declare function subagentProfileKey(profile: string | null | undefined): string;
|
|
40
|
+
/** How many children this profile may still start under the quota. */
|
|
41
|
+
export declare function subagentProfileLimit(quota: SubagentQuota, key: string): number;
|
|
42
|
+
export declare function subagentDepth(options: SubagentOptions | undefined): number;
|
|
43
|
+
export interface SubagentInput {
|
|
44
|
+
parentRunId: string;
|
|
45
|
+
/** The task for a new child; with `continue`, an optional extra instruction. */
|
|
46
|
+
brief?: string;
|
|
47
|
+
/** The short name the roster shows for the child (PROP-0030); the spawn tool requires it. */
|
|
48
|
+
title?: string;
|
|
49
|
+
tools?: string[];
|
|
50
|
+
wait?: boolean;
|
|
51
|
+
/** An agent profile by name (PROP-0029), or one of the parent variant's subagents (c5). */
|
|
52
|
+
agent?: string;
|
|
53
|
+
/**
|
|
54
|
+
* A stopped child to continue instead of starting a fresh one: its run id. The new child reopens
|
|
55
|
+
* that child's own history and keeps its profile, tools, account and variant; `brief` is then an
|
|
56
|
+
* optional extra instruction.
|
|
57
|
+
*/
|
|
58
|
+
continue?: string;
|
|
59
|
+
}
|
|
60
|
+
/** The words that tell a parent a stopped child can be continued rather than started again. */
|
|
61
|
+
export declare function continueHint(runId: string): string;
|
|
62
|
+
/** A subagent title is one short imperative, at most this many words (PROP-0030). */
|
|
63
|
+
export declare const MAX_SUBAGENT_TITLE_WORDS = 6;
|
|
64
|
+
/** The title a subagent title input means after cleaning, or undefined when it is not one. */
|
|
65
|
+
export declare function subagentTitle(value: unknown): string | undefined;
|
|
66
|
+
/** A title read from a brief when the caller gave none: its first line, cut to a short length. */
|
|
67
|
+
export declare function briefTitle(brief: string | null): string;
|
|
68
|
+
export interface SubagentSelection {
|
|
69
|
+
parentRunId: string;
|
|
70
|
+
runIds?: string[];
|
|
71
|
+
}
|
|
72
|
+
export interface SubagentResult {
|
|
73
|
+
runId: string;
|
|
74
|
+
status: string;
|
|
75
|
+
text: string;
|
|
76
|
+
terminalReason: string | null;
|
|
77
|
+
}
|
|
78
|
+
export interface SubagentReceipt {
|
|
79
|
+
version: 1;
|
|
80
|
+
ownerRunId: string;
|
|
81
|
+
spawned?: string[];
|
|
82
|
+
delivered?: string[];
|
|
83
|
+
}
|
|
84
|
+
export declare const SUBAGENT_RECEIPT = "xingularSubagents";
|
|
85
|
+
export declare const SUBAGENT_OWNER = "xingular-subagent-owner";
|
|
86
|
+
export declare const SUBAGENT_RESULTS = "xingular-subagent-results";
|
|
87
|
+
/** Read explicit native metadata, including entries retained before compaction. */
|
|
88
|
+
export declare function subagentHistory(entries: readonly unknown[]): {
|
|
89
|
+
owners: string[];
|
|
90
|
+
receipts: SubagentReceipt[];
|
|
91
|
+
};
|
|
92
|
+
/** Native nesting is independent of a host's other uses of the generic caller depth. */
|
|
93
|
+
export declare function subagentNesting(root: string, run: {
|
|
94
|
+
relation?: string | null;
|
|
95
|
+
parentRunId?: string | null;
|
|
96
|
+
}): number;
|
|
97
|
+
/** The child's final reply, or why it ended without one. */
|
|
98
|
+
export declare function subagentReport(root: string, runId: string): string;
|