@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,21 @@
|
|
|
1
|
+
import type { ConnectorTemplate } from "./types.js";
|
|
2
|
+
export interface PackageManifest {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
version: string | null;
|
|
6
|
+
/** The parts it adds to, by id: `memory`, `wiki`, `history`. */
|
|
7
|
+
extends: string[];
|
|
8
|
+
/** Stable terminal command namespace, or `null` to use the normalized package name. */
|
|
9
|
+
commandPrefix: string | null;
|
|
10
|
+
/** A prompt template name exposed only at the package namespace root. */
|
|
11
|
+
defaultPrompt: string | null;
|
|
12
|
+
/** The hooks file, inside the package, or `null` when it has none. */
|
|
13
|
+
hooks: string | null;
|
|
14
|
+
/** The folder of subagent profiles, inside the package. `agents` unless the manifest names another. */
|
|
15
|
+
agents: string;
|
|
16
|
+
/** Skill folders a foreign manifest declares, relative to the package root. */
|
|
17
|
+
skills: string[];
|
|
18
|
+
/** Data-only remote connector forms. Invalid templates are ignored; none can carry credentials. */
|
|
19
|
+
connectorTemplates: ConnectorTemplate[];
|
|
20
|
+
}
|
|
21
|
+
export declare function packageManifest(packageRoot: string): PackageManifest;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// What a package says about itself in its `package.json`: Pi's own fields, and under `harness`
|
|
2
|
+
// which part of the harness it extends, its command namespace, the file of hooks it runs and the
|
|
3
|
+
// folder of subagent profiles it brings. A package written for other agent harnesses may have no
|
|
4
|
+
// `package.json`; its `plugin.json` then names and describes it.
|
|
5
|
+
import { basename, join } from 'node:path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { readJsonOr, safeRelative } from "../core/fs.js";
|
|
8
|
+
const connectorTemplateSchema = z.object({
|
|
9
|
+
id: z.string().regex(/^[a-z0-9-]+$/),
|
|
10
|
+
name: z.string().min(1).max(120),
|
|
11
|
+
description: z.string().max(500),
|
|
12
|
+
url: z.string().url().startsWith('https://'),
|
|
13
|
+
auth: z.enum(['none', 'headers', 'oauth']),
|
|
14
|
+
oauthClient: z.enum(['dynamic', 'user']).nullable(),
|
|
15
|
+
oauthScopes: z.array(z.string().max(500)).max(30),
|
|
16
|
+
docsUrl: z.string().url().startsWith('https://').nullable(),
|
|
17
|
+
fields: z.array(z.object({
|
|
18
|
+
header: z.string().regex(/^[A-Za-z0-9_-]+$/),
|
|
19
|
+
label: z.string().min(1).max(120),
|
|
20
|
+
prefix: z.string().max(100),
|
|
21
|
+
help: z.string().max(500)
|
|
22
|
+
}).strict()).max(12),
|
|
23
|
+
setup: z.array(z.string().max(1000)).max(20),
|
|
24
|
+
notice: z.string().max(1000).nullable()
|
|
25
|
+
}).strict().superRefine((template, context) => {
|
|
26
|
+
const oauth = template.auth === 'oauth';
|
|
27
|
+
const headers = template.auth === 'headers';
|
|
28
|
+
if (oauth !== (template.oauthClient !== null))
|
|
29
|
+
context.addIssue({ code: 'custom', message: 'OAuth templates must state a client type and other templates must not.', path: ['oauthClient'] });
|
|
30
|
+
if (headers !== (template.fields.length > 0))
|
|
31
|
+
context.addIssue({ code: 'custom', message: 'Header templates must declare input fields and other templates must not.', path: ['fields'] });
|
|
32
|
+
});
|
|
33
|
+
/** A path inside the package, or `null` for one that is missing, absolute, or climbs out of it. */
|
|
34
|
+
function inside(path) {
|
|
35
|
+
if (typeof path !== 'string' || !path.trim())
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
return safeRelative(path.replace(/^\.\//, '').replace(/\/+$/, ''));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** The plugin manifests other agent harnesses read, in the order they are tried. */
|
|
45
|
+
const PLUGIN_MANIFESTS = ['plugin.json', '.claude-plugin/plugin.json', '.codex-plugin/plugin.json'];
|
|
46
|
+
const text = (value) => (typeof value === 'string' && value.trim() ? value.trim() : null);
|
|
47
|
+
function pluginJson(packageRoot) {
|
|
48
|
+
for (const file of PLUGIN_MANIFESTS) {
|
|
49
|
+
const found = readJsonOr(join(packageRoot, file), null);
|
|
50
|
+
if (found && typeof found === 'object' && !Array.isArray(found))
|
|
51
|
+
return found;
|
|
52
|
+
}
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The skill folders a foreign plugin manifest declares. Pi reads only a package's own `skills`
|
|
57
|
+
* folder and its `package.json` manifest, so a Claude- or Codex-layout package otherwise installs
|
|
58
|
+
* and contributes nothing.
|
|
59
|
+
*/
|
|
60
|
+
function declaredSkills(packageRoot) {
|
|
61
|
+
for (const file of PLUGIN_MANIFESTS) {
|
|
62
|
+
const found = readJsonOr(join(packageRoot, file), {});
|
|
63
|
+
const listed = typeof found.skills === 'string' ? [found.skills] : Array.isArray(found.skills) ? found.skills : [];
|
|
64
|
+
const skills = listed.flatMap((entry) => {
|
|
65
|
+
const path = inside(entry);
|
|
66
|
+
return path ? [path] : [];
|
|
67
|
+
});
|
|
68
|
+
if (skills.length)
|
|
69
|
+
return skills;
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
export function packageManifest(packageRoot) {
|
|
74
|
+
const manifest = readJsonOr(join(packageRoot, 'package.json'), {});
|
|
75
|
+
// Only a package without a name of its own is described by its plugin.json.
|
|
76
|
+
const plugin = text(manifest.name) ? {} : pluginJson(packageRoot);
|
|
77
|
+
const own = (manifest.harness && typeof manifest.harness === 'object' && !Array.isArray(manifest.harness) ? manifest.harness : {});
|
|
78
|
+
const pluginName = text(plugin.name);
|
|
79
|
+
return {
|
|
80
|
+
name: text(manifest.name) ?? (pluginName && /^[a-z0-9][a-z0-9._-]*$/i.test(pluginName) ? pluginName : basename(packageRoot)),
|
|
81
|
+
description: text(manifest.description) ?? text(plugin.description) ?? '',
|
|
82
|
+
version: text(manifest.version) ?? text(plugin.version),
|
|
83
|
+
extends: (Array.isArray(own.extends) ? own.extends : typeof own.extends === 'string' ? [own.extends] : []).filter((id) => typeof id === 'string' && !!id),
|
|
84
|
+
commandPrefix: typeof own.commandPrefix === 'string' && /^[a-z][a-z0-9-]*$/i.test(own.commandPrefix) && !['plugin', 'skill'].includes(own.commandPrefix.toLowerCase()) ? own.commandPrefix.toLowerCase() : null,
|
|
85
|
+
defaultPrompt: typeof own.defaultPrompt === 'string' && /^[a-z][a-z0-9-]*$/.test(own.defaultPrompt) ? own.defaultPrompt : null,
|
|
86
|
+
hooks: inside(own.hooks),
|
|
87
|
+
agents: inside(own.agents) ?? 'agents',
|
|
88
|
+
skills: declaredSkills(packageRoot),
|
|
89
|
+
connectorTemplates: (Array.isArray(own.connectors) ? own.connectors : []).flatMap((value) => {
|
|
90
|
+
const parsed = connectorTemplateSchema.safeParse(value);
|
|
91
|
+
return parsed.success ? [parsed.data] : [];
|
|
92
|
+
})
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { Bus } from "../core/bus.js";
|
|
2
|
+
import { type Attachments, type AttachScope } from "./attachments.js";
|
|
3
|
+
import { type Found, type ResolveInput, type Resolver } from "./discover.js";
|
|
4
|
+
import { Trust, type ProjectCode } from "./trust.js";
|
|
5
|
+
/** What one session or terminal loads besides the registry's own items. */
|
|
6
|
+
export interface Loading {
|
|
7
|
+
/** Extension files and folders, in the order Pi would have loaded them. */
|
|
8
|
+
extensionPaths: string[];
|
|
9
|
+
skillPaths: string[];
|
|
10
|
+
promptPaths: string[];
|
|
11
|
+
themePaths: string[];
|
|
12
|
+
/** Subagent profile files packages bring. The harness reads them; Pi is never given them. */
|
|
13
|
+
profilePaths: string[];
|
|
14
|
+
/** The `pi` command's own extensions left on, as `builtin:<name>`. Only a terminal has them. */
|
|
15
|
+
builtins: string[];
|
|
16
|
+
/** Hooks files the harness runs itself. Pi is never given them. */
|
|
17
|
+
hooks: {
|
|
18
|
+
path: string;
|
|
19
|
+
packageRoot: string;
|
|
20
|
+
hash: string;
|
|
21
|
+
}[];
|
|
22
|
+
/** Everything found, loaded or not. */
|
|
23
|
+
found: Found[];
|
|
24
|
+
/** Paths of found items a person switched off for this caller. */
|
|
25
|
+
detached: string[];
|
|
26
|
+
/** Applies the same attachment policy to resources supplied by a trusted extension. */
|
|
27
|
+
resourceAllowed?: (item: Found) => boolean;
|
|
28
|
+
/** Code the working folder brings, and whether a person trusted it. */
|
|
29
|
+
projectCode: (ProjectCode & {
|
|
30
|
+
trusted: boolean;
|
|
31
|
+
}) | null;
|
|
32
|
+
/** Each installed package that brings code, by its folder, and whether a person trusted it. */
|
|
33
|
+
packageCode: Record<string, ProjectCode & {
|
|
34
|
+
trusted: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
/** What one loaded extension added to a session. */
|
|
38
|
+
export interface Registered {
|
|
39
|
+
path: string;
|
|
40
|
+
hooks: string[];
|
|
41
|
+
tools: string[];
|
|
42
|
+
commands: string[];
|
|
43
|
+
flags: string[];
|
|
44
|
+
shortcuts: string[];
|
|
45
|
+
/** Fingerprint at observation time; stale registrations are not presented as current. */
|
|
46
|
+
hash?: string | null;
|
|
47
|
+
seenAt?: string;
|
|
48
|
+
resources?: RuntimeResource[];
|
|
49
|
+
}
|
|
50
|
+
export interface RuntimeResource {
|
|
51
|
+
kind: 'skill' | 'command' | 'theme';
|
|
52
|
+
name: string;
|
|
53
|
+
path: string;
|
|
54
|
+
chars: number | null;
|
|
55
|
+
}
|
|
56
|
+
export interface PluginsOptions {
|
|
57
|
+
stateDir: string;
|
|
58
|
+
bus: Bus;
|
|
59
|
+
resolver?: Resolver;
|
|
60
|
+
/** The choices a person made about what is switched on, or `null` while there is no data root. */
|
|
61
|
+
attachments?: () => Attachments | null;
|
|
62
|
+
/** The folder of packages kept with a person's data, or `null` while there is no data root. */
|
|
63
|
+
packagesDir?: () => string | null;
|
|
64
|
+
}
|
|
65
|
+
/** The package folders inside a folder: each direct child that is a folder and not hidden. */
|
|
66
|
+
export declare function packageFolders(directory: string | null): string[];
|
|
67
|
+
export interface LoadingInput extends ResolveInput {
|
|
68
|
+
/** Who the session is for. Something switched off for this agent or project does not load. */
|
|
69
|
+
caller?: AttachScope;
|
|
70
|
+
/** The contributions frozen for a run. When present, this snapshot governs loading. */
|
|
71
|
+
contributions?: readonly string[];
|
|
72
|
+
}
|
|
73
|
+
/** Which code a person trusted: the working folder's as a whole, and each installed package's. */
|
|
74
|
+
export interface Trusted {
|
|
75
|
+
project: boolean;
|
|
76
|
+
/** Folders of installed packages whose code is not trusted. */
|
|
77
|
+
untrustedPackages: ReadonlySet<string>;
|
|
78
|
+
}
|
|
79
|
+
export declare const trustedBy: (loading: Pick<Loading, "projectCode" | "packageCode"> | null) => Trusted;
|
|
80
|
+
/**
|
|
81
|
+
* Whether a found item loads: it is on in Pi's settings, and if it is code, a person trusted it.
|
|
82
|
+
* A loose file in the shared folder was put there by hand and needs no trust. Text always loads.
|
|
83
|
+
*/
|
|
84
|
+
export declare function loads(item: Found, trusted: Trusted): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Whether a person left a found item switched on for a caller. Pi reads its instruction files
|
|
87
|
+
* itself and its command owns its built-in extensions, so neither can be switched off here.
|
|
88
|
+
*/
|
|
89
|
+
export declare function switchable(item: Found): boolean;
|
|
90
|
+
export declare class Plugins {
|
|
91
|
+
private readonly options;
|
|
92
|
+
readonly trust: Trust;
|
|
93
|
+
private readonly resolver;
|
|
94
|
+
private readonly registeredPath;
|
|
95
|
+
constructor(options: PluginsOptions);
|
|
96
|
+
/** Finds what Pi would load in this folder, and chooses what does. */
|
|
97
|
+
loading(input: LoadingInput): Promise<Loading>;
|
|
98
|
+
/** What each extension registered the last time a session loaded it. */
|
|
99
|
+
registered(): Record<string, Registered & {
|
|
100
|
+
seenAt: string;
|
|
101
|
+
}>;
|
|
102
|
+
/** Records what a session's extensions registered, so the list can show it without loading code. */
|
|
103
|
+
loaded(extensions: readonly Registered[]): void;
|
|
104
|
+
}
|
|
105
|
+
/** Removes the skill links an earlier version of the harness kept in a Pi agent folder's `skills/`. */
|
|
106
|
+
export declare function removeLinkedSkills(skillsDir: string): void;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// The harness decides what a Pi session loads. Pi's own discovery is switched off for sessions
|
|
2
|
+
// and terminals; they receive the paths chosen here, so nothing reaches a model unlisted.
|
|
3
|
+
import { chmodSync, lstatSync, readdirSync, rmSync, unlinkSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { now, readJsonOr, writeJson } from "../core/fs.js";
|
|
6
|
+
import { attached } from "./attachments.js";
|
|
7
|
+
import { piResolver } from "./discover.js";
|
|
8
|
+
import { foundIds, pluginIdOf } from "./identity.js";
|
|
9
|
+
import { packageCode, projectCode, Trust } from "./trust.js";
|
|
10
|
+
/** The package folders inside a folder: each direct child that is a folder and not hidden. */
|
|
11
|
+
export function packageFolders(directory) {
|
|
12
|
+
if (!directory)
|
|
13
|
+
return [];
|
|
14
|
+
try {
|
|
15
|
+
return readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory() && !entry.name.startsWith('.')).map((entry) => join(directory, entry.name)).sort();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export const trustedBy = (loading) => ({
|
|
22
|
+
project: !!loading?.projectCode?.trusted,
|
|
23
|
+
untrustedPackages: new Set(Object.entries(loading?.packageCode ?? {}).filter(([, code]) => !code.trusted).map(([root]) => root))
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Whether a found item loads: it is on in Pi's settings, and if it is code, a person trusted it.
|
|
27
|
+
* A loose file in the shared folder was put there by hand and needs no trust. Text always loads.
|
|
28
|
+
*/
|
|
29
|
+
export function loads(item, trusted) {
|
|
30
|
+
if (!item.enabled)
|
|
31
|
+
return false;
|
|
32
|
+
if (item.kind !== 'extension' && item.kind !== 'hook')
|
|
33
|
+
return true;
|
|
34
|
+
if (item.project)
|
|
35
|
+
return trusted.project;
|
|
36
|
+
return !(item.packageRoot && trusted.untrustedPackages.has(item.packageRoot));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Whether a person left a found item switched on for a caller. Pi reads its instruction files
|
|
40
|
+
* itself and its command owns its built-in extensions, so neither can be switched off here.
|
|
41
|
+
*/
|
|
42
|
+
export function switchable(item) {
|
|
43
|
+
return item.kind !== 'context' && item.origin !== 'builtin';
|
|
44
|
+
}
|
|
45
|
+
export class Plugins {
|
|
46
|
+
options;
|
|
47
|
+
trust;
|
|
48
|
+
resolver;
|
|
49
|
+
registeredPath;
|
|
50
|
+
constructor(options) {
|
|
51
|
+
this.options = options;
|
|
52
|
+
this.trust = new Trust(options.stateDir, options.bus);
|
|
53
|
+
this.resolver = options.resolver ?? piResolver;
|
|
54
|
+
this.registeredPath = join(options.stateDir, 'plugin-registered.json');
|
|
55
|
+
}
|
|
56
|
+
/** Finds what Pi would load in this folder, and chooses what does. */
|
|
57
|
+
async loading(input) {
|
|
58
|
+
// Links an earlier version put in the shared skills folder would be found as skills again.
|
|
59
|
+
removeLinkedSkills(join(input.agentDir, 'skills'));
|
|
60
|
+
const found = await this.resolver({ ...input, packages: packageFolders(this.options.packagesDir?.() ?? null) });
|
|
61
|
+
const code = projectCode(found, input.cwd);
|
|
62
|
+
const packages = packageCode(found);
|
|
63
|
+
// Packages that loaded before trust was asked per package keep loading: they are taken over once.
|
|
64
|
+
if (!this.trust.adopted)
|
|
65
|
+
this.trust.adopt([...packages].map(([folder, packaged]) => ({ code: packaged, folder })));
|
|
66
|
+
const trustedHashes = new Set(this.trust.list().map((record) => record.hash));
|
|
67
|
+
const projectCodeState = code ? { ...code, trusted: trustedHashes.has(code.hash) } : null;
|
|
68
|
+
const packageCodeState = Object.fromEntries([...packages].map(([folder, packaged]) => [folder, { ...packaged, trusted: trustedHashes.has(packaged.hash) }]));
|
|
69
|
+
const trusted = trustedBy({ projectCode: projectCodeState, packageCode: packageCodeState });
|
|
70
|
+
const choices = this.options.attachments?.() ?? null;
|
|
71
|
+
const off = (item) => {
|
|
72
|
+
if (!choices || !switchable(item))
|
|
73
|
+
return false;
|
|
74
|
+
// A hook runs for everyone or not at all, so only its plugin's switch for everyone counts.
|
|
75
|
+
if (item.kind === 'hook')
|
|
76
|
+
return !attached(choices, [pluginIdOf(item)], {}, true);
|
|
77
|
+
return !attached(choices, foundIds(item), input.caller ?? {}, true);
|
|
78
|
+
};
|
|
79
|
+
const allowed = (item) => input.contributions === undefined
|
|
80
|
+
? !off(item)
|
|
81
|
+
: input.contributions.includes(foundIds(item)[0]);
|
|
82
|
+
const detached = found.filter((item) => !allowed(item)).map((item) => item.path);
|
|
83
|
+
const chosen = found.filter((item) => loads(item, trusted) && allowed(item));
|
|
84
|
+
const paths = (kind, builtin) => chosen.filter((item) => item.kind === kind && (item.origin === 'builtin') === builtin).map((item) => item.path);
|
|
85
|
+
return {
|
|
86
|
+
extensionPaths: paths('extension', false),
|
|
87
|
+
skillPaths: paths('skill', false),
|
|
88
|
+
promptPaths: paths('prompt', false),
|
|
89
|
+
themePaths: paths('theme', false),
|
|
90
|
+
profilePaths: paths('agent', false),
|
|
91
|
+
builtins: paths('extension', true),
|
|
92
|
+
hooks: chosen.filter((item) => item.kind === 'hook' && item.packageRoot).map((item) => ({ path: item.path, packageRoot: item.packageRoot, hash: packageCodeState[item.packageRoot]?.hash ?? '' })),
|
|
93
|
+
found,
|
|
94
|
+
detached,
|
|
95
|
+
resourceAllowed: allowed,
|
|
96
|
+
projectCode: projectCodeState,
|
|
97
|
+
packageCode: packageCodeState
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** What each extension registered the last time a session loaded it. */
|
|
101
|
+
registered() {
|
|
102
|
+
return readJsonOr(this.registeredPath, {});
|
|
103
|
+
}
|
|
104
|
+
/** Records what a session's extensions registered, so the list can show it without loading code. */
|
|
105
|
+
loaded(extensions) {
|
|
106
|
+
if (!extensions.length)
|
|
107
|
+
return;
|
|
108
|
+
const stored = this.registered();
|
|
109
|
+
let changed = false;
|
|
110
|
+
for (const extension of extensions) {
|
|
111
|
+
const { seenAt: _seenAt, ...before } = stored[extension.path] ?? {};
|
|
112
|
+
if (JSON.stringify(before) === JSON.stringify(extension))
|
|
113
|
+
continue;
|
|
114
|
+
stored[extension.path] = { ...extension, seenAt: now() };
|
|
115
|
+
changed = true;
|
|
116
|
+
}
|
|
117
|
+
if (!changed)
|
|
118
|
+
return;
|
|
119
|
+
writeJson(this.registeredPath, stored);
|
|
120
|
+
chmodSync(this.registeredPath, 0o600);
|
|
121
|
+
this.options.bus.emit({ type: 'plugins.changed' });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Prefix of the entries an earlier version of the harness linked into a Pi agent folder's `skills/`.
|
|
125
|
+
const LINKED_SKILL_PREFIX = 'agentx-';
|
|
126
|
+
function isLinkedSkill(path) {
|
|
127
|
+
let meta;
|
|
128
|
+
try {
|
|
129
|
+
meta = lstatSync(path);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (meta.isSymbolicLink())
|
|
135
|
+
return true;
|
|
136
|
+
if (!meta.isDirectory())
|
|
137
|
+
return false;
|
|
138
|
+
// A single-file skill was linked as `agentx-<name>/SKILL.md` inside a folder the harness made.
|
|
139
|
+
try {
|
|
140
|
+
const entries = readdirSync(path);
|
|
141
|
+
return entries.length === 1 && entries[0] === 'SKILL.md' && lstatSync(join(path, 'SKILL.md')).isSymbolicLink();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Removes the skill links an earlier version of the harness kept in a Pi agent folder's `skills/`. */
|
|
148
|
+
export function removeLinkedSkills(skillsDir) {
|
|
149
|
+
let names;
|
|
150
|
+
try {
|
|
151
|
+
names = readdirSync(skillsDir);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
for (const name of names) {
|
|
157
|
+
const path = join(skillsDir, name);
|
|
158
|
+
if (!name.startsWith(LINKED_SKILL_PREFIX) || !isLinkedSkill(path))
|
|
159
|
+
continue;
|
|
160
|
+
if (lstatSync(path).isSymbolicLink())
|
|
161
|
+
unlinkSync(path);
|
|
162
|
+
else
|
|
163
|
+
rmSync(path, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Harness } from "../harness.js";
|
|
2
|
+
export interface Proposal {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
files: Record<string, string>;
|
|
7
|
+
manifest: string;
|
|
8
|
+
hash: string;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
status: 'pending' | 'accepted' | 'rejected';
|
|
11
|
+
decidedAt?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function create(root: string, name: unknown, description: unknown, files: unknown): Proposal;
|
|
14
|
+
export declare function preview(root: string, id: string): Proposal;
|
|
15
|
+
export declare function list(root: string): Proposal[];
|
|
16
|
+
export declare function reject(root: string, id: string, hash: string): Proposal;
|
|
17
|
+
export declare function accept(harness: Harness, id: string, hash: string): Promise<Proposal>;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdirSync, readdirSync, renameSync, rmSync, rmdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { invalid, notFound } from "../core/errors.js";
|
|
5
|
+
import * as frontmatter from "../core/frontmatter.js";
|
|
6
|
+
import { now, readJson, safeId, safeRelative, writeJson } from "../core/fs.js";
|
|
7
|
+
import { ensureAdopted, list as listPlugins } from "./api.js";
|
|
8
|
+
import * as attachments from "./attachments.js";
|
|
9
|
+
import { packageCode } from "./trust.js";
|
|
10
|
+
const MAX_FILES = 100;
|
|
11
|
+
const MAX_FILE_BYTES = 256 * 1024;
|
|
12
|
+
const MAX_TOTAL_BYTES = 1024 * 1024;
|
|
13
|
+
const dir = (root) => join(root, 'plugin-proposals');
|
|
14
|
+
const pathOf = (root, id) => join(dir(root), `${safeId(id)}.json`);
|
|
15
|
+
function validate(name, description, input) {
|
|
16
|
+
if (typeof name !== 'string' || !/^[a-z0-9][a-z0-9_-]{0,63}$/.test(name))
|
|
17
|
+
throw invalid('Plugin name must be lowercase letters, digits, underscores or hyphens.');
|
|
18
|
+
if (typeof description !== 'string' || !description.trim() || Buffer.byteLength(description, 'utf8') > 4096 || /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(description))
|
|
19
|
+
throw invalid('Description must be non-empty valid text of at most 4096 bytes.');
|
|
20
|
+
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
21
|
+
throw invalid('Files must be a path to text object.');
|
|
22
|
+
const entries = Object.entries(input);
|
|
23
|
+
if (!entries.length || entries.length > MAX_FILES)
|
|
24
|
+
throw invalid('A proposal must contain between 1 and 100 files.');
|
|
25
|
+
const files = Object.create(null);
|
|
26
|
+
let total = 0;
|
|
27
|
+
for (const [path, content] of entries) {
|
|
28
|
+
if (typeof content !== 'string' || /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(content))
|
|
29
|
+
throw invalid('Each file must be valid UTF-8 text.');
|
|
30
|
+
if (path.includes('\\') || path.length > 240 || /[\x00-\x1f\x7f]/.test(path) || safeRelative(path) !== path || path.split('/').some((part) => part === 'node_modules' || part === '.git'))
|
|
31
|
+
throw invalid('Invalid proposal file path.');
|
|
32
|
+
if (!/^(?:README\.md|extensions\/[A-Za-z0-9_./-]+\.(?:ts|js|mjs)|skills\/[A-Za-z0-9_./-]+\.md|prompts\/[A-Za-z0-9_./-]+\.md|agents\/[A-Za-z0-9_./-]+\.md|themes\/[A-Za-z0-9_./-]+\.json)$/.test(path))
|
|
33
|
+
throw invalid('Unsupported proposal file type or location.');
|
|
34
|
+
if (path.startsWith('skills/') && path.endsWith('/SKILL.md')) {
|
|
35
|
+
if (!/^skills\/[A-Za-z0-9_-]+\/SKILL\.md$/.test(path))
|
|
36
|
+
throw invalid('Skill files must be in skills/<name>/SKILL.md.');
|
|
37
|
+
const front = frontmatter.parse(content)?.front;
|
|
38
|
+
if (front?.name !== path.split('/')[1] || typeof front.description !== 'string' || !front.description.trim())
|
|
39
|
+
throw invalid('Skill frontmatter needs a matching name and a non-empty description.');
|
|
40
|
+
}
|
|
41
|
+
const bytes = Buffer.byteLength(content, 'utf8');
|
|
42
|
+
if (bytes > MAX_FILE_BYTES || (total += bytes) > MAX_TOTAL_BYTES)
|
|
43
|
+
throw invalid('Proposal files exceed the size limit.');
|
|
44
|
+
files[path] = content;
|
|
45
|
+
}
|
|
46
|
+
for (const path of Object.keys(files))
|
|
47
|
+
if (Object.keys(files).some((other) => other.startsWith(`${path}/`)))
|
|
48
|
+
throw invalid('A file cannot also be a directory.');
|
|
49
|
+
const manifest = `${JSON.stringify({ name, version: '1.0.0', description }, null, 2)}\n`;
|
|
50
|
+
const hash = createHash('sha256').update(JSON.stringify([name, description, manifest, Object.entries(files).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)])).digest('hex');
|
|
51
|
+
return { name, description, files, manifest, hash };
|
|
52
|
+
}
|
|
53
|
+
export function create(root, name, description, files) {
|
|
54
|
+
const valid = validate(name, description, files);
|
|
55
|
+
const proposal = { id: randomUUID(), ...valid, createdAt: now(), status: 'pending' };
|
|
56
|
+
writeJson(pathOf(root, proposal.id), proposal);
|
|
57
|
+
return proposal;
|
|
58
|
+
}
|
|
59
|
+
export function preview(root, id) {
|
|
60
|
+
const proposal = readJson(pathOf(root, id));
|
|
61
|
+
if (!proposal)
|
|
62
|
+
throw notFound('Proposal');
|
|
63
|
+
const valid = validate(proposal.name, proposal.description, proposal.files);
|
|
64
|
+
if (proposal.id !== id || !['pending', 'accepted', 'rejected'].includes(proposal.status))
|
|
65
|
+
throw invalid('Invalid stored proposal.');
|
|
66
|
+
return { ...proposal, ...valid };
|
|
67
|
+
}
|
|
68
|
+
export function list(root) {
|
|
69
|
+
let names;
|
|
70
|
+
try {
|
|
71
|
+
names = readdirSync(dir(root));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.code === 'ENOENT')
|
|
75
|
+
return [];
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
return names.filter((name) => /^[a-f0-9-]+\.json$/.test(name)).sort().map((name) => preview(root, name.slice(0, -5)));
|
|
79
|
+
}
|
|
80
|
+
function reviewed(proposal, hash) {
|
|
81
|
+
if (proposal.status !== 'pending')
|
|
82
|
+
throw invalid('Proposal is no longer pending.');
|
|
83
|
+
if (!/^[a-f0-9]{64}$/.test(hash) || proposal.hash !== hash)
|
|
84
|
+
throw invalid('Stale proposal review; preview it again.');
|
|
85
|
+
}
|
|
86
|
+
export function reject(root, id, hash) {
|
|
87
|
+
const proposal = preview(root, id);
|
|
88
|
+
reviewed(proposal, hash);
|
|
89
|
+
const rejected = { ...proposal, status: 'rejected', decidedAt: now() };
|
|
90
|
+
writeJson(pathOf(root, id), rejected);
|
|
91
|
+
return rejected;
|
|
92
|
+
}
|
|
93
|
+
export async function accept(harness, id, hash) {
|
|
94
|
+
const root = harness.env.root;
|
|
95
|
+
const initial = preview(root, id);
|
|
96
|
+
reviewed(initial, hash);
|
|
97
|
+
await ensureAdopted(harness);
|
|
98
|
+
const existing = await listPlugins(harness, {});
|
|
99
|
+
const proposal = preview(root, id);
|
|
100
|
+
reviewed(proposal, hash);
|
|
101
|
+
const pluginId = `package:${proposal.name}`;
|
|
102
|
+
if (existing.some((plugin) => plugin.id === pluginId))
|
|
103
|
+
throw invalid('A plugin with this name already exists.');
|
|
104
|
+
const parent = join(root, 'plugins');
|
|
105
|
+
const destination = join(parent, proposal.name);
|
|
106
|
+
mkdirSync(parent, { recursive: true });
|
|
107
|
+
const stage = join(parent, `.proposal-${randomUUID()}`);
|
|
108
|
+
mkdirSync(stage);
|
|
109
|
+
let reserved = false;
|
|
110
|
+
try {
|
|
111
|
+
for (const [path, content] of Object.entries(proposal.files)) {
|
|
112
|
+
const target = join(stage, path);
|
|
113
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
114
|
+
writeFileSync(target, content, { flag: 'wx' });
|
|
115
|
+
}
|
|
116
|
+
writeFileSync(join(stage, 'package.json'), proposal.manifest, { flag: 'wx' });
|
|
117
|
+
const found = { kind: 'extension', path: stage, origin: 'package', project: false, packageRoot: stage, source: stage, enabled: true };
|
|
118
|
+
const code = packageCode([found]).get(stage);
|
|
119
|
+
if (harness.plugins.trust.has(code.hash))
|
|
120
|
+
throw invalid('Identical package code is already trusted; change it before accepting.');
|
|
121
|
+
// Reserve the destination exclusively. Renaming over our empty directory publishes the whole package.
|
|
122
|
+
mkdirSync(destination);
|
|
123
|
+
reserved = true;
|
|
124
|
+
const choices = attachments.load(root);
|
|
125
|
+
for (const scope of [choices.global, ...Object.values(choices.agents), ...Object.values(choices.projects)]) {
|
|
126
|
+
scope.on = scope.on.filter((entry) => entry !== pluginId && !entry.startsWith(`${pluginId}/`));
|
|
127
|
+
scope.off = scope.off.filter((entry) => entry !== pluginId && !entry.startsWith(`${pluginId}/`));
|
|
128
|
+
}
|
|
129
|
+
attachments.set(choices, [pluginId], {}, false, true);
|
|
130
|
+
attachments.save(root, choices);
|
|
131
|
+
renameSync(stage, destination);
|
|
132
|
+
reserved = false;
|
|
133
|
+
const accepted = { ...proposal, status: 'accepted', decidedAt: now() };
|
|
134
|
+
writeJson(pathOf(root, id), accepted);
|
|
135
|
+
harness.bus.emit({ type: 'plugins.changed' });
|
|
136
|
+
return accepted;
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
rmSync(stage, { recursive: true, force: true });
|
|
140
|
+
if (reserved) {
|
|
141
|
+
try {
|
|
142
|
+
rmdirSync(destination);
|
|
143
|
+
}
|
|
144
|
+
catch { /* Do not remove another writer's files. */ }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as Pi from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import type { Found } from "./discover.js";
|
|
3
|
+
import type { Loading, Registered, RuntimeResource } from "./plugins.js";
|
|
4
|
+
export declare function runtimeOwner(loading: Loading, path: string): Found | undefined;
|
|
5
|
+
export declare function registrationHash(loading: Loading, path: string): string | null;
|
|
6
|
+
/** A discovered resource has the same identity for its switch, catalogue and load decision. */
|
|
7
|
+
export declare function resourceOf(owner: Found, kind: 'skill' | 'prompt' | 'theme', path: string): RuntimeResource;
|
|
8
|
+
/** Wrap each handler separately so identical extension basenames never lose their owner. */
|
|
9
|
+
export declare function observeResources(pi: typeof Pi, loader: Pi.DefaultResourceLoader, loading: Loading, records: Registered[], publish: () => void): void;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Observe Pi's structured resource discovery without running code while the catalogue is read.
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
import { charCount } from "../core/text.js";
|
|
6
|
+
import { FOUND_KINDS, describeFound } from "./identity.js";
|
|
7
|
+
export function runtimeOwner(loading, path) {
|
|
8
|
+
return loading.found.find((item) => item.kind === 'extension' && (item.path === path || path.startsWith(`${item.path}/`)));
|
|
9
|
+
}
|
|
10
|
+
export function registrationHash(loading, path) {
|
|
11
|
+
const owner = runtimeOwner(loading, path);
|
|
12
|
+
if (owner?.project)
|
|
13
|
+
return loading.projectCode?.hash ?? null;
|
|
14
|
+
if (owner?.packageRoot)
|
|
15
|
+
return loading.packageCode[owner.packageRoot]?.hash ?? null;
|
|
16
|
+
try {
|
|
17
|
+
return createHash('sha256').update(readFileSync(path)).digest('hex');
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** A discovered resource has the same identity for its switch, catalogue and load decision. */
|
|
24
|
+
export function resourceOf(owner, kind, path) {
|
|
25
|
+
const found = { ...owner, kind, path };
|
|
26
|
+
const described = describeFound(found);
|
|
27
|
+
let chars = null;
|
|
28
|
+
try {
|
|
29
|
+
chars = charCount(readFileSync(path, 'utf8'));
|
|
30
|
+
}
|
|
31
|
+
catch { /* Missing files remain observable. */ }
|
|
32
|
+
return { kind: FOUND_KINDS[kind], name: described.name, path, chars };
|
|
33
|
+
}
|
|
34
|
+
/** Wrap each handler separately so identical extension basenames never lose their owner. */
|
|
35
|
+
export function observeResources(pi, loader, loading, records, publish) {
|
|
36
|
+
for (const extension of loader.getExtensions().extensions) {
|
|
37
|
+
if (extension.hidden)
|
|
38
|
+
continue;
|
|
39
|
+
const path = extension.resolvedPath || extension.path;
|
|
40
|
+
const owner = runtimeOwner(loading, path);
|
|
41
|
+
const record = records.find((entry) => entry.path === path);
|
|
42
|
+
if (!owner || !record)
|
|
43
|
+
continue;
|
|
44
|
+
const handlers = extension.handlers.get('resources_discover');
|
|
45
|
+
if (!handlers)
|
|
46
|
+
continue;
|
|
47
|
+
const observations = new Map();
|
|
48
|
+
extension.handlers.set('resources_discover', handlers.map((handler, index) => async (event, context) => {
|
|
49
|
+
const result = await handler(event, context);
|
|
50
|
+
if (!result) {
|
|
51
|
+
observations.delete(index);
|
|
52
|
+
record.resources = [...observations.values()].flat();
|
|
53
|
+
publish();
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
const collected = [];
|
|
57
|
+
const allowed = (kind, resourcePath) => {
|
|
58
|
+
const resource = resourceOf(owner, kind, resourcePath);
|
|
59
|
+
collected.push(resource);
|
|
60
|
+
return loading.resourceAllowed?.({ ...owner, kind, path: resourcePath }) !== false;
|
|
61
|
+
};
|
|
62
|
+
const absolute = (entry) => resolve(dirname(path), entry);
|
|
63
|
+
const skills = pi.loadSkills({ cwd: dirname(path), agentDir: dirname(path), includeDefaults: false, skillPaths: (result.skillPaths ?? []).map(absolute) }).skills;
|
|
64
|
+
const scanner = new pi.DefaultResourceLoader({ cwd: dirname(path), agentDir: dirname(path), settingsManager: pi.SettingsManager.inMemory({}), noExtensions: true, noSkills: true, noThemes: true, noContextFiles: true, noPromptTemplates: true, additionalPromptTemplatePaths: (result.promptPaths ?? []).map(absolute) });
|
|
65
|
+
await scanner.reload();
|
|
66
|
+
const prompts = scanner.getPrompts().prompts;
|
|
67
|
+
const themes = (result.themePaths ?? []).map(absolute).flatMap((theme) => {
|
|
68
|
+
try {
|
|
69
|
+
if (statSync(theme).isDirectory())
|
|
70
|
+
return readdirSync(theme).filter((name) => {
|
|
71
|
+
if (!name.endsWith('.json'))
|
|
72
|
+
return false;
|
|
73
|
+
try {
|
|
74
|
+
return statSync(resolve(theme, name)).isFile();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}).map((name) => resolve(theme, name));
|
|
80
|
+
}
|
|
81
|
+
catch { /* Preserve missing paths for Pi's diagnostics. */ }
|
|
82
|
+
return [theme];
|
|
83
|
+
});
|
|
84
|
+
const filtered = {
|
|
85
|
+
skillPaths: skills.filter((skill) => allowed('skill', skill.filePath)).map((skill) => skill.filePath),
|
|
86
|
+
promptPaths: prompts.filter((prompt) => allowed('prompt', prompt.filePath)).map((prompt) => prompt.filePath),
|
|
87
|
+
themePaths: themes.filter((theme) => allowed('theme', theme))
|
|
88
|
+
};
|
|
89
|
+
observations.set(index, collected);
|
|
90
|
+
record.resources = [...new Map([...observations.values()].flat().map((entry) => [`${entry.kind}:${entry.path}`, entry])).values()];
|
|
91
|
+
publish();
|
|
92
|
+
return filtered;
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Plugin, PluginSurfaces } from "./types.js";
|
|
2
|
+
/** A short badge for a list row: `better in the app`, or nothing. */
|
|
3
|
+
export declare function surfaceBadge(surfaces: PluginSurfaces | null | undefined): string;
|
|
4
|
+
/** The plugin's description, followed by what the host adds and what the terminal does instead. */
|
|
5
|
+
export declare function describePlugin(plugin: Pick<Plugin, 'description' | 'surfaces'>): string;
|