@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,136 @@
|
|
|
1
|
+
import { takeChars } from "../core/text.js";
|
|
2
|
+
import { findRun, loadRun, readEvents } from "./runStore.js";
|
|
3
|
+
export const SPAWN_SUBAGENT = 'spawn_subagent';
|
|
4
|
+
export const WAIT_SUBAGENTS = 'wait_subagents';
|
|
5
|
+
export const SUBAGENT_RELATION = 'subagent';
|
|
6
|
+
/** How deep subagents may nest when the caller does not say. */
|
|
7
|
+
export const DEFAULT_SUBAGENT_DEPTH = 1;
|
|
8
|
+
export const MAX_SUBAGENT_DEPTH = 3;
|
|
9
|
+
/** How many distinct children a run may start when the caller does not say. */
|
|
10
|
+
export const DEFAULT_SUBAGENT_CHILDREN = 4;
|
|
11
|
+
/** The most a host may allow, so a mistyped setting cannot lift the budget entirely. */
|
|
12
|
+
export const MAX_SUBAGENT_CHILDREN = 50;
|
|
13
|
+
/** Foundation limits for the profiles the harness ships; `maxByProfile` overrides them. */
|
|
14
|
+
export const DEFAULT_SUBAGENT_PROFILE_CHILDREN = { worker: 2, explorer: 3 };
|
|
15
|
+
export const DEFAULT_SUBAGENT_OTHER_PROFILE = 1;
|
|
16
|
+
export const DEFAULT_SUBAGENT_UNPROFILED = 1;
|
|
17
|
+
/** The bucket a child with no profile counts against. No profile name can be `*`. */
|
|
18
|
+
export const UNPROFILED_SUBAGENT = '*';
|
|
19
|
+
function limit(value, fallback) {
|
|
20
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
21
|
+
return fallback;
|
|
22
|
+
return Math.min(MAX_SUBAGENT_CHILDREN, Math.max(0, Math.trunc(value)));
|
|
23
|
+
}
|
|
24
|
+
/** The effective budget: the caller's values merged over the foundation defaults. */
|
|
25
|
+
export function subagentQuota(options) {
|
|
26
|
+
const profiles = { ...DEFAULT_SUBAGENT_PROFILE_CHILDREN };
|
|
27
|
+
const given = options?.maxByProfile;
|
|
28
|
+
if (given && typeof given === 'object' && !Array.isArray(given)) {
|
|
29
|
+
for (const [raw, value] of Object.entries(given)) {
|
|
30
|
+
const name = raw.trim();
|
|
31
|
+
if (!name || name.length > 64 || /[\x00-\x1f\x7f]/u.test(name))
|
|
32
|
+
continue;
|
|
33
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
34
|
+
continue;
|
|
35
|
+
profiles[name] = limit(value, profiles[name] ?? DEFAULT_SUBAGENT_OTHER_PROFILE);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
children: limit(options?.maxChildren, DEFAULT_SUBAGENT_CHILDREN),
|
|
40
|
+
profiles,
|
|
41
|
+
other: limit(options?.maxOther, DEFAULT_SUBAGENT_OTHER_PROFILE),
|
|
42
|
+
unprofiled: limit(options?.maxUnprofiled, DEFAULT_SUBAGENT_UNPROFILED)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** The bucket a child counts against: its profile name, or the unprofiled bucket. */
|
|
46
|
+
export function subagentProfileKey(profile) {
|
|
47
|
+
const name = typeof profile === 'string' ? profile.trim() : '';
|
|
48
|
+
return name || UNPROFILED_SUBAGENT;
|
|
49
|
+
}
|
|
50
|
+
/** How many children this profile may still start under the quota. */
|
|
51
|
+
export function subagentProfileLimit(quota, key) {
|
|
52
|
+
return key === UNPROFILED_SUBAGENT ? quota.unprofiled : quota.profiles[key] ?? quota.other;
|
|
53
|
+
}
|
|
54
|
+
export function subagentDepth(options) {
|
|
55
|
+
const value = Math.trunc(options?.maxDepth ?? DEFAULT_SUBAGENT_DEPTH);
|
|
56
|
+
return Math.min(MAX_SUBAGENT_DEPTH, Math.max(1, Number.isFinite(value) ? value : DEFAULT_SUBAGENT_DEPTH));
|
|
57
|
+
}
|
|
58
|
+
/** The words that tell a parent a stopped child can be continued rather than started again. */
|
|
59
|
+
export function continueHint(runId) {
|
|
60
|
+
return `Its conversation is saved: continue it with spawn_subagent { "continue": "${runId}" } if the work is still needed, instead of starting it again from scratch.`;
|
|
61
|
+
}
|
|
62
|
+
/** A subagent title is one short imperative, at most this many words (PROP-0030). */
|
|
63
|
+
export const MAX_SUBAGENT_TITLE_WORDS = 6;
|
|
64
|
+
const BRIEF_TITLE_LENGTH = 60;
|
|
65
|
+
/** The title a subagent title input means after cleaning, or undefined when it is not one. */
|
|
66
|
+
export function subagentTitle(value) {
|
|
67
|
+
if (typeof value !== 'string')
|
|
68
|
+
return undefined;
|
|
69
|
+
if (/[\x00-\x08\x0e-\x1f\x7f-\x9f]/u.test(value))
|
|
70
|
+
return undefined;
|
|
71
|
+
const title = value.replace(/\s+/gu, ' ').trim();
|
|
72
|
+
if (!title || title.split(' ').length > MAX_SUBAGENT_TITLE_WORDS)
|
|
73
|
+
return undefined;
|
|
74
|
+
return title;
|
|
75
|
+
}
|
|
76
|
+
/** A title read from a brief when the caller gave none: its first line, cut to a short length. */
|
|
77
|
+
export function briefTitle(brief) {
|
|
78
|
+
const line = (brief ?? '').split('\n').map((part) => part.replace(/\s+/gu, ' ').trim()).find(Boolean) ?? '';
|
|
79
|
+
return line.length > BRIEF_TITLE_LENGTH ? `${line.slice(0, BRIEF_TITLE_LENGTH - 1)}…` : line;
|
|
80
|
+
}
|
|
81
|
+
export const SUBAGENT_RECEIPT = 'xingularSubagents';
|
|
82
|
+
export const SUBAGENT_OWNER = 'xingular-subagent-owner';
|
|
83
|
+
export const SUBAGENT_RESULTS = 'xingular-subagent-results';
|
|
84
|
+
/** Read explicit native metadata, including entries retained before compaction. */
|
|
85
|
+
export function subagentHistory(entries) {
|
|
86
|
+
const owners = [];
|
|
87
|
+
const receipts = [];
|
|
88
|
+
for (const raw of entries) {
|
|
89
|
+
if (!raw || typeof raw !== 'object')
|
|
90
|
+
continue;
|
|
91
|
+
const entry = raw;
|
|
92
|
+
if (entry.type === 'custom' && entry.customType === SUBAGENT_OWNER && typeof entry.data?.runId === 'string')
|
|
93
|
+
owners.push(entry.data.runId);
|
|
94
|
+
const message = entry.type === 'message' ? entry.message : entry;
|
|
95
|
+
const receipt = message?.details?.[SUBAGENT_RECEIPT];
|
|
96
|
+
if (!receipt || receipt.version !== 1 || typeof receipt.ownerRunId !== 'string')
|
|
97
|
+
continue;
|
|
98
|
+
const strings = (value) => Array.isArray(value) && value.every((id) => typeof id === 'string');
|
|
99
|
+
if ((receipt.spawned !== undefined && !strings(receipt.spawned)) || (receipt.delivered !== undefined && !strings(receipt.delivered)))
|
|
100
|
+
continue;
|
|
101
|
+
receipts.push(receipt);
|
|
102
|
+
}
|
|
103
|
+
return { owners, receipts };
|
|
104
|
+
}
|
|
105
|
+
/** Native nesting is independent of a host's other uses of the generic caller depth. */
|
|
106
|
+
export function subagentNesting(root, run) {
|
|
107
|
+
let current = run;
|
|
108
|
+
let depth = 0;
|
|
109
|
+
const visited = new Set();
|
|
110
|
+
while (current.relation === SUBAGENT_RELATION) {
|
|
111
|
+
const parent = current.parentRunId;
|
|
112
|
+
if (!parent || visited.has(parent))
|
|
113
|
+
return MAX_SUBAGENT_DEPTH;
|
|
114
|
+
visited.add(parent);
|
|
115
|
+
depth++;
|
|
116
|
+
const record = findRun(root, parent);
|
|
117
|
+
if (!record)
|
|
118
|
+
return MAX_SUBAGENT_DEPTH;
|
|
119
|
+
current = record;
|
|
120
|
+
}
|
|
121
|
+
return depth;
|
|
122
|
+
}
|
|
123
|
+
/** The child's final reply, or why it ended without one. */
|
|
124
|
+
export function subagentReport(root, runId) {
|
|
125
|
+
const run = loadRun(root, runId);
|
|
126
|
+
const reply = readEvents(root, runId).filter((event) => event.type === 'message.completed' && event.payload.role === 'assistant').at(-1);
|
|
127
|
+
const text = typeof reply?.payload?.text === 'string' ? takeChars(reply.payload.text, 16_000) : '';
|
|
128
|
+
const lines = [`Subagent run ${runId} · ${run.status}`];
|
|
129
|
+
if (text)
|
|
130
|
+
lines.push(`Result:\n${text}`);
|
|
131
|
+
else if (run.status === 'completed')
|
|
132
|
+
lines.push('It finished without a written reply.');
|
|
133
|
+
if (run.status !== 'completed' && run.terminalReason)
|
|
134
|
+
lines.push(`Stopped because: ${run.terminalReason}`);
|
|
135
|
+
return lines.join('\n');
|
|
136
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { Checkpoint } from "./contracts.js";
|
|
2
|
+
export declare const WORK_SLICE_EXTENSION = "work-slice";
|
|
3
|
+
export interface WorkSliceInput {
|
|
4
|
+
/** False turns the guard off for this run: no budget, no handoff request, no continuation. */
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
/** Tool calls in one reply; 0 disables this limit. */
|
|
7
|
+
maxToolCalls?: number;
|
|
8
|
+
/** Minutes in one reply; 0 disables this limit. */
|
|
9
|
+
maxMinutes?: number;
|
|
10
|
+
/** New tokens in one reply (new input + cache writes + output); 0 disables this limit, and no limit is the default. */
|
|
11
|
+
maxNewTokens?: number;
|
|
12
|
+
/** Slices one task may use before it is handed back to the person; 0 disables the cap. */
|
|
13
|
+
maxSlices?: number;
|
|
14
|
+
/** Start the next slice from the checkpoint without asking. */
|
|
15
|
+
continue?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface SlicePolicy {
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
maxToolCalls: number;
|
|
20
|
+
maxMinutes: number;
|
|
21
|
+
maxNewTokens: number;
|
|
22
|
+
maxSlices: number;
|
|
23
|
+
continue: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The foundation defaults: no budget (ADR-0081). A reply is not cut at a number of tool calls, a
|
|
27
|
+
* length of time or a number of tokens, and nothing is continued as a "next slice"; it ends when the
|
|
28
|
+
* work is done, a person's decision is needed, or the person interrupts. The limits stay available
|
|
29
|
+
* to a caller that asks for one (`workSlice`, `XINGULAR_WORK_SLICE`), and the three-compaction guard
|
|
30
|
+
* is not a budget and stays on.
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_SLICE_POLICY: SlicePolicy;
|
|
33
|
+
export declare class WorkSliceError extends Error {
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The policy a run asked for, or the defaults. `XINGULAR_WORK_SLICE=off` at launch turns the guard
|
|
37
|
+
* off for every run in this process; nothing is persisted, so restarting without it restores the
|
|
38
|
+
* defaults.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseWorkSlice(input: unknown): SlicePolicy;
|
|
41
|
+
export type SliceEnd = 'budget' | 'compaction-thrash';
|
|
42
|
+
/** What a live reply tracks for its slice; the runner reads it after the reply. */
|
|
43
|
+
export interface SliceState {
|
|
44
|
+
slice: number;
|
|
45
|
+
steps: number;
|
|
46
|
+
tokens: number;
|
|
47
|
+
startedAt: number;
|
|
48
|
+
lastTool: string | null;
|
|
49
|
+
compactions: number;
|
|
50
|
+
/** Set when the guard ended the reply instead of the model finishing it. */
|
|
51
|
+
endedBy: SliceEnd | null;
|
|
52
|
+
/** The limit that ended it, for the record. */
|
|
53
|
+
endedByLimit: string | null;
|
|
54
|
+
/** Steps past which every non-exempt tool call is refused, once one was refused. */
|
|
55
|
+
refusedAt: number | null;
|
|
56
|
+
/** Whether this slice did work: a successful command or file change. A fruitless slice is not continued. */
|
|
57
|
+
progressed: boolean;
|
|
58
|
+
}
|
|
59
|
+
export declare function createSliceState(_policy: SlicePolicy, slice?: number, now?: number): SliceState;
|
|
60
|
+
/** Counters start again for each reply; a terminal session keeps one guard across replies. */
|
|
61
|
+
export declare function resetSliceState(state: SliceState, now?: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* The next slice of the same reply: fresh counters and clock, one more slice. Compactions carry
|
|
64
|
+
* over, so a reply that keeps compacting still ends.
|
|
65
|
+
*/
|
|
66
|
+
export declare function beginNextSlice(state: SliceState, now?: number): void;
|
|
67
|
+
/** The first limit this reply has passed, named as a person would say it. */
|
|
68
|
+
export declare function sliceLimitReached(policy: SlicePolicy, state: SliceState, now?: number): string | null;
|
|
69
|
+
interface ToolCall {
|
|
70
|
+
toolCallId: string;
|
|
71
|
+
toolName: string;
|
|
72
|
+
}
|
|
73
|
+
/** The part of Pi's extension API this guard uses. Structural, so the module needs no Pi import. */
|
|
74
|
+
interface GuardApi {
|
|
75
|
+
on(event: 'before_agent_start', handler: (event: {
|
|
76
|
+
messageType?: string;
|
|
77
|
+
}) => unknown): void;
|
|
78
|
+
on(event: 'tool_call', handler: (event: ToolCall) => unknown): void;
|
|
79
|
+
on(event: 'message_end', handler: (event: {
|
|
80
|
+
message: {
|
|
81
|
+
role: string;
|
|
82
|
+
usage?: {
|
|
83
|
+
input?: number;
|
|
84
|
+
output?: number;
|
|
85
|
+
cacheRead?: number;
|
|
86
|
+
cacheWrite?: number;
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
}) => unknown): void;
|
|
90
|
+
}
|
|
91
|
+
export interface WorkSliceGuardOptions {
|
|
92
|
+
policy: SlicePolicy;
|
|
93
|
+
state: SliceState;
|
|
94
|
+
/** Called when a triggering call terminates the reply; the runner ends it. */
|
|
95
|
+
onEnd?: (end: SliceEnd, limit: string) => void;
|
|
96
|
+
onRefuse?: (event: ToolCall, reason: string) => void;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Bounds one reply. A call past the budget is refused with one wrap-up request, and an ended reply
|
|
100
|
+
* lets only a handoff call through. Three compactions in one reply end it too. Every other call is
|
|
101
|
+
* allowed, however often it is made.
|
|
102
|
+
*/
|
|
103
|
+
export declare function workSliceGuard(options: WorkSliceGuardOptions): (pi: GuardApi) => void;
|
|
104
|
+
export declare const SLICE_CONTINUE_CUSTOM_TYPE = "xingular-slice-continue";
|
|
105
|
+
/** The part of Pi's extension API the continuation uses. Structural, so the module needs no Pi import. */
|
|
106
|
+
interface ContinuationApi {
|
|
107
|
+
on(event: 'before_agent_start', handler: (event: {
|
|
108
|
+
messageType?: string;
|
|
109
|
+
}) => unknown): void;
|
|
110
|
+
on(event: 'tool_result', handler: (event: {
|
|
111
|
+
toolName: string;
|
|
112
|
+
isError?: boolean;
|
|
113
|
+
}) => unknown): void;
|
|
114
|
+
on(event: 'agent_before_settle', handler: (event: {
|
|
115
|
+
outcome?: string;
|
|
116
|
+
continue?: boolean;
|
|
117
|
+
entries: unknown[];
|
|
118
|
+
}, ctx?: {
|
|
119
|
+
signal?: AbortSignal;
|
|
120
|
+
}) => unknown): void;
|
|
121
|
+
}
|
|
122
|
+
export interface SliceContinuationOptions {
|
|
123
|
+
policy: SlicePolicy;
|
|
124
|
+
state: SliceState;
|
|
125
|
+
/** False while a plan runs: a plan is not continued. */
|
|
126
|
+
active?: () => boolean;
|
|
127
|
+
failed?: () => boolean;
|
|
128
|
+
/** True when the completion check said the reply needs the person (ADR-0071). */
|
|
129
|
+
blocked?: () => boolean;
|
|
130
|
+
/** The todo list: when every item is done, the work is not continued. */
|
|
131
|
+
todo?: () => readonly {
|
|
132
|
+
status: string;
|
|
133
|
+
}[];
|
|
134
|
+
/** The next open step, for the continue message. */
|
|
135
|
+
next?: () => string;
|
|
136
|
+
/** True while a /goal is active: a goal's slices go on even when every todo item is done (ADR-0072). */
|
|
137
|
+
goalActive?: () => boolean;
|
|
138
|
+
/** Called before the next slice starts, with the slice that ended. */
|
|
139
|
+
onContinue?: (ended: {
|
|
140
|
+
slice: number;
|
|
141
|
+
steps: number;
|
|
142
|
+
limit: string | null;
|
|
143
|
+
}) => void;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Continues a reply in place when its slice ended at the budget (PROP-0041, ADR-0070): the same
|
|
147
|
+
* run and the same cached prompt, with fresh counters, up to `maxSlices`. Never after a fruitless,
|
|
148
|
+
* blocked, failed, aborted or plan slice, or when every todo item is done. A person's message
|
|
149
|
+
* starts again at slice 1.
|
|
150
|
+
*/
|
|
151
|
+
export declare function sliceContinuation(options: SliceContinuationOptions): (pi: ContinuationApi) => void;
|
|
152
|
+
/**
|
|
153
|
+
* Which slice of its session a run is, from 1. Counts the recorded continuation chain, so it
|
|
154
|
+
* survives a restart and needs no extra field on the run record.
|
|
155
|
+
*/
|
|
156
|
+
export declare function sliceOf(root: string, runId: string, limit?: number): number;
|
|
157
|
+
/** The reason a checkpoint the harness derives (no model handoff) records. */
|
|
158
|
+
export declare function derivedReason(end: SliceEnd | null): Checkpoint['reason'];
|
|
159
|
+
/** What a heartbeat reports about the tools in flight: their names once each, and the oldest one's age. */
|
|
160
|
+
export declare function activeToolBeat(tools: ReadonlyMap<string, {
|
|
161
|
+
name: string;
|
|
162
|
+
at: number;
|
|
163
|
+
}>, now?: number): {
|
|
164
|
+
activeTools: string[];
|
|
165
|
+
oldestToolMs: number;
|
|
166
|
+
} | Record<string, never>;
|
|
167
|
+
export {};
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { findRun } from "./runStore.js";
|
|
2
|
+
export const WORK_SLICE_EXTENSION = 'work-slice';
|
|
3
|
+
/**
|
|
4
|
+
* The foundation defaults: no budget (ADR-0081). A reply is not cut at a number of tool calls, a
|
|
5
|
+
* length of time or a number of tokens, and nothing is continued as a "next slice"; it ends when the
|
|
6
|
+
* work is done, a person's decision is needed, or the person interrupts. The limits stay available
|
|
7
|
+
* to a caller that asks for one (`workSlice`, `XINGULAR_WORK_SLICE`), and the three-compaction guard
|
|
8
|
+
* is not a budget and stays on.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_SLICE_POLICY = {
|
|
11
|
+
enabled: true,
|
|
12
|
+
maxToolCalls: 0,
|
|
13
|
+
maxMinutes: 0,
|
|
14
|
+
maxNewTokens: 0,
|
|
15
|
+
// Inert while no limit ends a slice; a caller that sets one gets the same continuation as before.
|
|
16
|
+
maxSlices: 8,
|
|
17
|
+
continue: true
|
|
18
|
+
};
|
|
19
|
+
const LIMITS = {
|
|
20
|
+
maxToolCalls: { min: 1, max: 2_000 },
|
|
21
|
+
maxMinutes: { min: 1, max: 480 },
|
|
22
|
+
maxNewTokens: { min: 1_000, max: 5_000_000 },
|
|
23
|
+
maxSlices: { min: 1, max: 100 }
|
|
24
|
+
};
|
|
25
|
+
export class WorkSliceError extends Error {
|
|
26
|
+
}
|
|
27
|
+
/** `XINGULAR_WORK_SLICE=maxToolCalls=15,maxSlices=3` at launch: the same fields as a run's policy. */
|
|
28
|
+
function launchPolicy(text) {
|
|
29
|
+
const record = {};
|
|
30
|
+
for (const part of text.split(',')) {
|
|
31
|
+
const [key, raw] = part.split('=').map((value) => value.trim());
|
|
32
|
+
if (!key || raw === undefined)
|
|
33
|
+
throw new WorkSliceError(`XINGULAR_WORK_SLICE must be off or key=value pairs, not ${JSON.stringify(text)}.`);
|
|
34
|
+
record[key] = raw === 'true' ? true : raw === 'false' ? false : Number(raw);
|
|
35
|
+
}
|
|
36
|
+
return record;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The policy a run asked for, or the defaults. `XINGULAR_WORK_SLICE=off` at launch turns the guard
|
|
40
|
+
* off for every run in this process; nothing is persisted, so restarting without it restores the
|
|
41
|
+
* defaults.
|
|
42
|
+
*/
|
|
43
|
+
export function parseWorkSlice(input) {
|
|
44
|
+
if (input === undefined || input === null) {
|
|
45
|
+
const launch = process.env.XINGULAR_WORK_SLICE?.trim();
|
|
46
|
+
if (launch === undefined || launch === '')
|
|
47
|
+
return { ...DEFAULT_SLICE_POLICY };
|
|
48
|
+
if (['off', '0', 'false'].includes(launch.toLowerCase()))
|
|
49
|
+
return { ...DEFAULT_SLICE_POLICY, enabled: false };
|
|
50
|
+
return parseWorkSlice(launchPolicy(launch));
|
|
51
|
+
}
|
|
52
|
+
if (typeof input !== 'object' || Array.isArray(input))
|
|
53
|
+
throw new WorkSliceError('workSlice must be an object.');
|
|
54
|
+
const record = input;
|
|
55
|
+
const policy = { ...DEFAULT_SLICE_POLICY };
|
|
56
|
+
for (const key of Object.keys(record)) {
|
|
57
|
+
if (key === 'enabled') {
|
|
58
|
+
if (typeof record.enabled !== 'boolean')
|
|
59
|
+
throw new WorkSliceError('workSlice.enabled must be true or false.');
|
|
60
|
+
policy.enabled = record.enabled;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (key === 'continue') {
|
|
64
|
+
if (typeof record.continue !== 'boolean')
|
|
65
|
+
throw new WorkSliceError('workSlice.continue must be true or false.');
|
|
66
|
+
policy.continue = record.continue;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const limits = LIMITS[key];
|
|
70
|
+
if (!limits)
|
|
71
|
+
throw new WorkSliceError(`workSlice has no field ${key}.`);
|
|
72
|
+
const value = record[key];
|
|
73
|
+
if (typeof value !== 'number' || !Number.isInteger(value))
|
|
74
|
+
throw new WorkSliceError(`workSlice.${key} must be a whole number.`);
|
|
75
|
+
// 0 switches one limit off, as the settings page says.
|
|
76
|
+
if (value === 0) {
|
|
77
|
+
policy[key] = 0;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (value < limits.min || value > limits.max)
|
|
81
|
+
throw new WorkSliceError(`workSlice.${key} must be between ${limits.min} and ${limits.max}, or 0 for no limit.`);
|
|
82
|
+
policy[key] = value;
|
|
83
|
+
}
|
|
84
|
+
return policy;
|
|
85
|
+
}
|
|
86
|
+
export function createSliceState(_policy, slice = 1, now = Date.now()) {
|
|
87
|
+
return { slice, steps: 0, tokens: 0, startedAt: now, lastTool: null, compactions: 0, endedBy: null, endedByLimit: null, refusedAt: null, progressed: false };
|
|
88
|
+
}
|
|
89
|
+
/** Counters start again for each reply; a terminal session keeps one guard across replies. */
|
|
90
|
+
export function resetSliceState(state, now = Date.now()) {
|
|
91
|
+
state.steps = 0;
|
|
92
|
+
state.tokens = 0;
|
|
93
|
+
state.startedAt = now;
|
|
94
|
+
state.lastTool = null;
|
|
95
|
+
state.compactions = 0;
|
|
96
|
+
state.endedBy = null;
|
|
97
|
+
state.endedByLimit = null;
|
|
98
|
+
state.refusedAt = null;
|
|
99
|
+
state.progressed = false;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The next slice of the same reply: fresh counters and clock, one more slice. Compactions carry
|
|
103
|
+
* over, so a reply that keeps compacting still ends.
|
|
104
|
+
*/
|
|
105
|
+
export function beginNextSlice(state, now = Date.now()) {
|
|
106
|
+
const compactions = state.compactions;
|
|
107
|
+
resetSliceState(state, now);
|
|
108
|
+
state.compactions = compactions;
|
|
109
|
+
state.slice += 1;
|
|
110
|
+
}
|
|
111
|
+
/** The first limit this reply has passed, named as a person would say it. */
|
|
112
|
+
export function sliceLimitReached(policy, state, now = Date.now()) {
|
|
113
|
+
if (policy.maxToolCalls > 0 && state.steps >= policy.maxToolCalls)
|
|
114
|
+
return `${policy.maxToolCalls} tool calls`;
|
|
115
|
+
if (policy.maxMinutes > 0 && now - state.startedAt >= policy.maxMinutes * 60_000)
|
|
116
|
+
return `${policy.maxMinutes} minutes`;
|
|
117
|
+
if (policy.maxNewTokens > 0 && state.tokens >= policy.maxNewTokens)
|
|
118
|
+
return `${Math.round(policy.maxNewTokens / 1000)}k new tokens`;
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
/** Tools a reply may still call after its slice ended. A plan update waits for the next slice. */
|
|
122
|
+
const HANDOFF_TOOLS = new Set(['session_name']);
|
|
123
|
+
const clip = (value, limit) => (value.length <= limit ? value : `${value.slice(0, limit - 1)}…`);
|
|
124
|
+
// The harness writes the handoff itself from the reply's files, checks and todo list (ADR-0069), so
|
|
125
|
+
// the model is only asked to stop and say where it is.
|
|
126
|
+
function handoffRequest(limit, state) {
|
|
127
|
+
return clip(`This reply reached its work-slice limit (${limit}; step ${state.steps}). Stop using tools and write a short report: what is done or found, what is left, and the single next step. ` +
|
|
128
|
+
'The Harness records a checkpoint from this reply\'s evidence, and the next slice continues from it. Do not call other tools.', 600);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Bounds one reply. A call past the budget is refused with one wrap-up request, and an ended reply
|
|
132
|
+
* lets only a handoff call through. Three compactions in one reply end it too. Every other call is
|
|
133
|
+
* allowed, however often it is made.
|
|
134
|
+
*/
|
|
135
|
+
export function workSliceGuard(options) {
|
|
136
|
+
const { policy, state } = options;
|
|
137
|
+
const end = (kind, limit) => {
|
|
138
|
+
state.endedBy = kind;
|
|
139
|
+
state.endedByLimit = limit;
|
|
140
|
+
options.onEnd?.(kind, limit);
|
|
141
|
+
const reason = kind === 'compaction-thrash'
|
|
142
|
+
? handoffRequest('three context compactions in one reply', state)
|
|
143
|
+
: handoffRequest(limit, state);
|
|
144
|
+
return { block: true, terminate: true, reason };
|
|
145
|
+
};
|
|
146
|
+
return (pi) => {
|
|
147
|
+
// Pi emits agent_start again for every continuation (a slice continuation, delivered subagent
|
|
148
|
+
// results, a plan repair), and those belong to the same reply and the same budget. Only a
|
|
149
|
+
// person's message starts a new slice.
|
|
150
|
+
pi.on('before_agent_start', (event) => {
|
|
151
|
+
if (event.messageType !== undefined && event.messageType !== 'user')
|
|
152
|
+
return;
|
|
153
|
+
resetSliceState(state);
|
|
154
|
+
});
|
|
155
|
+
pi.on('message_end', (event) => {
|
|
156
|
+
const usage = event.message.usage;
|
|
157
|
+
if (event.message.role !== 'assistant' || !usage)
|
|
158
|
+
return;
|
|
159
|
+
// New tokens only: the cached prefix was sent before and is not new context or new cost.
|
|
160
|
+
state.tokens += (usage.input ?? 0) + (usage.cacheWrite ?? 0) + (usage.output ?? 0);
|
|
161
|
+
});
|
|
162
|
+
pi.on('tool_call', (event) => {
|
|
163
|
+
const name = event.toolName;
|
|
164
|
+
const refuse = (result) => { options.onRefuse?.(event, result.reason); return result; };
|
|
165
|
+
state.steps += 1;
|
|
166
|
+
state.lastTool = name;
|
|
167
|
+
const handoff = HANDOFF_TOOLS.has(name);
|
|
168
|
+
// After the slice ended, a handoff call is the only one that runs.
|
|
169
|
+
if (state.endedBy) {
|
|
170
|
+
const reason = 'This reply is over. The Harness will record an evidence-derived checkpoint; nothing else runs.';
|
|
171
|
+
return handoff ? undefined : refuse({ block: true, terminate: true, reason });
|
|
172
|
+
}
|
|
173
|
+
if (state.compactions >= 3) {
|
|
174
|
+
if (handoff) {
|
|
175
|
+
state.endedBy = 'compaction-thrash';
|
|
176
|
+
state.endedByLimit = 'three compactions';
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
return refuse(end('compaction-thrash', 'three compactions'));
|
|
180
|
+
}
|
|
181
|
+
const limit = sliceLimitReached(policy, state);
|
|
182
|
+
if (limit) {
|
|
183
|
+
// The slice ends here; the model gets one wrap-up request to report where it is. A handoff
|
|
184
|
+
// call is never refused, including when it is the very first call past the budget.
|
|
185
|
+
state.endedBy = 'budget';
|
|
186
|
+
state.endedByLimit = limit;
|
|
187
|
+
state.refusedAt ??= state.steps;
|
|
188
|
+
return handoff ? undefined : refuse({ block: true, reason: handoffRequest(limit, state) });
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
export const SLICE_CONTINUE_CUSTOM_TYPE = 'xingular-slice-continue';
|
|
194
|
+
/** Successful tools that change the workspace count as progress. */
|
|
195
|
+
const PROGRESS_TOOLS = new Set(['bash', 'edit', 'write']);
|
|
196
|
+
/**
|
|
197
|
+
* Continues a reply in place when its slice ended at the budget (PROP-0041, ADR-0070): the same
|
|
198
|
+
* run and the same cached prompt, with fresh counters, up to `maxSlices`. Never after a fruitless,
|
|
199
|
+
* blocked, failed, aborted or plan slice, or when every todo item is done. A person's message
|
|
200
|
+
* starts again at slice 1.
|
|
201
|
+
*/
|
|
202
|
+
export function sliceContinuation(options) {
|
|
203
|
+
const { policy, state } = options;
|
|
204
|
+
return (pi) => {
|
|
205
|
+
pi.on('before_agent_start', (event) => {
|
|
206
|
+
if (event.messageType !== undefined && event.messageType !== 'user')
|
|
207
|
+
return;
|
|
208
|
+
state.slice = 1;
|
|
209
|
+
});
|
|
210
|
+
pi.on('tool_result', (event) => {
|
|
211
|
+
if (!event.isError && PROGRESS_TOOLS.has(event.toolName))
|
|
212
|
+
state.progressed = true;
|
|
213
|
+
});
|
|
214
|
+
pi.on('agent_before_settle', (event, ctx) => {
|
|
215
|
+
if (event.outcome !== 'completed' || event.continue || ctx?.signal?.aborted)
|
|
216
|
+
return;
|
|
217
|
+
if (!policy.enabled || !policy.continue || state.endedBy !== 'budget')
|
|
218
|
+
return;
|
|
219
|
+
if (options.active && !options.active())
|
|
220
|
+
return;
|
|
221
|
+
if (options.failed?.() || options.blocked?.() || !state.progressed)
|
|
222
|
+
return;
|
|
223
|
+
if (state.slice >= policy.maxSlices)
|
|
224
|
+
return;
|
|
225
|
+
const todo = options.todo?.() ?? [];
|
|
226
|
+
if (!options.goalActive?.() && todo.length && todo.every((item) => item.status === 'completed'))
|
|
227
|
+
return;
|
|
228
|
+
const ended = { slice: state.slice, steps: state.steps, limit: state.endedByLimit };
|
|
229
|
+
options.onContinue?.(ended);
|
|
230
|
+
beginNextSlice(state);
|
|
231
|
+
const next = options.next?.().trim();
|
|
232
|
+
const content = clip(`Work slice ${ended.slice} reached its limit (${ended.limit ?? 'budget'}). Slice ${state.slice} of up to ${policy.maxSlices} starts now with a fresh budget. ` +
|
|
233
|
+
`Continue the task from ${next ? `the next step: ${next}` : 'the next step you reported'}. Do not redo finished work.`, 900);
|
|
234
|
+
return {
|
|
235
|
+
entries: [...event.entries, { type: 'custom_message', customType: SLICE_CONTINUE_CUSTOM_TYPE, content, display: true }],
|
|
236
|
+
continue: true
|
|
237
|
+
};
|
|
238
|
+
});
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Which slice of its session a run is, from 1. Counts the recorded continuation chain, so it
|
|
243
|
+
* survives a restart and needs no extra field on the run record.
|
|
244
|
+
*/
|
|
245
|
+
export function sliceOf(root, runId, limit = 100) {
|
|
246
|
+
let current = runId;
|
|
247
|
+
let count = 0;
|
|
248
|
+
const seen = new Set();
|
|
249
|
+
while (current && count < limit && !seen.has(current)) {
|
|
250
|
+
seen.add(current);
|
|
251
|
+
count += 1;
|
|
252
|
+
current = findRun(root, current)?.resumedFromRunId ?? null;
|
|
253
|
+
}
|
|
254
|
+
return Math.max(1, count);
|
|
255
|
+
}
|
|
256
|
+
/** The reason a checkpoint the harness derives (no model handoff) records. */
|
|
257
|
+
export function derivedReason(end) {
|
|
258
|
+
return end ?? 'requested';
|
|
259
|
+
}
|
|
260
|
+
/** What a heartbeat reports about the tools in flight: their names once each, and the oldest one's age. */
|
|
261
|
+
export function activeToolBeat(tools, now = Date.now()) {
|
|
262
|
+
if (!tools.size)
|
|
263
|
+
return {};
|
|
264
|
+
const names = [...new Set([...tools.values()].map((tool) => tool.name))].slice(0, 16);
|
|
265
|
+
return { activeTools: names, oldestToolMs: Math.max(0, now - Math.min(...[...tools.values()].map((tool) => tool.at))) };
|
|
266
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RunRecord } from "./contracts.js";
|
|
2
|
+
import type { ScopeDecision } from "./policy.js";
|
|
3
|
+
export declare const WORKSPACE_FILE_WRITE_TOOLS: Set<string>;
|
|
4
|
+
export interface WorkspaceWriteInspection {
|
|
5
|
+
input: unknown;
|
|
6
|
+
path: string | null;
|
|
7
|
+
outside: boolean;
|
|
8
|
+
reason: string | null;
|
|
9
|
+
}
|
|
10
|
+
/** Canonicalize native file-write arguments and identify an explicit workspace escape. */
|
|
11
|
+
export declare function inspectWorkspaceWrite(workspaceRoot: string, cwd: string, tool: string, input: unknown): WorkspaceWriteInspection;
|
|
12
|
+
/** Adds the mandatory per-operation boundary without allowing it to waive host hard denials. */
|
|
13
|
+
export declare function combineWorkspaceScope(scope: ScopeDecision, inspection: WorkspaceWriteInspection): ScopeDecision;
|
|
14
|
+
/** Resolve a root for pre-boundary run records, then inspect the write using the pinned directory. */
|
|
15
|
+
export declare function inspectRunWorkspaceWrite(run: RunRecord, tool: string, input: unknown): WorkspaceWriteInspection;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { isWithinWorkspace, resolveWorkspaceRoot, resolveWritePath, verifyWorkspaceRoot } from "../core/workspace.js";
|
|
2
|
+
export const WORKSPACE_FILE_WRITE_TOOLS = new Set(['edit', 'write']);
|
|
3
|
+
/** Canonicalize native file-write arguments and identify an explicit workspace escape. */
|
|
4
|
+
export function inspectWorkspaceWrite(workspaceRoot, cwd, tool, input) {
|
|
5
|
+
if (!WORKSPACE_FILE_WRITE_TOOLS.has(tool.toLowerCase()) || !input || typeof input !== 'object' || Array.isArray(input)) {
|
|
6
|
+
return { input, path: null, outside: false, reason: null };
|
|
7
|
+
}
|
|
8
|
+
const args = input;
|
|
9
|
+
if (typeof args.path !== 'string')
|
|
10
|
+
return { input, path: null, outside: false, reason: null };
|
|
11
|
+
const root = verifyWorkspaceRoot(workspaceRoot);
|
|
12
|
+
const path = resolveWritePath(args.path, cwd);
|
|
13
|
+
const outside = !isWithinWorkspace(root, path);
|
|
14
|
+
return {
|
|
15
|
+
input: { ...args, path },
|
|
16
|
+
path,
|
|
17
|
+
outside,
|
|
18
|
+
reason: outside ? `Write target ${path} is outside the active project workspace ${root}.` : null
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Adds the mandatory per-operation boundary without allowing it to waive host hard denials. */
|
|
22
|
+
export function combineWorkspaceScope(scope, inspection) {
|
|
23
|
+
if (!inspection.outside)
|
|
24
|
+
return scope;
|
|
25
|
+
if (!scope.allowed && (scope.automatic || !scope.requiresApproval))
|
|
26
|
+
return scope;
|
|
27
|
+
return {
|
|
28
|
+
...scope,
|
|
29
|
+
allowed: false,
|
|
30
|
+
requiresApproval: true,
|
|
31
|
+
humanOnly: true,
|
|
32
|
+
allowGlobalApproval: scope.humanOnly ? scope.allowGlobalApproval : true,
|
|
33
|
+
reason: inspection.reason
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Resolve a root for pre-boundary run records, then inspect the write using the pinned directory. */
|
|
37
|
+
export function inspectRunWorkspaceWrite(run, tool, input) {
|
|
38
|
+
const cwd = run.workingDirectory;
|
|
39
|
+
const root = run.workspaceRoot ?? (cwd ? resolveWorkspaceRoot(cwd) : null);
|
|
40
|
+
if (!root || !cwd) {
|
|
41
|
+
if (WORKSPACE_FILE_WRITE_TOOLS.has(tool.toLowerCase()))
|
|
42
|
+
throw new Error('The active project workspace could not be resolved; file writes are blocked.');
|
|
43
|
+
return { input, path: null, outside: false, reason: null };
|
|
44
|
+
}
|
|
45
|
+
return inspectWorkspaceWrite(root, cwd, tool, input);
|
|
46
|
+
}
|