@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
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// Proposing a plugin: how an agent offers a person a new skill, instruction, or piece of code
|
|
2
|
-
// that extends memory, the Wiki or history. It only proposes. A person accepts it, switches it
|
|
3
|
-
// on and trusts its code; no tool does any of those for them.
|
|
4
|
-
import { actorOf, type CallerContext } from '../memory/caller'
|
|
5
|
-
import type { DispatchEnv } from '../memory/dispatch'
|
|
6
|
-
import * as store from '../memory/store'
|
|
7
|
-
import { EXTENDABLE, parkPluginProposal } from '../plugins/proposal'
|
|
8
|
-
import type { ToolSpec } from './types'
|
|
9
|
-
|
|
10
|
-
export const PLUGIN_PROPOSE = 'plugin_propose'
|
|
11
|
-
|
|
12
|
-
const text = (value: unknown): string => (typeof value === 'string' ? value : '')
|
|
13
|
-
|
|
14
|
-
export function pluginProposeTool(env: DispatchEnv, caller: CallerContext): ToolSpec {
|
|
15
|
-
return {
|
|
16
|
-
name: PLUGIN_PROPOSE,
|
|
17
|
-
label: 'Propose a plugin',
|
|
18
|
-
description:
|
|
19
|
-
'Propose a plugin for the user to review: a bundle of files that changes how agents work. Nothing is saved until the user accepts it, and its code never runs until they also switch it on and trust it. ' +
|
|
20
|
-
'Files by folder: skills/<name>/SKILL.md (a procedure, with name and description front matter), prompts/<name>.md (a slash command), extensions/<name>.ts (a Pi extension), ' +
|
|
21
|
-
'and hooks.mjs for code the harness runs after a change: `export default function (harness) { harness.on("memory.saved", async (event, ctx) => { await ctx.call("<connected app name>", "<tool>", { text: event.body }) }) }`. ' +
|
|
22
|
-
'Hook events: memory.saved, memory.block.changed, wiki.page.saved (each has id, title, body, actor) and history.run.ended (runId, status, goal). ' +
|
|
23
|
-
'ctx.call reaches only a connected-app tool the user marked to run without asking; put no key or password in a file. Do not include package.json.',
|
|
24
|
-
parameters: (Type) =>
|
|
25
|
-
Type.Object({
|
|
26
|
-
name: Type.String({ description: 'A short name, such as memory-to-docs' }),
|
|
27
|
-
description: Type.String({ description: 'One line the user reads first: what it does' }),
|
|
28
|
-
extends: Type.Optional(Type.Array(Type.String({ description: `One of ${EXTENDABLE.join(', ')}` }))),
|
|
29
|
-
reason: Type.Optional(Type.String({ description: 'Why you are proposing it' })),
|
|
30
|
-
files: Type.Array(Type.Object({ path: Type.String({ description: 'A path inside the plugin, such as hooks.mjs' }), content: Type.String() }), { maxItems: 40 })
|
|
31
|
-
}),
|
|
32
|
-
execute: async (input) => {
|
|
33
|
-
const files = (Array.isArray(input.files) ? input.files : []).map((file) => ({ path: text((file as { path?: unknown }).path), content: text((file as { content?: unknown }).content) }))
|
|
34
|
-
const extended = (Array.isArray(input.extends) ? input.extends : []).filter((part): part is string => typeof part === 'string')
|
|
35
|
-
const from = caller.agentName ? `${caller.agentName} (${actorOf(caller)})` : actorOf(caller)
|
|
36
|
-
const slug = parkPluginProposal(store.wikiDir(env.root), from, { name: text(input.name), description: text(input.description), extends: extended, reason: text(input.reason), files })
|
|
37
|
-
env.bus?.emit({ type: 'wiki.changed' })
|
|
38
|
-
return `The plugin "${slug}" is waiting in the Inbox. It is saved only if the user accepts it, and it does nothing until they switch it on${files.some((file) => file.path.startsWith('extensions/') || /^hooks\.m?js$/.test(file.path)) ? ' and trust its code' : ''}.`
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { mkdtempSync, readFileSync } from 'node:fs'
|
|
2
|
-
import { tmpdir } from 'node:os'
|
|
3
|
-
import { join } from 'node:path'
|
|
4
|
-
import { afterEach, describe, expect, it } from 'vitest'
|
|
5
|
-
|
|
6
|
-
import { memorySecretStore } from '../accounts/secrets'
|
|
7
|
-
import { createHarness, type Harness } from '../harness'
|
|
8
|
-
import * as attachments from '../plugins/attachments'
|
|
9
|
-
import * as registry from '../skills/registry'
|
|
10
|
-
import * as store from '../memory/store'
|
|
11
|
-
import { registryTools } from './registryWrite'
|
|
12
|
-
import type { ToolSession, ToolSpec } from './types'
|
|
13
|
-
|
|
14
|
-
const open: Harness[] = []
|
|
15
|
-
afterEach(async () => {
|
|
16
|
-
for (const harness of open.splice(0)) await harness.close()
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
function setup() {
|
|
20
|
-
const harness = createHarness({
|
|
21
|
-
dataRoot: mkdtempSync(join(tmpdir(), 'registry-write-data-')),
|
|
22
|
-
stateDir: mkdtempSync(join(tmpdir(), 'registry-write-state-')),
|
|
23
|
-
secrets: memorySecretStore()
|
|
24
|
-
})
|
|
25
|
-
open.push(harness)
|
|
26
|
-
/** Runs one of the tools as the given agent would see it. */
|
|
27
|
-
const call = (agentId: string, name: string, input: Record<string, unknown>) => {
|
|
28
|
-
const session = { caller: { agentId, agentName: 'Helper', actor: 'Chat', runId: 'run-1' }, allow: [], depth: 0, cwd: harness.env.root, capabilities: { version: 1, tools: [], connectors: [], contributions: [] } } as unknown as ToolSession
|
|
29
|
-
const tool = (registryTools({ harness })(session) as ToolSpec[]).find((candidate) => candidate.name === name)!
|
|
30
|
-
return tool.execute(input)
|
|
31
|
-
}
|
|
32
|
-
return { harness, root: harness.env.root, call }
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
describe('registry_write', () => {
|
|
36
|
-
it('writes a new skill on for the calling agent only, and records who wrote it', async () => {
|
|
37
|
-
const { root, call } = setup()
|
|
38
|
-
const reply = await call('agent-1', 'registry_write', { kind: 'skill', name: 'Release Notes', description: 'Write notes', body: 'Use short bullets.' })
|
|
39
|
-
expect(reply).toContain('on for you only')
|
|
40
|
-
expect(registry.list(root).some((item) => item.id === 'skills/release-notes')).toBe(true)
|
|
41
|
-
expect(registry.enabledFor(root, null, 'agent-1').map((item) => item.id)).toContain('skills/release-notes')
|
|
42
|
-
expect(registry.enabledFor(root, null, 'agent-2').map((item) => item.id)).not.toContain('skills/release-notes')
|
|
43
|
-
expect(readFileSync(join(store.wikiDir(root), 'log.md'), 'utf8')).toContain('Helper (Chat)')
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('leaves an item others already use unchanged and sends the new text to the Inbox', async () => {
|
|
47
|
-
const { root, call } = setup()
|
|
48
|
-
await call('agent-1', 'registry_write', { kind: 'rule', name: 'Be brief', description: 'Keep answers short', body: 'Short answers.' })
|
|
49
|
-
const choices = attachments.load(root)
|
|
50
|
-
attachments.set(choices, ['rules/be-brief'], {}, true, false)
|
|
51
|
-
attachments.save(root, choices)
|
|
52
|
-
const path = registry.list(root).find((item) => item.id === 'rules/be-brief')!.path
|
|
53
|
-
const before = readFileSync(path, 'utf8')
|
|
54
|
-
|
|
55
|
-
const reply = await call('agent-2', 'registry_write', { kind: 'rule', name: 'Be brief', description: 'Keep answers short', body: 'Different text.' })
|
|
56
|
-
expect(reply).toContain('Inbox')
|
|
57
|
-
expect(readFileSync(path, 'utf8')).toBe(before)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('refuses a body that looks like a credential', async () => {
|
|
61
|
-
const { call } = setup()
|
|
62
|
-
await expect(call('agent-1', 'registry_write', { kind: 'prompt', name: 'Leak', description: 'x', body: 'key sk-ant-abc123' })).rejects.toThrow(/credential/)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('rejects an unknown kind', async () => {
|
|
66
|
-
const { call } = setup()
|
|
67
|
-
await expect(call('agent-1', 'registry_write', { kind: 'page', name: 'x', description: 'x', body: 'x' })).rejects.toThrow(/skill, prompt, or rule/)
|
|
68
|
-
})
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
describe('plugin_write', () => {
|
|
72
|
-
const skillOnly = { name: 'Notes Helper', description: 'Adds a note skill', files: [{ path: 'skills/notes/SKILL.md', content: '---\nname: notes\ndescription: Notes\n---\n\nTake notes.' }] }
|
|
73
|
-
|
|
74
|
-
it('writes a plugin that is on for the calling agent only', async () => {
|
|
75
|
-
const { root, call } = setup()
|
|
76
|
-
const reply = await call('agent-1', 'plugin_write', skillOnly)
|
|
77
|
-
expect(reply).toContain('on for you only')
|
|
78
|
-
const choices = attachments.load(root)
|
|
79
|
-
expect(attachments.attached(choices, ['package:notes-helper'], { agentId: 'agent-1' }, false)).toBe(true)
|
|
80
|
-
expect(attachments.attached(choices, ['package:notes-helper'], { agentId: 'agent-2' }, false)).toBe(false)
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('trusts the code of a plugin that runs code, and only once it is written', async () => {
|
|
84
|
-
const { harness, call } = setup()
|
|
85
|
-
expect(harness.plugins.trust.list()).toEqual([])
|
|
86
|
-
const reply = await call('agent-1', 'plugin_write', {
|
|
87
|
-
name: 'Memory Mirror',
|
|
88
|
-
description: 'Mirrors saved facts',
|
|
89
|
-
extends: ['memory'],
|
|
90
|
-
files: [{ path: 'hooks.mjs', content: 'export default function () {}' }]
|
|
91
|
-
})
|
|
92
|
-
expect(reply).toContain('trusted')
|
|
93
|
-
expect(harness.plugins.trust.list()).toHaveLength(1)
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('refuses a plugin folder that already exists', async () => {
|
|
97
|
-
const { call } = setup()
|
|
98
|
-
await call('agent-1', 'plugin_write', skillOnly)
|
|
99
|
-
await expect(call('agent-1', 'plugin_write', skillOnly)).rejects.toThrow(/already a plugin folder/)
|
|
100
|
-
})
|
|
101
|
-
})
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
// Writing skills, rules, prompts and plugins directly, for the agent that wrote them. Nothing
|
|
2
|
-
// goes through the Inbox first, but every write is recorded there, and a plugin's code runs only
|
|
3
|
-
// once it is trusted. A change that would alter an item other people already use goes to the
|
|
4
|
-
// Inbox instead, as before.
|
|
5
|
-
import { join, resolve } from 'node:path'
|
|
6
|
-
|
|
7
|
-
import { invalid } from '../core/errors'
|
|
8
|
-
import type { Harness } from '../harness'
|
|
9
|
-
import { actorOf, type CallerContext } from '../memory/caller'
|
|
10
|
-
import { enqueueCuration } from '../memory/curation'
|
|
11
|
-
import { inbox } from '../memory/operations'
|
|
12
|
-
import { parkRegistryProposal } from '../memory/proposals'
|
|
13
|
-
import { looksSecret } from '../memory/secrets'
|
|
14
|
-
import * as store from '../memory/store'
|
|
15
|
-
import { reindexQuietly } from '../memory/wikiIndex'
|
|
16
|
-
import { attach, ensureAdopted, loadingFor, trust } from '../plugins/api'
|
|
17
|
-
import * as attachments from '../plugins/attachments'
|
|
18
|
-
import type { PluginDescriptor } from '../plugins/types'
|
|
19
|
-
import { acceptPluginProposal, checkPluginProposal } from '../plugins/proposal'
|
|
20
|
-
import * as registry from '../skills/registry'
|
|
21
|
-
import type { ToolProvider, ToolSpec } from './types'
|
|
22
|
-
|
|
23
|
-
export const REGISTRY_WRITE = 'registry_write'
|
|
24
|
-
export const PLUGIN_WRITE = 'plugin_write'
|
|
25
|
-
|
|
26
|
-
const MAX_BODY_BYTES = 64 * 1024
|
|
27
|
-
const text = (value: unknown): string => (typeof value === 'string' ? value : '')
|
|
28
|
-
|
|
29
|
-
/** The tools as a plugin, for an application that provides them. */
|
|
30
|
-
export const REGISTRY_WRITE_PLUGIN: PluginDescriptor = {
|
|
31
|
-
id: 'registry-write',
|
|
32
|
-
title: 'Skills and plugins',
|
|
33
|
-
description: 'Lets an agent write a skill, rule, prompt or plugin directly. A new item is on only for the agent that wrote it. A plugin is switched on for that agent and its code is trusted only after it is written; an item already in use by others goes to the Inbox.',
|
|
34
|
-
manage: 'tools',
|
|
35
|
-
tools: [
|
|
36
|
-
{ name: REGISTRY_WRITE, description: 'Write a skill, rule or prompt' },
|
|
37
|
-
{ name: PLUGIN_WRITE, description: 'Write a plugin' }
|
|
38
|
-
]
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface RegistryToolOptions {
|
|
42
|
-
harness: Harness
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** The `registry_write` and `plugin_write` tools. Only the names a session allows are registered. */
|
|
46
|
-
export function registryTools(options: RegistryToolOptions): ToolProvider {
|
|
47
|
-
return ({ caller }) => [registryWriteTool(options.harness, caller), pluginWriteTool(options.harness, caller)]
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function actorLabel(caller: CallerContext): string {
|
|
51
|
-
return caller.agentName ? `${caller.agentName} (${actorOf(caller)})` : actorOf(caller)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function requireAgent(caller: CallerContext): string {
|
|
55
|
-
if (!caller.agentId) throw invalid('Only an agent can write skills, rules, prompts, or plugins.')
|
|
56
|
-
return caller.agentId
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Whether an existing item belongs to this agent alone: switched on for no one else, nowhere
|
|
61
|
-
* wider, and not built in. Anything else is someone else's to review.
|
|
62
|
-
*/
|
|
63
|
-
function ownedByCaller(choices: attachments.Attachments, id: string, agentId: string, builtin: boolean): boolean {
|
|
64
|
-
const where = attachments.describe(choices, id, builtin)
|
|
65
|
-
if (where.global || where.on.projectIds.length) return false
|
|
66
|
-
return where.on.agentIds.length === 1 && where.on.agentIds[0] === agentId
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function registryWriteTool(harness: Harness, caller: CallerContext): ToolSpec {
|
|
70
|
-
return {
|
|
71
|
-
name: REGISTRY_WRITE,
|
|
72
|
-
label: caller.vaultAccess ? 'Propose a skill, rule or prompt' : 'Write a skill, rule or prompt',
|
|
73
|
-
description: caller.vaultAccess ? 'Submit a bounded text skill, rule or prompt for curator review. It stays inactive until reviewed; permissions and code trust remain unchanged.' :
|
|
74
|
-
'Write a skill, rule or prompt directly. It is on only for you until the user switches it on for others. ' +
|
|
75
|
-
'An item that others already use, or that is built in, is not changed: your text goes to the Inbox for the user to review. ' +
|
|
76
|
-
'A rule reaches every future prompt of the agents it is on for, so write one only when it should always apply.',
|
|
77
|
-
parameters: (Type) =>
|
|
78
|
-
Type.Object({
|
|
79
|
-
kind: Type.String({ description: 'skill, prompt, or rule' }),
|
|
80
|
-
name: Type.String({ description: 'A short name, such as release-notes' }),
|
|
81
|
-
description: Type.String({ description: 'One line the user reads first' }),
|
|
82
|
-
body: Type.String({ description: 'The text itself, as Markdown' }),
|
|
83
|
-
reason: Type.Optional(Type.String({ description: 'Why you are writing it' }))
|
|
84
|
-
}),
|
|
85
|
-
execute: async (input) => {
|
|
86
|
-
const agentId = requireAgent(caller)
|
|
87
|
-
const kind = text(input.kind)
|
|
88
|
-
const name = text(input.name).trim()
|
|
89
|
-
const description = text(input.description).trim()
|
|
90
|
-
const body = text(input.body)
|
|
91
|
-
const reason = text(input.reason).trim()
|
|
92
|
-
if (!['skill', 'prompt', 'rule'].includes(kind)) throw invalid('kind must be skill, prompt, or rule.')
|
|
93
|
-
if (!name || !body.trim()) throw invalid('A skill, prompt, or rule needs a name and a body.')
|
|
94
|
-
if (Buffer.byteLength(body, 'utf8') > MAX_BODY_BYTES) throw invalid('The body is larger than 64 KiB.')
|
|
95
|
-
if (looksSecret(body)) throw invalid('The text looks like a credential, so it was not saved.')
|
|
96
|
-
|
|
97
|
-
if (caller.vaultAccess === 'self' || caller.vaultAccess === 'propose' || caller.vaultAccess === 'curator') {
|
|
98
|
-
const job = enqueueCuration(harness.env.root, { kind: 'registry', proposal: { kind, name, description, body, reason }, caller })
|
|
99
|
-
harness.bus.emit({ type: 'wiki.changed' })
|
|
100
|
-
return `Submitted proposal ${job.id} for curator review. Nothing has been activated.`
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const { root } = harness.env
|
|
104
|
-
const wiki = store.wikiDir(root)
|
|
105
|
-
const id = `${kind}s/${store.slug(name)}`
|
|
106
|
-
const existing = registry.list(root).find((item) => item.id === id)
|
|
107
|
-
const choices = attachments.load(root)
|
|
108
|
-
if (existing && !ownedByCaller(choices, id, agentId, !!existing.builtin)) {
|
|
109
|
-
const parked = parkRegistryProposal(wiki, { kind: 'agent', runId: caller.runId ?? null, actor: actorLabel(caller) }, { kind, name, description, body, reason })
|
|
110
|
-
harness.bus.emit({ type: 'wiki.changed' })
|
|
111
|
-
return `The ${kind} change (${parked}) is in the Wiki Inbox: "${id}" is already used by others, so the user reviews it before it changes.`
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
registry.writeItem(root, kind, name, description, body, reason || `Written by ${actorLabel(caller)}`, actorLabel(caller))
|
|
115
|
-
attachments.set(choices, [id], { agentId }, true, false)
|
|
116
|
-
attachments.save(root, choices)
|
|
117
|
-
reindexQuietly(root)
|
|
118
|
-
harness.bus.emit({ type: 'plugins.changed' })
|
|
119
|
-
inbox(wiki, 'applied', `Wrote ${kind} "${name}"`, `${reason || 'Written by an agent.'}\n\nBy ${actorLabel(caller)}. It is on only for that agent.`, [], null)
|
|
120
|
-
return `Saved the ${kind} "${id}". It is on for you only; the user can switch it on for everyone.`
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function pluginWriteTool(harness: Harness, caller: CallerContext): ToolSpec {
|
|
126
|
-
return {
|
|
127
|
-
name: PLUGIN_WRITE,
|
|
128
|
-
label: caller.vaultAccess ? 'Propose a plugin' : 'Write a plugin',
|
|
129
|
-
description: caller.vaultAccess ? 'Submit a plugin bundle for curator and user review. It remains inactive and untrusted; executable code requires an explicit user trust decision. Include at most 40 bounded files; never include credentials.' :
|
|
130
|
-
'Write a plugin directly: a bundle of files that changes how agents work. It is switched on for you only. ' +
|
|
131
|
-
'If it contains code (extensions/ or hooks.mjs), that code is trusted and runs in your sessions; nobody else runs it. ' +
|
|
132
|
-
'Files by folder: skills/<name>/SKILL.md, prompts/<name>.md, extensions/<name>.ts, and hooks.mjs. Do not include package.json. Put no key or password in a file.',
|
|
133
|
-
parameters: (Type) =>
|
|
134
|
-
Type.Object({
|
|
135
|
-
name: Type.String({ description: 'A short name, such as memory-to-docs' }),
|
|
136
|
-
description: Type.String({ description: 'One line the user reads first' }),
|
|
137
|
-
extends: Type.Optional(Type.Array(Type.String({ description: 'memory, wiki, or history' }))),
|
|
138
|
-
reason: Type.Optional(Type.String({ description: 'Why you are writing it' })),
|
|
139
|
-
files: Type.Array(Type.Object({ path: Type.String({ description: 'A path inside the plugin' }), content: Type.String() }), { maxItems: 40 })
|
|
140
|
-
}),
|
|
141
|
-
execute: async (input) => {
|
|
142
|
-
const agentId = requireAgent(caller)
|
|
143
|
-
const files = (Array.isArray(input.files) ? input.files : []).map((file) => ({ path: text((file as { path?: unknown }).path), content: text((file as { content?: unknown }).content) }))
|
|
144
|
-
const proposal = {
|
|
145
|
-
name: text(input.name),
|
|
146
|
-
description: text(input.description),
|
|
147
|
-
extends: (Array.isArray(input.extends) ? input.extends : []).filter((part): part is string => typeof part === 'string'),
|
|
148
|
-
reason: text(input.reason),
|
|
149
|
-
files
|
|
150
|
-
}
|
|
151
|
-
const checked = checkPluginProposal(proposal)
|
|
152
|
-
if (caller.vaultAccess === 'self' || caller.vaultAccess === 'propose' || caller.vaultAccess === 'curator') {
|
|
153
|
-
const job = enqueueCuration(harness.env.root, { kind: 'plugin', proposal, caller })
|
|
154
|
-
harness.bus.emit({ type: 'wiki.changed' })
|
|
155
|
-
return `Submitted proposal ${job.id}. Executable code requires user review and trust.`
|
|
156
|
-
}
|
|
157
|
-
const { root } = harness.env
|
|
158
|
-
// Trust the packages that were there first, so the new one is not adopted with them.
|
|
159
|
-
await ensureAdopted(harness)
|
|
160
|
-
acceptPluginProposal(root, proposal)
|
|
161
|
-
|
|
162
|
-
let note = ''
|
|
163
|
-
try {
|
|
164
|
-
if (checked.runsCode) {
|
|
165
|
-
const loading = await loadingFor(harness, { agentId })
|
|
166
|
-
const folder = resolve(join(root, 'plugins', checked.slug))
|
|
167
|
-
const found = Object.entries(loading?.packageCode ?? {}).find(([dir]) => resolve(dir) === folder)
|
|
168
|
-
if (!found) throw new Error('its code was not found after it was saved')
|
|
169
|
-
await trust(harness, { agentId, hash: found[1].hash })
|
|
170
|
-
}
|
|
171
|
-
await attach(harness, { id: `package:${checked.slug}`, scope: { agentId } }, true)
|
|
172
|
-
} catch (error) {
|
|
173
|
-
note = ` It is saved but not switched on: ${error instanceof Error ? error.message : String(error)}. The user can switch it on in Plugins.`
|
|
174
|
-
}
|
|
175
|
-
harness.bus.emit({ type: 'plugins.changed' })
|
|
176
|
-
inbox(store.wikiDir(root), 'applied', `Wrote plugin "${checked.slug}"`, `${proposal.reason || 'Written by an agent.'}\n\nBy ${actorLabel(caller)}.${checked.runsCode ? ' Its code runs only for that agent.' : ''}`, [], null)
|
|
177
|
-
return note
|
|
178
|
-
? `The plugin "${checked.slug}" was written.${note}`
|
|
179
|
-
: `The plugin "${checked.slug}" was written and is on for you only.${checked.runsCode ? ' Its code is trusted for your sessions.' : ''}`
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { HarnessError, invalid } from '../core/errors'
|
|
2
|
-
import type { Subagents } from '../sessions/subagentService'
|
|
3
|
-
import { SPAWN_SUBAGENT, WAIT_SUBAGENTS, SUBAGENT_RECEIPT, type SubagentReceipt, type SubagentResult } from '../sessions/subagents'
|
|
4
|
-
import type { ToolResult, ToolSpec } from './types'
|
|
5
|
-
|
|
6
|
-
export { SPAWN_SUBAGENT, SUBAGENT_RELATION, DEFAULT_SUBAGENT_DEPTH, MAX_SUBAGENT_DEPTH, subagentDepth, subagentReport, type SubagentOptions } from '../sessions/subagents'
|
|
7
|
-
|
|
8
|
-
function reported(parentRunId: string, results: SubagentResult[], spawned?: string[]): ToolResult {
|
|
9
|
-
const included: SubagentResult[] = []
|
|
10
|
-
let length = 0
|
|
11
|
-
for (const result of results) {
|
|
12
|
-
if (length + result.text.length > 24_000 && included.length) break
|
|
13
|
-
included.push(result)
|
|
14
|
-
length += result.text.length + 300
|
|
15
|
-
}
|
|
16
|
-
const receipt: SubagentReceipt = { version: 1, ownerRunId: parentRunId, ...(spawned ? { spawned } : {}), delivered: included.map((result) => result.runId) }
|
|
17
|
-
return { text: JSON.stringify({ results: included, ...(results.length > included.length ? { remaining: results.slice(included.length).map((result) => result.runId) } : {}) }), details: { [SUBAGENT_RECEIPT]: receipt } }
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function subagentTools(service: Subagents, parentRunId: string): ToolSpec[] {
|
|
21
|
-
const execute = (fn: (input: Record<string, unknown>) => Promise<ToolResult>): ToolSpec['execute'] => async (input) => {
|
|
22
|
-
try { return await fn(input) } catch (error) {
|
|
23
|
-
if (error instanceof HarnessError) return error.message
|
|
24
|
-
throw error
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return [{
|
|
28
|
-
name: SPAWN_SUBAGENT,
|
|
29
|
-
label: 'Start a subagent',
|
|
30
|
-
description: 'Start a fresh child run of yourself for independent work. Give a complete brief: the child has no conversation history and no more capabilities than you. Returns its run ID immediately by default so you can continue working. Results arrive automatically before you finish. Use wait_subagents to join selected children, or wait: true for an inline result. Stopping you stops your children.',
|
|
31
|
-
parameters: (Type) => Type.Object({ brief: Type.String(), tools: Type.Optional(Type.Array(Type.String())), wait: Type.Optional(Type.Boolean({ description: 'Wait for the child and return its result; default false' })) }),
|
|
32
|
-
execute: execute(async (input) => {
|
|
33
|
-
const child = await service.spawn({ parentRunId, brief: input.brief as string, tools: input.tools as string[] | undefined, wait: input.wait as boolean | undefined })
|
|
34
|
-
if (input.wait === true) return reported(parentRunId, service.results({ parentRunId, runIds: [child.runId] }), [child.runId])
|
|
35
|
-
return { text: JSON.stringify(child), details: { [SUBAGENT_RECEIPT]: { version: 1, ownerRunId: parentRunId, spawned: [child.runId] } satisfies SubagentReceipt } }
|
|
36
|
-
})
|
|
37
|
-
}, {
|
|
38
|
-
name: WAIT_SUBAGENTS,
|
|
39
|
-
label: 'Wait for subagents',
|
|
40
|
-
description: 'Wait for all selected direct subagents to settle and return their results, including failures. Omit runIds to select your current children. Do useful independent work before waiting; results also arrive automatically before your final reply.',
|
|
41
|
-
parameters: (Type) => Type.Object({ runIds: Type.Optional(Type.Array(Type.String())) }),
|
|
42
|
-
execute: execute(async (input) => {
|
|
43
|
-
if (input.runIds !== undefined && !Array.isArray(input.runIds)) throw invalid('runIds must be an array of child run IDs.')
|
|
44
|
-
return reported(parentRunId, await service.wait({ parentRunId, runIds: input.runIds as string[] | undefined }))
|
|
45
|
-
})
|
|
46
|
-
}]
|
|
47
|
-
}
|
package/src/tools/types.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// A tool as the harness holds it: described without Pi imports, so a provider can be written
|
|
2
|
-
// against this package alone. The session turns each one into a Pi tool.
|
|
3
|
-
import type { CallerContext } from '../memory/caller'
|
|
4
|
-
import type { CapabilitySet } from '../capabilities/types'
|
|
5
|
-
import type { ActiveRun } from '../sessions/registry'
|
|
6
|
-
import type { ToolAttachmentRef } from '../sessions/contracts'
|
|
7
|
-
|
|
8
|
-
export interface ToolResult {
|
|
9
|
-
text: string
|
|
10
|
-
/** Native-history metadata; never interpreted as model instructions. */
|
|
11
|
-
details?: Record<string, unknown>
|
|
12
|
-
image?: { data: string; mimeType: string }
|
|
13
|
-
/** References to content stored by the provider; bytes never enter the run-event stream. */
|
|
14
|
-
attachments?: ToolAttachmentRef[]
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface ToolSpec {
|
|
18
|
-
name: string
|
|
19
|
-
label: string
|
|
20
|
-
description: string
|
|
21
|
-
/** Builds the TypeBox parameter schema. */
|
|
22
|
-
parameters: (type: typeof import('typebox').Type) => unknown
|
|
23
|
-
execute: (input: Record<string, unknown>) => Promise<string | ToolResult>
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** What a tool provider is told about the session it is building tools for. */
|
|
27
|
-
export interface ToolSession {
|
|
28
|
-
run: ActiveRun
|
|
29
|
-
caller: CallerContext
|
|
30
|
-
/** The tool names switched on for this session. */
|
|
31
|
-
allow: readonly string[]
|
|
32
|
-
/** Hops from the user to this session (0 when the user started it). */
|
|
33
|
-
depth: number
|
|
34
|
-
/** The session's working folder. */
|
|
35
|
-
cwd: string
|
|
36
|
-
/** The capability set frozen when this run started. */
|
|
37
|
-
capabilities: CapabilitySet
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Builds the tools a session may be given. Only those named in `allow` are registered. */
|
|
41
|
-
export type ToolProvider = (session: ToolSession) => ToolSpec[] | Promise<ToolSpec[]>
|
package/src/web/safeRequest.ts
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
// Reads a web address on behalf of an agent without reaching the machine's own network. The
|
|
2
|
-
// address is checked before a request and again when the connection is made, so a name that
|
|
3
|
-
// resolves to a private address, or changes between the check and the connection, is refused.
|
|
4
|
-
import { lookup as dnsLookup, type LookupAddress } from 'node:dns'
|
|
5
|
-
import { request as httpRequest, type IncomingMessage } from 'node:http'
|
|
6
|
-
import { request as httpsRequest } from 'node:https'
|
|
7
|
-
import { isIP, type LookupFunction } from 'node:net'
|
|
8
|
-
|
|
9
|
-
export interface WebResponse {
|
|
10
|
-
status: number
|
|
11
|
-
contentType: string
|
|
12
|
-
body: Buffer
|
|
13
|
-
/** The body reached the byte limit and was cut short. */
|
|
14
|
-
truncated: boolean
|
|
15
|
-
/** The address finally read, after any redirects. */
|
|
16
|
-
url: URL
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface WebRequestOptions {
|
|
20
|
-
headers?: Record<string, string>
|
|
21
|
-
/** Longest a single read may stay silent, and the most time the whole request may take. */
|
|
22
|
-
timeoutMs: number
|
|
23
|
-
maxBytes: number
|
|
24
|
-
maxRedirects?: number
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Makes one read. Tests replace it; the default is `safeRequest`. */
|
|
28
|
-
export type WebRequest = (url: URL, options: WebRequestOptions) => Promise<WebResponse>
|
|
29
|
-
|
|
30
|
-
const USER_AGENT = 'Mozilla/5.0 (compatible; XingularHarness/0.1; +web tools)'
|
|
31
|
-
const REDIRECT_CODES = new Set([301, 302, 303, 307, 308])
|
|
32
|
-
|
|
33
|
-
/** Only plain web addresses: no other scheme, and no username or password in the address. */
|
|
34
|
-
export function webAddress(input: string): URL {
|
|
35
|
-
let url: URL
|
|
36
|
-
try {
|
|
37
|
-
url = new URL(input.trim())
|
|
38
|
-
} catch {
|
|
39
|
-
throw new Error('That is not a web address.')
|
|
40
|
-
}
|
|
41
|
-
if (url.protocol !== 'http:' && url.protocol !== 'https:') throw new Error('Only http and https addresses can be read.')
|
|
42
|
-
if (url.username || url.password) throw new Error('Addresses with a username or password cannot be read.')
|
|
43
|
-
if (!url.hostname) throw new Error('That address has no host name.')
|
|
44
|
-
return url
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Whether an address belongs to this machine, a private network, or is otherwise not public. */
|
|
48
|
-
export function isPublicAddress(address: string): boolean {
|
|
49
|
-
const mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(address)
|
|
50
|
-
if (mapped) return isPublicIpv4(mapped[1])
|
|
51
|
-
if (address.includes(':')) return isPublicIpv6(address.toLowerCase())
|
|
52
|
-
return isPublicIpv4(address)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function isPublicIpv4(address: string): boolean {
|
|
56
|
-
const parts = address.split('.').map(Number)
|
|
57
|
-
if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return false
|
|
58
|
-
const [a, b, c] = parts
|
|
59
|
-
if (a === 0 || a === 10 || a === 127 || a >= 224) return false
|
|
60
|
-
if (a === 100 && b >= 64 && b <= 127) return false
|
|
61
|
-
if (a === 169 && b === 254) return false
|
|
62
|
-
if (a === 172 && b >= 16 && b <= 31) return false
|
|
63
|
-
if (a === 192 && b === 168) return false
|
|
64
|
-
if (a === 192 && b === 0 && c === 0) return false
|
|
65
|
-
if (a === 198 && (b === 18 || b === 19)) return false
|
|
66
|
-
return true
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function isPublicIpv6(address: string): boolean {
|
|
70
|
-
// Global unicast only (2000::/3), without documentation (2001:db8::/32), Teredo (2001::/32) or 6to4 (2002::/16), which carry IPv4 addresses.
|
|
71
|
-
const first = parseInt(address.split(':')[0] || '0', 16)
|
|
72
|
-
if (Number.isNaN(first) || first < 0x2000 || first > 0x3fff) return false
|
|
73
|
-
if (/^2001:db8(:|$)/.test(address) || /^2001:0{0,4}:/.test(address) || /^2002(:|$)/.test(address)) return false
|
|
74
|
-
return true
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
type LookupCallback = (error: NodeJS.ErrnoException | null, address: string | LookupAddress[], family?: number) => void
|
|
78
|
-
|
|
79
|
-
/** A DNS lookup that refuses any address that is not public. It runs when the connection is made. */
|
|
80
|
-
function publicLookupImpl(hostname: string, options: { all?: boolean }, callback: LookupCallback): void {
|
|
81
|
-
dnsLookup(hostname, { all: true, verbatim: true }, (error, addresses) => {
|
|
82
|
-
if (error) return callback(error, '', 4)
|
|
83
|
-
if (addresses.some((entry) => !isPublicAddress(entry.address))) {
|
|
84
|
-
return callback(Object.assign(new Error(`${hostname} is not a public address.`), { code: 'EPRIVATE' }), '', 4)
|
|
85
|
-
}
|
|
86
|
-
if (options.all) return callback(null, addresses)
|
|
87
|
-
callback(null, addresses[0].address, addresses[0].family)
|
|
88
|
-
})
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export const publicLookup = publicLookupImpl as unknown as LookupFunction
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* A literal address is never looked up, so it is checked here. A name is checked by the lookup
|
|
95
|
-
* at connection time.
|
|
96
|
-
*/
|
|
97
|
-
function assertReachable(url: URL): void {
|
|
98
|
-
const host = url.hostname.replace(/^\[|\]$/g, '')
|
|
99
|
-
if (isIP(host) && !isPublicAddress(host)) throw Object.assign(new Error(`${host} is not a public address.`), { code: 'EPRIVATE' })
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/** Reads a web address, following redirects one at a time, each checked the same way. */
|
|
103
|
-
export const safeRequest: WebRequest = async (start, options) => {
|
|
104
|
-
let url = start
|
|
105
|
-
for (let hop = 0; ; hop += 1) {
|
|
106
|
-
assertReachable(url)
|
|
107
|
-
const response = await readOnce(url, options)
|
|
108
|
-
if (REDIRECT_CODES.has(response.status) && response.location) {
|
|
109
|
-
if (hop >= (options.maxRedirects ?? 5)) throw new Error('The address redirected too many times.')
|
|
110
|
-
url = webAddress(new URL(response.location, url).toString())
|
|
111
|
-
continue
|
|
112
|
-
}
|
|
113
|
-
return { status: response.status, contentType: response.contentType, body: response.body, truncated: response.truncated, url }
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function readOnce(url: URL, options: WebRequestOptions): Promise<WebResponse & { location?: string }> {
|
|
118
|
-
return new Promise((resolve, reject) => {
|
|
119
|
-
const start = (url.protocol === 'https:' ? httpsRequest : httpRequest) as typeof httpRequest
|
|
120
|
-
let settled = false
|
|
121
|
-
const finish = (value: WebResponse & { location?: string }): void => {
|
|
122
|
-
if (settled) return
|
|
123
|
-
settled = true
|
|
124
|
-
clearTimeout(total)
|
|
125
|
-
resolve(value)
|
|
126
|
-
}
|
|
127
|
-
const fail = (error: Error): void => {
|
|
128
|
-
if (settled) return
|
|
129
|
-
settled = true
|
|
130
|
-
clearTimeout(total)
|
|
131
|
-
reject(error)
|
|
132
|
-
}
|
|
133
|
-
const request = start(url, {
|
|
134
|
-
method: 'GET',
|
|
135
|
-
headers: { 'user-agent': USER_AGENT, accept: 'text/html,text/plain,application/json;q=0.9,*/*;q=0.5', ...options.headers },
|
|
136
|
-
lookup: publicLookup,
|
|
137
|
-
timeout: options.timeoutMs
|
|
138
|
-
}, (response: IncomingMessage) => {
|
|
139
|
-
const status = response.statusCode ?? 0
|
|
140
|
-
const location = response.headers.location
|
|
141
|
-
if (REDIRECT_CODES.has(status) && location) {
|
|
142
|
-
response.resume()
|
|
143
|
-
finish({ status, contentType: '', body: Buffer.alloc(0), truncated: false, url, location })
|
|
144
|
-
return
|
|
145
|
-
}
|
|
146
|
-
const chunks: Buffer[] = []
|
|
147
|
-
let size = 0
|
|
148
|
-
let truncated = false
|
|
149
|
-
const done = (): void => finish({ status, contentType: String(response.headers['content-type'] ?? ''), body: Buffer.concat(chunks), truncated, url })
|
|
150
|
-
response.on('data', (chunk: Buffer) => {
|
|
151
|
-
const room = options.maxBytes - size
|
|
152
|
-
const kept = chunk.length > room ? chunk.subarray(0, Math.max(room, 0)) : chunk
|
|
153
|
-
chunks.push(kept)
|
|
154
|
-
size += kept.length
|
|
155
|
-
if (kept.length < chunk.length) {
|
|
156
|
-
truncated = true
|
|
157
|
-
response.destroy()
|
|
158
|
-
done()
|
|
159
|
-
}
|
|
160
|
-
})
|
|
161
|
-
response.on('error', (error) => (truncated ? done() : fail(error)))
|
|
162
|
-
response.on('end', done)
|
|
163
|
-
response.on('close', done)
|
|
164
|
-
})
|
|
165
|
-
// The whole request is capped as well as each silent stretch, so a slow trickle cannot hold a turn open.
|
|
166
|
-
const total = setTimeout(() => request.destroy(new Error('The address took too long to answer.')), options.timeoutMs * 3)
|
|
167
|
-
request.on('timeout', () => request.destroy(new Error('The address took too long to answer.')))
|
|
168
|
-
request.on('error', fail)
|
|
169
|
-
request.end()
|
|
170
|
-
})
|
|
171
|
-
}
|
package/src/web/text.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
// Turns a fetched page into the readable text an agent can use. This is a plain reduction, not a
|
|
2
|
-
// browser: scripts, styles and markup go, block boundaries become line breaks, entities decode.
|
|
3
|
-
const ENTITIES: Record<string, string> = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'", nbsp: ' ', mdash: '—', ndash: '–', hellip: '…', copy: '©' }
|
|
4
|
-
|
|
5
|
-
export function decodeEntities(text: string): string {
|
|
6
|
-
return text.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (match, name: string) => {
|
|
7
|
-
if (name[0] === '#') {
|
|
8
|
-
const code = name[1] === 'x' || name[1] === 'X' ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10)
|
|
9
|
-
return Number.isFinite(code) && code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : match
|
|
10
|
-
}
|
|
11
|
-
return ENTITIES[name.toLowerCase()] ?? match
|
|
12
|
-
})
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function pageTitle(html: string): string {
|
|
16
|
-
const match = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(html)
|
|
17
|
-
return match ? decodeEntities(match[1]).replace(/\s+/g, ' ').trim() : ''
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const BLOCK_TAGS = /<\/?(?:p|div|br|li|ul|ol|h[1-6]|tr|table|section|article|header|footer|nav|main|blockquote|pre|hr|dt|dd|figure|figcaption)\b[^>]*>/gi
|
|
21
|
-
|
|
22
|
-
/** Readable text of an HTML page, with at most `limit` characters. */
|
|
23
|
-
export function htmlToText(html: string, limit: number): { text: string; truncated: boolean } {
|
|
24
|
-
const plain = html
|
|
25
|
-
.replace(/<!--[\s\S]*?-->/g, ' ')
|
|
26
|
-
.replace(/<(script|style|noscript|template|svg|iframe|head|title)\b[^>]*>[\s\S]*?<\/\1\s*>/gi, ' ')
|
|
27
|
-
.replace(BLOCK_TAGS, '\n')
|
|
28
|
-
.replace(/<[^>]+>/g, ' ')
|
|
29
|
-
const lines = decodeEntities(plain)
|
|
30
|
-
.split('\n')
|
|
31
|
-
.map((line) => line.replace(/\s+/g, ' ').trim())
|
|
32
|
-
const text = lines.reduce<string[]>((kept, line) => {
|
|
33
|
-
// One blank line between paragraphs at most.
|
|
34
|
-
if (!line && (!kept.length || !kept[kept.length - 1])) return kept
|
|
35
|
-
kept.push(line)
|
|
36
|
-
return kept
|
|
37
|
-
}, []).join('\n').trim()
|
|
38
|
-
return text.length > limit ? { text: text.slice(0, limit), truncated: true } : { text, truncated: false }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** Text of a plain-text or JSON body, with at most `limit` characters. */
|
|
42
|
-
export function plainText(body: string, limit: number): { text: string; truncated: boolean } {
|
|
43
|
-
const text = body.trim()
|
|
44
|
-
return text.length > limit ? { text: text.slice(0, limit), truncated: true } : { text, truncated: false }
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function isHtmlType(contentType: string): boolean {
|
|
48
|
-
return /^(?:text\/html|application\/xhtml\+xml)\b/i.test(contentType)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function isTextType(contentType: string): boolean {
|
|
52
|
-
return /^(?:text\/|application\/(?:json|xml|xhtml\+xml|ld\+json)\b)/i.test(contentType) || contentType === ''
|
|
53
|
-
}
|