@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,387 @@
|
|
|
1
|
+
// The harness, assembled: Pi sessions on isolated accounts, versioned variants that shape
|
|
2
|
+
// them, refinement that improves those variants from evidence, a compiled prompt, project notes,
|
|
3
|
+
// tools, and connected apps. An application embeds one of these and adds its own prompt
|
|
4
|
+
// sections, tools, and policy; nothing here knows what that application is.
|
|
5
|
+
import { Subagents } from "./sessions/subagentService.js";
|
|
6
|
+
import { mkdirSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { Accounts } from "./accounts/accounts.js";
|
|
9
|
+
import { Hub } from "./hub/hub.js";
|
|
10
|
+
import * as capabilities from "./capabilities/api.js";
|
|
11
|
+
import { ensureSharedDir, isolateProcess } from "./accounts/env.js";
|
|
12
|
+
import { fileSecretStore } from "./accounts/secrets.js";
|
|
13
|
+
import { Bus, log } from "./core/bus.js";
|
|
14
|
+
import { DEFAULT_PRODUCT_NAME, EMPTY_DIRECTORY } from "./core/env.js";
|
|
15
|
+
import { HarnessError } from "./core/errors.js";
|
|
16
|
+
import { readJsonOr } from "./core/fs.js";
|
|
17
|
+
import { closeIndex } from "./core/index.js";
|
|
18
|
+
import { openWithSystem } from "./core/links.js";
|
|
19
|
+
import { ConnectedApps } from "./mcp/service.js";
|
|
20
|
+
import { migrateConnectionScopes } from "./mcp/scopeMigration.js";
|
|
21
|
+
import { Lessons } from "./history/lessons.js";
|
|
22
|
+
import * as recall from "./history/recall.js";
|
|
23
|
+
import { Refinements } from "./refine/service.js";
|
|
24
|
+
import { configureBuiltins } from "./variant/components.js";
|
|
25
|
+
import { migrateVariantLayout } from "./variant/migrate.js";
|
|
26
|
+
import { VariantTrust } from "./variant/trust.js";
|
|
27
|
+
import * as notes from "./wiki/notes.js";
|
|
28
|
+
import * as pluginApi from "./plugins/api.js";
|
|
29
|
+
import * as pluginInstall from "./plugins/install.js";
|
|
30
|
+
import * as pluginProposals from "./plugins/proposals.js";
|
|
31
|
+
import * as attachments from "./plugins/attachments.js";
|
|
32
|
+
import { HARNESS_PLUGINS } from "./plugins/builtin.js";
|
|
33
|
+
import { World } from "./world/world.js";
|
|
34
|
+
import { Doctor } from "./doctor/service.js";
|
|
35
|
+
import { builtinChecks } from "./doctor/checks.js";
|
|
36
|
+
import { diagnosticProbe } from "./doctor/probe.js";
|
|
37
|
+
import { Hooks } from "./plugins/hooks.js";
|
|
38
|
+
import { packageFolders, Plugins } from "./plugins/plugins.js";
|
|
39
|
+
import { approvalKey, Approvals } from "./sessions/approvals.js";
|
|
40
|
+
import { RunRegistry } from "./sessions/registry.js";
|
|
41
|
+
import { loadRun, markInterruptedRuns, reconcileStaleRuns } from "./sessions/runStore.js";
|
|
42
|
+
import { Sessions } from "./sessions/sessions.js";
|
|
43
|
+
import { SideQuestions } from "./sessions/sideQuestions.js";
|
|
44
|
+
import { Terminals } from "./terminal/terminals.js";
|
|
45
|
+
import { Worktrees } from "./worktrees/service.js";
|
|
46
|
+
import { Usage } from "./usage/service.js";
|
|
47
|
+
import { UsageLimits } from "./usage/limits/service.js";
|
|
48
|
+
import { indexRunUsage, syncUsage } from "./usage/ledger.js";
|
|
49
|
+
import { AnnotationCapture } from "./annotations/capture.js";
|
|
50
|
+
import { NoteDeliveries } from "./annotations/delivery.js";
|
|
51
|
+
class Env {
|
|
52
|
+
directory;
|
|
53
|
+
productName;
|
|
54
|
+
dataRoot;
|
|
55
|
+
bus;
|
|
56
|
+
constructor(dataRoot, directory, productName, bus) {
|
|
57
|
+
this.directory = directory;
|
|
58
|
+
this.productName = productName;
|
|
59
|
+
this.dataRoot = dataRoot;
|
|
60
|
+
this.bus = bus;
|
|
61
|
+
}
|
|
62
|
+
get root() {
|
|
63
|
+
if (!this.dataRoot)
|
|
64
|
+
throw new HarnessError('data_root_missing', 'Choose a data location first.', 'Open Settings → Projects and Storage.');
|
|
65
|
+
return this.dataRoot;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class Harness {
|
|
69
|
+
/** The periodic liveness check, started once with recovery (PROP-0041). */
|
|
70
|
+
staleRuns;
|
|
71
|
+
browserEnabled;
|
|
72
|
+
hub;
|
|
73
|
+
bus = new Bus();
|
|
74
|
+
env;
|
|
75
|
+
stateDir;
|
|
76
|
+
/** The account registry, account Pi folders and their shared settings; usually `<state dir>/accounts`. */
|
|
77
|
+
accountsDir;
|
|
78
|
+
policy;
|
|
79
|
+
/** How a link a person clicked reaches the operating system (page 10, `links.open`). */
|
|
80
|
+
linkOpener;
|
|
81
|
+
accounts;
|
|
82
|
+
approvals;
|
|
83
|
+
runs;
|
|
84
|
+
apps;
|
|
85
|
+
plugins;
|
|
86
|
+
/** Code plugins gave the harness to run after memory, the Wiki or history changed. */
|
|
87
|
+
hooks;
|
|
88
|
+
/** Every part described as a plugin: the harness's own, then the application's. */
|
|
89
|
+
descriptors = HARNESS_PLUGINS;
|
|
90
|
+
applicationPlugins = new Set();
|
|
91
|
+
subagents;
|
|
92
|
+
sessions;
|
|
93
|
+
/** Tool-free, run-backed questions over a redacted projection of the main conversation. */
|
|
94
|
+
sideQuestions;
|
|
95
|
+
/** Web, browser and computer tools (page 13). */
|
|
96
|
+
world;
|
|
97
|
+
/** Which plugin code in variants a person trusted. */
|
|
98
|
+
trust;
|
|
99
|
+
/** Refinement: improving a variant from evidence of how it ran. */
|
|
100
|
+
refine;
|
|
101
|
+
/** Reflection on finished runs, when the `lessons` plugin is on (page 08). */
|
|
102
|
+
lessons;
|
|
103
|
+
refineHost;
|
|
104
|
+
terminals;
|
|
105
|
+
doctor;
|
|
106
|
+
/** Usage analytics over the derived ledger, and the provider limits last reported. */
|
|
107
|
+
usage;
|
|
108
|
+
usageLimits;
|
|
109
|
+
/** Managed git worktrees sessions can work in (PROP-0016). */
|
|
110
|
+
worktrees;
|
|
111
|
+
/** The terminal's visible browser for capturing page notes (PROP-0017). */
|
|
112
|
+
noteCapture;
|
|
113
|
+
/** Page notes on their way to a session (PROP-0018). */
|
|
114
|
+
pageNotes;
|
|
115
|
+
/** Resolves when what was loaded in the background at construction is in place. */
|
|
116
|
+
ready;
|
|
117
|
+
recovery = { interruptedRuns: 0, interruptedRunIds: [], reindexedPages: 0, migrationError: null };
|
|
118
|
+
constructor(options) {
|
|
119
|
+
this.browserEnabled = options.browser !== false;
|
|
120
|
+
this.stateDir = options.stateDir;
|
|
121
|
+
this.accountsDir = options.accountsDir ?? join(this.stateDir, 'accounts');
|
|
122
|
+
mkdirSync(this.stateDir, { recursive: true });
|
|
123
|
+
// Before anything can start a session: no inherited credential, no `~/.pi`.
|
|
124
|
+
isolateProcess(this.accountsDir);
|
|
125
|
+
this.env = new Env(options.dataRoot || null, options.directory ?? EMPTY_DIRECTORY, options.productName ?? DEFAULT_PRODUCT_NAME, this.bus);
|
|
126
|
+
this.hub = new Hub(this, options.hub);
|
|
127
|
+
this.policy = options.policy ?? {};
|
|
128
|
+
this.linkOpener = options.linkOpener ?? openWithSystem;
|
|
129
|
+
configureBuiltins(options.builtins ?? []);
|
|
130
|
+
this.trust = new VariantTrust(this.stateDir);
|
|
131
|
+
this.refineHost = options.refineHost ?? null;
|
|
132
|
+
const secrets = options.secrets ?? fileSecretStore(join(this.stateDir, 'secrets.json'));
|
|
133
|
+
this.accounts = new Accounts({ dir: this.accountsDir, secrets, bus: this.bus });
|
|
134
|
+
this.approvals = new Approvals(this.stateDir, this.bus);
|
|
135
|
+
this.usageLimits = new UsageLimits({ accounts: this.accounts, root: () => this.env.dataRoot });
|
|
136
|
+
// Response headers are the free, always-fresh limit signal; the account runtime reports them here.
|
|
137
|
+
this.accounts.observeModels = (models, accountId) => this.usageLimits.observeModels(models, accountId);
|
|
138
|
+
this.usage = new Usage({ root: () => this.env.root, accounts: this.accounts });
|
|
139
|
+
this.runs = new RunRegistry({
|
|
140
|
+
root: () => this.env.root,
|
|
141
|
+
automatic: async (run, target, operation, standing) => {
|
|
142
|
+
if (standing === 'switch')
|
|
143
|
+
return this.approvals.isAuto(approvalKey(run)) ? 'always' : null;
|
|
144
|
+
return this.approvals.automatic(run, target, (await this.policy.approval?.({ run, target, operation })) ?? {});
|
|
145
|
+
},
|
|
146
|
+
redact: (event) => this.apps.connections.redactEvent(event),
|
|
147
|
+
ended: (runId, sessionId) => this.apps.revokeRun(runId, sessionId)
|
|
148
|
+
});
|
|
149
|
+
this.apps = new ConnectedApps({ env: this.env, stateDir: this.stateDir, secrets, bus: this.bus, runs: this.runs, policy: this.policy, oauthClients: options.oauthClients });
|
|
150
|
+
this.plugins = new Plugins({ stateDir: this.stateDir, bus: this.bus, resolver: options.resolver, attachments: () => (this.env.dataRoot ? attachments.load(this.env.dataRoot) : null), packagesDir: () => (this.env.dataRoot ? join(this.env.dataRoot, 'plugins') : null) });
|
|
151
|
+
this.hooks = new Hooks({
|
|
152
|
+
stateDir: this.stateDir,
|
|
153
|
+
bus: this.bus,
|
|
154
|
+
// A hook runs for everyone or not at all, so only what is on everywhere and trusted counts.
|
|
155
|
+
// The shared folder stands in for an account: packages are the same for all of them.
|
|
156
|
+
wanted: async () => {
|
|
157
|
+
if (!this.env.dataRoot)
|
|
158
|
+
return [];
|
|
159
|
+
const shared = ensureSharedDir(this.accountsDir);
|
|
160
|
+
// A hook comes only with a package: one kept beside the data, or one the shared settings
|
|
161
|
+
// name. With neither there is nothing to look for, and Pi is not loaded to find that out.
|
|
162
|
+
const named = readJsonOr(join(shared, 'settings.json'), {}).packages;
|
|
163
|
+
if (!packageFolders(join(this.env.dataRoot, 'plugins')).length && !(Array.isArray(named) && named.length))
|
|
164
|
+
return [];
|
|
165
|
+
return (await this.plugins.loading({ cwd: this.stateDir, agentDir: shared, caller: {} })).hooks;
|
|
166
|
+
},
|
|
167
|
+
call: (connection, tool, args) => this.apps.callUnattended(connection, tool, args ?? {}),
|
|
168
|
+
importFile: options.hookImporter
|
|
169
|
+
});
|
|
170
|
+
let reloadTimer = null;
|
|
171
|
+
this.bus.on((notice) => {
|
|
172
|
+
if (notice.type !== 'plugins.changed' || reloadTimer)
|
|
173
|
+
return;
|
|
174
|
+
// Several changes arrive together when a plugin is installed or switched; one reload covers them.
|
|
175
|
+
reloadTimer = setTimeout(() => {
|
|
176
|
+
reloadTimer = null;
|
|
177
|
+
void this.hooks.reload();
|
|
178
|
+
}, 50);
|
|
179
|
+
reloadTimer.unref?.();
|
|
180
|
+
});
|
|
181
|
+
this.describe(options.plugins ?? []);
|
|
182
|
+
this.worktrees = new Worktrees(this.stateDir, options.worktrees);
|
|
183
|
+
this.noteCapture = new AnnotationCapture({ stateDir: this.stateDir });
|
|
184
|
+
this.subagents = new Subagents(this.env, this.runs, (input) => this.sessions.run(input), { descriptors: () => HARNESS_PLUGINS });
|
|
185
|
+
this.sessions = new Sessions({
|
|
186
|
+
subagents: this.subagents,
|
|
187
|
+
env: this.env,
|
|
188
|
+
accounts: this.accounts,
|
|
189
|
+
runs: this.runs,
|
|
190
|
+
policy: this.policy,
|
|
191
|
+
broker: this.apps,
|
|
192
|
+
plugins: this.plugins,
|
|
193
|
+
resolveCapabilities: (caller, tools, cwd) => capabilities.resolve(this, { agentId: caller.agentId ?? null, projectId: caller.projectId ?? null, cwd, tools }),
|
|
194
|
+
fullPermission: (run) => this.approvals.isAuto(approvalKey(run)),
|
|
195
|
+
factory: options.sessionFactory,
|
|
196
|
+
trust: this.trust,
|
|
197
|
+
worktrees: this.worktrees
|
|
198
|
+
});
|
|
199
|
+
this.sideQuestions = new SideQuestions({ env: this.env, sessions: this.sessions, runs: this.runs });
|
|
200
|
+
this.world = new World({ root: () => this.env.root, stateDir: this.stateDir, secrets, browser: this.browserEnabled ? undefined : false, browserExtension: options.browserExtension });
|
|
201
|
+
// The harness's own world tools come first; a tool an application provides under the same name is not added again.
|
|
202
|
+
this.sessions.provide(this.world.provider());
|
|
203
|
+
this.doctor = new Doctor({
|
|
204
|
+
checks: context => builtinChecks(this, context, secrets, options.assets),
|
|
205
|
+
probe: (context, signal, action) => diagnosticProbe(this, context, signal, action)
|
|
206
|
+
});
|
|
207
|
+
const refineRuntime = { root: () => this.env.root, runs: this.runs, run: (input) => this.sessions.run(input) };
|
|
208
|
+
this.refine = new Refinements({ root: () => this.env.root, bus: this.bus, trust: this.trust, host: () => this.refineHost, runtime: refineRuntime });
|
|
209
|
+
this.lessons = new Lessons({ root: () => this.env.root, runtime: refineRuntime });
|
|
210
|
+
this.pageNotes = new NoteDeliveries({ root: () => this.env.root, bus: this.bus, terminals: () => this.terminals ?? null });
|
|
211
|
+
this.terminals = new Terminals({ trust: this.trust, subagents: this.subagents, sideQuestions: this.sideQuestions, resolveCapabilities: (caller, tools, cwd) => capabilities.resolve(this, { agentId: caller.agentId ?? null, projectId: caller.projectId ?? null, cwd, tools }), env: this.env, stateDir: this.stateDir, accounts: this.accounts, runs: this.runs, approvals: this.approvals, apps: this.apps, policy: this.policy, bus: this.bus, plugins: this.plugins, usage: this.usage, usageLimits: this.usageLimits, pluginControl: { list: (scope) => pluginApi.list(this, scope), attach: (params, on) => pluginApi.attach(this, params, on), trust: (scope) => pluginApi.trust(this, scope), untrust: (scope) => pluginApi.untrust(this, scope), configure: (params) => pluginApi.configure(this, params), install: params => pluginInstall.install(this, params), remove: params => pluginInstall.remove(this, params), proposals: { list: () => pluginProposals.list(this.env.root), preview: id => pluginProposals.preview(this.env.root, id), accept: (id, hash) => pluginProposals.accept(this, id, hash), reject: (id, hash) => pluginProposals.reject(this.env.root, id, hash) } }, assets: options.assets, hub: this.hub, world: this.world, doctor: this.doctor, worktrees: this.worktrees, noteCapture: this.noteCapture, pageNotes: this.pageNotes, refine: this.refine, sessionService: this.sessions });
|
|
212
|
+
this.ready = this.apps.start().catch((error) => log('connected apps', error instanceof Error ? error.message : String(error)));
|
|
213
|
+
this.runs.listen((event, run) => {
|
|
214
|
+
this.accounts.onRunEvent(event, run);
|
|
215
|
+
// Each run is indexed when it ends, so the next turn can already recall it.
|
|
216
|
+
if (event.type === 'completed' || event.type === 'failed')
|
|
217
|
+
recall.indexRun(this.env.root, event.runId);
|
|
218
|
+
if (run?.trigger === 'doctor')
|
|
219
|
+
return;
|
|
220
|
+
const runEnded = event.type === 'completed' || event.type === 'failed' || (event.type === 'status.changed' && event.payload.status === 'interrupted');
|
|
221
|
+
// The usage ledger is derived from the same recorded events; a failure never blocks the run.
|
|
222
|
+
// An interrupted run is indexed too, so its spent tokens are not lost until the next start.
|
|
223
|
+
if (runEnded)
|
|
224
|
+
indexRunUsage(this.env.root, event.runId);
|
|
225
|
+
if (runEnded && run?.sessionId) {
|
|
226
|
+
// Notes sent while this session was working go out now (runEnded waits for the terminal to
|
|
227
|
+
// see its run as ended, and tries again while it is still busy).
|
|
228
|
+
void this.pageNotes.runEnded(run.sessionId).catch((error) => log('page notes', error instanceof Error ? error.message : String(error)));
|
|
229
|
+
}
|
|
230
|
+
if ((event.type === 'completed' || event.type === 'failed') && run) {
|
|
231
|
+
if (event.type === 'completed')
|
|
232
|
+
this.lessons.consider(run);
|
|
233
|
+
this.hooks.emit({ type: 'history.run.ended', runId: run.id, sessionId: run.sessionId, status: run.status, goal: run.goal ?? null, agentId: run.agentId ?? null, projectId: run.projectId ?? null, startedAt: run.startedAt, endedAt: run.endedAt ?? null, at: event.timestamp });
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
get dataRoot() {
|
|
238
|
+
return this.env.dataRoot;
|
|
239
|
+
}
|
|
240
|
+
/** Sets the application's own parts, described as plugins. One with a harness plugin's id is ignored. */
|
|
241
|
+
describe(plugins) {
|
|
242
|
+
const foundation = HARNESS_PLUGINS.filter(plugin => this.browserEnabled || plugin.id !== 'browser');
|
|
243
|
+
const own = new Set(foundation.map((plugin) => plugin.id));
|
|
244
|
+
const supplied = plugins.filter((plugin) => plugin && typeof plugin.id === 'string' && !own.has(plugin.id));
|
|
245
|
+
this.descriptors = [...foundation, ...supplied];
|
|
246
|
+
this.applicationPlugins = new Set(supplied.map((plugin) => plugin.id));
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Opens a data root: moves an earlier Wiki's memory and facts aside (once), lays out the Wiki,
|
|
250
|
+
* settles runs that never ended, and refreshes the history index. `agentIds` is accepted for
|
|
251
|
+
* hosts written against earlier versions and is not used.
|
|
252
|
+
*/
|
|
253
|
+
open(dataRoot, _agentIds = []) {
|
|
254
|
+
if (this.hub.busy && this.env.dataRoot !== dataRoot)
|
|
255
|
+
throw new HarnessError('hub_busy', 'Wait for the hub installation before changing the data location.');
|
|
256
|
+
if (this.env.dataRoot && this.env.dataRoot !== dataRoot)
|
|
257
|
+
closeIndex(this.env.dataRoot);
|
|
258
|
+
this.env.dataRoot = dataRoot;
|
|
259
|
+
this.hub.watch(dataRoot);
|
|
260
|
+
const root = dataRoot;
|
|
261
|
+
this.hooks.watch(notes.wikiDir(root));
|
|
262
|
+
void this.hooks.reload();
|
|
263
|
+
for (const folder of ['registry/skills', 'registry/prompts', 'registry/rules', 'config', 'runs'])
|
|
264
|
+
mkdirSync(join(root, folder), { recursive: true });
|
|
265
|
+
let migrationError = null;
|
|
266
|
+
try {
|
|
267
|
+
const moved = migrateVariantLayout(root);
|
|
268
|
+
if (moved.length)
|
|
269
|
+
log(`renamed ${moved.length} earlier harness folders to variants`);
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
migrationError = error instanceof Error ? error.message : String(error);
|
|
273
|
+
log('variant layout', migrationError);
|
|
274
|
+
}
|
|
275
|
+
mkdirSync(join(root, 'variants'), { recursive: true });
|
|
276
|
+
let legacyWiki = null;
|
|
277
|
+
try {
|
|
278
|
+
legacyWiki = notes.moveLegacy(root);
|
|
279
|
+
if (legacyWiki)
|
|
280
|
+
log(`moved the earlier Wiki's memory, facts and revisions to ${legacyWiki}`);
|
|
281
|
+
notes.ensureLayout(root, this.env.productName);
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
migrationError = error instanceof Error ? error.message : String(error);
|
|
285
|
+
log('Wiki layout', migrationError);
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
migrateConnectionScopes(root, this.stateDir);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
292
|
+
migrationError = migrationError ? `${migrationError}; connector scope migration: ${detail}` : detail;
|
|
293
|
+
log('connector scope migration failed', detail);
|
|
294
|
+
}
|
|
295
|
+
let interruptedRunIds = [];
|
|
296
|
+
try {
|
|
297
|
+
interruptedRunIds = markInterruptedRuns(root, `${this.env.productName} stopped before the run settled.`);
|
|
298
|
+
const recoveredSessions = new Set();
|
|
299
|
+
for (const runId of interruptedRunIds) {
|
|
300
|
+
try {
|
|
301
|
+
const sessionId = loadRun(root, runId).sessionId;
|
|
302
|
+
if (!sessionId || recoveredSessions.has(sessionId))
|
|
303
|
+
continue;
|
|
304
|
+
recoveredSessions.add(sessionId);
|
|
305
|
+
void this.pageNotes.runEnded(sessionId).catch((error) => log('page notes', error instanceof Error ? error.message : String(error)));
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
// A malformed run record does not prevent the rest of recovery.
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
log('run recovery', error instanceof Error ? error.message : String(error));
|
|
314
|
+
}
|
|
315
|
+
try {
|
|
316
|
+
// Runs recorded while nothing was running become searchable.
|
|
317
|
+
recall.sync(root);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
log('recall', error instanceof Error ? error.message : String(error));
|
|
321
|
+
}
|
|
322
|
+
try {
|
|
323
|
+
// Usage rows come from the same run events; the ledger can always be rebuilt from them.
|
|
324
|
+
syncUsage(root);
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
log('usage ledger', error instanceof Error ? error.message : String(error));
|
|
328
|
+
}
|
|
329
|
+
this.recovery = { interruptedRuns: interruptedRunIds.length, interruptedRunIds, reindexedPages: safeCount(root), migrationError, legacyWiki };
|
|
330
|
+
if (!this.staleRuns) {
|
|
331
|
+
// A reply that stops emitting heartbeats while its process lives is settled here, not left
|
|
332
|
+
// `running` for the next restart (PROP-0041).
|
|
333
|
+
this.staleRuns = setInterval(() => {
|
|
334
|
+
try {
|
|
335
|
+
reconcileStaleRuns(root);
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
log('stale run check', error instanceof Error ? error.message : String(error));
|
|
339
|
+
}
|
|
340
|
+
}, 60_000);
|
|
341
|
+
this.staleRuns.unref?.();
|
|
342
|
+
}
|
|
343
|
+
return this.recovery;
|
|
344
|
+
}
|
|
345
|
+
/** Rebuilds the history index from the run records. Returns the notes in the Wiki. */
|
|
346
|
+
rebuildIndex() {
|
|
347
|
+
recall.sync(this.env.root);
|
|
348
|
+
syncUsage(this.env.root);
|
|
349
|
+
const count = safeCount(this.env.root);
|
|
350
|
+
this.recovery = { ...this.recovery, reindexedPages: count };
|
|
351
|
+
return count;
|
|
352
|
+
}
|
|
353
|
+
/** Stops live runs and refinements and releases the index. */
|
|
354
|
+
async close() {
|
|
355
|
+
if (this.staleRuns)
|
|
356
|
+
clearInterval(this.staleRuns);
|
|
357
|
+
await this.doctor.close();
|
|
358
|
+
this.hub.close();
|
|
359
|
+
await this.refine.close();
|
|
360
|
+
await this.lessons.close();
|
|
361
|
+
await this.terminals.close();
|
|
362
|
+
this.sessions.close();
|
|
363
|
+
await this.noteCapture.close();
|
|
364
|
+
await this.sideQuestions.close();
|
|
365
|
+
await this.runs.interruptAll();
|
|
366
|
+
await this.world.close();
|
|
367
|
+
await this.hooks.settled().catch(() => undefined);
|
|
368
|
+
this.hooks.close();
|
|
369
|
+
await this.apps.close();
|
|
370
|
+
if (this.env.dataRoot)
|
|
371
|
+
closeIndex(this.env.dataRoot);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
function safeCount(root) {
|
|
375
|
+
try {
|
|
376
|
+
return notes.paths(root).length;
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return 0;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
export function createHarness(options) {
|
|
383
|
+
const harness = new Harness(options);
|
|
384
|
+
if (options.dataRoot)
|
|
385
|
+
harness.open(options.dataRoot);
|
|
386
|
+
return harness;
|
|
387
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const REFLECTION_IDENTITY = "You read the record of one finished agent run and decide whether it teaches a lesson worth keeping for later runs. Work only inside the current folder: the evidence is under `context/`. Do not change any file. Follow the mission in the user message exactly.";
|
|
2
|
+
export declare function lessonMission(): string;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// The mission of a reflection run: read how one finished run went and write at most one lesson
|
|
2
|
+
// for the Wiki. The lesson shape (a cue, a checkable lesson, the evidence, or NO_ENTRY) is the
|
|
3
|
+
// one the refinement library uses (`refine/prompts.ts::experience`), from harness².
|
|
4
|
+
import { ANSWER_FREE, EVIDENCE_BOUNDARY } from "../refine/prompts.js";
|
|
5
|
+
export const REFLECTION_IDENTITY = 'You read the record of one finished agent run and decide whether it teaches a lesson worth keeping for later runs. Work only inside the current folder: the evidence is under `context/`. Do not change any file. Follow the mission in the user message exactly.';
|
|
6
|
+
export function lessonMission() {
|
|
7
|
+
return [
|
|
8
|
+
'Read `context/run.md`: the complete record of one finished run of an agent, in the order it happened -- the request, what the agent said, every tool call and what came back. `context/lessons.md` lists the lessons already kept, one per line, as `path -- cue`.',
|
|
9
|
+
'# WHAT A LESSON IS\n\nA lesson is something a later run, on a different request, would do differently because it read it. It comes from a contrast the record shows: an approach that failed and one that then worked, a tool call that was wasted, a check that caught a mistake, a step that had to be redone.\n\nThe `cue` describes the SHAPE OF SITUATION the lesson applies to, so it can fire on a different matter. Not this run\'s facts -- the pattern. The `lesson` is the operation to perform, stated so it can be applied and checked.\n\nToo generic is useless (\'be thorough\', \'read the code first\'); too specific never fires again (\'the config file is at src/app.json\'). Aim between: \'when a build tool reports a missing module after a dependency upgrade, check the lockfile was regenerated before editing imports\'.\n\nNever put into a lesson a fact about this run\'s subject: names of files, people, projects, values, or anything the user said about their own work. Those are wrong anchors for any other run, and they may be private.',
|
|
10
|
+
'# WHEN TO WRITE NOTHING\n\nMost runs teach nothing new. If the record shows no concrete contrast -- the work simply went as planned, or the only lesson would be generic advice -- reply with the single line NO_ENTRY. That is the expected answer for most runs.\n\nIf one of the lessons in `context/lessons.md` already says the same thing, reply with the single line `SAME <path>` naming it, instead of a new entry.',
|
|
11
|
+
ANSWER_FREE,
|
|
12
|
+
EVIDENCE_BOUNDARY,
|
|
13
|
+
'# OUTPUT FORMAT\n\nExactly one of:\n\nNO_ENTRY\n\nSAME <path from context/lessons.md>\n\n<experience>\ncue: <the shape of situation this applies to, one line>\nlesson: <the operation to perform, one line>\nevidence: <the contrast in the record this rests on, one line, without the subject\'s facts>\nconfidence: <high|medium|low, and why>\n</experience>'
|
|
14
|
+
].join('\n\n') + '\n';
|
|
15
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type RefineRuntime } from "../refine/pi.js";
|
|
2
|
+
import type { Improver } from "../refine/types.js";
|
|
3
|
+
import type { RunRecord } from "../sessions/contracts.js";
|
|
4
|
+
export declare const REFLECTION_TRIGGER = "reflection";
|
|
5
|
+
export declare const LESSONS_FOLDER = "library/lessons";
|
|
6
|
+
export type LessonOutcome = {
|
|
7
|
+
kind: 'written';
|
|
8
|
+
path: string;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'same';
|
|
11
|
+
path: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'no_entry';
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'skipped';
|
|
16
|
+
reason: string;
|
|
17
|
+
};
|
|
18
|
+
export interface LessonsOptions {
|
|
19
|
+
root: () => string;
|
|
20
|
+
runtime: RefineRuntime;
|
|
21
|
+
/** Builds the reflection session for one run. Tests pass a fake; by default it is a `PiImprover`. */
|
|
22
|
+
reflector?: (run: RunRecord, model: string | null, signal: AbortSignal) => Improver;
|
|
23
|
+
}
|
|
24
|
+
interface KeptLesson {
|
|
25
|
+
path: string;
|
|
26
|
+
cue: string;
|
|
27
|
+
sources: string[];
|
|
28
|
+
front: Record<string, unknown>;
|
|
29
|
+
body: string;
|
|
30
|
+
}
|
|
31
|
+
/** The lessons the Wiki keeps now. */
|
|
32
|
+
export declare function keptLessons(root: string): KeptLesson[];
|
|
33
|
+
export declare class Lessons {
|
|
34
|
+
private readonly options;
|
|
35
|
+
private readonly queue;
|
|
36
|
+
private readonly abort;
|
|
37
|
+
private draining;
|
|
38
|
+
private closed;
|
|
39
|
+
constructor(options: LessonsOptions);
|
|
40
|
+
/** Called when a run completes. Cheap: the work happens later, one run at a time. */
|
|
41
|
+
consider(run: RunRecord | null): void;
|
|
42
|
+
/** Resolves when everything queued so far was reflected on. */
|
|
43
|
+
idle(): Promise<void>;
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
private drain;
|
|
46
|
+
/** The plugin's settings for this run's caller, or null when it is off for them. */
|
|
47
|
+
private limits;
|
|
48
|
+
/** Reflects on one finished run. Exposed for tests and for a host that wants to ask directly. */
|
|
49
|
+
reflect(runId: string): Promise<LessonOutcome>;
|
|
50
|
+
private keep;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Lessons from finished runs. When the `lessons` plugin is on for a run's caller, a completed
|
|
2
|
+
// top-level run is reflected on in the background: a file-tools-only session reads its record and
|
|
3
|
+
// may keep one general lesson as a Wiki note under `library/lessons/`. The lesson shape and the
|
|
4
|
+
// answer-free guards are refinement's (harness²); the caps follow OMP's memory budget.
|
|
5
|
+
//
|
|
6
|
+
// Lessons are reference notes (INV-MEM-1). They never enter the stable prefix and never change a
|
|
7
|
+
// variant; something that should become an instruction goes through refinement and `adopt`.
|
|
8
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { loadRun as loadCapabilities } from "../capabilities/runSnapshot.js";
|
|
12
|
+
import { log } from "../core/bus.js";
|
|
13
|
+
import * as frontmatter from "../core/frontmatter.js";
|
|
14
|
+
import { looksSecret } from "../core/secrets.js";
|
|
15
|
+
import * as attachments from "../plugins/attachments.js";
|
|
16
|
+
import { LESSONS, LESSONS_CODE, LESSONS_SETTINGS, settingValue } from "../plugins/firstParty.js";
|
|
17
|
+
import { assertNoGraderVerdicts, assertVariantHasNoGraderVerdicts } from "../refine/evidence.js";
|
|
18
|
+
import { hasExperience } from "../refine/library.js";
|
|
19
|
+
import { PiImprover } from "../refine/pi.js";
|
|
20
|
+
import { parseExperience } from "../refine/selection.js";
|
|
21
|
+
import { renderEvents } from "../refine/trajectory.js";
|
|
22
|
+
import { executionEvents, findRun, readEvents } from "../sessions/runStore.js";
|
|
23
|
+
import * as notes from "../wiki/notes.js";
|
|
24
|
+
import { lessonMission, REFLECTION_IDENTITY } from "./lessonPrompt.js";
|
|
25
|
+
export const REFLECTION_TRIGGER = 'reflection';
|
|
26
|
+
export const LESSONS_FOLDER = 'library/lessons';
|
|
27
|
+
/** Runs that are themselves part of improving the harness are never reflected on. */
|
|
28
|
+
const SKIPPED_TRIGGERS = new Set(['probe', 'improver', REFLECTION_TRIGGER]);
|
|
29
|
+
const REFLECTION_TOOLS = ['read', 'grep', 'find', 'ls'];
|
|
30
|
+
/** The same floor refinement keeps for a trajectory (INV-REF-8). */
|
|
31
|
+
const OBS_TRUNC = 10_000;
|
|
32
|
+
const slug = (text) => text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 60).replace(/-+$/, '') || 'lesson';
|
|
33
|
+
/** The lessons the Wiki keeps now. */
|
|
34
|
+
export function keptLessons(root) {
|
|
35
|
+
return notes.paths(root).filter((path) => path.startsWith(`${LESSONS_FOLDER}/`)).flatMap((path) => {
|
|
36
|
+
try {
|
|
37
|
+
const text = readFileSync(join(notes.wikiDir(root), `${path}.md`), 'utf8');
|
|
38
|
+
const parsed = frontmatter.parse(text);
|
|
39
|
+
const front = parsed?.front ?? {};
|
|
40
|
+
const sources = Array.isArray(front.sources) ? front.sources.filter((id) => typeof id === 'string') : [];
|
|
41
|
+
return [{ path, cue: typeof front.cue === 'string' ? front.cue : '', sources, front, body: parsed?.body ?? text }];
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** The model the run used, as Pi names it, from its last usage report. */
|
|
49
|
+
function modelOf(root, runId) {
|
|
50
|
+
const usage = readEvents(root, runId).filter((event) => event.type === 'usage.updated').at(-1)?.payload;
|
|
51
|
+
return typeof usage?.model === 'string' && typeof usage.provider === 'string' ? `${usage.provider}/${usage.model}` : null;
|
|
52
|
+
}
|
|
53
|
+
function lessonNote(experience, sources) {
|
|
54
|
+
const title = experience.cue.length > 80 ? `${experience.cue.slice(0, 77).trimEnd()}…` : experience.cue;
|
|
55
|
+
const body = [`# ${title}`, '', `**When:** ${experience.cue}`, '', `**Do:** ${experience.lesson}`, '', `**Evidence:** ${experience.evidence}`].join('\n');
|
|
56
|
+
return frontmatter.serialize({ title, cue: experience.cue, confidence: experience.confidence ?? null, sources }, body);
|
|
57
|
+
}
|
|
58
|
+
export class Lessons {
|
|
59
|
+
options;
|
|
60
|
+
queue = [];
|
|
61
|
+
abort = new AbortController();
|
|
62
|
+
draining = null;
|
|
63
|
+
closed = false;
|
|
64
|
+
constructor(options) {
|
|
65
|
+
this.options = options;
|
|
66
|
+
}
|
|
67
|
+
/** Called when a run completes. Cheap: the work happens later, one run at a time. */
|
|
68
|
+
consider(run) {
|
|
69
|
+
if (this.closed || !run || run.status !== 'completed' || run.parentRunId || run.relation)
|
|
70
|
+
return;
|
|
71
|
+
if (run.trigger && SKIPPED_TRIGGERS.has(run.trigger))
|
|
72
|
+
return;
|
|
73
|
+
if (this.queue.includes(run.id))
|
|
74
|
+
return;
|
|
75
|
+
this.queue.push(run.id);
|
|
76
|
+
this.draining ??= this.drain().finally(() => {
|
|
77
|
+
this.draining = null;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Resolves when everything queued so far was reflected on. */
|
|
81
|
+
async idle() {
|
|
82
|
+
while (this.draining)
|
|
83
|
+
await this.draining;
|
|
84
|
+
}
|
|
85
|
+
async close() {
|
|
86
|
+
this.closed = true;
|
|
87
|
+
this.queue.length = 0;
|
|
88
|
+
this.abort.abort();
|
|
89
|
+
await this.draining?.catch(() => undefined);
|
|
90
|
+
}
|
|
91
|
+
async drain() {
|
|
92
|
+
while (this.queue.length && !this.closed) {
|
|
93
|
+
const runId = this.queue.shift();
|
|
94
|
+
try {
|
|
95
|
+
const outcome = await this.reflect(runId);
|
|
96
|
+
if (outcome.kind !== 'skipped')
|
|
97
|
+
log(`lessons: run ${runId}: ${outcome.kind}${'path' in outcome ? ` ${outcome.path}` : ''}`);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
log(`lessons: run ${runId} was not reflected on`, error instanceof Error ? error.message : String(error));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** The plugin's settings for this run's caller, or null when it is off for them. */
|
|
105
|
+
limits(root, runId) {
|
|
106
|
+
const contribution = `${LESSONS}/code/${LESSONS_CODE}`;
|
|
107
|
+
if (!loadCapabilities(root, runId)?.contributions.includes(contribution))
|
|
108
|
+
return null;
|
|
109
|
+
const saved = attachments.load(root).settings[LESSONS];
|
|
110
|
+
const value = (key) => settingValue(LESSONS_SETTINGS.find((setting) => setting.key === key), saved);
|
|
111
|
+
return { minToolCalls: value('minToolCalls'), maxLessons: value('maxLessons'), maxChars: value('maxChars') };
|
|
112
|
+
}
|
|
113
|
+
/** Reflects on one finished run. Exposed for tests and for a host that wants to ask directly. */
|
|
114
|
+
async reflect(runId) {
|
|
115
|
+
const root = this.options.root();
|
|
116
|
+
const run = findRun(root, runId);
|
|
117
|
+
if (!run || run.status !== 'completed')
|
|
118
|
+
return { kind: 'skipped', reason: 'not completed' };
|
|
119
|
+
const limits = this.limits(root, runId);
|
|
120
|
+
if (!limits)
|
|
121
|
+
return { kind: 'skipped', reason: 'plugin off' };
|
|
122
|
+
const events = executionEvents(readEvents(root, runId));
|
|
123
|
+
if (events.filter((event) => event.type === 'tool.started').length < limits.minToolCalls)
|
|
124
|
+
return { kind: 'skipped', reason: 'too few tool calls' };
|
|
125
|
+
const kept = keptLessons(root);
|
|
126
|
+
if (kept.some((lesson) => lesson.sources.includes(runId)))
|
|
127
|
+
return { kind: 'skipped', reason: 'already reflected' };
|
|
128
|
+
if (kept.length >= limits.maxLessons)
|
|
129
|
+
return { kind: 'skipped', reason: 'lesson limit reached' };
|
|
130
|
+
const context = mkdtempSync(join(tmpdir(), 'harness-lesson-'));
|
|
131
|
+
try {
|
|
132
|
+
const goal = run.goal ? `# Request\n\n${run.goal}\n\n# Record\n\n` : '# Record\n\n';
|
|
133
|
+
writeFileSync(join(context, 'run.md'), `${goal}${renderEvents(events, { obsTrunc: OBS_TRUNC })}\n`);
|
|
134
|
+
writeFileSync(join(context, 'lessons.md'), kept.length ? `${kept.map((lesson) => `${lesson.path} -- ${lesson.cue}`).join('\n')}\n` : '(no lessons kept yet)\n');
|
|
135
|
+
assertNoGraderVerdicts(context);
|
|
136
|
+
const reflector = this.options.reflector?.(run, modelOf(root, runId), this.abort.signal)
|
|
137
|
+
?? new PiImprover(this.options.runtime, join(root, 'reflection'), { accountId: run.accountId, model: modelOf(root, runId), effort: 'medium' }, this.abort.signal, { trigger: REFLECTION_TRIGGER, identity: REFLECTION_IDENTITY, tools: REFLECTION_TOOLS });
|
|
138
|
+
const reply = await reflector.call({ mission: lessonMission(), contextDir: context, label: `lesson-${runId}`, signal: this.abort.signal });
|
|
139
|
+
return this.keep(root, runId, reply.text, kept, limits);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
rmSync(context, { recursive: true, force: true });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
keep(root, runId, text, kept, limits) {
|
|
146
|
+
if (/^\s*NO_ENTRY\s*$/m.test(text) && !text.includes('<experience>'))
|
|
147
|
+
return { kind: 'no_entry' };
|
|
148
|
+
const same = /^\s*SAME\s+(\S+)\s*$/m.exec(text)?.[1]?.replace(/\.md$/, '');
|
|
149
|
+
if (same) {
|
|
150
|
+
const lesson = kept.find((entry) => entry.path === same);
|
|
151
|
+
if (!lesson)
|
|
152
|
+
return { kind: 'skipped', reason: `named an unknown lesson ${same}` };
|
|
153
|
+
notes.write(root, lesson.path, frontmatter.serialize({ ...lesson.front, sources: [...lesson.sources, runId] }, lesson.body), { actor: REFLECTION_TRIGGER, reason: `Seen again in run ${runId}` });
|
|
154
|
+
return { kind: 'same', path: lesson.path };
|
|
155
|
+
}
|
|
156
|
+
const experience = parseExperience(text);
|
|
157
|
+
if (!hasExperience(experience))
|
|
158
|
+
return { kind: 'no_entry' };
|
|
159
|
+
const body = lessonNote(experience, [runId]);
|
|
160
|
+
if (`${experience.cue}${experience.lesson}${experience.evidence}`.length > limits.maxChars)
|
|
161
|
+
return { kind: 'skipped', reason: 'lesson too long' };
|
|
162
|
+
if (looksSecret(body))
|
|
163
|
+
return { kind: 'skipped', reason: 'lesson looked like it held a credential' };
|
|
164
|
+
assertVariantHasNoGraderVerdicts({ 'lesson.md': body });
|
|
165
|
+
const taken = new Set(notes.paths(root));
|
|
166
|
+
const base = `${LESSONS_FOLDER}/${slug(experience.cue)}`;
|
|
167
|
+
let path = base;
|
|
168
|
+
for (let n = 2; taken.has(path); n++)
|
|
169
|
+
path = `${base}-${n}`;
|
|
170
|
+
notes.write(root, path, body, { actor: REFLECTION_TRIGGER, reason: `Lesson from run ${runId}` });
|
|
171
|
+
return { kind: 'written', path };
|
|
172
|
+
}
|
|
173
|
+
}
|