@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,188 @@
|
|
|
1
|
+
// `xagent plugins …`: plugin control for a person using the harness without an
|
|
2
|
+
// application. It runs outside any session, as the person who typed it, and acts directly.
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { createInterface } from 'node:readline/promises';
|
|
6
|
+
import { DEFAULT_PRODUCT_NAME } from "../core/env.js";
|
|
7
|
+
import { Harness } from "../harness.js";
|
|
8
|
+
import * as api from "./api.js";
|
|
9
|
+
import * as install from "./install.js";
|
|
10
|
+
export const PLUGINS_USAGE = `Usage: xagent plugins <command> [options]
|
|
11
|
+
|
|
12
|
+
list Every plugin and whether it is on
|
|
13
|
+
show <plugin id> One plugin: what it brings, where it is on, its code
|
|
14
|
+
install <source> A folder, an npm name, or a git address. It arrives off and untrusted
|
|
15
|
+
remove <plugin id> Remove a plugin you installed
|
|
16
|
+
update [plugin id] Fetch a newer version of one installed plugin, or of all
|
|
17
|
+
attach <id> Switch a plugin, or one thing it brings, on
|
|
18
|
+
detach <id> Switch it off
|
|
19
|
+
trust <plugin id> [--yes] Show the files of its code, then trust them
|
|
20
|
+
untrust <plugin id> Stop trusting its code
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
--data <dir> Data directory (default: ~/.xingular-harness/data)
|
|
24
|
+
--state <dir> State directory (default: ~/.xingular-harness/state)
|
|
25
|
+
--cwd <dir> Also list what this working folder brings
|
|
26
|
+
--project <id> attach/detach for one project instead of everywhere
|
|
27
|
+
--agent <id> attach/detach for one agent instead of everywhere
|
|
28
|
+
`;
|
|
29
|
+
function parse(argv) {
|
|
30
|
+
const positional = [];
|
|
31
|
+
const values = {};
|
|
32
|
+
const switches = new Set();
|
|
33
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
34
|
+
const arg = argv[index];
|
|
35
|
+
if (!arg.startsWith('--'))
|
|
36
|
+
positional.push(arg);
|
|
37
|
+
else if (arg === '--yes')
|
|
38
|
+
switches.add('yes');
|
|
39
|
+
else if (index + 1 < argv.length) {
|
|
40
|
+
values[arg.slice(2)] = argv[index + 1];
|
|
41
|
+
index += 1;
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
throw new Error(`${arg} needs a value.`);
|
|
45
|
+
}
|
|
46
|
+
return { positional, values, switches };
|
|
47
|
+
}
|
|
48
|
+
const stateOf = (plugin) => {
|
|
49
|
+
if (plugin.required)
|
|
50
|
+
return 'required';
|
|
51
|
+
if (plugin.trust === 'untrusted')
|
|
52
|
+
return plugin.attachment && !plugin.attachment.global ? 'off, code not trusted' : 'code not trusted';
|
|
53
|
+
if (plugin.attachment)
|
|
54
|
+
return plugin.attachment.global ? 'on' : 'off';
|
|
55
|
+
const on = plugin.contributions.filter((entry) => entry.state === 'on').length;
|
|
56
|
+
return `${on} of ${plugin.contributions.length} on`;
|
|
57
|
+
};
|
|
58
|
+
function describe(plugin) {
|
|
59
|
+
const lines = [`${plugin.title} (${plugin.id})`, ` ${plugin.description || 'No description.'}`, ` Source: ${plugin.source}${plugin.version ? ` ${plugin.version}` : ''}${plugin.path ? ` · ${plugin.path}` : ''}`, ` State: ${stateOf(plugin)}`];
|
|
60
|
+
if (plugin.extends.length)
|
|
61
|
+
lines.push(` Extends: ${plugin.extends.join(', ')}`);
|
|
62
|
+
if (plugin.code)
|
|
63
|
+
lines.push(` Code (${plugin.trust}), fingerprint ${plugin.code.hash.slice(0, 12)}:`, ...plugin.code.files.map((file) => ` ${file}`));
|
|
64
|
+
for (const entry of plugin.contributions)
|
|
65
|
+
lines.push(` ${entry.state === 'on' ? '●' : '○'} ${entry.kind} ${entry.name} (${entry.id})${entry.scope ? ` · ${entry.scope}` : ''}${entry.problem ? ` · last run failed: ${entry.problem}` : ''}`);
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
}
|
|
68
|
+
export async function runPluginsCli(argv, dependencies = {}) {
|
|
69
|
+
const write = dependencies.write ?? ((text) => void process.stdout.write(text));
|
|
70
|
+
let parsed;
|
|
71
|
+
try {
|
|
72
|
+
parsed = parse(argv);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
76
|
+
return 2;
|
|
77
|
+
}
|
|
78
|
+
const [command, target] = parsed.positional;
|
|
79
|
+
if (!command || command === 'help') {
|
|
80
|
+
write(PLUGINS_USAGE);
|
|
81
|
+
return command ? 0 : 2;
|
|
82
|
+
}
|
|
83
|
+
const base = dependencies.cwd ?? process.cwd();
|
|
84
|
+
const root = join(dependencies.home ?? homedir(), '.xingular-harness');
|
|
85
|
+
const options = { dataRoot: parsed.values.data ? resolve(base, parsed.values.data) : join(root, 'data'), stateDir: parsed.values.state ? resolve(base, parsed.values.state) : join(root, 'state'), productName: DEFAULT_PRODUCT_NAME };
|
|
86
|
+
// Built without opening the data root: a plugin command must not settle runs or migrate a Wiki
|
|
87
|
+
// that another process may be using.
|
|
88
|
+
const harness = dependencies.createHarness ? dependencies.createHarness(options) : new Harness(options);
|
|
89
|
+
const scope = { cwd: parsed.values.cwd ? resolve(base, parsed.values.cwd) : null };
|
|
90
|
+
const need = (what) => {
|
|
91
|
+
if (!target)
|
|
92
|
+
throw new Error(`${command} needs ${what}.`);
|
|
93
|
+
return target;
|
|
94
|
+
};
|
|
95
|
+
const find = async (id) => {
|
|
96
|
+
const plugin = (await api.list(harness, scope)).find((candidate) => candidate.id === id);
|
|
97
|
+
if (!plugin)
|
|
98
|
+
throw new Error(`There is no plugin with the id "${id}". Run "plugins list" to see the ids.`);
|
|
99
|
+
return plugin;
|
|
100
|
+
};
|
|
101
|
+
try {
|
|
102
|
+
switch (command) {
|
|
103
|
+
case 'list': {
|
|
104
|
+
const plugins = await api.list(harness, scope);
|
|
105
|
+
const width = Math.max(...plugins.map((plugin) => plugin.id.length));
|
|
106
|
+
write(`${plugins.map((plugin) => `${plugin.id.padEnd(width)} ${stateOf(plugin).padEnd(22)} ${plugin.title}`).join('\n')}\n`);
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
case 'show':
|
|
110
|
+
write(`${describe(await find(need('a plugin id')))}\n`);
|
|
111
|
+
return 0;
|
|
112
|
+
case 'install': {
|
|
113
|
+
const before = new Set((await api.list(harness, scope)).map((plugin) => plugin.id));
|
|
114
|
+
const added = (await install.install(harness, { ...scope, source: need('a folder, an npm name, or a git address') })).filter((plugin) => !before.has(plugin.id));
|
|
115
|
+
write(added.length ? `${added.map(describe).join('\n\n')}\n\nInstalled, switched off. Switch it on with "plugins attach <id>"${added.some((plugin) => plugin.code) ? ' and trust its code with "plugins trust <id>"' : ''}.\n` : 'Nothing new was installed.\n');
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
case 'remove':
|
|
119
|
+
await install.remove(harness, { ...scope, pluginId: need('a plugin id') });
|
|
120
|
+
write(`Removed ${target}.\n`);
|
|
121
|
+
return 0;
|
|
122
|
+
case 'update':
|
|
123
|
+
await install.update(harness, { ...scope, pluginId: target ?? null });
|
|
124
|
+
write(target ? `Updated ${target}. If its code changed, trust it again.\n` : 'Updated the installed plugins. Any whose code changed needs trust again.\n');
|
|
125
|
+
return 0;
|
|
126
|
+
case 'attach':
|
|
127
|
+
case 'detach': {
|
|
128
|
+
const where = parsed.values.agent ? { agentId: parsed.values.agent } : parsed.values.project ? { projectId: parsed.values.project } : {};
|
|
129
|
+
await api.attach(harness, { ...scope, id: need('a plugin or contribution id'), scope: where }, command === 'attach');
|
|
130
|
+
write(`${target} is ${command === 'attach' ? 'on' : 'off'} ${parsed.values.agent ? `for agent ${parsed.values.agent}` : parsed.values.project ? `for project ${parsed.values.project}` : 'everywhere'}. It applies from the next session start.\n`);
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
case 'trust': {
|
|
134
|
+
const plugin = await find(need('a plugin id'));
|
|
135
|
+
if (!plugin.code)
|
|
136
|
+
throw new Error(`${plugin.title} has no code that waits for trust.`);
|
|
137
|
+
if (plugin.trust === 'trusted') {
|
|
138
|
+
write(`${plugin.title} is already trusted.\n`);
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
write(`${plugin.title} brings code that runs inside the harness and its sessions. It can do anything you can, including reading your files and credentials.\n\nFiles:\n${plugin.code.files.map((file) => ` ${file}`).join('\n')}\n\nFingerprint ${plugin.code.hash.slice(0, 12)}\n`);
|
|
142
|
+
if (!parsed.switches.has('yes')) {
|
|
143
|
+
if (!dependencies.ask)
|
|
144
|
+
throw new Error('Read the files, then run this again with --yes to trust them.');
|
|
145
|
+
if ((await dependencies.ask('Trust this code? Type yes: ')).trim().toLowerCase() !== 'yes') {
|
|
146
|
+
write('Not trusted.\n');
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await api.trust(harness, { ...scope, hash: plugin.code.hash });
|
|
151
|
+
write(`Trusted. If any of these files changes, it asks again.\n`);
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
154
|
+
case 'untrust': {
|
|
155
|
+
const plugin = await find(need('a plugin id'));
|
|
156
|
+
if (!plugin.code)
|
|
157
|
+
throw new Error(`${plugin.title} has no code to stop trusting.`);
|
|
158
|
+
await api.untrust(harness, { ...scope, hash: plugin.code.hash });
|
|
159
|
+
write(`${plugin.title} is not trusted any more.\n`);
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
write(PLUGINS_USAGE);
|
|
164
|
+
return 2;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
169
|
+
return 1;
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
await harness.close();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/** Asks on the terminal, when there is one to ask on. */
|
|
176
|
+
export function terminalAsk() {
|
|
177
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
178
|
+
return undefined;
|
|
179
|
+
return async (question) => {
|
|
180
|
+
const reader = createInterface({ input: process.stdin, output: process.stdout });
|
|
181
|
+
try {
|
|
182
|
+
return await reader.question(question);
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
reader.close();
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface CommandSourceInfo {
|
|
2
|
+
path: string;
|
|
3
|
+
source?: string;
|
|
4
|
+
origin?: 'package' | 'top-level';
|
|
5
|
+
baseDir?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Stable command namespace for a Pi extension's owning package or loose extension file. */
|
|
8
|
+
export declare function pluginCommandPrefix(source: CommandSourceInfo): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { basename, dirname, extname } from 'node:path';
|
|
2
|
+
import { packageManifest } from "./manifest.js";
|
|
3
|
+
const slug = (value) => {
|
|
4
|
+
const normalized = value.toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
|
|
5
|
+
const prefix = /^[a-z]/.test(normalized) ? normalized : `plugin-${normalized || 'command'}`;
|
|
6
|
+
return prefix === 'plugin' || prefix === 'skill' ? `extension-${prefix}` : prefix;
|
|
7
|
+
};
|
|
8
|
+
/** Stable command namespace for a Pi extension's owning package or loose extension file. */
|
|
9
|
+
export function pluginCommandPrefix(source) {
|
|
10
|
+
if (source.origin === 'package' && source.baseDir) {
|
|
11
|
+
const manifest = packageManifest(source.baseDir);
|
|
12
|
+
return manifest.commandPrefix ?? slug(manifest.name);
|
|
13
|
+
}
|
|
14
|
+
if (source.path.startsWith('builtin:'))
|
|
15
|
+
return slug(source.path.slice('builtin:'.length));
|
|
16
|
+
const synthetic = /^<[^:>]+:([^>]+)>$/.exec(source.path);
|
|
17
|
+
if (synthetic)
|
|
18
|
+
return slug(synthetic[1]);
|
|
19
|
+
const file = basename(source.path, extname(source.path));
|
|
20
|
+
return slug(file === 'index' ? basename(dirname(source.path)) : file);
|
|
21
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `context` is an instruction file Pi reads on its own: `AGENTS.md`, `SYSTEM.md` and their kin.
|
|
3
|
+
* `hook` is a package's hooks file, which the harness runs itself; Pi never loads it.
|
|
4
|
+
* `agent` is a subagent profile a package brings; the harness reads it, Pi never does.
|
|
5
|
+
*/
|
|
6
|
+
export type FoundKind = 'extension' | 'skill' | 'prompt' | 'theme' | 'context' | 'hook' | 'agent';
|
|
7
|
+
/** Where a found item comes from. `builtin` is one of the Pi command's own extensions. */
|
|
8
|
+
export type FoundOrigin = 'shared' | 'package' | 'project' | 'home' | 'builtin';
|
|
9
|
+
export interface Found {
|
|
10
|
+
kind: FoundKind;
|
|
11
|
+
/** A file or folder, or `builtin:<name>`. */
|
|
12
|
+
path: string;
|
|
13
|
+
origin: FoundOrigin;
|
|
14
|
+
/** Declared by the working folder: its `.pi` or `.agents` folder, or its settings. */
|
|
15
|
+
project: boolean;
|
|
16
|
+
/** The folder of the package this belongs to. */
|
|
17
|
+
packageRoot: string | null;
|
|
18
|
+
/** The package as its settings name it (`npm:…`, `git:…`, a folder). */
|
|
19
|
+
source: string | null;
|
|
20
|
+
/** Left on in Pi's settings. An item switched off there is found but never loaded. */
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ResolveInput {
|
|
24
|
+
cwd: string;
|
|
25
|
+
/** The account's Pi agent folder. */
|
|
26
|
+
agentDir: string;
|
|
27
|
+
/** Install a package the shared settings name and the account does not have yet. */
|
|
28
|
+
install?: boolean;
|
|
29
|
+
/** Folders of packages kept outside Pi's settings: each is found as an installed package. */
|
|
30
|
+
packages?: readonly string[];
|
|
31
|
+
}
|
|
32
|
+
/** Finds what Pi would load. Replaced in tests. */
|
|
33
|
+
export type Resolver = (input: ResolveInput) => Promise<Found[]>;
|
|
34
|
+
/** The extensions built into the `pi` command. A terminal loads them; an SDK session has none. */
|
|
35
|
+
export declare const PI_BUILTINS: readonly ["llama.cpp", "codemode", "tool-search", "mcp"];
|
|
36
|
+
export declare const BUILTIN_PREFIX = "builtin:";
|
|
37
|
+
/**
|
|
38
|
+
* The subagent profiles in a package's agents folder: Markdown files whose frontmatter has a
|
|
39
|
+
* `name` and a `description`. Anything else there (notes, a README) is not a profile.
|
|
40
|
+
*/
|
|
41
|
+
export declare function packageProfiles(root: string, folder: string): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Runs an install with the package manager's install scripts switched off, so fetching a
|
|
44
|
+
* package runs none of its code. A package that builds itself on install then fails to load,
|
|
45
|
+
* and says so; that is the price of installing being safe to do before trust.
|
|
46
|
+
*/
|
|
47
|
+
export declare function withoutInstallScripts<T>(action: () => Promise<T>): Promise<T>;
|
|
48
|
+
export declare const piResolver: Resolver;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// What Pi would load for a session, found with Pi's own resolver so the list matches Pi's
|
|
2
|
+
// rules. Resolving reads folders and manifests; it never runs an extension.
|
|
3
|
+
import { existsSync, lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { basename, join, sep } from 'node:path';
|
|
6
|
+
import { log } from "../core/bus.js";
|
|
7
|
+
import * as frontmatter from "../core/frontmatter.js";
|
|
8
|
+
import { loadPi } from "../pi/runtime.js";
|
|
9
|
+
import { packageManifest } from "./manifest.js";
|
|
10
|
+
/** The extensions built into the `pi` command. A terminal loads them; an SDK session has none. */
|
|
11
|
+
export const PI_BUILTINS = ['llama.cpp', 'codemode', 'tool-search', 'mcp'];
|
|
12
|
+
export const BUILTIN_PREFIX = 'builtin:';
|
|
13
|
+
/** At most this many profiles are read from one package. */
|
|
14
|
+
const MAX_PACKAGE_PROFILES = 50;
|
|
15
|
+
/**
|
|
16
|
+
* The subagent profiles in a package's agents folder: Markdown files whose frontmatter has a
|
|
17
|
+
* `name` and a `description`. Anything else there (notes, a README) is not a profile.
|
|
18
|
+
*/
|
|
19
|
+
export function packageProfiles(root, folder) {
|
|
20
|
+
const dir = join(root, folder);
|
|
21
|
+
let names;
|
|
22
|
+
try {
|
|
23
|
+
if (!lstatSync(dir).isDirectory())
|
|
24
|
+
return [];
|
|
25
|
+
names = readdirSync(dir).filter((name) => name.endsWith('.md') && !name.startsWith('.')).sort();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const profiles = [];
|
|
31
|
+
for (const name of names) {
|
|
32
|
+
const path = join(dir, name);
|
|
33
|
+
try {
|
|
34
|
+
if (!lstatSync(path).isFile())
|
|
35
|
+
continue;
|
|
36
|
+
const front = frontmatter.parse(readFileSync(path, 'utf8'))?.front;
|
|
37
|
+
if (typeof front?.name === 'string' && front.name.trim() && typeof front.description === 'string' && front.description.trim())
|
|
38
|
+
profiles.push(path);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (profiles.length >= MAX_PACKAGE_PROFILES)
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
return profiles;
|
|
47
|
+
}
|
|
48
|
+
const inside = (path, parent) => path === parent || path.startsWith(parent.endsWith(sep) ? parent : `${parent}${sep}`);
|
|
49
|
+
/** At most this many skills are read from one package's foreign manifest. */
|
|
50
|
+
const MAX_MANIFEST_SKILLS = 100;
|
|
51
|
+
/**
|
|
52
|
+
* The skills a package's foreign manifest declares: a folder with a `SKILL.md`, a folder of skill
|
|
53
|
+
* folders, or a `SKILL.md` file. Paths are already relative and inside the package.
|
|
54
|
+
*/
|
|
55
|
+
function declaredSkillFiles(root, declared) {
|
|
56
|
+
const found = new Set();
|
|
57
|
+
const visit = (path, depth) => {
|
|
58
|
+
if (found.size >= MAX_MANIFEST_SKILLS)
|
|
59
|
+
return;
|
|
60
|
+
let stat;
|
|
61
|
+
try {
|
|
62
|
+
stat = lstatSync(path);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (stat.isSymbolicLink())
|
|
68
|
+
return;
|
|
69
|
+
if (stat.isFile()) {
|
|
70
|
+
if (basename(path) === 'SKILL.md')
|
|
71
|
+
found.add(path);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (!stat.isDirectory() || depth > 2)
|
|
75
|
+
return;
|
|
76
|
+
const own = join(path, 'SKILL.md');
|
|
77
|
+
try {
|
|
78
|
+
if (lstatSync(own).isFile()) {
|
|
79
|
+
found.add(own);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// A folder without its own SKILL.md lists the skills inside it.
|
|
85
|
+
}
|
|
86
|
+
for (const name of readdirSync(path).sort())
|
|
87
|
+
visit(join(path, name), depth + 1);
|
|
88
|
+
};
|
|
89
|
+
for (const path of declared)
|
|
90
|
+
visit(join(root, path), 0);
|
|
91
|
+
return [...found];
|
|
92
|
+
}
|
|
93
|
+
function origin(path, metadata) {
|
|
94
|
+
if (path.startsWith(BUILTIN_PREFIX))
|
|
95
|
+
return 'builtin';
|
|
96
|
+
if (metadata.origin === 'package')
|
|
97
|
+
return 'package';
|
|
98
|
+
if (metadata.scope === 'project')
|
|
99
|
+
return 'project';
|
|
100
|
+
return metadata.baseDir && inside(metadata.baseDir, join(process.env.HOME || homedir(), '.agents')) ? 'home' : 'shared';
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Runs an install with the package manager's install scripts switched off, so fetching a
|
|
104
|
+
* package runs none of its code. A package that builds itself on install then fails to load,
|
|
105
|
+
* and says so; that is the price of installing being safe to do before trust.
|
|
106
|
+
*/
|
|
107
|
+
export async function withoutInstallScripts(action) {
|
|
108
|
+
const before = process.env.npm_config_ignore_scripts;
|
|
109
|
+
process.env.npm_config_ignore_scripts = 'true';
|
|
110
|
+
try {
|
|
111
|
+
return await action();
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
if (before === undefined)
|
|
115
|
+
delete process.env.npm_config_ignore_scripts;
|
|
116
|
+
else
|
|
117
|
+
process.env.npm_config_ignore_scripts = before;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export const piResolver = async ({ cwd, agentDir, install, packages }) => {
|
|
121
|
+
const pi = await loadPi();
|
|
122
|
+
const settings = pi.SettingsManager.create(cwd, agentDir);
|
|
123
|
+
const shared = new Set((settings.getGlobalSettings().packages ?? []).map((entry) => (typeof entry === 'string' ? entry : entry.source)));
|
|
124
|
+
const manager = () => new pi.DefaultPackageManager({ cwd, agentDir, settingsManager: settings, builtinExtensions: [...PI_BUILTINS] });
|
|
125
|
+
const resolve = (installing) => manager().resolve(async (source) => (installing && shared.has(source) ? 'install' : 'skip'));
|
|
126
|
+
let resolved;
|
|
127
|
+
try {
|
|
128
|
+
resolved = install ? await withoutInstallScripts(() => resolve(true)) : await resolve(false);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (!install)
|
|
132
|
+
throw error;
|
|
133
|
+
// A package that cannot be installed must not stop the session; it is found again next time.
|
|
134
|
+
log('a plugin package could not be installed', error instanceof Error ? error.message : String(error));
|
|
135
|
+
resolved = await resolve(false);
|
|
136
|
+
}
|
|
137
|
+
const found = [];
|
|
138
|
+
const add = (paths) => {
|
|
139
|
+
const kinds = [['extension', paths.extensions], ['skill', paths.skills], ['prompt', paths.prompts], ['theme', paths.themes]];
|
|
140
|
+
for (const [kind, resources] of kinds) {
|
|
141
|
+
for (const resource of resources) {
|
|
142
|
+
const metadata = resource.metadata;
|
|
143
|
+
const packaged = metadata.origin === 'package';
|
|
144
|
+
found.push({
|
|
145
|
+
kind,
|
|
146
|
+
path: resource.path,
|
|
147
|
+
origin: origin(resource.path, metadata),
|
|
148
|
+
project: metadata.scope === 'project',
|
|
149
|
+
packageRoot: packaged ? (metadata.packageRoot ?? metadata.baseDir ?? null) : null,
|
|
150
|
+
source: packaged ? metadata.source : null,
|
|
151
|
+
enabled: resource.enabled
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
add(resolved);
|
|
157
|
+
// Packages a person keeps beside their data are read where they are; nothing is fetched for them.
|
|
158
|
+
if (packages?.length) {
|
|
159
|
+
try {
|
|
160
|
+
add(await manager().resolveExtensionSources([...packages]));
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
log('a local plugin could not be read', error instanceof Error ? error.message : String(error));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// A package may name a hooks file for the harness. Only a package a person installed counts:
|
|
167
|
+
// a working folder's package cannot put code into the harness's own process.
|
|
168
|
+
const roots = new Map();
|
|
169
|
+
// A foreign manifest's skills are text, so a project's package may bring them too.
|
|
170
|
+
const skillRoots = new Map();
|
|
171
|
+
const filtered = new Set();
|
|
172
|
+
for (const entry of [...(settings.getGlobalSettings().packages ?? []), ...(settings.getProjectSettings().packages ?? [])]) {
|
|
173
|
+
if (entry && typeof entry === 'object' && Array.isArray(entry.skills))
|
|
174
|
+
filtered.add(entry.source);
|
|
175
|
+
}
|
|
176
|
+
for (const configured of manager().listConfiguredPackages()) {
|
|
177
|
+
if (!configured.installedPath)
|
|
178
|
+
continue;
|
|
179
|
+
if (configured.scope === 'user')
|
|
180
|
+
roots.set(configured.installedPath, configured.source);
|
|
181
|
+
skillRoots.set(configured.installedPath, { source: configured.source, project: configured.scope === 'project' });
|
|
182
|
+
}
|
|
183
|
+
for (const folder of packages ?? []) {
|
|
184
|
+
roots.set(folder, folder);
|
|
185
|
+
skillRoots.set(folder, { source: folder, project: false });
|
|
186
|
+
}
|
|
187
|
+
for (const [root, source] of roots) {
|
|
188
|
+
const manifest = packageManifest(root);
|
|
189
|
+
for (const path of packageProfiles(root, manifest.agents))
|
|
190
|
+
found.push({ kind: 'agent', path, origin: 'package', project: false, packageRoot: root, source, enabled: true });
|
|
191
|
+
const hooks = manifest.hooks;
|
|
192
|
+
if (!hooks || !existsSync(join(root, hooks)))
|
|
193
|
+
continue;
|
|
194
|
+
found.push({ kind: 'hook', path: join(root, hooks), origin: 'package', project: false, packageRoot: root, source, enabled: true });
|
|
195
|
+
// Pi takes a folder with none of its own resources to be an extension itself. A package that
|
|
196
|
+
// only brings hooks is not one, and must not be handed to Pi as code to load.
|
|
197
|
+
const fallback = found.findIndex((item) => item.kind === 'extension' && item.path === root);
|
|
198
|
+
if (fallback !== -1)
|
|
199
|
+
found.splice(fallback, 1);
|
|
200
|
+
}
|
|
201
|
+
// Skills a foreign manifest declares load with the package, under its own switch. A package
|
|
202
|
+
// whose settings entry names skill patterns has expressed a filter, so nothing is added there.
|
|
203
|
+
for (const [root, meta] of skillRoots) {
|
|
204
|
+
if (filtered.has(meta.source))
|
|
205
|
+
continue;
|
|
206
|
+
let added = false;
|
|
207
|
+
for (const path of declaredSkillFiles(root, packageManifest(root).skills)) {
|
|
208
|
+
if (found.some((item) => item.kind === 'skill' && item.path === path))
|
|
209
|
+
continue;
|
|
210
|
+
found.push({ kind: 'skill', path, origin: 'package', project: meta.project, packageRoot: root, source: meta.source, enabled: true });
|
|
211
|
+
added = true;
|
|
212
|
+
}
|
|
213
|
+
if (!added)
|
|
214
|
+
continue;
|
|
215
|
+
// The package has resources of its own, so it is not itself an extension.
|
|
216
|
+
const fallback = found.findIndex((item) => item.kind === 'extension' && item.path === root);
|
|
217
|
+
if (fallback !== -1)
|
|
218
|
+
found.splice(fallback, 1);
|
|
219
|
+
}
|
|
220
|
+
// Pi reads these itself, whatever else is switched off. They are text, so they are only listed.
|
|
221
|
+
const context = [
|
|
222
|
+
...pi.loadProjectContextFiles({ cwd, agentDir }).map((file) => file.path),
|
|
223
|
+
...[join(agentDir, 'SYSTEM.md'), join(agentDir, 'APPEND_SYSTEM.md'), join(cwd, '.pi', 'SYSTEM.md'), join(cwd, '.pi', 'APPEND_SYSTEM.md')].filter((path) => existsSync(path))
|
|
224
|
+
];
|
|
225
|
+
for (const path of context) {
|
|
226
|
+
const shared = inside(path, agentDir);
|
|
227
|
+
found.push({ kind: 'context', path, origin: shared ? 'shared' : 'project', project: !shared, packageRoot: null, source: null, enabled: true });
|
|
228
|
+
}
|
|
229
|
+
return found;
|
|
230
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { PluginDescriptor, PluginSetting } from "./types.js";
|
|
2
|
+
/** The part of Pi's extension API these two use. */
|
|
3
|
+
interface Api {
|
|
4
|
+
on(event: 'tool_result', handler: (event: ToolResult) => unknown): void;
|
|
5
|
+
on(event: 'tool_call', handler: (event: {
|
|
6
|
+
toolName: string;
|
|
7
|
+
}) => unknown): void;
|
|
8
|
+
on(event: 'turn_start' | 'agent_start', handler: () => unknown): void;
|
|
9
|
+
on(event: 'message_end', handler: (event: {
|
|
10
|
+
message: {
|
|
11
|
+
role: string;
|
|
12
|
+
usage?: {
|
|
13
|
+
input?: number;
|
|
14
|
+
output?: number;
|
|
15
|
+
cacheRead?: number;
|
|
16
|
+
cacheWrite?: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}) => unknown): void;
|
|
20
|
+
}
|
|
21
|
+
interface ToolResult {
|
|
22
|
+
toolName: string;
|
|
23
|
+
content: ({
|
|
24
|
+
type: 'text';
|
|
25
|
+
text: string;
|
|
26
|
+
} | {
|
|
27
|
+
type: string;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
})[];
|
|
30
|
+
}
|
|
31
|
+
export declare const OUTPUT_TRIM = "output-trim";
|
|
32
|
+
export declare const BUDGET_GUARD = "budget-guard";
|
|
33
|
+
export declare const LESSONS = "lessons";
|
|
34
|
+
export declare const LESSONS_CODE = "Reflect after a run";
|
|
35
|
+
export declare const LESSONS_SETTINGS: PluginSetting[];
|
|
36
|
+
export declare const FIRST_PARTY_PLUGINS: readonly PluginDescriptor[];
|
|
37
|
+
/** A setting's value: what a person saved when it is a number inside the setting's range, else its default. */
|
|
38
|
+
export declare function settingValue(setting: PluginSetting, saved: Record<string, unknown> | undefined): number;
|
|
39
|
+
/** The text of a long result, cut to its first 70% and its last 30% of `maxChars`, with a line between that says what is missing. */
|
|
40
|
+
export declare function trimText(text: string, maxChars: number): string;
|
|
41
|
+
export declare function outputTrim(saved: Record<string, unknown> | undefined): (pi: Api) => void;
|
|
42
|
+
export declare function budgetGuard(saved: Record<string, unknown> | undefined): (pi: Api) => void;
|
|
43
|
+
export interface InlineExtension {
|
|
44
|
+
name: string;
|
|
45
|
+
/** A Pi extension factory. Typed loosely so this module needs nothing of Pi's to be loaded. */
|
|
46
|
+
factory: unknown;
|
|
47
|
+
}
|
|
48
|
+
/** The first-party extensions switched on for a caller, each with the settings a person saved. */
|
|
49
|
+
export declare function firstPartyExtensions(on: (pluginId: string) => boolean, settings: Record<string, Record<string, unknown>>): InlineExtension[];
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export const OUTPUT_TRIM = 'output-trim';
|
|
2
|
+
export const BUDGET_GUARD = 'budget-guard';
|
|
3
|
+
export const LESSONS = 'lessons';
|
|
4
|
+
export const LESSONS_CODE = 'Reflect after a run';
|
|
5
|
+
const OUTPUT_TRIM_SETTINGS = [
|
|
6
|
+
{ key: 'maxChars', label: 'Longest tool result', description: 'A tool result longer than this many characters is cut to its beginning and its end.', default: 20_000, min: 2_000, max: 400_000 }
|
|
7
|
+
];
|
|
8
|
+
const BUDGET_GUARD_SETTINGS = [
|
|
9
|
+
{ key: 'maxRequests', label: 'Model requests in one reply', description: 'After this many model requests in one reply or one run of work, tool calls are refused so the agent wraps up.', default: 60, min: 5, max: 2_000 },
|
|
10
|
+
{ key: 'maxTokens', label: 'Tokens in one reply', description: 'The same, counted in tokens of every kind (cached ones included). 0 means no token limit.', default: 0, min: 0, max: 500_000_000 }
|
|
11
|
+
];
|
|
12
|
+
export const LESSONS_SETTINGS = [
|
|
13
|
+
{ key: 'minToolCalls', label: 'Tool calls before reflecting', description: 'Only a run that made at least this many tool calls is reflected on; shorter runs rarely teach anything.', default: 4, min: 1, max: 1_000 },
|
|
14
|
+
{ key: 'maxLessons', label: 'Most lessons kept', description: 'Once the Wiki holds this many lessons, no new one is written until some are removed.', default: 100, min: 1, max: 1_000 },
|
|
15
|
+
{ key: 'maxChars', label: 'Longest lesson', description: 'A lesson longer than this many characters is not kept.', default: 2_000, min: 200, max: 10_000 }
|
|
16
|
+
];
|
|
17
|
+
export const FIRST_PARTY_PLUGINS = [
|
|
18
|
+
{
|
|
19
|
+
id: OUTPUT_TRIM,
|
|
20
|
+
title: 'Output trim',
|
|
21
|
+
description: 'Cuts a very long tool result to its beginning and its end before the model reads it, and says how much was cut.',
|
|
22
|
+
switchable: { on: false },
|
|
23
|
+
settings: OUTPUT_TRIM_SETTINGS,
|
|
24
|
+
code: [{ name: 'Trim long tool results', description: 'Runs after every tool call, in conversations, terminal sessions, task threads and unattended work.' }]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: BUDGET_GUARD,
|
|
28
|
+
title: 'Budget guard',
|
|
29
|
+
description: 'Stops a reply that keeps going: past a limit of model requests or tokens, further tool calls are refused and the agent is told to wrap up.',
|
|
30
|
+
switchable: { on: false },
|
|
31
|
+
settings: BUDGET_GUARD_SETTINGS,
|
|
32
|
+
code: [{ name: 'Refuse tool calls past the limit', description: 'Counts model requests and tokens in one reply, in conversations, terminal sessions, task threads and unattended work.' }]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: LESSONS,
|
|
36
|
+
title: 'Lessons',
|
|
37
|
+
description: 'After a finished run, a short reflection reads what happened and may keep one general lesson in the Wiki under library/lessons, for later runs to find. It uses the same account and model as the run, so it costs tokens.',
|
|
38
|
+
switchable: { on: false },
|
|
39
|
+
settings: LESSONS_SETTINGS,
|
|
40
|
+
code: [{ name: LESSONS_CODE, description: 'Runs in the background after a completed top-level run with enough tool calls. It reads only that run\'s record, has no tools that change anything, and writes at most one Wiki note.' }]
|
|
41
|
+
}
|
|
42
|
+
];
|
|
43
|
+
/** A setting's value: what a person saved when it is a number inside the setting's range, else its default. */
|
|
44
|
+
export function settingValue(setting, saved) {
|
|
45
|
+
const value = saved?.[setting.key];
|
|
46
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= setting.min && value <= setting.max ? Math.floor(value) : setting.default;
|
|
47
|
+
}
|
|
48
|
+
const values = (settings, saved) => Object.fromEntries(settings.map((setting) => [setting.key, settingValue(setting, saved)]));
|
|
49
|
+
/** The text of a long result, cut to its first 70% and its last 30% of `maxChars`, with a line between that says what is missing. */
|
|
50
|
+
export function trimText(text, maxChars) {
|
|
51
|
+
if (text.length <= maxChars)
|
|
52
|
+
return text;
|
|
53
|
+
const head = Math.floor(maxChars * 0.7);
|
|
54
|
+
const tail = maxChars - head;
|
|
55
|
+
const cut = text.length - maxChars;
|
|
56
|
+
return `${text.slice(0, head)}\n\n[… ${cut} of ${text.length} characters were cut here by the Output trim plugin. Ask for a narrower result (a line range, a filter, a smaller file) to see them. …]\n\n${text.slice(text.length - tail)}`;
|
|
57
|
+
}
|
|
58
|
+
export function outputTrim(saved) {
|
|
59
|
+
const { maxChars } = values(OUTPUT_TRIM_SETTINGS, saved);
|
|
60
|
+
return (pi) => {
|
|
61
|
+
pi.on('tool_result', (event) => {
|
|
62
|
+
const texts = event.content.filter((part) => part.type === 'text' && typeof part.text === 'string');
|
|
63
|
+
const total = texts.reduce((sum, part) => sum + part.text.length, 0);
|
|
64
|
+
if (total <= maxChars)
|
|
65
|
+
return undefined;
|
|
66
|
+
// Several text parts are read as one result; pictures and anything else pass through untouched.
|
|
67
|
+
const trimmed = trimText(texts.map((part) => part.text).join('\n'), maxChars);
|
|
68
|
+
return { content: [{ type: 'text', text: trimmed }, ...event.content.filter((part) => part.type !== 'text')] };
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function budgetGuard(saved) {
|
|
73
|
+
const { maxRequests, maxTokens } = values(BUDGET_GUARD_SETTINGS, saved);
|
|
74
|
+
return (pi) => {
|
|
75
|
+
let requests = 0;
|
|
76
|
+
let tokens = 0;
|
|
77
|
+
let refusedInRequest = 0;
|
|
78
|
+
// A terminal session keeps one Pi session for many replies; each reply starts its own count.
|
|
79
|
+
pi.on('agent_start', () => {
|
|
80
|
+
requests = 0;
|
|
81
|
+
tokens = 0;
|
|
82
|
+
refusedInRequest = 0;
|
|
83
|
+
});
|
|
84
|
+
pi.on('turn_start', () => {
|
|
85
|
+
requests += 1;
|
|
86
|
+
});
|
|
87
|
+
pi.on('message_end', (event) => {
|
|
88
|
+
if (event.message.role !== 'assistant' || !event.message.usage)
|
|
89
|
+
return;
|
|
90
|
+
const usage = event.message.usage;
|
|
91
|
+
tokens += (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0);
|
|
92
|
+
});
|
|
93
|
+
// Pi's own event before a request can change what is sent and cannot refuse it, so the limit
|
|
94
|
+
// is held where the loop can be stopped: at the tool calls that keep it going.
|
|
95
|
+
pi.on('tool_call', () => {
|
|
96
|
+
const over = requests >= maxRequests ? `${maxRequests} model requests` : maxTokens > 0 && tokens >= maxTokens ? `${maxTokens} tokens` : null;
|
|
97
|
+
if (!over)
|
|
98
|
+
return undefined;
|
|
99
|
+
// The first refusal leaves the agent one request to say what is done. If it calls tools
|
|
100
|
+
// again instead, the batch ends the reply.
|
|
101
|
+
const again = refusedInRequest !== 0 && refusedInRequest !== requests;
|
|
102
|
+
refusedInRequest ||= requests;
|
|
103
|
+
return {
|
|
104
|
+
block: true,
|
|
105
|
+
terminate: again,
|
|
106
|
+
reason: `This reply reached its limit of ${over} (the Budget guard plugin). Call no more tools. Tell the user what is done and what is left; they can raise the limit on the Plugins page.`
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** The first-party extensions switched on for a caller, each with the settings a person saved. */
|
|
112
|
+
export function firstPartyExtensions(on, settings) {
|
|
113
|
+
const extensions = [];
|
|
114
|
+
if (on(OUTPUT_TRIM))
|
|
115
|
+
extensions.push({ name: OUTPUT_TRIM, factory: outputTrim(settings[OUTPUT_TRIM]) });
|
|
116
|
+
if (on(BUDGET_GUARD))
|
|
117
|
+
extensions.push({ name: BUDGET_GUARD, factory: budgetGuard(settings[BUDGET_GUARD]) });
|
|
118
|
+
return extensions;
|
|
119
|
+
}
|