@xingular/harness 2.0.0 → 2.0.1-unstable
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +635 -0
- package/LICENSE +202 -0
- package/NOTICE.md +50 -0
- package/README.md +241 -90
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/browser-extension/README.md +32 -0
- package/browser-extension/background.js +612 -0
- package/browser-extension/manifest.json +16 -0
- package/browser-extension/overlay.js +97 -0
- package/browser-extension/popup.css +19 -0
- package/browser-extension/popup.html +30 -0
- package/browser-extension/popup.js +101 -0
- package/browser-extension/site-access.js +63 -0
- package/builtin/skills/plugin-authoring/SKILL.md +53 -0
- package/dist/cli.js +32851 -17155
- package/dist/sdk/accounts/accounts.d.ts +195 -0
- package/dist/sdk/accounts/accounts.js +821 -0
- package/dist/sdk/accounts/choices.d.ts +41 -0
- package/dist/sdk/accounts/choices.js +89 -0
- package/dist/sdk/accounts/env.d.ts +78 -0
- package/dist/sdk/accounts/env.js +294 -0
- package/dist/sdk/accounts/secrets.d.ts +28 -0
- package/dist/sdk/accounts/secrets.js +147 -0
- package/dist/sdk/accounts/store.d.ts +139 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/agents/builtin.d.ts +2 -0
- package/dist/sdk/agents/builtin.js +50 -0
- package/dist/sdk/agents/narrow.d.ts +13 -0
- package/dist/sdk/agents/narrow.js +29 -0
- package/dist/sdk/agents/planResearch.d.ts +27 -0
- package/dist/sdk/agents/planResearch.js +82 -0
- package/dist/sdk/agents/profiles.d.ts +93 -0
- package/dist/sdk/agents/profiles.js +289 -0
- package/dist/sdk/annotations/bridge.d.ts +44 -0
- package/dist/sdk/annotations/bridge.js +268 -0
- package/dist/sdk/annotations/capture.d.ts +158 -0
- package/dist/sdk/annotations/capture.js +409 -0
- package/dist/sdk/annotations/delivery.d.ts +79 -0
- package/dist/sdk/annotations/delivery.js +163 -0
- package/dist/sdk/annotations/inspect.d.ts +10 -0
- package/dist/sdk/annotations/inspect.js +34 -0
- package/dist/sdk/annotations/isolated.d.ts +6 -0
- package/dist/sdk/annotations/isolated.js +51 -0
- package/dist/sdk/annotations/pageScript.d.ts +28 -0
- package/dist/sdk/annotations/pageScript.js +871 -0
- package/dist/sdk/annotations/part.d.ts +8 -0
- package/dist/sdk/annotations/part.js +126 -0
- package/dist/sdk/annotations/queue.d.ts +4 -0
- package/dist/sdk/annotations/queue.js +45 -0
- package/dist/sdk/annotations/serverMethods.d.ts +3 -0
- package/dist/sdk/annotations/serverMethods.js +66 -0
- package/dist/sdk/annotations/store.d.ts +159 -0
- package/dist/sdk/annotations/store.js +404 -0
- package/dist/sdk/browser/backend.d.ts +16 -0
- package/dist/sdk/browser/backend.js +17 -0
- package/dist/sdk/browser/config.d.ts +19 -0
- package/dist/sdk/browser/config.js +23 -0
- package/dist/sdk/browser/contracts.d.ts +19 -0
- package/dist/sdk/browser/contracts.js +116 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/extension/bridge.d.ts +55 -0
- package/dist/sdk/browser/extension/bridge.js +336 -0
- package/dist/sdk/browser/extension/session.d.ts +50 -0
- package/dist/sdk/browser/extension/session.js +321 -0
- package/dist/sdk/browser/index.d.ts +33 -0
- package/dist/sdk/browser/index.js +105 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/serverMethods.d.ts +3 -0
- package/dist/sdk/browser/serverMethods.js +10 -0
- package/dist/sdk/browser/session.d.ts +85 -0
- package/dist/sdk/browser/session.js +228 -0
- package/dist/sdk/browser/tools.d.ts +102 -0
- package/dist/sdk/browser/tools.js +257 -0
- package/dist/sdk/capabilities/api.d.ts +22 -0
- package/dist/sdk/capabilities/api.js +54 -0
- package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
- package/dist/sdk/capabilities/runSnapshot.js +53 -0
- package/dist/sdk/capabilities/types.d.ts +29 -0
- package/dist/sdk/capabilities/types.js +1 -0
- package/dist/sdk/cli.d.ts +2 -0
- package/dist/sdk/cli.js +172 -0
- package/dist/sdk/commands/extensionOwners.d.ts +4 -0
- package/dist/sdk/commands/extensionOwners.js +17 -0
- package/dist/sdk/commands/list.d.ts +3 -0
- package/dist/sdk/commands/list.js +90 -0
- package/dist/sdk/commands/promptLoader.d.ts +5 -0
- package/dist/sdk/commands/promptLoader.js +76 -0
- package/dist/sdk/commands/promptRoutes.d.ts +13 -0
- package/dist/sdk/commands/promptRoutes.js +46 -0
- package/dist/sdk/commands/registry.d.ts +299 -0
- package/dist/sdk/commands/registry.js +54 -0
- package/dist/sdk/commands/routes.d.ts +16 -0
- package/dist/sdk/commands/routes.js +33 -0
- package/dist/sdk/commands/runtimeRouter.d.ts +4 -0
- package/dist/sdk/commands/runtimeRouter.js +48 -0
- package/dist/sdk/computer/boundary.d.ts +40 -0
- package/dist/sdk/computer/boundary.js +79 -0
- package/dist/sdk/computer/contracts.d.ts +127 -0
- package/dist/sdk/computer/contracts.js +13 -0
- package/dist/sdk/computer/control.d.ts +34 -0
- package/dist/sdk/computer/control.js +112 -0
- package/dist/sdk/computer/screenshot.d.ts +32 -0
- package/dist/sdk/computer/screenshot.js +35 -0
- package/dist/sdk/computer/terminalCapture.d.ts +26 -0
- package/dist/sdk/computer/terminalCapture.js +64 -0
- package/dist/sdk/computer/volatileImages.d.ts +9 -0
- package/dist/sdk/computer/volatileImages.js +50 -0
- package/dist/sdk/context/attribution.d.ts +18 -0
- package/dist/sdk/context/attribution.js +295 -0
- package/dist/sdk/context/runDetails.d.ts +16 -0
- package/dist/sdk/context/runDetails.js +22 -0
- package/dist/sdk/context/types.d.ts +94 -0
- package/dist/sdk/context/types.js +10 -0
- package/dist/sdk/core/bus.d.ts +23 -0
- package/dist/sdk/core/bus.js +76 -0
- package/dist/sdk/core/caller.d.ts +22 -0
- package/dist/sdk/core/caller.js +16 -0
- package/dist/sdk/core/changes.d.ts +15 -0
- package/dist/sdk/core/changes.js +15 -0
- package/dist/sdk/core/commandBudget.d.ts +23 -0
- package/dist/sdk/core/commandBudget.js +62 -0
- package/dist/sdk/core/effort.d.ts +2 -0
- package/dist/sdk/core/effort.js +1 -0
- package/dist/sdk/core/env.d.ts +18 -0
- package/dist/sdk/core/env.js +8 -0
- package/dist/sdk/core/errors.d.ts +15 -0
- package/dist/sdk/core/errors.js +24 -0
- package/dist/sdk/core/frontmatter.d.ts +12 -0
- package/dist/sdk/core/frontmatter.js +50 -0
- package/dist/sdk/core/fs.d.ts +18 -0
- package/dist/sdk/core/fs.js +106 -0
- package/dist/sdk/core/index.d.ts +24 -0
- package/dist/sdk/core/index.js +203 -0
- package/dist/sdk/core/interactiveProfile.d.ts +46 -0
- package/dist/sdk/core/interactiveProfile.js +143 -0
- package/dist/sdk/core/links.d.ts +51 -0
- package/dist/sdk/core/links.js +155 -0
- package/dist/sdk/core/path.d.ts +7 -0
- package/dist/sdk/core/path.js +79 -0
- package/dist/sdk/core/projects.d.ts +18 -0
- package/dist/sdk/core/projects.js +67 -0
- package/dist/sdk/core/secrets.d.ts +2 -0
- package/dist/sdk/core/secrets.js +5 -0
- package/dist/sdk/core/shell.d.ts +20 -0
- package/dist/sdk/core/shell.js +73 -0
- package/dist/sdk/core/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -0
- package/dist/sdk/core/workspace.d.ts +13 -0
- package/dist/sdk/core/workspace.js +88 -0
- package/dist/sdk/core/workspaceBashTool.d.ts +20 -0
- package/dist/sdk/core/workspaceBashTool.js +50 -0
- package/dist/sdk/core/workspaceSandbox.d.ts +41 -0
- package/dist/sdk/core/workspaceSandbox.js +360 -0
- package/dist/sdk/core/workspaceWriteOperations.d.ts +57 -0
- package/dist/sdk/core/workspaceWriteOperations.js +245 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +270 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +94 -0
- package/dist/sdk/doctor/serverMethods.d.ts +3 -0
- package/dist/sdk/doctor/serverMethods.js +8 -0
- package/dist/sdk/doctor/service.d.ts +23 -0
- package/dist/sdk/doctor/service.js +144 -0
- package/dist/sdk/doctor/types.d.ts +141 -0
- package/dist/sdk/doctor/types.js +29 -0
- package/dist/sdk/harness.d.ts +172 -0
- package/dist/sdk/harness.js +387 -0
- package/dist/sdk/history/lessonPrompt.d.ts +2 -0
- package/dist/sdk/history/lessonPrompt.js +15 -0
- package/dist/sdk/history/lessons.d.ts +52 -0
- package/dist/sdk/history/lessons.js +173 -0
- package/dist/sdk/history/recall.d.ts +68 -0
- package/dist/sdk/history/recall.js +199 -0
- package/dist/sdk/history/serverMethods.d.ts +3 -0
- package/dist/sdk/history/serverMethods.js +8 -0
- package/dist/sdk/history/trajectory.d.ts +7 -0
- package/dist/sdk/history/trajectory.js +218 -0
- package/dist/sdk/hub/catalog.json +123 -0
- package/dist/sdk/hub/cli.d.ts +7 -0
- package/dist/sdk/hub/cli.js +81 -0
- package/dist/sdk/hub/hub.d.ts +74 -0
- package/dist/sdk/hub/hub.js +476 -0
- package/dist/sdk/hub/schema.d.ts +280 -0
- package/dist/sdk/hub/schema.js +78 -0
- package/dist/sdk/hub/serverMethods.d.ts +3 -0
- package/dist/sdk/hub/serverMethods.js +11 -0
- package/dist/sdk/index.d.ts +80 -0
- package/dist/sdk/index.js +60 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +676 -0
- package/dist/sdk/mcp/manager.d.ts +26 -0
- package/dist/sdk/mcp/manager.js +124 -0
- package/dist/sdk/mcp/oauth.d.ts +35 -0
- package/dist/sdk/mcp/oauth.js +171 -0
- package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
- package/dist/sdk/mcp/scopeMigration.js +198 -0
- package/dist/sdk/mcp/serverMethods.d.ts +3 -0
- package/dist/sdk/mcp/serverMethods.js +22 -0
- package/dist/sdk/mcp/service.d.ts +160 -0
- package/dist/sdk/mcp/service.js +510 -0
- package/dist/sdk/mcp/types.d.ts +131 -0
- package/dist/sdk/mcp/types.js +49 -0
- package/dist/sdk/pi/retryPolicy.d.ts +19 -0
- package/dist/sdk/pi/retryPolicy.js +11 -0
- package/dist/sdk/pi/runtime.d.ts +14 -0
- package/dist/sdk/pi/runtime.js +31 -0
- package/dist/sdk/plugins/api.d.ts +66 -0
- package/dist/sdk/plugins/api.js +155 -0
- package/dist/sdk/plugins/attachments.d.ts +46 -0
- package/dist/sdk/plugins/attachments.js +111 -0
- package/dist/sdk/plugins/builtin.d.ts +7 -0
- package/dist/sdk/plugins/builtin.js +182 -0
- package/dist/sdk/plugins/builtinRegistry.d.ts +62 -0
- package/dist/sdk/plugins/builtinRegistry.js +77 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +197 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +188 -0
- package/dist/sdk/plugins/commandPrefix.d.ts +8 -0
- package/dist/sdk/plugins/commandPrefix.js +21 -0
- package/dist/sdk/plugins/discover.d.ts +48 -0
- package/dist/sdk/plugins/discover.js +230 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +119 -0
- package/dist/sdk/plugins/hooks.d.ts +94 -0
- package/dist/sdk/plugins/hooks.js +162 -0
- package/dist/sdk/plugins/identity.d.ts +19 -0
- package/dist/sdk/plugins/identity.js +48 -0
- package/dist/sdk/plugins/install.d.ts +24 -0
- package/dist/sdk/plugins/install.js +160 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +111 -0
- package/dist/sdk/plugins/manifest.d.ts +21 -0
- package/dist/sdk/plugins/manifest.js +94 -0
- package/dist/sdk/plugins/plugins.d.ts +106 -0
- package/dist/sdk/plugins/plugins.js +165 -0
- package/dist/sdk/plugins/proposals.d.ts +17 -0
- package/dist/sdk/plugins/proposals.js +147 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -0
- package/dist/sdk/plugins/surfaces.d.ts +5 -0
- package/dist/sdk/plugins/surfaces.js +11 -0
- package/dist/sdk/plugins/trust.d.ts +44 -0
- package/dist/sdk/plugins/trust.js +120 -0
- package/dist/sdk/plugins/types.d.ts +174 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +245 -0
- package/dist/sdk/prompt/compile.js +535 -0
- package/dist/sdk/prompt/reporting.d.ts +2 -0
- package/dist/sdk/prompt/reporting.js +94 -0
- package/dist/sdk/prompt/standard.d.ts +32 -0
- package/dist/sdk/prompt/standard.js +76 -0
- package/dist/sdk/refine/cli.d.ts +4 -0
- package/dist/sdk/refine/cli.js +186 -0
- package/dist/sdk/refine/demo.d.ts +21 -0
- package/dist/sdk/refine/demo.js +114 -0
- package/dist/sdk/refine/evidence.d.ts +55 -0
- package/dist/sdk/refine/evidence.js +330 -0
- package/dist/sdk/refine/host.d.ts +59 -0
- package/dist/sdk/refine/host.js +105 -0
- package/dist/sdk/refine/ledger.d.ts +48 -0
- package/dist/sdk/refine/ledger.js +76 -0
- package/dist/sdk/refine/library.d.ts +55 -0
- package/dist/sdk/refine/library.js +177 -0
- package/dist/sdk/refine/pi.d.ts +72 -0
- package/dist/sdk/refine/pi.js +248 -0
- package/dist/sdk/refine/prompts.d.ts +60 -0
- package/dist/sdk/refine/prompts.js +434 -0
- package/dist/sdk/refine/recursion.d.ts +113 -0
- package/dist/sdk/refine/recursion.js +258 -0
- package/dist/sdk/refine/runner.d.ts +83 -0
- package/dist/sdk/refine/runner.js +151 -0
- package/dist/sdk/refine/selection.d.ts +57 -0
- package/dist/sdk/refine/selection.js +251 -0
- package/dist/sdk/refine/serverMethods.d.ts +3 -0
- package/dist/sdk/refine/serverMethods.js +23 -0
- package/dist/sdk/refine/service.d.ts +115 -0
- package/dist/sdk/refine/service.js +280 -0
- package/dist/sdk/refine/suite.d.ts +67 -0
- package/dist/sdk/refine/suite.js +174 -0
- package/dist/sdk/refine/trajectory.d.ts +9 -0
- package/dist/sdk/refine/trajectory.js +73 -0
- package/dist/sdk/refine/types.d.ts +93 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/remote/addresses.d.ts +19 -0
- package/dist/sdk/remote/addresses.js +52 -0
- package/dist/sdk/remote/pairing.d.ts +59 -0
- package/dist/sdk/remote/pairing.js +160 -0
- package/dist/sdk/remote/seal.d.ts +28 -0
- package/dist/sdk/remote/seal.js +84 -0
- package/dist/sdk/remote/server.d.ts +28 -0
- package/dist/sdk/remote/server.js +158 -0
- package/dist/sdk/remote/service.d.ts +125 -0
- package/dist/sdk/remote/service.js +330 -0
- package/dist/sdk/remote/webClient.d.ts +4 -0
- package/dist/sdk/remote/webClient.js +452 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +365 -0
- package/dist/sdk/server/params.d.ts +4 -0
- package/dist/sdk/server/params.js +11 -0
- package/dist/sdk/server/remote.d.ts +19 -0
- package/dist/sdk/server/remote.js +109 -0
- package/dist/sdk/server/rpc.d.ts +20 -0
- package/dist/sdk/server/rpc.js +102 -0
- package/dist/sdk/server/serve.d.ts +13 -0
- package/dist/sdk/server/serve.js +25 -0
- package/dist/sdk/server/socket.d.ts +28 -0
- package/dist/sdk/server/socket.js +122 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/checkpoint.d.ts +7 -0
- package/dist/sdk/sessions/checkpoint.js +41 -0
- package/dist/sdk/sessions/compactionCheckpoint.d.ts +18 -0
- package/dist/sdk/sessions/compactionCheckpoint.js +79 -0
- package/dist/sdk/sessions/completionCheck.d.ts +51 -0
- package/dist/sdk/sessions/completionCheck.js +161 -0
- package/dist/sdk/sessions/continuation.d.ts +53 -0
- package/dist/sdk/sessions/continuation.js +90 -0
- package/dist/sdk/sessions/contracts.d.ts +991 -0
- package/dist/sdk/sessions/contracts.js +545 -0
- package/dist/sdk/sessions/control.d.ts +72 -0
- package/dist/sdk/sessions/control.js +158 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/goal.d.ts +145 -0
- package/dist/sdk/sessions/goal.js +405 -0
- package/dist/sdk/sessions/goalLoop.d.ts +37 -0
- package/dist/sdk/sessions/goalLoop.js +125 -0
- package/dist/sdk/sessions/goalPrompts.d.ts +4 -0
- package/dist/sdk/sessions/goalPrompts.js +93 -0
- package/dist/sdk/sessions/goalStop.d.ts +27 -0
- package/dist/sdk/sessions/goalStop.js +41 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/initialBash.d.ts +7 -0
- package/dist/sdk/sessions/initialBash.js +7 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/live.d.ts +101 -0
- package/dist/sdk/sessions/live.js +265 -0
- package/dist/sdk/sessions/planMode.d.ts +116 -0
- package/dist/sdk/sessions/planMode.js +281 -0
- package/dist/sdk/sessions/policy.d.ts +43 -0
- package/dist/sdk/sessions/policy.js +1 -0
- package/dist/sdk/sessions/pricing.d.ts +34 -0
- package/dist/sdk/sessions/pricing.js +40 -0
- package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
- package/dist/sdk/sessions/reasoningSummaries.js +61 -0
- package/dist/sdk/sessions/registry.d.ts +124 -0
- package/dist/sdk/sessions/registry.js +392 -0
- package/dist/sdk/sessions/runIndex.d.ts +21 -0
- package/dist/sdk/sessions/runIndex.js +65 -0
- package/dist/sdk/sessions/runStore.d.ts +82 -0
- package/dist/sdk/sessions/runStore.js +393 -0
- package/dist/sdk/sessions/runner.d.ts +291 -0
- package/dist/sdk/sessions/runner.js +1040 -0
- package/dist/sdk/sessions/sessionState.d.ts +13 -0
- package/dist/sdk/sessions/sessionState.js +31 -0
- package/dist/sdk/sessions/sessions.d.ts +238 -0
- package/dist/sdk/sessions/sessions.js +923 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
- package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
- package/dist/sdk/sessions/sideQuestions.js +290 -0
- package/dist/sdk/sessions/stallWatch.d.ts +35 -0
- package/dist/sdk/sessions/stallWatch.js +42 -0
- package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
- package/dist/sdk/sessions/subagentServerMethods.js +41 -0
- package/dist/sdk/sessions/subagentService.d.ts +88 -0
- package/dist/sdk/sessions/subagentService.js +546 -0
- package/dist/sdk/sessions/subagents.d.ts +98 -0
- package/dist/sdk/sessions/subagents.js +136 -0
- package/dist/sdk/sessions/workSlice.d.ts +167 -0
- package/dist/sdk/sessions/workSlice.js +266 -0
- package/dist/sdk/sessions/workspaceBoundary.d.ts +15 -0
- package/dist/sdk/sessions/workspaceBoundary.js +46 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -0
- package/dist/sdk/terminal/browser.d.ts +62 -0
- package/dist/sdk/terminal/browser.js +41 -0
- package/dist/sdk/terminal/browserControl.d.ts +29 -0
- package/dist/sdk/terminal/browserControl.js +187 -0
- package/dist/sdk/terminal/cli.d.ts +20 -0
- package/dist/sdk/terminal/cli.js +121 -0
- package/dist/sdk/terminal/client.d.ts +20 -0
- package/dist/sdk/terminal/client.js +148 -0
- package/dist/sdk/terminal/commandHelp.d.ts +17 -0
- package/dist/sdk/terminal/commandHelp.js +20 -0
- package/dist/sdk/terminal/control.d.ts +4 -0
- package/dist/sdk/terminal/control.js +25 -0
- package/dist/sdk/terminal/controller.d.ts +136 -0
- package/dist/sdk/terminal/controller.js +579 -0
- package/dist/sdk/terminal/credentialStore.d.ts +4 -0
- package/dist/sdk/terminal/credentialStore.js +33 -0
- package/dist/sdk/terminal/daemon.d.ts +44 -0
- package/dist/sdk/terminal/daemon.js +264 -0
- package/dist/sdk/terminal/hubMenu.d.ts +10 -0
- package/dist/sdk/terminal/hubMenu.js +34 -0
- package/dist/sdk/terminal/launch.d.ts +5 -0
- package/dist/sdk/terminal/launch.js +27 -0
- package/dist/sdk/terminal/liveTerminal.d.ts +96 -0
- package/dist/sdk/terminal/liveTerminal.js +436 -0
- package/dist/sdk/terminal/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/opentui/ansi.d.ts +25 -0
- package/dist/sdk/terminal/opentui/ansi.js +192 -0
- package/dist/sdk/terminal/opentui/model.d.ts +163 -0
- package/dist/sdk/terminal/opentui/model.js +484 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
- package/dist/sdk/terminal/opentui/subagentsWidget.js +54 -0
- package/dist/sdk/terminal/opentui/theme.d.ts +47 -0
- package/dist/sdk/terminal/opentui/theme.js +93 -0
- package/dist/sdk/terminal/piExtension.d.ts +12 -0
- package/dist/sdk/terminal/piExtension.js +847 -0
- package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
- package/dist/sdk/terminal/pluginMenu.js +101 -0
- package/dist/sdk/terminal/socket.d.ts +73 -0
- package/dist/sdk/terminal/socket.js +287 -0
- package/dist/sdk/terminal/standalone.d.ts +52 -0
- package/dist/sdk/terminal/standalone.js +329 -0
- package/dist/sdk/terminal/subagentMonitor.d.ts +62 -0
- package/dist/sdk/terminal/subagentMonitor.js +176 -0
- package/dist/sdk/terminal/terminals.d.ts +312 -0
- package/dist/sdk/terminal/terminals.js +1782 -0
- package/dist/sdk/terminal/toolName.d.ts +6 -0
- package/dist/sdk/terminal/toolName.js +12 -0
- package/dist/sdk/terminal/trajectory.d.ts +15 -0
- package/dist/sdk/terminal/trajectory.js +38 -0
- package/dist/sdk/terminal/tui/annotateCommand.d.ts +7 -0
- package/dist/sdk/terminal/tui/annotateCommand.js +36 -0
- package/dist/sdk/terminal/tui/annotateSend.d.ts +30 -0
- package/dist/sdk/terminal/tui/annotateSend.js +40 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +68 -0
- package/dist/sdk/terminal/tui/chrome.js +182 -0
- package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
- package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
- package/dist/sdk/terminal/tui/commandPages.d.ts +16 -0
- package/dist/sdk/terminal/tui/commandPages.js +136 -0
- package/dist/sdk/terminal/tui/commands.d.ts +71 -0
- package/dist/sdk/terminal/tui/commands.js +496 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +81 -0
- package/dist/sdk/terminal/tui/dialogs.js +372 -0
- package/dist/sdk/terminal/tui/goalCommand.d.ts +19 -0
- package/dist/sdk/terminal/tui/goalCommand.js +83 -0
- package/dist/sdk/terminal/tui/harnessRuntime.d.ts +8 -0
- package/dist/sdk/terminal/tui/harnessRuntime.js +771 -0
- package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
- package/dist/sdk/terminal/tui/keybindings.js +49 -0
- package/dist/sdk/terminal/tui/list.d.ts +86 -0
- package/dist/sdk/terminal/tui/list.js +278 -0
- package/dist/sdk/terminal/tui/markdown.d.ts +16 -0
- package/dist/sdk/terminal/tui/markdown.js +55 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +61 -0
- package/dist/sdk/terminal/tui/modeChoices.js +95 -0
- package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
- package/dist/sdk/terminal/tui/modelPicker.js +150 -0
- package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
- package/dist/sdk/terminal/tui/mouse.js +3 -0
- package/dist/sdk/terminal/tui/mouseReport.d.ts +30 -0
- package/dist/sdk/terminal/tui/mouseReport.js +80 -0
- package/dist/sdk/terminal/tui/page.d.ts +17 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +30 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +183 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
- package/dist/sdk/terminal/tui/pages/agentsPage.js +193 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +148 -0
- package/dist/sdk/terminal/tui/pages/annotatePage.js +576 -0
- package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
- package/dist/sdk/terminal/tui/pages/browserPage.js +739 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
- package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
- package/dist/sdk/terminal/tui/pages/contextPage.d.ts +91 -0
- package/dist/sdk/terminal/tui/pages/contextPage.js +585 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
- package/dist/sdk/terminal/tui/pages/followUpQueuePage.d.ts +34 -0
- package/dist/sdk/terminal/tui/pages/followUpQueuePage.js +130 -0
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +52 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +292 -0
- package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
- package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
- package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +65 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +519 -0
- package/dist/sdk/terminal/tui/pages/remoteControlPage.d.ts +32 -0
- package/dist/sdk/terminal/tui/pages/remoteControlPage.js +170 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +24 -0
- package/dist/sdk/terminal/tui/pages/subagentsPage.js +155 -0
- package/dist/sdk/terminal/tui/pages/textPage.d.ts +17 -0
- package/dist/sdk/terminal/tui/pages/textPage.js +52 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +66 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +490 -0
- package/dist/sdk/terminal/tui/pages/usagePage.d.ts +45 -0
- package/dist/sdk/terminal/tui/pages/usagePage.js +397 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
- package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
- package/dist/sdk/terminal/tui/piAdapter.d.ts +17 -0
- package/dist/sdk/terminal/tui/piAdapter.js +46 -0
- package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
- package/dist/sdk/terminal/tui/planMode.js +2 -0
- package/dist/sdk/terminal/tui/pluginCommands.d.ts +16 -0
- package/dist/sdk/terminal/tui/pluginCommands.js +41 -0
- package/dist/sdk/terminal/tui/qr.d.ts +4 -0
- package/dist/sdk/terminal/tui/qr.js +35 -0
- package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
- package/dist/sdk/terminal/tui/questionPicker.js +150 -0
- package/dist/sdk/terminal/tui/questions.d.ts +21 -0
- package/dist/sdk/terminal/tui/questions.js +42 -0
- package/dist/sdk/terminal/tui/runtime.d.ts +117 -0
- package/dist/sdk/terminal/tui/runtime.js +544 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +61 -0
- package/dist/sdk/terminal/tui/selection.d.ts +16 -0
- package/dist/sdk/terminal/tui/selection.js +16 -0
- package/dist/sdk/terminal/tui/sessionPicker.d.ts +40 -0
- package/dist/sdk/terminal/tui/sessionPicker.js +141 -0
- package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
- package/dist/sdk/terminal/tui/sessionUi.js +30 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
- package/dist/sdk/terminal/tui/settingsModel.js +195 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +57 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +241 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +28 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +63 -0
- package/dist/sdk/terminal/tui/status.d.ts +18 -0
- package/dist/sdk/terminal/tui/status.js +67 -0
- package/dist/sdk/terminal/tui/theme.d.ts +54 -0
- package/dist/sdk/terminal/tui/theme.js +185 -0
- package/dist/sdk/terminal/tui/thinkingLevels.d.ts +11 -0
- package/dist/sdk/terminal/tui/thinkingLevels.js +31 -0
- package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
- package/dist/sdk/terminal/tui/treeModel.js +483 -0
- package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
- package/dist/sdk/terminal/tui/treePicker.js +251 -0
- package/dist/sdk/terminal/tui/ui.d.ts +49 -0
- package/dist/sdk/terminal/tui/ui.js +149 -0
- package/dist/sdk/terminal/tui/variantCommands.d.ts +32 -0
- package/dist/sdk/terminal/tui/variantCommands.js +359 -0
- package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/terminal/variantControl.d.ts +24 -0
- package/dist/sdk/terminal/variantControl.js +145 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +92 -0
- package/dist/sdk/tools/defaultSkills.d.ts +23 -0
- package/dist/sdk/tools/defaultSkills.js +46 -0
- package/dist/sdk/tools/definitions.d.ts +32 -0
- package/dist/sdk/tools/definitions.js +133 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +92 -0
- package/dist/sdk/tools/getCapabilities.d.ts +31 -0
- package/dist/sdk/tools/getCapabilities.js +34 -0
- package/dist/sdk/tools/harnessTools.d.ts +8 -0
- package/dist/sdk/tools/harnessTools.js +20 -0
- package/dist/sdk/tools/sessionName.d.ts +16 -0
- package/dist/sdk/tools/sessionName.js +78 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +63 -0
- package/dist/sdk/tools/todo.d.ts +15 -0
- package/dist/sdk/tools/todo.js +66 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -0
- package/dist/sdk/usage/analytics.d.ts +20 -0
- package/dist/sdk/usage/analytics.js +151 -0
- package/dist/sdk/usage/ledger.d.ts +38 -0
- package/dist/sdk/usage/ledger.js +142 -0
- package/dist/sdk/usage/limits/adapters.d.ts +11 -0
- package/dist/sdk/usage/limits/adapters.js +349 -0
- package/dist/sdk/usage/limits/capture.d.ts +8 -0
- package/dist/sdk/usage/limits/capture.js +47 -0
- package/dist/sdk/usage/limits/http.d.ts +12 -0
- package/dist/sdk/usage/limits/http.js +51 -0
- package/dist/sdk/usage/limits/normalize.d.ts +15 -0
- package/dist/sdk/usage/limits/normalize.js +211 -0
- package/dist/sdk/usage/limits/service.d.ts +30 -0
- package/dist/sdk/usage/limits/service.js +176 -0
- package/dist/sdk/usage/limits/types.d.ts +65 -0
- package/dist/sdk/usage/limits/types.js +1 -0
- package/dist/sdk/usage/serverMethods.d.ts +3 -0
- package/dist/sdk/usage/serverMethods.js +22 -0
- package/dist/sdk/usage/service.d.ts +32 -0
- package/dist/sdk/usage/service.js +66 -0
- package/dist/sdk/usage/settings.d.ts +7 -0
- package/dist/sdk/usage/settings.js +28 -0
- package/dist/sdk/usage/types.d.ts +60 -0
- package/dist/sdk/usage/types.js +4 -0
- package/dist/sdk/variant/components.d.ts +34 -0
- package/dist/sdk/variant/components.js +230 -0
- package/dist/sdk/variant/materialise.d.ts +66 -0
- package/dist/sdk/variant/materialise.js +81 -0
- package/dist/sdk/variant/migrate.d.ts +4 -0
- package/dist/sdk/variant/migrate.js +41 -0
- package/dist/sdk/variant/seed.d.ts +20 -0
- package/dist/sdk/variant/seed.js +116 -0
- package/dist/sdk/variant/store.d.ts +114 -0
- package/dist/sdk/variant/store.js +256 -0
- package/dist/sdk/variant/surface.d.ts +56 -0
- package/dist/sdk/variant/surface.js +81 -0
- package/dist/sdk/variant/trust.d.ts +27 -0
- package/dist/sdk/variant/trust.js +64 -0
- package/dist/sdk/variant/variant.d.ts +71 -0
- package/dist/sdk/variant/variant.js +331 -0
- package/dist/sdk/web/markdown.d.ts +10 -0
- package/dist/sdk/web/markdown.js +66 -0
- package/dist/sdk/web/part.d.ts +10 -0
- package/dist/sdk/web/part.js +6 -0
- package/dist/sdk/web/safeRequest.d.ts +34 -0
- package/dist/sdk/web/safeRequest.js +175 -0
- package/dist/sdk/web/search.d.ts +53 -0
- package/dist/sdk/web/search.js +168 -0
- package/dist/sdk/web/serverMethods.d.ts +3 -0
- package/dist/sdk/web/serverMethods.js +7 -0
- package/dist/sdk/web/text.d.ts +2 -0
- package/dist/sdk/web/text.js +7 -0
- package/dist/sdk/web/tools.d.ts +22 -0
- package/dist/sdk/web/tools.js +195 -0
- package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
- package/dist/sdk/wiki/notes.d.ts +68 -0
- package/dist/sdk/wiki/notes.js +297 -0
- package/dist/sdk/wiki/serverMethods.d.ts +3 -0
- package/dist/sdk/wiki/serverMethods.js +26 -0
- package/dist/sdk/worktrees/cli.d.ts +11 -0
- package/dist/sdk/worktrees/cli.js +146 -0
- package/dist/sdk/worktrees/copy.d.ts +9 -0
- package/dist/sdk/worktrees/copy.js +111 -0
- package/dist/sdk/worktrees/git.d.ts +18 -0
- package/dist/sdk/worktrees/git.js +89 -0
- package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
- package/dist/sdk/worktrees/serverMethods.js +30 -0
- package/dist/sdk/worktrees/service.d.ts +73 -0
- package/dist/sdk/worktrees/service.js +483 -0
- package/dist/sdk/worktrees/setup.d.ts +23 -0
- package/dist/sdk/worktrees/setup.js +65 -0
- package/dist/sdk/worktrees/snapshot.d.ts +16 -0
- package/dist/sdk/worktrees/snapshot.js +83 -0
- package/dist/sdk/worktrees/types.d.ts +91 -0
- package/dist/sdk/worktrees/types.js +1 -0
- package/dist/sdk/world/actions.d.ts +23 -0
- package/dist/sdk/world/actions.js +31 -0
- package/dist/sdk/world/cli.d.ts +12 -0
- package/dist/sdk/world/cli.js +166 -0
- package/dist/sdk/world/images.d.ts +20 -0
- package/dist/sdk/world/images.js +48 -0
- package/dist/sdk/world/untrusted.d.ts +12 -0
- package/dist/sdk/world/untrusted.js +20 -0
- package/dist/sdk/world/world.d.ts +75 -0
- package/dist/sdk/world/world.js +117 -0
- package/dist/terminal-opentui.js +30986 -0
- package/dist/terminal-pi.js +3008 -610
- package/docs/README.md +45 -1
- package/docs/architecture/00-overview.md +171 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +505 -0
- package/docs/architecture/03-variants.md +122 -0
- package/docs/architecture/04-prompt.md +277 -0
- package/docs/architecture/05-refinement.md +134 -0
- package/docs/architecture/06-plugins-and-capabilities.md +208 -0
- package/docs/architecture/07-tools-and-gate.md +245 -0
- package/docs/architecture/08-memory-and-history.md +100 -0
- package/docs/architecture/09-accounts-and-connectors.md +153 -0
- package/docs/architecture/10-server-protocol.md +403 -0
- package/docs/architecture/11-terminal.md +555 -0
- package/docs/architecture/12-storage.md +118 -0
- package/docs/architecture/13-world-tools.md +114 -0
- package/docs/architecture/14-surfaces-and-parity.md +151 -0
- package/docs/architecture/15-remote-control.md +120 -0
- package/docs/architecture/README.md +143 -0
- package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
- package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
- package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
- package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
- package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
- package/docs/architecture/proposals/PROP-0006-run-checklist.md +72 -0
- package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
- package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
- package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
- package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
- package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
- package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
- package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
- package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
- package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
- package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
- package/docs/architecture/proposals/PROP-0017-page-annotations.md +131 -0
- package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +183 -0
- package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
- package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
- package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
- package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
- package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
- package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
- package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
- package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +96 -0
- package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
- package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
- package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
- package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
- package/docs/architecture/proposals/PROP-0031-plugin-command-owner-namespaces.md +54 -0
- package/docs/architecture/proposals/PROP-0032-planning-quality.md +196 -0
- package/docs/architecture/proposals/PROP-0033-compaction-plan-checkpoints.md +75 -0
- package/docs/architecture/proposals/PROP-0034-conversation-fast-mode.md +120 -0
- package/docs/architecture/proposals/PROP-0035-retain-subagent-status.md +47 -0
- package/docs/architecture/proposals/PROP-0036-first-class-harness-commands.md +59 -0
- package/docs/architecture/proposals/PROP-0037-workspace-write-boundary.md +63 -0
- package/docs/architecture/proposals/PROP-0038-annotate-open-shadow-roots.md +73 -0
- package/docs/architecture/proposals/PROP-0039-workspace-boundary-hardening.md +139 -0
- package/docs/architecture/proposals/PROP-0040-one-launch-path.md +87 -0
- package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +260 -0
- package/docs/architecture/proposals/PROP-0042-usage-and-provider-limits.md +127 -0
- package/docs/architecture/proposals/PROP-0043-read-only-plan-bash.md +74 -0
- package/docs/architecture/proposals/PROP-0044-work-slice-defaults.md +93 -0
- package/docs/architecture/proposals/PROP-0045-rename-checklist-to-todo.md +132 -0
- package/docs/architecture/proposals/PROP-0046-progress-aware-stall-guards.md +82 -0
- package/docs/architecture/proposals/PROP-0047-plugins-hub-separation.md +122 -0
- package/docs/architecture/proposals/PROP-0048-simple-annotate.md +85 -0
- package/docs/architecture/proposals/PROP-0049-context-attribution.md +415 -0
- package/docs/architecture/proposals/PROP-0050-run-stop-codes-and-refusals.md +30 -0
- package/docs/architecture/proposals/PROP-0051-unfinished-run-handoff.md +110 -0
- package/docs/architecture/proposals/PROP-0052-terminal-refine-and-variant-switch.md +111 -0
- package/docs/architecture/proposals/README.md +123 -0
- package/docs/decisions/ADR-0001-owned-terminal.md +10 -3
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +3 -1
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +3 -2
- package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
- package/docs/decisions/ADR-0007-reporting-section.md +33 -0
- package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +41 -0
- package/docs/decisions/ADR-0009-xharness-command.md +39 -0
- package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
- package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
- package/docs/decisions/ADR-0012-native-session-names.md +34 -0
- package/docs/decisions/ADR-0013-doctor.md +27 -0
- package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
- package/docs/decisions/ADR-0015-resource-browser.md +28 -0
- package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
- package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
- package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
- package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
- package/docs/decisions/ADR-0020-page-annotations.md +37 -0
- package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
- package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
- package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
- package/docs/decisions/ADR-0024-xagent-command.md +40 -0
- package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
- package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
- package/docs/decisions/ADR-0027-connected-sketch-display.md +62 -0
- package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
- package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
- package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
- package/docs/decisions/ADR-0031-plugin-command-owner-namespaces.md +37 -0
- package/docs/decisions/ADR-0032-compaction-run-checkpoints.md +35 -0
- package/docs/decisions/ADR-0033-plan-mode-research-delegation.md +47 -0
- package/docs/decisions/ADR-0034-first-class-harness-terminal-commands.md +25 -0
- package/docs/decisions/ADR-0035-one-launch-path.md +40 -0
- package/docs/decisions/ADR-0036-workspace-write-operation-boundary.md +54 -0
- package/docs/decisions/ADR-0037-usage-ledger-and-provider-limits.md +44 -0
- package/docs/decisions/ADR-0038-plan-bash-os-read-only.md +29 -0
- package/docs/decisions/ADR-0039-progress-aware-stall-guards.md +43 -0
- package/docs/decisions/ADR-0040-architecture-change-workflow.md +31 -0
- package/docs/decisions/ADR-0041-plugins-hub-separation.md +41 -0
- package/docs/decisions/ADR-0042-windows-shell-without-sandbox.md +40 -0
- package/docs/decisions/ADR-0043-parents-continue-stopped-subagents.md +49 -0
- package/docs/decisions/ADR-0044-annotations-pending-or-sent.md +24 -0
- package/docs/decisions/ADR-0045-default-plugin-authoring-skill.md +9 -0
- package/docs/decisions/ADR-0046-hash-bound-plugin-proposals.md +20 -0
- package/docs/decisions/ADR-0047-links-open-with-the-os-handler.md +47 -0
- package/docs/decisions/ADR-0048-required-skills-from-a-message.md +42 -0
- package/docs/decisions/ADR-0050-approved-window-screenshots.md +19 -0
- package/docs/decisions/ADR-0051-terminal-decision-wait.md +10 -0
- package/docs/decisions/ADR-0052-per-profile-subagent-budgets.md +25 -0
- package/docs/decisions/ADR-0053-no-repeated-work-guard.md +45 -0
- package/docs/decisions/ADR-0054-terminal-reply-heartbeat-and-stall.md +52 -0
- package/docs/decisions/ADR-0055-plan-output-repair.md +51 -0
- package/docs/decisions/ADR-0056-remote-control.md +53 -0
- package/docs/decisions/ADR-0057-structured-plan-outcomes.md +39 -0
- package/docs/decisions/ADR-0058-ask-user-only-plan-clarification.md +36 -0
- package/docs/decisions/ADR-0059-run-diagnostic-evidence.md +35 -0
- package/docs/decisions/ADR-0060-approvals-are-controls.md +40 -0
- package/docs/decisions/ADR-0061-strict-plugin-command-namespaces.md +41 -0
- package/docs/decisions/ADR-0062-shared-account-state.md +67 -0
- package/docs/decisions/ADR-0063-unfinished-work-handoffs.md +34 -0
- package/docs/decisions/ADR-0064-account-model-fallback-on-resume.md +79 -0
- package/docs/decisions/ADR-0065-variant-switch-at-turn-boundaries.md +31 -0
- package/docs/decisions/ADR-0066-guided-refinement-from-turn-snapshots.md +37 -0
- package/docs/decisions/ADR-0067-cache-stable-compaction-checkpoint.md +54 -0
- package/docs/decisions/ADR-0068-scope-and-completion-report.md +60 -0
- package/docs/decisions/ADR-0069-stop-gate-and-finish.md +136 -0
- package/docs/decisions/ADR-0070-terminal-slice-continuation.md +49 -0
- package/docs/decisions/ADR-0071-completion-check.md +104 -0
- package/docs/decisions/ADR-0072-codex-prompts-and-goal.md +108 -0
- package/docs/decisions/ADR-0073-large-reporting-prompt.md +89 -0
- package/docs/decisions/ADR-0074-report-content-not-report-blocks.md +90 -0
- package/docs/decisions/ADR-0075-no-todo-gate.md +84 -0
- package/docs/decisions/ADR-0076-codex-final-answer-verbatim.md +98 -0
- package/docs/decisions/ADR-0077-plan-runs-may-conclude-no-plan-needed.md +120 -0
- package/docs/decisions/ADR-0078-child-aware-stall-watch.md +46 -0
- package/docs/decisions/ADR-0079-phase-led-reporting-guidance.md +72 -0
- package/docs/decisions/ADR-0080-fixed-width-question-sketch-canvas.md +50 -0
- package/docs/decisions/ADR-0081-no-work-slice-budget-by-default.md +36 -0
- package/docs/decisions/ADR-0082-connected-brave-browser.md +72 -0
- package/docs/decisions/ADR-0083-one-live-session-runtime.md +256 -0
- package/docs/doctor.md +95 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
- package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
- package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
- package/docs/experiments/EXP-0003-performance-audit/data/session-runtime-replication.json +420 -0
- package/docs/experiments/EXP-0003-performance-audit/data/session-runtime.json +420 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-compact.json +376 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-history.json +422 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-question.json +95 -0
- package/docs/experiments/EXP-0003-performance-audit/data/terminal-wide.json +1036 -0
- package/docs/experiments/EXP-0003-performance-audit/plan.md +109 -0
- package/docs/experiments/EXP-0003-performance-audit/results.md +151 -0
- package/docs/features/README.md +46 -0
- package/docs/features/automations/README.md +41 -0
- package/docs/features/cores/README.md +39 -0
- package/docs/features/google-harness2/README.md +52 -0
- package/docs/features/integrations/README.md +40 -0
- package/docs/features/interfaces/README.md +29 -0
- package/docs/features/memory/README.md +28 -0
- package/docs/future-work.md +48 -0
- package/docs/handoff-2026-10-25-app-parity-and-solo-tabs.md +202 -0
- package/docs/parity.md +158 -0
- package/docs/releases/1.0.0.md +40 -0
- package/docs/releases/1.1.1.md +28 -0
- package/docs/releases/1.2.0.md +49 -0
- package/docs/releases/1.3.0.md +21 -0
- package/docs/releases/1.3.1-unstable.1.md +8 -0
- package/docs/releases/1.3.1-unstable.2.md +11 -0
- package/docs/releases/1.3.1-unstable.3.md +54 -0
- package/docs/releases/1.3.1-unstable.4.md +56 -0
- package/docs/releases/1.3.1-unstable.5.md +53 -0
- package/docs/releases/1.3.1-unstable.6.md +31 -0
- package/docs/releases/1.3.1-unstable.7.md +17 -0
- package/docs/releases/1.3.1-unstable.8.md +19 -0
- package/docs/releases/1.3.1-unstable.9.md +54 -0
- package/docs/releases/1.4.0-unstable.md +25 -0
- package/docs/releases/1.5.0-unstable.md +32 -0
- package/docs/releases/1.5.1-unstable.md +24 -0
- package/docs/releases/1.6.0-unstable.md +59 -0
- package/docs/releases/2.0.1-unstable.md +63 -0
- package/docs/releases/4.0.0.md +47 -0
- package/docs/releases/README.md +49 -0
- package/docs/study/00-index.md +112 -0
- package/docs/study/STUDY-0003-long-horizon-runs.md +210 -0
- package/docs/study/STUDY-0004-turn-end-controls.md +130 -0
- package/docs/study/STUDY-0005-skill-installation-guidance.md +146 -0
- package/docs/study/STUDY-0006-reporting-prompts.md +119 -0
- package/docs/study/STUDY-0007-claude-code-prompt.md +162 -0
- package/docs/study/STUDY-0008-browser-control.md +281 -0
- package/docs/study/STUDY-0009-claude-code-reporting.md +205 -0
- package/docs/study/arms/00-matrix.md +20 -0
- package/docs/study/arms/01-system-prompt.md +211 -0
- package/docs/study/arms/02-tools.md +79 -0
- package/docs/study/arms/03-subagents.md +90 -0
- package/docs/study/arms/04-skills.md +81 -0
- package/docs/study/arms/05-context-management.md +90 -0
- package/docs/study/arms/06-memory.md +90 -0
- package/docs/study/arms/07-governance.md +71 -0
- package/docs/study/arms/08-execution.md +69 -0
- package/docs/study/arms/09-observability.md +60 -0
- package/docs/study/arms/10-refinement.md +110 -0
- package/docs/study/autonomous-engineering-sources.md +277 -0
- package/docs/study/autonomy-sources.md +147 -0
- package/docs/study/btw-comparison.md +37 -0
- package/docs/study/feature-gap-review.md +42 -0
- package/docs/study/insights.md +123 -0
- package/docs/study/proactive-autonomy.md +408 -0
- package/docs/study/roadmap.md +72 -0
- package/docs/study/sources/claude-code.md +56 -0
- package/docs/study/sources/deepseek-harness.md +102 -0
- package/docs/study/sources/harness2.md +50 -0
- package/docs/study/sources/kimi-cli.md +42 -0
- package/docs/study/sources/omp.md +93 -0
- package/docs/study/sources/opencode.md +43 -0
- package/docs/study/sources/openhands.md +46 -0
- package/docs/study/sources/smolagents.md +40 -0
- package/docs/study/sources/swe-agent.md +34 -0
- package/docs/study/tui-resource-browser.md +78 -0
- package/docs/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +887 -109
- package/package.json +46 -13
- package/src/accounts/accounts.test.ts +0 -419
- package/src/accounts/accounts.ts +0 -760
- package/src/accounts/env.test.ts +0 -95
- package/src/accounts/env.ts +0 -338
- package/src/accounts/secrets.ts +0 -50
- package/src/accounts/store.ts +0 -338
- package/src/capabilities/api.ts +0 -75
- package/src/capabilities/runSnapshot.ts +0 -59
- package/src/capabilities/types.ts +0 -34
- package/src/cli.ts +0 -118
- package/src/core/bus.test.ts +0 -22
- package/src/core/bus.ts +0 -49
- package/src/core/changes.ts +0 -33
- package/src/core/env.ts +0 -27
- package/src/core/errors.ts +0 -32
- package/src/core/frontmatter.ts +0 -47
- package/src/core/fs.test.ts +0 -38
- package/src/core/fs.ts +0 -92
- package/src/core/index.ts +0 -193
- package/src/core/path.test.ts +0 -14
- package/src/core/path.ts +0 -79
- package/src/core/projects.ts +0 -90
- package/src/core/text.ts +0 -39
- package/src/harness.ts +0 -322
- package/src/hub/catalog.json +0 -123
- package/src/hub/cli.ts +0 -59
- package/src/hub/hub.test.ts +0 -205
- package/src/hub/hub.ts +0 -256
- package/src/hub/schema.ts +0 -81
- package/src/index.ts +0 -80
- package/src/mcp/connections.ts +0 -641
- package/src/mcp/manager.ts +0 -130
- package/src/mcp/oauth.ts +0 -195
- package/src/mcp/scopeMigration.test.ts +0 -79
- package/src/mcp/scopeMigration.ts +0 -204
- package/src/mcp/service.test.ts +0 -422
- package/src/mcp/service.ts +0 -560
- package/src/mcp/types.ts +0 -118
- package/src/memory/api.test.ts +0 -82
- package/src/memory/api.ts +0 -303
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -408
- package/src/memory/caller.ts +0 -69
- package/src/memory/curation.test.ts +0 -206
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -64
- package/src/memory/facts.test.ts +0 -41
- package/src/memory/facts.ts +0 -248
- package/src/memory/graph.ts +0 -103
- package/src/memory/health.test.ts +0 -130
- package/src/memory/health.ts +0 -74
- package/src/memory/maintainer.ts +0 -272
- package/src/memory/maintenance.test.ts +0 -192
- package/src/memory/maintenance.ts +0 -679
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -150
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -584
- package/src/memory/recall.test.ts +0 -115
- package/src/memory/recall.ts +0 -279
- package/src/memory/references.ts +0 -77
- package/src/memory/runContext.ts +0 -93
- package/src/memory/secrets.ts +0 -6
- package/src/memory/store.test.ts +0 -66
- package/src/memory/store.ts +0 -385
- package/src/memory/trajectory.test.ts +0 -178
- package/src/memory/trajectory.ts +0 -220
- package/src/memory/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -423
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -117
- package/src/plugins/api.ts +0 -181
- package/src/plugins/attachments.test.ts +0 -84
- package/src/plugins/attachments.ts +0 -141
- package/src/plugins/builtin.ts +0 -84
- package/src/plugins/catalogue.test.ts +0 -254
- package/src/plugins/catalogue.ts +0 -251
- package/src/plugins/cli.ts +0 -184
- package/src/plugins/discover.ts +0 -151
- package/src/plugins/firstParty.test.ts +0 -143
- package/src/plugins/firstParty.ts +0 -129
- package/src/plugins/hooks.test.ts +0 -250
- package/src/plugins/hooks.ts +0 -239
- package/src/plugins/identity.ts +0 -37
- package/src/plugins/install.test.ts +0 -107
- package/src/plugins/install.ts +0 -106
- package/src/plugins/inventory.ts +0 -123
- package/src/plugins/manifest.ts +0 -76
- package/src/plugins/plugins.test.ts +0 -205
- package/src/plugins/plugins.ts +0 -189
- package/src/plugins/proposal.ts +0 -121
- package/src/plugins/runtime.test.ts +0 -40
- package/src/plugins/runtime.ts +0 -82
- package/src/plugins/trust.ts +0 -142
- package/src/plugins/types.ts +0 -149
- package/src/prompt/compile.test.ts +0 -261
- package/src/prompt/compile.ts +0 -732
- package/src/server/methods.ts +0 -355
- package/src/server/remote.ts +0 -77
- package/src/server/rpc.ts +0 -116
- package/src/server/serve.ts +0 -28
- package/src/server/server.test.ts +0 -193
- package/src/sessions/approvals.test.ts +0 -49
- package/src/sessions/approvals.ts +0 -140
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -233
- package/src/sessions/extensionSession.test.ts +0 -74
- package/src/sessions/extensionUi.test.ts +0 -65
- package/src/sessions/extensionUi.ts +0 -102
- package/src/sessions/history.ts +0 -51
- package/src/sessions/lineageJoin.ts +0 -75
- package/src/sessions/policy.ts +0 -36
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/questionBatches.test.ts +0 -110
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -412
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -346
- package/src/sessions/runner.ts +0 -610
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -588
- package/src/sessions/sessions.ts +0 -331
- package/src/sessions/subagentService.test.ts +0 -159
- package/src/sessions/subagentService.ts +0 -236
- package/src/sessions/subagents.ts +0 -97
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -413
- package/src/terminal/accountsMenu.test.ts +0 -225
- package/src/terminal/accountsMenu.ts +0 -382
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/control.test.ts +0 -23
- package/src/terminal/control.ts +0 -23
- package/src/terminal/controller.ts +0 -354
- package/src/terminal/hubMenu.ts +0 -24
- package/src/terminal/launch.test.ts +0 -25
- package/src/terminal/launch.ts +0 -48
- package/src/terminal/piExtension.lifecycle.test.ts +0 -55
- package/src/terminal/piExtension.ts +0 -295
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -94
- package/src/terminal/socket.ts +0 -256
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -165
- package/src/terminal/terminal.test.ts +0 -534
- package/src/terminal/terminals.ts +0 -661
- package/src/terminal/trajectory.test.ts +0 -66
- package/src/terminal/trajectory.ts +0 -44
- package/src/terminal/tui/application.test.ts +0 -290
- package/src/terminal/tui/application.ts +0 -653
- package/src/terminal/tui/commands.test.ts +0 -278
- package/src/terminal/tui/commands.ts +0 -443
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -113
- package/src/terminal/tui/editor.ts +0 -109
- package/src/terminal/tui/keybindings.test.ts +0 -30
- package/src/terminal/tui/keybindings.ts +0 -59
- package/src/terminal/tui/piAdapter.ts +0 -62
- package/src/terminal/tui/planMode.test.ts +0 -10
- package/src/terminal/tui/planMode.ts +0 -12
- package/src/terminal/tui/presentation.test.ts +0 -79
- package/src/terminal/tui/questions.test.ts +0 -41
- package/src/terminal/tui/questions.ts +0 -47
- package/src/terminal/tui/runtime.socket.test.ts +0 -178
- package/src/terminal/tui/runtime.test.ts +0 -225
- package/src/terminal/tui/runtime.ts +0 -403
- package/src/terminal/tui/screen.test.ts +0 -143
- package/src/terminal/tui/screen.ts +0 -121
- package/src/terminal/tui/sessionUi.ts +0 -24
- package/src/terminal/tui/settings.test.ts +0 -150
- package/src/terminal/tui/settings.ts +0 -188
- package/src/terminal/tui/skillInvocation.test.ts +0 -71
- package/src/terminal/tui/skillInvocation.ts +0 -51
- package/src/terminal/tui/status.test.ts +0 -48
- package/src/terminal/tui/status.ts +0 -82
- package/src/terminal/tui/theme.ts +0 -185
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/trajectoryPanel.test.ts +0 -99
- package/src/terminal/tui/trajectoryPanel.ts +0 -226
- package/src/terminal/tui/transcript.test.ts +0 -39
- package/src/terminal/tui/transcript.ts +0 -135
- package/src/terminal/tui/ui.test.ts +0 -313
- package/src/terminal/tui/ui.ts +0 -166
- package/src/terminal/tui/welcome.ts +0 -102
- package/src/terminal/tui/workingStatus.test.ts +0 -44
- package/src/terminal/tui/workingStatus.ts +0 -238
- package/src/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -228
- package/src/tools/maintenance.ts +0 -29
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- package/src/tools/registryWrite.test.ts +0 -101
- package/src/tools/registryWrite.ts +0 -182
- package/src/tools/spawnSubagent.ts +0 -47
- package/src/tools/types.ts +0 -41
- package/src/web/safeRequest.ts +0 -171
- package/src/web/text.ts +0 -53
- package/src/web/tools.ts +0 -134
- package/src/web/web.test.ts +0 -141
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { Bus } from "../core/bus.js";
|
|
2
|
+
import { type Change } from "../core/changes.js";
|
|
3
|
+
export declare const HOOK_EVENTS: readonly ["wiki.page.saved", "history.run.ended"];
|
|
4
|
+
export type HookEventType = (typeof HOOK_EVENTS)[number];
|
|
5
|
+
/** A Wiki note, as it is after the change. */
|
|
6
|
+
export interface EntryEvent {
|
|
7
|
+
type: 'wiki.page.saved';
|
|
8
|
+
id: string;
|
|
9
|
+
path: string;
|
|
10
|
+
title: string;
|
|
11
|
+
/** The entry without its front matter. */
|
|
12
|
+
body: string;
|
|
13
|
+
/** The whole file. */
|
|
14
|
+
text: string;
|
|
15
|
+
/** Who made the change: `user`, an agent's name, or the background upkeep. */
|
|
16
|
+
actor: string;
|
|
17
|
+
reason: string;
|
|
18
|
+
at: string;
|
|
19
|
+
}
|
|
20
|
+
export interface RunEndedEvent {
|
|
21
|
+
type: 'history.run.ended';
|
|
22
|
+
runId: string;
|
|
23
|
+
sessionId: string;
|
|
24
|
+
status: string;
|
|
25
|
+
goal: string | null;
|
|
26
|
+
agentId: string | null;
|
|
27
|
+
projectId: string | null;
|
|
28
|
+
startedAt: string;
|
|
29
|
+
endedAt: string | null;
|
|
30
|
+
at: string;
|
|
31
|
+
}
|
|
32
|
+
export type HookEvent = EntryEvent | RunEndedEvent;
|
|
33
|
+
export interface HookContext {
|
|
34
|
+
/** Calls a tool of a connected app that is on for everyone, if a person marked that tool to run without asking. */
|
|
35
|
+
call(connection: string, tool: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
36
|
+
log(message: string): void;
|
|
37
|
+
}
|
|
38
|
+
type Handler = (event: HookEvent, context: HookContext) => unknown;
|
|
39
|
+
/** What a hooks file is given: `export default function (harness) { harness.on('wiki.page.saved', …) }`. */
|
|
40
|
+
export interface HookApi {
|
|
41
|
+
on(event: HookEventType, handler: Handler): void;
|
|
42
|
+
}
|
|
43
|
+
export interface HookTarget {
|
|
44
|
+
/** The hooks file. */
|
|
45
|
+
path: string;
|
|
46
|
+
/** A hash of the package's code, so a changed file is loaded again. */
|
|
47
|
+
hash: string;
|
|
48
|
+
}
|
|
49
|
+
export interface HookStatus {
|
|
50
|
+
/** The events it listens for. */
|
|
51
|
+
events: string[];
|
|
52
|
+
lastRunAt: string | null;
|
|
53
|
+
/** Why it could not be loaded, or what its last failing run threw. */
|
|
54
|
+
lastError: string | null;
|
|
55
|
+
}
|
|
56
|
+
export interface HooksOptions {
|
|
57
|
+
stateDir: string;
|
|
58
|
+
bus: Bus;
|
|
59
|
+
/** The hooks files that should run now: attached for everyone, and trusted. */
|
|
60
|
+
wanted: () => Promise<HookTarget[]>;
|
|
61
|
+
call: HookContext['call'];
|
|
62
|
+
/** How long one handler may take. */
|
|
63
|
+
timeoutMs?: number;
|
|
64
|
+
/** Reads a hooks file as a module. Replaced in tests, where the runner owns `import()`. */
|
|
65
|
+
importFile?: (address: string) => Promise<unknown>;
|
|
66
|
+
}
|
|
67
|
+
/** Which event a written file is, from where it is in the Wiki. */
|
|
68
|
+
export declare function entryEvent(change: Change): EntryEvent;
|
|
69
|
+
export declare class Hooks {
|
|
70
|
+
private readonly options;
|
|
71
|
+
private loaded;
|
|
72
|
+
private readonly queue;
|
|
73
|
+
private working;
|
|
74
|
+
private reloading;
|
|
75
|
+
private readonly statusPath;
|
|
76
|
+
private wiki;
|
|
77
|
+
private readonly stop;
|
|
78
|
+
constructor(options: HooksOptions);
|
|
79
|
+
/** The Wiki whose changes these hooks hear about. */
|
|
80
|
+
watch(wiki: string | null): void;
|
|
81
|
+
/** What each hooks file listens for, and how its last run went. */
|
|
82
|
+
status(): Record<string, HookStatus>;
|
|
83
|
+
private record;
|
|
84
|
+
/** Loads the hooks files that should run and drops the ones that should not. Safe to call often. */
|
|
85
|
+
reload(): Promise<void>;
|
|
86
|
+
/** Takes an event down. It is delivered afterwards, in the order events arrived. */
|
|
87
|
+
emit(event: HookEvent): void;
|
|
88
|
+
private drain;
|
|
89
|
+
private run;
|
|
90
|
+
/** Resolves when every event taken down so far was delivered. */
|
|
91
|
+
settled(): Promise<void>;
|
|
92
|
+
close(): void;
|
|
93
|
+
}
|
|
94
|
+
export {};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Hooks: code a plugin gives the harness to run after something changed. A Pi extension lives
|
|
2
|
+
// only while a session is open, and most memory is written outside one (a person accepts an
|
|
3
|
+
// Inbox item, edits a fact, the background upkeep runs), so these are the harness's own events,
|
|
4
|
+
// delivered in its own process.
|
|
5
|
+
//
|
|
6
|
+
// A hook is told after the fact. It cannot stop or change a write, it runs with a time limit,
|
|
7
|
+
// and what it throws is recorded and shown on its plugin. It reaches outside only through
|
|
8
|
+
// `ctx.call`, which the harness limits to connected-app tools a person marked to run without asking.
|
|
9
|
+
import { chmodSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { pathToFileURL } from 'node:url';
|
|
12
|
+
import { log } from "../core/bus.js";
|
|
13
|
+
import { onChange } from "../core/changes.js";
|
|
14
|
+
import * as frontmatter from "../core/frontmatter.js";
|
|
15
|
+
import { now, readJsonOr, writeJson } from "../core/fs.js";
|
|
16
|
+
export const HOOK_EVENTS = ['wiki.page.saved', 'history.run.ended'];
|
|
17
|
+
// Node's own `import()`, out of reach of a bundler or a test runner that would rewrite it: a hooks
|
|
18
|
+
// file is a person's file on disk, loaded as it is, and its address must reach Node unchanged.
|
|
19
|
+
const importFile = new Function('address', 'return import(address)');
|
|
20
|
+
/** Which event a written file is, from where it is in the Wiki. */
|
|
21
|
+
export function entryEvent(change) {
|
|
22
|
+
const type = 'wiki.page.saved';
|
|
23
|
+
const parsed = frontmatter.parse(change.text);
|
|
24
|
+
const front = (parsed?.front ?? {});
|
|
25
|
+
const title = typeof front.title === 'string' ? front.title : typeof front.label === 'string' ? front.label : change.id;
|
|
26
|
+
return { type, id: change.id, path: change.path, title, body: (parsed?.body ?? change.text).trim(), text: change.text, actor: change.actor, reason: change.reason, at: now() };
|
|
27
|
+
}
|
|
28
|
+
export class Hooks {
|
|
29
|
+
options;
|
|
30
|
+
loaded = [];
|
|
31
|
+
queue = [];
|
|
32
|
+
working = Promise.resolve();
|
|
33
|
+
reloading = Promise.resolve();
|
|
34
|
+
statusPath;
|
|
35
|
+
wiki = null;
|
|
36
|
+
stop;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.options = options;
|
|
39
|
+
this.statusPath = join(options.stateDir, 'plugin-hooks.json');
|
|
40
|
+
this.stop = onChange((change) => {
|
|
41
|
+
// Several harnesses can share a process; each hears only about its own Wiki.
|
|
42
|
+
if (change.wiki === this.wiki)
|
|
43
|
+
this.emit(entryEvent(change));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/** The Wiki whose changes these hooks hear about. */
|
|
47
|
+
watch(wiki) {
|
|
48
|
+
this.wiki = wiki;
|
|
49
|
+
}
|
|
50
|
+
/** What each hooks file listens for, and how its last run went. */
|
|
51
|
+
status() {
|
|
52
|
+
return readJsonOr(this.statusPath, {});
|
|
53
|
+
}
|
|
54
|
+
record(path, change) {
|
|
55
|
+
const all = this.status();
|
|
56
|
+
const before = all[path] ?? { events: [], lastRunAt: null, lastError: null };
|
|
57
|
+
const next = { ...before, ...change };
|
|
58
|
+
if (JSON.stringify(before) === JSON.stringify(next) && all[path])
|
|
59
|
+
return;
|
|
60
|
+
all[path] = next;
|
|
61
|
+
writeJson(this.statusPath, all);
|
|
62
|
+
chmodSync(this.statusPath, 0o600);
|
|
63
|
+
// A new failure, or a failure that cleared, is something a person looking at the plugin should see.
|
|
64
|
+
if (before.lastError !== next.lastError || before.events.join() !== next.events.join())
|
|
65
|
+
this.options.bus.emit({ type: 'plugins.changed' });
|
|
66
|
+
}
|
|
67
|
+
/** Loads the hooks files that should run and drops the ones that should not. Safe to call often. */
|
|
68
|
+
reload() {
|
|
69
|
+
this.reloading = this.reloading.then(async () => {
|
|
70
|
+
let wanted;
|
|
71
|
+
try {
|
|
72
|
+
wanted = await this.options.wanted();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
log('plugin hooks', error instanceof Error ? error.message : String(error));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const next = [];
|
|
79
|
+
for (const target of wanted) {
|
|
80
|
+
const kept = this.loaded.find((hook) => hook.path === target.path && hook.hash === target.hash);
|
|
81
|
+
if (kept) {
|
|
82
|
+
next.push(kept);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const handlers = new Map();
|
|
86
|
+
try {
|
|
87
|
+
// The hash is part of the address, so a changed file is read again and not served from the module cache.
|
|
88
|
+
const module = (await (this.options.importFile ?? importFile)(`${pathToFileURL(target.path).href}?v=${target.hash}`));
|
|
89
|
+
if (typeof module.default !== 'function')
|
|
90
|
+
throw new Error('It must export a default function.');
|
|
91
|
+
const api = {
|
|
92
|
+
on: (event, handler) => {
|
|
93
|
+
if (!HOOK_EVENTS.includes(event))
|
|
94
|
+
throw new Error(`There is no event called "${String(event)}". The events are ${HOOK_EVENTS.join(', ')}.`);
|
|
95
|
+
if (typeof handler !== 'function')
|
|
96
|
+
throw new Error('A handler must be a function.');
|
|
97
|
+
handlers.set(event, [...(handlers.get(event) ?? []), handler]);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
await module.default(api);
|
|
101
|
+
next.push({ ...target, handlers });
|
|
102
|
+
this.record(target.path, { events: [...handlers.keys()], lastError: null });
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.record(target.path, { events: [], lastError: `It could not be loaded: ${error instanceof Error ? error.message : String(error)}` });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
this.loaded = next;
|
|
109
|
+
});
|
|
110
|
+
return this.reloading;
|
|
111
|
+
}
|
|
112
|
+
/** Takes an event down. It is delivered afterwards, in the order events arrived. */
|
|
113
|
+
emit(event) {
|
|
114
|
+
this.queue.push(event);
|
|
115
|
+
this.working = this.working.then(() => this.drain());
|
|
116
|
+
}
|
|
117
|
+
async drain() {
|
|
118
|
+
// A file can change on disk without anyone telling the harness. What is loaded is checked
|
|
119
|
+
// against what should run before it is told anything, so code that changed since it was
|
|
120
|
+
// trusted stops here. With nothing loaded there is nothing to check: a new hook arrives
|
|
121
|
+
// with a `plugins.changed` notice.
|
|
122
|
+
if (this.loaded.length)
|
|
123
|
+
await this.reload();
|
|
124
|
+
else
|
|
125
|
+
await this.reloading;
|
|
126
|
+
for (let event = this.queue.shift(); event; event = this.queue.shift()) {
|
|
127
|
+
for (const hook of this.loaded) {
|
|
128
|
+
for (const handler of hook.handlers.get(event.type) ?? [])
|
|
129
|
+
await this.run(hook, handler, event);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async run(hook, handler, event) {
|
|
134
|
+
const context = { call: this.options.call, log: (message) => log(`plugin hook ${hook.path}`, String(message)) };
|
|
135
|
+
let timer;
|
|
136
|
+
try {
|
|
137
|
+
await Promise.race([
|
|
138
|
+
Promise.resolve().then(() => handler(event, context)),
|
|
139
|
+
new Promise((_, reject) => {
|
|
140
|
+
timer = setTimeout(() => reject(new Error(`It took longer than ${Math.round((this.options.timeoutMs ?? 30_000) / 1000)} seconds and was left behind.`)), this.options.timeoutMs ?? 30_000);
|
|
141
|
+
})
|
|
142
|
+
]);
|
|
143
|
+
this.record(hook.path, { lastRunAt: now(), lastError: null });
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.record(hook.path, { lastRunAt: now(), lastError: `${event.type}: ${error instanceof Error ? error.message : String(error)}`.slice(0, 1000) });
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
if (timer)
|
|
150
|
+
clearTimeout(timer);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Resolves when every event taken down so far was delivered. */
|
|
154
|
+
async settled() {
|
|
155
|
+
await this.reloading;
|
|
156
|
+
await this.working;
|
|
157
|
+
}
|
|
158
|
+
close() {
|
|
159
|
+
this.stop();
|
|
160
|
+
this.loaded = [];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Found } from "./discover.js";
|
|
2
|
+
import type { ContributionKind } from "./types.js";
|
|
3
|
+
export { packageManifest } from "./manifest.js";
|
|
4
|
+
export declare const FOUND_KINDS: Record<Found['kind'], ContributionKind>;
|
|
5
|
+
/** The id of the plugin a found item is listed under. */
|
|
6
|
+
export declare function pluginIdOf(item: Found): string;
|
|
7
|
+
/** A found item's name and description as a person reads them. */
|
|
8
|
+
export declare function describeFound(item: Found): {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string | null;
|
|
11
|
+
};
|
|
12
|
+
export declare const contributionId: (pluginId: string, kind: ContributionKind, name: string) => string;
|
|
13
|
+
/** The ids a choice about a found item is stored under: the item itself, then its plugin. */
|
|
14
|
+
export declare function foundIds(item: Found): [string, string];
|
|
15
|
+
/** A Markdown file's `name` and `description` frontmatter; a `SKILL.md` is named after its folder. */
|
|
16
|
+
export declare function describeFile(path: string): {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
} | null;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Which plugin a found file belongs to, and what it is called there. The list a person sees and
|
|
2
|
+
// the choice of what loads both use this, so a switch on the page names exactly what stops loading.
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { basename, dirname } from 'node:path';
|
|
5
|
+
import * as frontmatter from "../core/frontmatter.js";
|
|
6
|
+
import { BUILTIN_PREFIX } from "./discover.js";
|
|
7
|
+
import { packageManifest } from "./manifest.js";
|
|
8
|
+
export { packageManifest } from "./manifest.js";
|
|
9
|
+
export const FOUND_KINDS = { extension: 'code', hook: 'code', skill: 'skill', prompt: 'command', agent: 'agent', theme: 'theme', context: 'instruction' };
|
|
10
|
+
/** The id of the plugin a found item is listed under. */
|
|
11
|
+
export function pluginIdOf(item) {
|
|
12
|
+
if (item.origin === 'builtin')
|
|
13
|
+
return 'pi';
|
|
14
|
+
if (item.packageRoot)
|
|
15
|
+
return `package:${packageManifest(item.packageRoot).name}`;
|
|
16
|
+
return item.origin === 'home' ? 'home' : item.origin === 'project' ? 'project' : 'shared';
|
|
17
|
+
}
|
|
18
|
+
/** A found item's name and description as a person reads them. */
|
|
19
|
+
export function describeFound(item) {
|
|
20
|
+
if (item.path.startsWith(BUILTIN_PREFIX))
|
|
21
|
+
return { name: item.path.slice(BUILTIN_PREFIX.length), description: null };
|
|
22
|
+
const file = basename(item.path);
|
|
23
|
+
if (item.kind === 'extension')
|
|
24
|
+
return { name: file.startsWith('index.') ? basename(dirname(item.path)) : file, description: null };
|
|
25
|
+
if (item.kind === 'context' || item.kind === 'theme' || item.kind === 'hook')
|
|
26
|
+
return { name: file, description: null };
|
|
27
|
+
const described = describeFile(item.path);
|
|
28
|
+
return { name: described?.name ?? file, description: described?.description ?? '' };
|
|
29
|
+
}
|
|
30
|
+
export const contributionId = (pluginId, kind, name) => `${pluginId}/${kind}/${name}`;
|
|
31
|
+
/** The ids a choice about a found item is stored under: the item itself, then its plugin. */
|
|
32
|
+
export function foundIds(item) {
|
|
33
|
+
const pluginId = pluginIdOf(item);
|
|
34
|
+
return [contributionId(pluginId, FOUND_KINDS[item.kind], describeFound(item).name), pluginId];
|
|
35
|
+
}
|
|
36
|
+
/** A Markdown file's `name` and `description` frontmatter; a `SKILL.md` is named after its folder. */
|
|
37
|
+
export function describeFile(path) {
|
|
38
|
+
let text;
|
|
39
|
+
try {
|
|
40
|
+
text = readFileSync(path, 'utf8');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const front = frontmatter.parse(text)?.front ?? {};
|
|
46
|
+
const fallback = basename(path) === 'SKILL.md' ? basename(dirname(path)) : basename(path).replace(/\.md$/, '');
|
|
47
|
+
return { name: typeof front.name === 'string' && front.name.trim() ? front.name.trim() : fallback, description: typeof front.description === 'string' ? front.description.trim() : '' };
|
|
48
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Harness } from "../harness.js";
|
|
2
|
+
import { type PluginScope } from "./api.js";
|
|
3
|
+
import type { Plugin } from "./types.js";
|
|
4
|
+
/** A folder on this machine, or a package as Pi's settings name it. A bare name is an npm package. */
|
|
5
|
+
export declare function normalizeSource(input: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Installs a package for every account. It arrives switched off, and if it brings code, not
|
|
8
|
+
* trusted: nothing of it reaches a session until a person switches it on and trusts it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function install(harness: Harness, params: PluginScope & {
|
|
11
|
+
source: string;
|
|
12
|
+
}): Promise<Plugin[]>;
|
|
13
|
+
/** Removes an installed package without consulting Hub. Hub calls this while it owns the receipt transaction. */
|
|
14
|
+
export declare function removeDirect(harness: Harness, params: PluginScope & {
|
|
15
|
+
pluginId: string;
|
|
16
|
+
}): Promise<Plugin[]>;
|
|
17
|
+
/** Removes an installed package, delegating Hub-owned packages to their receipt owner. */
|
|
18
|
+
export declare function remove(harness: Harness, params: PluginScope & {
|
|
19
|
+
pluginId: string;
|
|
20
|
+
}): Promise<Plugin[]>;
|
|
21
|
+
/** Fetches newer versions of local packages. Hub-owned packages remain pinned to catalog versions. */
|
|
22
|
+
export declare function update(harness: Harness, params: PluginScope & {
|
|
23
|
+
pluginId?: string | null;
|
|
24
|
+
}): Promise<Plugin[]>;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// Installing, updating and removing a package. Pi's own package manager does the work, against
|
|
2
|
+
// the settings every account shares, so the `pi` command and the harness agree on what is
|
|
3
|
+
// installed. Fetching runs none of a package's code, and what was installed is switched off and
|
|
4
|
+
// untrusted until a person has looked at it.
|
|
5
|
+
import { existsSync, mkdirSync, renameSync, statSync } from 'node:fs';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { basename, isAbsolute, join, resolve } from 'node:path';
|
|
8
|
+
import { ensureSharedDir } from "../accounts/env.js";
|
|
9
|
+
import { invalid, notFound } from "../core/errors.js";
|
|
10
|
+
import { now } from "../core/fs.js";
|
|
11
|
+
import { loadPi } from "../pi/runtime.js";
|
|
12
|
+
import { ensureAdopted, list } from "./api.js";
|
|
13
|
+
import * as attachments from "./attachments.js";
|
|
14
|
+
import { withoutInstallScripts } from "./discover.js";
|
|
15
|
+
/**
|
|
16
|
+
* A code-hosting page for a folder or file inside a repository. Pi installs a repository, so a
|
|
17
|
+
* pasted `tree` or `blob` address must not reach the package manager as one.
|
|
18
|
+
*/
|
|
19
|
+
function repositoryPage(source) {
|
|
20
|
+
let url;
|
|
21
|
+
try {
|
|
22
|
+
url = new URL(source);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:')
|
|
28
|
+
return null;
|
|
29
|
+
const host = url.hostname.replace(/^www\./, '');
|
|
30
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
31
|
+
const repository = () => `${url.protocol}//${host}/${parts[0]}/${parts[1]}`;
|
|
32
|
+
if (host === 'github.com' && parts.length >= 4 && (parts[2] === 'tree' || parts[2] === 'blob'))
|
|
33
|
+
return repository();
|
|
34
|
+
if (host === 'gitlab.com' && parts.length >= 5 && parts[2] === '-' && (parts[3] === 'tree' || parts[3] === 'blob'))
|
|
35
|
+
return repository();
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/** A folder on this machine, or a package as Pi's settings name it. A bare name is an npm package. */
|
|
39
|
+
export function normalizeSource(input) {
|
|
40
|
+
const source = input.trim();
|
|
41
|
+
if (!source)
|
|
42
|
+
throw invalid('Name a package: a folder, an npm name, or a git address.');
|
|
43
|
+
const page = repositoryPage(source);
|
|
44
|
+
if (page)
|
|
45
|
+
throw invalid(`That address is a page inside a repository, not a package. Install ${page} as a package, or copy its skill folder into <project>/.agents/skills/ for one project or ~/.agents/skills/ for every project.`);
|
|
46
|
+
if (source.startsWith('~/'))
|
|
47
|
+
return join(process.env.HOME || homedir(), source.slice(2));
|
|
48
|
+
if (isAbsolute(source))
|
|
49
|
+
return resolve(source);
|
|
50
|
+
if (source.startsWith('./') || source.startsWith('../'))
|
|
51
|
+
throw invalid('Give the whole path of the folder.');
|
|
52
|
+
return /^(npm:|git:|https?:\/\/|ssh:\/\/|git@)/.test(source) ? source : `npm:${source}`;
|
|
53
|
+
}
|
|
54
|
+
async function manager(harness) {
|
|
55
|
+
const pi = await loadPi();
|
|
56
|
+
// The shared folder is where `settings.json` really is; an account's own is a link to it.
|
|
57
|
+
const agentDir = ensureSharedDir(harness.accounts.dir);
|
|
58
|
+
const settings = pi.SettingsManager.create(harness.stateDir, agentDir);
|
|
59
|
+
return { settings, packages: new pi.DefaultPackageManager({ cwd: harness.stateDir, agentDir, settingsManager: settings }) };
|
|
60
|
+
}
|
|
61
|
+
const changed = (harness) => harness.bus.emit({ type: 'plugins.changed' });
|
|
62
|
+
/**
|
|
63
|
+
* Installs a package for every account. It arrives switched off, and if it brings code, not
|
|
64
|
+
* trusted: nothing of it reaches a session until a person switches it on and trusts it.
|
|
65
|
+
*/
|
|
66
|
+
export async function install(harness, params) {
|
|
67
|
+
const source = normalizeSource(params.source);
|
|
68
|
+
if (isAbsolute(source) && !(existsSync(source) && statSync(source).isDirectory()))
|
|
69
|
+
throw invalid('That folder does not exist.');
|
|
70
|
+
// What was already there is taken over as trusted before anything new arrives, never after.
|
|
71
|
+
await ensureAdopted(harness);
|
|
72
|
+
const before = new Set((await list(harness, params)).map((plugin) => plugin.id));
|
|
73
|
+
const { settings, packages } = await manager(harness);
|
|
74
|
+
if (isAbsolute(source)) {
|
|
75
|
+
// Pi would save a folder as a path relative to the settings file, and each account reads
|
|
76
|
+
// that file through a link in its own folder, where a relative path points somewhere else.
|
|
77
|
+
const named = settings.getGlobalSettings().packages ?? [];
|
|
78
|
+
if (!named.some((entry) => (typeof entry === 'string' ? entry : entry.source) === source))
|
|
79
|
+
settings.setPackages([...named, source]);
|
|
80
|
+
await settings.flush();
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
await withoutInstallScripts(() => packages.installAndPersist(source));
|
|
84
|
+
}
|
|
85
|
+
const after = await list(harness, params);
|
|
86
|
+
const added = after.filter((plugin) => plugin.install && !before.has(plugin.id));
|
|
87
|
+
if (added.length) {
|
|
88
|
+
const choices = attachments.load(harness.env.root);
|
|
89
|
+
for (const plugin of added)
|
|
90
|
+
attachments.set(choices, [plugin.id], {}, false, true);
|
|
91
|
+
attachments.save(harness.env.root, choices);
|
|
92
|
+
}
|
|
93
|
+
changed(harness);
|
|
94
|
+
return added.length ? list(harness, params) : after;
|
|
95
|
+
}
|
|
96
|
+
function installed(plugins, pluginId) {
|
|
97
|
+
const plugin = plugins.find((candidate) => candidate.id === pluginId);
|
|
98
|
+
if (!plugin)
|
|
99
|
+
throw notFound('Plugin');
|
|
100
|
+
if (!plugin.install)
|
|
101
|
+
throw invalid(`${plugin.title} was not installed as a package, so it cannot be removed or updated here.`);
|
|
102
|
+
return plugin;
|
|
103
|
+
}
|
|
104
|
+
/** Removes an installed package without consulting Hub. Hub calls this while it owns the receipt transaction. */
|
|
105
|
+
export async function removeDirect(harness, params) {
|
|
106
|
+
const plugin = installed(await list(harness, params), params.pluginId);
|
|
107
|
+
if (plugin.install.kind === 'folder') {
|
|
108
|
+
const trash = join(harness.env.root, 'trash', 'plugins');
|
|
109
|
+
mkdirSync(trash, { recursive: true });
|
|
110
|
+
renameSync(plugin.install.source, join(trash, `${basename(plugin.install.source)}-${now().replace(/[:.]/g, '-')}`));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
await (await manager(harness)).packages.removeAndPersist(plugin.install.source);
|
|
114
|
+
}
|
|
115
|
+
const choices = attachments.load(harness.env.root);
|
|
116
|
+
for (const scope of [choices.global, ...Object.values(choices.agents), ...Object.values(choices.projects)]) {
|
|
117
|
+
scope.on = scope.on.filter((id) => id !== plugin.id && !id.startsWith(`${plugin.id}/`));
|
|
118
|
+
scope.off = scope.off.filter((id) => id !== plugin.id && !id.startsWith(`${plugin.id}/`));
|
|
119
|
+
}
|
|
120
|
+
delete choices.settings[plugin.id];
|
|
121
|
+
attachments.save(harness.env.root, choices);
|
|
122
|
+
if (plugin.code)
|
|
123
|
+
harness.plugins.trust.revoke(plugin.code.hash);
|
|
124
|
+
changed(harness);
|
|
125
|
+
return list(harness, params);
|
|
126
|
+
}
|
|
127
|
+
async function hubReceiptForPackage(harness, pluginId) {
|
|
128
|
+
const receipts = (await harness.hub.list()).installed.filter((receipt) => receipt.entry.delivery.kind === 'pi-package' && receipt.resourceIds.includes(pluginId));
|
|
129
|
+
if (receipts.length > 1)
|
|
130
|
+
throw invalid('More than one Hub receipt owns this package. Review the Hub receipts before changing it.');
|
|
131
|
+
return receipts[0];
|
|
132
|
+
}
|
|
133
|
+
/** Removes an installed package, delegating Hub-owned packages to their receipt owner. */
|
|
134
|
+
export async function remove(harness, params) {
|
|
135
|
+
const receipt = await hubReceiptForPackage(harness, params.pluginId);
|
|
136
|
+
if (receipt) {
|
|
137
|
+
await harness.hub.uninstall(receipt.entry.id, receipt.entry.version);
|
|
138
|
+
return list(harness, params);
|
|
139
|
+
}
|
|
140
|
+
return removeDirect(harness, params);
|
|
141
|
+
}
|
|
142
|
+
/** Fetches newer versions of local packages. Hub-owned packages remain pinned to catalog versions. */
|
|
143
|
+
export async function update(harness, params) {
|
|
144
|
+
const plugins = await list(harness, params);
|
|
145
|
+
const plugin = params.pluginId ? installed(plugins, params.pluginId) : null;
|
|
146
|
+
if (plugin?.install.kind === 'folder')
|
|
147
|
+
throw invalid(`${plugin.title} is a folder on this machine. Change its files to update it.`);
|
|
148
|
+
const receipts = (await harness.hub.list()).installed.filter((receipt) => receipt.entry.delivery.kind === 'pi-package');
|
|
149
|
+
const hubOwned = new Set(receipts.flatMap((receipt) => receipt.resourceIds));
|
|
150
|
+
if (plugin && hubOwned.has(plugin.id))
|
|
151
|
+
throw invalid(`${plugin.title} is managed by Hub. Uninstall its receipt before installing another exact catalog version.`);
|
|
152
|
+
const sources = plugin
|
|
153
|
+
? [plugin.install.source]
|
|
154
|
+
: [...new Set(plugins.filter((candidate) => candidate.install && candidate.install.kind !== 'folder' && !hubOwned.has(candidate.id)).map((candidate) => candidate.install.source))];
|
|
155
|
+
const { packages } = await manager(harness);
|
|
156
|
+
for (const source of sources)
|
|
157
|
+
await withoutInstallScripts(() => packages.update(source));
|
|
158
|
+
changed(harness);
|
|
159
|
+
return list(harness, params);
|
|
160
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HarnessEnv } from "../core/env.js";
|
|
2
|
+
import type { Connection } from "../mcp/types.js";
|
|
3
|
+
import type { CallerContext } from "../core/caller.js";
|
|
4
|
+
import { type Launch } from "../prompt/compile.js";
|
|
5
|
+
import type { Materialised } from "../variant/materialise.js";
|
|
6
|
+
import type { Inventory, Plugin, PluginDescriptor } from "./types.js";
|
|
7
|
+
export interface InventoryInput {
|
|
8
|
+
env: HarnessEnv;
|
|
9
|
+
context: CallerContext;
|
|
10
|
+
/** What the application adds to the prompt for this caller, as it would for a session. */
|
|
11
|
+
launch: Launch;
|
|
12
|
+
/** The tools the caller has switched on, as a session's `allow` list. */
|
|
13
|
+
tools: readonly string[];
|
|
14
|
+
/** Whether the caller gets the connected-apps tools. */
|
|
15
|
+
connections: boolean;
|
|
16
|
+
plugins: readonly Plugin[];
|
|
17
|
+
descriptors: readonly PluginDescriptor[];
|
|
18
|
+
saved: readonly Connection[];
|
|
19
|
+
/** The variant the caller runs, when it has one. */
|
|
20
|
+
variant?: Materialised | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function inventory(input: InventoryInput): Inventory;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// What reaches one caller: every prompt section, tool, skill, connection and extension, each
|
|
2
|
+
// attributed to the plugin it comes from. Anything no plugin accounts for is reported, so a new
|
|
3
|
+
// source of model-visible text cannot appear without showing up here.
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { charCount } from "../core/text.js";
|
|
6
|
+
import { allowed } from "../mcp/connections.js";
|
|
7
|
+
import { BUILT_IN_DYNAMIC, compile, toolGroups } from "../prompt/compile.js";
|
|
8
|
+
import { ASK_USER } from "../tools/askUser.js";
|
|
9
|
+
import { TODO_WRITE } from "../tools/todo.js";
|
|
10
|
+
import { DEFAULT_TOOL_NAMES } from "../tools/definitions.js";
|
|
11
|
+
import { VARIANT_PLUGIN } from "./builtin.js";
|
|
12
|
+
const size = (path) => {
|
|
13
|
+
if (!path)
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
return charCount(readFileSync(path, 'utf8'));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
export function inventory(input) {
|
|
23
|
+
const { env, context, launch, descriptors } = input;
|
|
24
|
+
const items = [];
|
|
25
|
+
const unattributed = [];
|
|
26
|
+
const item = (pluginId, kind, name, delivery, chars, rest = {}) => {
|
|
27
|
+
items.push({ pluginId, contributionId: null, kind, name, delivery, chars, cut: false, ...rest });
|
|
28
|
+
};
|
|
29
|
+
const pack = compile(env, context, launch, input.variant ?? null);
|
|
30
|
+
const dynamic = new Set([...BUILT_IN_DYNAMIC.map((entry) => entry.id), ...(launch.sections ?? []).filter((section) => section.dynamic).map((section) => section.id)]);
|
|
31
|
+
let systemChars = 0;
|
|
32
|
+
let contextChars = 0;
|
|
33
|
+
for (const section of pack.sections) {
|
|
34
|
+
const delivery = dynamic.has(section.id) ? 'context' : 'system';
|
|
35
|
+
if (delivery === 'context')
|
|
36
|
+
contextChars += section.size;
|
|
37
|
+
else
|
|
38
|
+
systemChars += section.size;
|
|
39
|
+
if (section.id === 'tools') {
|
|
40
|
+
// One paragraph per tool group; each belongs to the plugin that provides the group.
|
|
41
|
+
for (const group of toolGroups(context, launch)) {
|
|
42
|
+
if (!group.guidance)
|
|
43
|
+
continue;
|
|
44
|
+
const plugin = descriptors.find((descriptor) => descriptor.toolGroups?.includes(group.group));
|
|
45
|
+
if (!plugin)
|
|
46
|
+
unattributed.push({ kind: 'toolGroup', id: group.group });
|
|
47
|
+
item(plugin?.id ?? '', 'instruction', `Tool guidance: ${group.group}`, delivery, charCount(group.guidance), { cut: section.cut });
|
|
48
|
+
}
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const plugin = descriptors.find((descriptor) => descriptor.sections?.some((declared) => declared.id === section.id));
|
|
52
|
+
if (!plugin)
|
|
53
|
+
unattributed.push({ kind: 'section', id: section.id });
|
|
54
|
+
const name = plugin?.sections?.find((declared) => declared.id === section.id)?.name ?? section.title;
|
|
55
|
+
item(plugin?.id ?? '', 'instruction', name, delivery, section.size, { contributionId: plugin ? `${plugin.id}/instruction/${name}` : null, cut: section.cut });
|
|
56
|
+
}
|
|
57
|
+
// The variant's skills are loaded only when used; its plugins run in the tool loop.
|
|
58
|
+
const variant = input.variant ?? null;
|
|
59
|
+
if (variant) {
|
|
60
|
+
for (const rel of Object.keys(variant.files).filter((path) => /^skills\/[^/]+\/SKILL\.md$/.test(path)).sort()) {
|
|
61
|
+
const name = rel.split('/')[1];
|
|
62
|
+
item(VARIANT_PLUGIN.id, 'skill', name, 'on-demand', charCount(variant.files[rel]), { contributionId: `${VARIANT_PLUGIN.id}/skill/${name}` });
|
|
63
|
+
}
|
|
64
|
+
for (const path of variant.extensionPaths) {
|
|
65
|
+
const name = path.split('/').pop();
|
|
66
|
+
item(VARIANT_PLUGIN.id, 'code', name, 'code', size(path), { contributionId: `${VARIANT_PLUGIN.id}/code/${name}` });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const names = [...input.tools];
|
|
70
|
+
const extensionToolNames = new Set(input.plugins.filter((plugin) => ['project', 'package', 'shared', 'home'].includes(plugin.source)).flatMap((plugin) => plugin.contributions.filter((entry) => entry.kind === 'tool' && entry.state === 'on').map((entry) => entry.name)));
|
|
71
|
+
for (const name of [ASK_USER, TODO_WRITE, ...DEFAULT_TOOL_NAMES, ...(input.connections ? ['mcp_list_tools', 'mcp_call_tool'] : [])])
|
|
72
|
+
if (!names.includes(name))
|
|
73
|
+
names.push(name);
|
|
74
|
+
for (const name of names) {
|
|
75
|
+
if (extensionToolNames.has(name))
|
|
76
|
+
continue;
|
|
77
|
+
const plugin = descriptors.find((descriptor) => descriptor.tools?.some((tool) => tool.name === name));
|
|
78
|
+
if (!plugin)
|
|
79
|
+
unattributed.push({ kind: 'tool', id: name });
|
|
80
|
+
item(plugin?.id ?? '', 'tool', name, 'tool', null, { contributionId: plugin ? `${plugin.id}/tool/${name}` : null });
|
|
81
|
+
}
|
|
82
|
+
if (input.connections) {
|
|
83
|
+
for (const connection of input.saved.filter((candidate) => allowed(candidate, { agentId: context.agentId ?? null, projectId: context.projectId ?? null }))) {
|
|
84
|
+
item('connected-apps', 'connection', connection.name || connection.id, 'tool', null, { contributionId: `connected-apps/connection/${connection.id}` });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// What the harness found on disk and lets load. The pi command's own extensions load in no
|
|
88
|
+
// Xingular session, so a terminal and a host have the same (PROP-0039).
|
|
89
|
+
const delivered = { code: 'code', skill: 'on-demand', command: 'on-demand', agent: 'on-demand', instruction: 'system', theme: 'code', tool: 'tool', connection: 'tool' };
|
|
90
|
+
const terminal = context.surface === 'cli';
|
|
91
|
+
for (const plugin of input.plugins) {
|
|
92
|
+
if (!['project', 'package', 'shared', 'home'].includes(plugin.source))
|
|
93
|
+
continue;
|
|
94
|
+
for (const found of plugin.contributions) {
|
|
95
|
+
if (found.state !== 'on' || (found.kind === 'theme' && !terminal))
|
|
96
|
+
continue;
|
|
97
|
+
item(plugin.id, found.kind, found.name, found.background ? 'background' : delivered[found.kind], ['instruction', 'skill', 'command'].includes(found.kind) ? size(found.path) : null, { contributionId: found.id });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// The harness's own switched-on extensions.
|
|
101
|
+
for (const plugin of input.plugins) {
|
|
102
|
+
if (plugin.source !== 'builtin')
|
|
103
|
+
continue;
|
|
104
|
+
for (const own of plugin.contributions)
|
|
105
|
+
if (own.kind === 'code' && own.state === 'on')
|
|
106
|
+
item(plugin.id, 'code', own.name, 'code', null, { contributionId: own.id });
|
|
107
|
+
}
|
|
108
|
+
item('pi', 'instruction', 'Base prompt', 'system', null);
|
|
109
|
+
const used = new Set(items.map((entry) => entry.pluginId));
|
|
110
|
+
return { plugins: input.plugins.filter((plugin) => used.has(plugin.id)), others: input.plugins.filter((plugin) => !used.has(plugin.id)), items, unattributed, systemChars, contextChars };
|
|
111
|
+
}
|