@xingular/harness 0.1.7 → 1.0.0
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 +97 -1
- package/LICENSE +202 -0
- package/NOTICE.md +22 -0
- package/README.md +187 -85
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +13701 -13498
- package/dist/sdk/accounts/accounts.d.ts +165 -0
- package/dist/sdk/accounts/accounts.js +730 -0
- package/dist/sdk/accounts/choices.d.ts +23 -0
- package/dist/sdk/accounts/choices.js +62 -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 +16 -0
- package/dist/sdk/accounts/secrets.js +40 -0
- package/dist/sdk/accounts/store.d.ts +114 -0
- package/dist/sdk/accounts/store.js +255 -0
- package/dist/sdk/browser/config.d.ts +16 -0
- package/dist/sdk/browser/config.js +22 -0
- package/dist/sdk/browser/diagnostics.d.ts +4 -0
- package/dist/sdk/browser/diagnostics.js +38 -0
- package/dist/sdk/browser/index.d.ts +17 -0
- package/dist/sdk/browser/index.js +65 -0
- package/dist/sdk/browser/network.d.ts +10 -0
- package/dist/sdk/browser/network.js +59 -0
- package/dist/sdk/browser/session.d.ts +84 -0
- package/dist/sdk/browser/session.js +192 -0
- package/dist/sdk/browser/tools.d.ts +8 -0
- package/dist/sdk/browser/tools.js +329 -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 +47 -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 +142 -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/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 +187 -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/text.d.ts +7 -0
- package/dist/sdk/core/text.js +40 -0
- package/dist/sdk/doctor/checks.d.ts +5 -0
- package/dist/sdk/doctor/checks.js +208 -0
- package/dist/sdk/doctor/probe.d.ts +4 -0
- package/dist/sdk/doctor/probe.js +92 -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 +133 -0
- package/dist/sdk/harness.js +299 -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/trajectory.d.ts +7 -0
- package/dist/sdk/history/trajectory.js +216 -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 +474 -0
- package/dist/sdk/hub/schema.d.ts +280 -0
- package/dist/sdk/hub/schema.js +78 -0
- package/dist/sdk/index.d.ts +63 -0
- package/dist/sdk/index.js +48 -0
- package/dist/sdk/mcp/connections.d.ts +83 -0
- package/dist/sdk/mcp/connections.js +669 -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/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/runtime.d.ts +13 -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 +6 -0
- package/dist/sdk/plugins/builtin.js +68 -0
- package/dist/sdk/plugins/catalogue.d.ts +29 -0
- package/dist/sdk/plugins/catalogue.js +196 -0
- package/dist/sdk/plugins/cli.d.ts +13 -0
- package/dist/sdk/plugins/cli.js +187 -0
- package/dist/sdk/plugins/discover.d.ts +42 -0
- package/dist/sdk/plugins/discover.js +115 -0
- package/dist/sdk/plugins/firstParty.d.ts +50 -0
- package/dist/sdk/plugins/firstParty.js +113 -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 +20 -0
- package/dist/sdk/plugins/install.js +110 -0
- package/dist/sdk/plugins/inventory.d.ts +22 -0
- package/dist/sdk/plugins/inventory.js +110 -0
- package/dist/sdk/plugins/manifest.d.ts +13 -0
- package/dist/sdk/plugins/manifest.js +56 -0
- package/dist/sdk/plugins/plugins.d.ts +104 -0
- package/dist/sdk/plugins/plugins.js +164 -0
- package/dist/sdk/plugins/runtime.d.ts +9 -0
- package/dist/sdk/plugins/runtime.js +95 -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 +159 -0
- package/dist/sdk/plugins/types.js +7 -0
- package/dist/sdk/prompt/compile.d.ts +174 -0
- package/dist/sdk/prompt/compile.js +396 -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 +51 -0
- package/dist/sdk/refine/host.js +76 -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 +45 -0
- package/dist/sdk/refine/prompts.js +390 -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 +81 -0
- package/dist/sdk/refine/runner.js +150 -0
- package/dist/sdk/refine/selection.d.ts +57 -0
- package/dist/sdk/refine/selection.js +251 -0
- package/dist/sdk/refine/service.d.ts +84 -0
- package/dist/sdk/refine/service.js +165 -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 +68 -0
- package/dist/sdk/refine/types.d.ts +77 -0
- package/dist/sdk/refine/types.js +10 -0
- package/dist/sdk/server/methods.d.ts +3 -0
- package/dist/sdk/server/methods.js +370 -0
- package/dist/sdk/server/remote.d.ts +19 -0
- package/dist/sdk/server/remote.js +84 -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 +10 -0
- package/dist/sdk/server/serve.js +18 -0
- package/dist/sdk/sessions/approvals.d.ts +47 -0
- package/dist/sdk/sessions/approvals.js +119 -0
- package/dist/sdk/sessions/continuation.d.ts +48 -0
- package/dist/sdk/sessions/continuation.js +85 -0
- package/dist/sdk/sessions/contracts.d.ts +534 -0
- package/dist/sdk/sessions/contracts.js +299 -0
- package/dist/sdk/sessions/extensionUi.d.ts +19 -0
- package/dist/sdk/sessions/extensionUi.js +64 -0
- package/dist/sdk/sessions/history.d.ts +16 -0
- package/dist/sdk/sessions/history.js +68 -0
- package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
- package/dist/sdk/sessions/lineageJoin.js +61 -0
- package/dist/sdk/sessions/planMode.d.ts +36 -0
- package/dist/sdk/sessions/planMode.js +84 -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 +102 -0
- package/dist/sdk/sessions/registry.js +383 -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 +66 -0
- package/dist/sdk/sessions/runStore.js +335 -0
- package/dist/sdk/sessions/runner.d.ts +213 -0
- package/dist/sdk/sessions/runner.js +589 -0
- package/dist/sdk/sessions/sessions.d.ts +140 -0
- package/dist/sdk/sessions/sessions.js +394 -0
- package/dist/sdk/sessions/subagentService.d.ts +41 -0
- package/dist/sdk/sessions/subagentService.js +247 -0
- package/dist/sdk/sessions/subagents.d.ts +50 -0
- package/dist/sdk/sessions/subagents.js +68 -0
- package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
- package/dist/sdk/terminal/accountsMenu.js +392 -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 +15 -0
- package/dist/sdk/terminal/client.js +126 -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 +72 -0
- package/dist/sdk/terminal/controller.js +351 -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/logs.d.ts +14 -0
- package/dist/sdk/terminal/logs.js +59 -0
- package/dist/sdk/terminal/piExtension.d.ts +6 -0
- package/dist/sdk/terminal/piExtension.js +392 -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 +70 -0
- package/dist/sdk/terminal/socket.js +256 -0
- package/dist/sdk/terminal/standalone.d.ts +18 -0
- package/dist/sdk/terminal/standalone.js +146 -0
- package/dist/sdk/terminal/terminals.d.ts +176 -0
- package/dist/sdk/terminal/terminals.js +767 -0
- package/dist/sdk/terminal/trajectory.d.ts +10 -0
- package/dist/sdk/terminal/trajectory.js +30 -0
- package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
- package/dist/sdk/terminal/tui/chrome.js +169 -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 +7 -0
- package/dist/sdk/terminal/tui/commandPages.js +63 -0
- package/dist/sdk/terminal/tui/commands.d.ts +42 -0
- package/dist/sdk/terminal/tui/commands.js +276 -0
- package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
- package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
- package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
- package/dist/sdk/terminal/tui/dialogs.js +363 -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 +73 -0
- package/dist/sdk/terminal/tui/list.js +196 -0
- package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
- package/dist/sdk/terminal/tui/modeChoices.js +70 -0
- package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
- package/dist/sdk/terminal/tui/modelPicker.js +155 -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/page.d.ts +14 -0
- package/dist/sdk/terminal/tui/page.js +1 -0
- package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
- package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
- package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -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/doctorPage.d.ts +37 -0
- package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
- package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
- package/dist/sdk/terminal/tui/pages/hubPage.js +128 -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 +57 -0
- package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
- package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
- package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
- package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
- package/dist/sdk/terminal/tui/piAdapter.js +48 -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/questionPicker.d.ts +20 -0
- package/dist/sdk/terminal/tui/questionPicker.js +150 -0
- package/dist/sdk/terminal/tui/questions.d.ts +19 -0
- package/dist/sdk/terminal/tui/questions.js +42 -0
- package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
- package/dist/sdk/terminal/tui/runtime.js +441 -0
- package/dist/sdk/terminal/tui/search.d.ts +22 -0
- package/dist/sdk/terminal/tui/search.js +60 -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/sessionUi.d.ts +3 -0
- package/dist/sdk/terminal/tui/sessionUi.js +30 -0
- package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
- package/dist/sdk/terminal/tui/settingsModel.js +84 -0
- package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
- package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
- package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
- package/dist/sdk/terminal/tui/skillInvocation.js +43 -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 +45 -0
- package/dist/sdk/terminal/tui/theme.js +176 -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 +47 -0
- package/dist/sdk/terminal/tui/ui.js +148 -0
- package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
- package/dist/sdk/terminal/tui/workingStatus.js +229 -0
- package/dist/sdk/tools/askUser.d.ts +6 -0
- package/dist/sdk/tools/askUser.js +74 -0
- package/dist/sdk/tools/checklist.d.ts +9 -0
- package/dist/sdk/tools/checklist.js +54 -0
- package/dist/sdk/tools/definitions.d.ts +30 -0
- package/dist/sdk/tools/definitions.js +117 -0
- package/dist/sdk/tools/dispatch.d.ts +16 -0
- package/dist/sdk/tools/dispatch.js +67 -0
- package/dist/sdk/tools/harnessTools.d.ts +6 -0
- package/dist/sdk/tools/harnessTools.js +20 -0
- package/dist/sdk/tools/sessionName.d.ts +7 -0
- package/dist/sdk/tools/sessionName.js +31 -0
- package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
- package/dist/sdk/tools/spawnSubagent.js +49 -0
- package/dist/sdk/tools/types.d.ts +48 -0
- package/dist/sdk/tools/types.js +1 -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 +82 -0
- package/dist/sdk/variant/store.js +151 -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/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/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/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 +65 -0
- package/dist/sdk/world/world.js +80 -0
- package/dist/terminal-opentui.js +13612 -0
- package/dist/terminal-pi.js +808 -151
- package/docs/README.md +22 -0
- package/docs/architecture/00-overview.md +159 -0
- package/docs/architecture/01-extension-points.md +78 -0
- package/docs/architecture/02-sessions-and-runs.md +146 -0
- package/docs/architecture/03-variants.md +95 -0
- package/docs/architecture/04-prompt.md +102 -0
- package/docs/architecture/05-refinement.md +107 -0
- package/docs/architecture/06-plugins-and-capabilities.md +93 -0
- package/docs/architecture/07-tools-and-gate.md +88 -0
- package/docs/architecture/08-memory-and-history.md +94 -0
- package/docs/architecture/09-accounts-and-connectors.md +90 -0
- package/docs/architecture/10-server-protocol.md +84 -0
- package/docs/architecture/11-terminal.md +81 -0
- package/docs/architecture/12-storage.md +61 -0
- package/docs/architecture/13-world-tools.md +23 -0
- package/docs/architecture/README.md +114 -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 +68 -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/README.md +76 -0
- package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
- package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
- package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
- package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
- 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 +38 -0
- package/docs/decisions/ADR-0009-xharness-command.md +38 -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 +21 -0
- package/docs/doctor.md +74 -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/features/README.md +20 -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/releases/1.0.0.md +40 -0
- package/docs/releases/README.md +36 -0
- package/docs/study/00-index.md +78 -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 +75 -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/btw-comparison.md +37 -0
- package/docs/study/feature-gap-review.md +42 -0
- package/docs/study/insights.md +123 -0
- package/docs/study/roadmap.md +72 -0
- package/docs/study/sources/claude-code.md +44 -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/system-prompt-design.md +196 -0
- package/docs/terminal-tui.md +473 -56
- package/package.json +43 -13
- package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
- package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
- package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
- package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
- package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
- package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
- package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
- package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
- package/src/accounts/accounts.test.ts +0 -333
- package/src/accounts/accounts.ts +0 -658
- 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.ts +0 -34
- 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 -312
- 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 -75
- package/src/mcp/connections.ts +0 -614
- 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 -376
- package/src/mcp/service.ts +0 -549
- package/src/mcp/types.ts +0 -108
- 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 -163
- package/src/memory/curation.ts +0 -64
- package/src/memory/dispatch.ts +0 -59
- 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 -176
- package/src/memory/maintenance.ts +0 -518
- 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 -278
- 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/wiki.test.ts +0 -47
- package/src/memory/wiki.ts +0 -422
- package/src/memory/wikiIndex.test.ts +0 -88
- package/src/memory/wikiIndex.ts +0 -116
- 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 -82
- 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 -349
- 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 -174
- package/src/sessions/approvals.ts +0 -118
- package/src/sessions/contracts.ts +0 -336
- package/src/sessions/conversation.test.ts +0 -177
- 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 -381
- package/src/sessions/runIndex.ts +0 -99
- package/src/sessions/runStore.test.ts +0 -152
- package/src/sessions/runStore.ts +0 -332
- package/src/sessions/runner.ts +0 -604
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -549
- package/src/sessions/sessions.ts +0 -339
- 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 -291
- 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 -259
- package/src/terminal/pluginControl.test.ts +0 -146
- package/src/terminal/pluginMenu.ts +0 -112
- package/src/terminal/socket.test.ts +0 -71
- package/src/terminal/socket.ts +0 -232
- package/src/terminal/standalone.test.ts +0 -167
- package/src/terminal/standalone.ts +0 -153
- package/src/terminal/terminal.test.ts +0 -399
- package/src/terminal/terminals.ts +0 -553
- package/src/terminal/tui/application.test.ts +0 -114
- package/src/terminal/tui/application.ts +0 -491
- package/src/terminal/tui/commands.test.ts +0 -218
- package/src/terminal/tui/commands.ts +0 -361
- package/src/terminal/tui/dialogs.ts +0 -301
- package/src/terminal/tui/editor.test.ts +0 -84
- package/src/terminal/tui/editor.ts +0 -79
- package/src/terminal/tui/keybindings.test.ts +0 -22
- package/src/terminal/tui/keybindings.ts +0 -50
- package/src/terminal/tui/piAdapter.ts +0 -62
- 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 -104
- package/src/terminal/tui/runtime.test.ts +0 -215
- package/src/terminal/tui/runtime.ts +0 -388
- 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/status.test.ts +0 -70
- package/src/terminal/tui/status.ts +0 -109
- package/src/terminal/tui/theme.ts +0 -174
- package/src/terminal/tui/tools.test.ts +0 -145
- package/src/terminal/tui/tools.ts +0 -142
- package/src/terminal/tui/transcript.test.ts +0 -25
- package/src/terminal/tui/transcript.ts +0 -124
- 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/tools/askUser.test.ts +0 -69
- package/src/tools/askUser.ts +0 -59
- package/src/tools/definitions.ts +0 -187
- package/src/tools/maintenance.ts +0 -24
- 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 -92
- package/src/tools/types.ts +0 -39
- 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
package/src/plugins/api.ts
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
// The plugin calls a host makes: the list, what reaches one caller, switching something on or
|
|
2
|
-
// off for a scope, and the trust decision.
|
|
3
|
-
import { join } from 'node:path'
|
|
4
|
-
|
|
5
|
-
import { ensureSharedDir, sharedDir } from '../accounts/env'
|
|
6
|
-
import { invalid, notFound } from '../core/errors'
|
|
7
|
-
import { findProject } from '../core/projects'
|
|
8
|
-
import type { Harness } from '../harness'
|
|
9
|
-
import type { CallerContext } from '../memory/caller'
|
|
10
|
-
import type { Launch } from '../prompt/compile'
|
|
11
|
-
import * as attachments from './attachments'
|
|
12
|
-
import { INCLUDED_PLUGIN, YOURS_PLUGIN } from './builtin'
|
|
13
|
-
import { catalogue } from './catalogue'
|
|
14
|
-
import { inventory } from './inventory'
|
|
15
|
-
import type { Loading } from './plugins'
|
|
16
|
-
import type { Inventory, Plugin } from './types'
|
|
17
|
-
|
|
18
|
-
export interface PluginScope {
|
|
19
|
-
/** The working folder to list for. Without one, nothing a folder brings is listed. */
|
|
20
|
-
cwd?: string | null
|
|
21
|
-
/** The account whose Pi folder is searched. Defaults to the default account. */
|
|
22
|
-
accountId?: string | null
|
|
23
|
-
/** Whose list it is. With either, each state is what that agent or project gets. */
|
|
24
|
-
agentId?: string | null
|
|
25
|
-
projectId?: string | null
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const callerOf = (scope: PluginScope): attachments.AttachScope => ({ agentId: scope.agentId ?? null, projectId: scope.projectId ?? null })
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* What Pi would load for this account and folder. Before the first account exists, the folder
|
|
32
|
-
* every account shares stands in: packages and shared files are the same for all of them.
|
|
33
|
-
* `null` only when the account that was named cannot be found.
|
|
34
|
-
*/
|
|
35
|
-
export async function loadingFor(harness: Harness, scope: PluginScope): Promise<Loading | null> {
|
|
36
|
-
let agentDir: string
|
|
37
|
-
try {
|
|
38
|
-
agentDir = harness.accounts.context(harness.accounts.resolve(scope.accountId ?? null, null)).configDir
|
|
39
|
-
} catch {
|
|
40
|
-
if (scope.accountId) return null
|
|
41
|
-
agentDir = ensureSharedDir(harness.accounts.dir)
|
|
42
|
-
}
|
|
43
|
-
// Listing never installs anything. Without a working folder the state folder stands in, and
|
|
44
|
-
// what it "brings" is dropped by the catalogue.
|
|
45
|
-
return harness.plugins.loading({ cwd: scope.cwd || harness.stateDir, agentDir, caller: callerOf(scope) })
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export async function list(harness: Harness, scope: PluginScope = {}): Promise<Plugin[]> {
|
|
49
|
-
return catalogue({
|
|
50
|
-
root: harness.env.root,
|
|
51
|
-
descriptors: harness.descriptors,
|
|
52
|
-
application: harness.applicationPlugins,
|
|
53
|
-
connections: harness.apps.connections.list(),
|
|
54
|
-
loading: await loadingFor(harness, scope),
|
|
55
|
-
cwd: scope.cwd || null,
|
|
56
|
-
sharedDir: sharedDir(harness.accounts.dir),
|
|
57
|
-
packagesDir: join(harness.env.root, 'plugins'),
|
|
58
|
-
registered: harness.plugins.registered(),
|
|
59
|
-
hooks: harness.hooks.status(),
|
|
60
|
-
attachments: attachments.load(harness.env.root),
|
|
61
|
-
caller: callerOf(scope)
|
|
62
|
-
})
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface InventoryParams extends PluginScope {
|
|
66
|
-
context?: CallerContext
|
|
67
|
-
launch?: Launch
|
|
68
|
-
tools?: string[]
|
|
69
|
-
connections?: boolean
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export async function inventoryFor(harness: Harness, params: InventoryParams): Promise<Inventory> {
|
|
73
|
-
return inventory({
|
|
74
|
-
env: harness.env,
|
|
75
|
-
context: params.context ?? {},
|
|
76
|
-
launch: params.launch ?? {},
|
|
77
|
-
tools: Array.isArray(params.tools) ? params.tools : [],
|
|
78
|
-
connections: params.connections !== false,
|
|
79
|
-
// What is switched off for the caller is not in what reaches it.
|
|
80
|
-
plugins: await list(harness, { ...params, agentId: params.agentId ?? params.context?.agentId ?? null, projectId: params.projectId ?? params.context?.projectId ?? null }),
|
|
81
|
-
descriptors: harness.descriptors,
|
|
82
|
-
saved: harness.apps.connections.list()
|
|
83
|
-
})
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Trusts code a person was shown, if it is still that code: a working folder's own, or an
|
|
88
|
-
* installed package's. The hash names which; a folder is needed only for the working folder's.
|
|
89
|
-
*/
|
|
90
|
-
export async function trust(harness: Harness, scope: PluginScope & { hash: string }): Promise<Plugin[]> {
|
|
91
|
-
const loading = await loadingFor(harness, scope)
|
|
92
|
-
const project = scope.cwd && loading?.projectCode?.hash === scope.hash ? { code: loading.projectCode, folder: scope.cwd } : null
|
|
93
|
-
const packaged = Object.entries(loading?.packageCode ?? {}).find(([, code]) => code.hash === scope.hash)
|
|
94
|
-
const match = project ?? (packaged ? { code: packaged[1], folder: packaged[0] } : null)
|
|
95
|
-
if (!match) throw invalid('This code changed since it was shown. Review it again before trusting it.')
|
|
96
|
-
harness.plugins.trust.grant({ hash: match.code.hash, files: match.code.files }, match.folder)
|
|
97
|
-
return list(harness, scope)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export async function untrust(harness: Harness, scope: PluginScope & { hash: string }): Promise<Plugin[]> {
|
|
101
|
-
harness.plugins.trust.revoke(scope.hash)
|
|
102
|
-
return list(harness, scope)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export interface AttachParams extends PluginScope {
|
|
106
|
-
/** A plugin's id, or one contribution's. */
|
|
107
|
-
id: string
|
|
108
|
-
/** Who the switch is for. Neither id means everywhere. */
|
|
109
|
-
scope?: attachments.AttachScope | null
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Switches a plugin, or one thing it brings, on or off: everywhere, for one agent, or for one
|
|
114
|
-
* project. A required part refuses and says why. Nothing here grants a permission: a tool that
|
|
115
|
-
* is switched on still passes the gate.
|
|
116
|
-
*/
|
|
117
|
-
export async function attach(harness: Harness, params: AttachParams, on: boolean): Promise<Plugin[]> {
|
|
118
|
-
const { root } = harness.env
|
|
119
|
-
const scope: attachments.AttachScope = { agentId: params.scope?.agentId || null, projectId: params.scope?.projectId || null }
|
|
120
|
-
if (scope.projectId) findProject(root, scope.projectId)
|
|
121
|
-
const plugins = await list(harness, params)
|
|
122
|
-
const plugin = plugins.find((candidate) => candidate.id === params.id || candidate.contributions.some((entry) => entry.id === params.id))
|
|
123
|
-
if (!plugin) throw notFound('Plugin')
|
|
124
|
-
const contribution = plugin.id === params.id ? null : plugin.contributions.find((entry) => entry.id === params.id)!
|
|
125
|
-
if (plugin.required && contribution?.kind !== 'connection') throw invalid(`${plugin.title} cannot be switched off. ${plugin.required}`)
|
|
126
|
-
if (plugin.source === 'application') throw invalid(`${plugin.title} is switched by the application that provides it.`)
|
|
127
|
-
if (!(contribution ?? plugin).attachment) throw invalid(contribution ? `${contribution.name} cannot be switched on its own.` : `${plugin.title} is switched one item at a time.`)
|
|
128
|
-
|
|
129
|
-
if (contribution?.kind === 'connection') {
|
|
130
|
-
harness.apps.attach(contribution.id.slice(`${plugin.id}/connection/`.length), scope, on)
|
|
131
|
-
} else {
|
|
132
|
-
const registryItem = plugin.id === YOURS_PLUGIN.id || plugin.id === INCLUDED_PLUGIN.id
|
|
133
|
-
// A registry item's choice is stored under its own id; anything found, under its id and then its plugin's.
|
|
134
|
-
const ids = registryItem ? [contribution!.id.slice(plugin.id.length + 1)] : contribution ? [contribution.id, plugin.id] : [plugin.id]
|
|
135
|
-
// What it is until a person says otherwise: a built-in registry item is on, a person's own is
|
|
136
|
-
// off, a part that ships switched off is off, and anything found on disk is on.
|
|
137
|
-
const shipped = harness.descriptors.find((descriptor) => descriptor.id === plugin.id)?.switchable
|
|
138
|
-
const fallback = registryItem ? plugin.id === INCLUDED_PLUGIN.id : shipped ? shipped.on : true
|
|
139
|
-
const choices = attachments.load(root)
|
|
140
|
-
attachments.set(choices, ids, scope, on, fallback)
|
|
141
|
-
attachments.save(root, choices)
|
|
142
|
-
}
|
|
143
|
-
harness.bus.emit({ type: 'plugins.changed' })
|
|
144
|
-
return list(harness, params)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/** Saves the numbers a person set on a plugin. Each must be one of the plugin's settings and inside its range. */
|
|
148
|
-
export async function configure(harness: Harness, params: PluginScope & { pluginId: string; settings: Record<string, unknown> }): Promise<Plugin[]> {
|
|
149
|
-
const descriptor = harness.descriptors.find((candidate) => candidate.id === params.pluginId)
|
|
150
|
-
if (!descriptor?.settings?.length) throw invalid('This plugin has no settings.')
|
|
151
|
-
const choices = attachments.load(harness.env.root)
|
|
152
|
-
const saved: Record<string, unknown> = { ...choices.settings[descriptor.id] }
|
|
153
|
-
for (const [key, value] of Object.entries(params.settings ?? {})) {
|
|
154
|
-
const setting = descriptor.settings.find((candidate) => candidate.key === key)
|
|
155
|
-
if (!setting) throw invalid(`${descriptor.title} has no setting called "${key}".`)
|
|
156
|
-
if (typeof value !== 'number' || !Number.isFinite(value) || value < setting.min || value > setting.max) throw invalid(`${setting.label} must be a number from ${setting.min} to ${setting.max}.`)
|
|
157
|
-
saved[key] = Math.floor(value)
|
|
158
|
-
}
|
|
159
|
-
choices.settings[descriptor.id] = saved
|
|
160
|
-
attachments.save(harness.env.root, choices)
|
|
161
|
-
harness.bus.emit({ type: 'plugins.changed' })
|
|
162
|
-
return list(harness, params)
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Makes sure the packages that loaded before trust was asked per package were taken over, before
|
|
167
|
-
* something new is written that must not be taken over with them.
|
|
168
|
-
*/
|
|
169
|
-
export async function ensureAdopted(harness: Harness): Promise<void> {
|
|
170
|
-
if (harness.plugins.trust.adopted) return
|
|
171
|
-
await loadingFor(harness, {})
|
|
172
|
-
if (!harness.plugins.trust.adopted) harness.plugins.trust.adopt([])
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/** Forgets what was switched for an agent that no longer exists. */
|
|
176
|
-
export function forgetAgent(harness: Harness, agentId: string): void {
|
|
177
|
-
const choices = attachments.load(harness.env.root)
|
|
178
|
-
if (!choices.agents[agentId]) return
|
|
179
|
-
attachments.forget(choices, { agentId })
|
|
180
|
-
attachments.save(harness.env.root, choices)
|
|
181
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdtempSync, readFileSync } from 'node:fs'
|
|
2
|
-
import { tmpdir } from 'node:os'
|
|
3
|
-
import { join } from 'node:path'
|
|
4
|
-
import { describe, expect, it } from 'vitest'
|
|
5
|
-
|
|
6
|
-
import { writeJson } from '../core/fs'
|
|
7
|
-
import { attached, decided, describe as where, load, save, set, type Attachments } from './attachments'
|
|
8
|
-
|
|
9
|
-
const empty = (): Attachments => ({ version: 1, global: { on: [], off: [] }, agents: {}, projects: {}, settings: {} })
|
|
10
|
-
|
|
11
|
-
describe('what is switched on, and for whom', () => {
|
|
12
|
-
it('follows the narrowest scope that says something', () => {
|
|
13
|
-
const choices = empty()
|
|
14
|
-
choices.global.on = ['skill']
|
|
15
|
-
choices.projects.p1 = { on: [], off: ['skill'] }
|
|
16
|
-
choices.agents.a1 = { on: ['skill'], off: [] }
|
|
17
|
-
choices.agents.a2 = { on: [], off: ['other'] }
|
|
18
|
-
const rows: [string, { agentId?: string; projectId?: string }, boolean | null][] = [
|
|
19
|
-
['skill', {}, true],
|
|
20
|
-
['skill', { projectId: 'p1' }, false],
|
|
21
|
-
['skill', { projectId: 'p2' }, true],
|
|
22
|
-
// An agent's own choice holds in every project it works in.
|
|
23
|
-
['skill', { agentId: 'a1', projectId: 'p1' }, true],
|
|
24
|
-
['skill', { agentId: 'a2', projectId: 'p1' }, false],
|
|
25
|
-
['other', { agentId: 'a2' }, false],
|
|
26
|
-
['other', {}, null]
|
|
27
|
-
]
|
|
28
|
-
for (const [id, caller, expected] of rows) expect([id, caller, decided(choices, [id], caller)]).toEqual([id, caller, expected])
|
|
29
|
-
// With no entry, a thing keeps its own default.
|
|
30
|
-
expect([attached(choices, ['other'], {}, true), attached(choices, ['other'], {}, false)]).toEqual([true, false])
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('lets one item of a plugin differ from the plugin', () => {
|
|
34
|
-
const choices = empty()
|
|
35
|
-
choices.global.off = ['package:kit']
|
|
36
|
-
choices.projects.p1 = { on: ['package:kit/skill/audit'], off: [] }
|
|
37
|
-
expect(attached(choices, ['package:kit/skill/audit', 'package:kit'], {}, true)).toBe(false)
|
|
38
|
-
expect(attached(choices, ['package:kit/skill/audit', 'package:kit'], { projectId: 'p1' }, true)).toBe(true)
|
|
39
|
-
expect(attached(choices, ['package:kit/code/guard.ts', 'package:kit'], { projectId: 'p1' }, true)).toBe(false)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
it('keeps a choice only where it differs from the wider scope', () => {
|
|
43
|
-
const choices = empty()
|
|
44
|
-
set(choices, ['shared/code/a.ts', 'shared'], {}, false, true)
|
|
45
|
-
expect(choices.global).toEqual({ on: [], off: ['shared/code/a.ts'] })
|
|
46
|
-
// On again is the default, so nothing is stored.
|
|
47
|
-
set(choices, ['shared/code/a.ts', 'shared'], {}, true, true)
|
|
48
|
-
expect(choices.global).toEqual({ on: [], off: [] })
|
|
49
|
-
|
|
50
|
-
set(choices, ['skills/review'], { agentId: 'a1' }, true, false)
|
|
51
|
-
expect(choices.agents.a1).toEqual({ on: ['skills/review'], off: [] })
|
|
52
|
-
// Switching it on everywhere and then off for the agent keeps the agent's own choice.
|
|
53
|
-
set(choices, ['skills/review'], {}, true, false)
|
|
54
|
-
set(choices, ['skills/review'], { agentId: 'a1' }, false, false)
|
|
55
|
-
expect(choices.agents.a1).toEqual({ on: [], off: ['skills/review'] })
|
|
56
|
-
set(choices, ['skills/review'], { agentId: 'a1' }, true, false)
|
|
57
|
-
expect(choices.agents.a1).toEqual({ on: [], off: [] })
|
|
58
|
-
|
|
59
|
-
// A project's choice cannot stand in for an agent's, so the agent's is kept as said.
|
|
60
|
-
set(choices, ['skills/review'], { projectId: 'p1' }, false, false)
|
|
61
|
-
set(choices, ['skills/review'], { agentId: 'a1' }, true, false)
|
|
62
|
-
expect(choices.agents.a1.on).toEqual(['skills/review'])
|
|
63
|
-
expect(where(choices, 'skills/review', false)).toEqual({ global: true, on: { agentIds: ['a1'], projectIds: [] }, off: { agentIds: [], projectIds: ['p1'] } })
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it("reads the registry's earlier file until the first change, and never rewrites it", () => {
|
|
67
|
-
const root = mkdtempSync(join(tmpdir(), 'attach-'))
|
|
68
|
-
const legacy = join(root, 'config/registry-enabled.json')
|
|
69
|
-
writeJson(legacy, { global: ['rules/tests'], personal: ['skills/old'], p1: ['skills/review'], builtinOff: ['rules/plain'] })
|
|
70
|
-
const before = readFileSync(legacy, 'utf8')
|
|
71
|
-
const choices = load(root)
|
|
72
|
-
expect(choices.global).toEqual({ on: ['rules/tests', 'skills/old'], off: ['rules/plain'] })
|
|
73
|
-
expect(choices.projects).toEqual({ p1: { on: ['skills/review'], off: [] } })
|
|
74
|
-
expect(existsSync(join(root, 'config/plugin-attachments.json'))).toBe(false)
|
|
75
|
-
|
|
76
|
-
set(choices, ['skills/review'], { agentId: 'a1' }, true, false)
|
|
77
|
-
save(root, choices)
|
|
78
|
-
expect(readFileSync(legacy, 'utf8')).toBe(before)
|
|
79
|
-
expect(load(root)).toEqual(choices)
|
|
80
|
-
// From here the earlier file is not read any more.
|
|
81
|
-
writeJson(legacy, { global: [] })
|
|
82
|
-
expect(load(root).global.on).toEqual(['rules/tests', 'skills/old'])
|
|
83
|
-
})
|
|
84
|
-
})
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
// What is switched on, and for whom. One file in the data root holds every choice a person made
|
|
2
|
-
// about a plugin or one of its contributions; one rule reads it: the narrowest scope that says
|
|
3
|
-
// something wins, an agent before a project before everywhere. With no entry, the thing keeps
|
|
4
|
-
// its own default (what loads today stays on; a person's registry item is off until switched on).
|
|
5
|
-
import { join } from 'node:path'
|
|
6
|
-
|
|
7
|
-
import { readJsonOr, writeJson } from '../core/fs'
|
|
8
|
-
|
|
9
|
-
/** Who a choice applies to. Neither id means everywhere. */
|
|
10
|
-
export interface AttachScope {
|
|
11
|
-
agentId?: string | null
|
|
12
|
-
projectId?: string | null
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface Entries {
|
|
16
|
-
on: string[]
|
|
17
|
-
off: string[]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface Attachments {
|
|
21
|
-
version: 1
|
|
22
|
-
global: Entries
|
|
23
|
-
agents: Record<string, Entries>
|
|
24
|
-
projects: Record<string, Entries>
|
|
25
|
-
/** Values a plugin reads, such as a limit. Keyed by plugin id. */
|
|
26
|
-
settings: Record<string, Record<string, unknown>>
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Where one id is switched on and off, as data for a screen. */
|
|
30
|
-
export interface Attachment {
|
|
31
|
-
/** On everywhere, unless a narrower scope says otherwise. */
|
|
32
|
-
global: boolean
|
|
33
|
-
on: { agentIds: string[]; projectIds: string[] }
|
|
34
|
-
off: { agentIds: string[]; projectIds: string[] }
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const path = (root: string): string => join(root, 'config/plugin-attachments.json')
|
|
38
|
-
const legacyPath = (root: string): string => join(root, 'config/registry-enabled.json')
|
|
39
|
-
|
|
40
|
-
const strings = (value: unknown): string[] => (Array.isArray(value) ? value.filter((id): id is string => typeof id === 'string') : [])
|
|
41
|
-
const entries = (value: unknown): Entries => {
|
|
42
|
-
const record = (value && typeof value === 'object' ? value : {}) as Record<string, unknown>
|
|
43
|
-
return { on: strings(record.on), off: strings(record.off) }
|
|
44
|
-
}
|
|
45
|
-
const scoped = (value: unknown): Record<string, Entries> => Object.fromEntries(Object.entries((value && typeof value === 'object' && !Array.isArray(value) ? value : {}) as Record<string, unknown>).map(([id, item]) => [id, entries(item)]))
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* The registry's earlier file: enabled ids keyed by project id, `global` (once `personal`) for
|
|
49
|
-
* everyone, and `builtinOff` for built-in items a person switched off. It is read until the
|
|
50
|
-
* first change is saved here, and never written again.
|
|
51
|
-
*/
|
|
52
|
-
function fromLegacy(root: string): Attachments {
|
|
53
|
-
const legacy = readJsonOr<unknown>(legacyPath(root), {})
|
|
54
|
-
const map = (legacy && typeof legacy === 'object' && !Array.isArray(legacy) ? legacy : {}) as Record<string, unknown>
|
|
55
|
-
const projects: Record<string, Entries> = {}
|
|
56
|
-
for (const [key, ids] of Object.entries(map)) {
|
|
57
|
-
if (key === 'global' || key === 'personal' || key === 'builtinOff') continue
|
|
58
|
-
projects[key] = { on: strings(ids), off: [] }
|
|
59
|
-
}
|
|
60
|
-
return { version: 1, global: { on: [...new Set([...strings(map.global), ...strings(map.personal)])], off: strings(map.builtinOff) }, agents: {}, projects, settings: {} }
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function load(root: string): Attachments {
|
|
64
|
-
const stored = readJsonOr<Record<string, unknown> | null>(path(root), null)
|
|
65
|
-
if (!stored || typeof stored !== 'object' || stored.version !== 1) return fromLegacy(root)
|
|
66
|
-
const settings = (stored.settings && typeof stored.settings === 'object' && !Array.isArray(stored.settings) ? stored.settings : {}) as Attachments['settings']
|
|
67
|
-
return { version: 1, global: entries(stored.global), agents: scoped(stored.agents), projects: scoped(stored.projects), settings }
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export function save(root: string, attachments: Attachments): void {
|
|
71
|
-
const kept = (map: Record<string, Entries>): Record<string, Entries> => Object.fromEntries(Object.entries(map).filter(([, item]) => item.on.length || item.off.length))
|
|
72
|
-
writeJson(path(root), { ...attachments, agents: kept(attachments.agents), projects: kept(attachments.projects) })
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const said = (item: Entries | undefined, ids: readonly string[]): boolean | null => {
|
|
76
|
-
if (!item) return null
|
|
77
|
-
// The first id is the thing itself; the rest are what it belongs to.
|
|
78
|
-
for (const id of ids) {
|
|
79
|
-
if (item.off.includes(id)) return false
|
|
80
|
-
if (item.on.includes(id)) return true
|
|
81
|
-
}
|
|
82
|
-
return null
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/** What the stored choices say for a caller, or `null` when none applies. `ids` is the thing, then what it belongs to. */
|
|
86
|
-
export function decided(attachments: Attachments, ids: readonly string[], caller: AttachScope = {}): boolean | null {
|
|
87
|
-
return (caller.agentId ? said(attachments.agents[caller.agentId], ids) : null) ?? (caller.projectId ? said(attachments.projects[caller.projectId], ids) : null) ?? said(attachments.global, ids)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function attached(attachments: Attachments, ids: readonly string[], caller: AttachScope, fallback: boolean): boolean {
|
|
91
|
-
return decided(attachments, ids, caller) ?? fallback
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function entriesAt(attachments: Attachments, scope: AttachScope): Entries {
|
|
95
|
-
if (scope.agentId) return (attachments.agents[scope.agentId] ??= { on: [], off: [] })
|
|
96
|
-
if (scope.projectId) return (attachments.projects[scope.projectId] ??= { on: [], off: [] })
|
|
97
|
-
return attachments.global
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Switches one thing on or off for a scope. A choice that only repeats what the wider scopes
|
|
102
|
-
* already say is not kept, so the thing follows them again when they change.
|
|
103
|
-
*/
|
|
104
|
-
export function set(attachments: Attachments, ids: readonly string[], scope: AttachScope, on: boolean, fallback: boolean): void {
|
|
105
|
-
const [id] = ids
|
|
106
|
-
const target = entriesAt(attachments, scope.agentId ? { agentId: scope.agentId } : scope)
|
|
107
|
-
target.on = target.on.filter((item) => item !== id)
|
|
108
|
-
target.off = target.off.filter((item) => item !== id)
|
|
109
|
-
// An agent works in different projects, so a project's choice about this thing cannot stand in for the agent's.
|
|
110
|
-
const projectSays = !!scope.agentId && Object.values(attachments.projects).some((item) => said(item, ids) !== null)
|
|
111
|
-
const inherited = decided(attachments, ids, scope.agentId ? { agentId: scope.agentId } : scope) ?? fallback
|
|
112
|
-
if (on !== inherited || projectSays) (on ? target.on : target.off).push(id)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export function describe(attachments: Attachments, id: string, fallback: boolean): Attachment {
|
|
116
|
-
const where = (map: Record<string, Entries>, list: 'on' | 'off'): string[] => Object.entries(map).filter(([, item]) => item[list].includes(id)).map(([key]) => key)
|
|
117
|
-
return {
|
|
118
|
-
global: said(attachments.global, [id]) ?? fallback,
|
|
119
|
-
on: { agentIds: where(attachments.agents, 'on'), projectIds: where(attachments.projects, 'on') },
|
|
120
|
-
off: { agentIds: where(attachments.agents, 'off'), projectIds: where(attachments.projects, 'off') }
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/** Forgets an agent's or a project's own choices, when it is deleted. */
|
|
125
|
-
export function forget(attachments: Attachments, scope: AttachScope): void {
|
|
126
|
-
if (scope.agentId) delete attachments.agents[scope.agentId]
|
|
127
|
-
if (scope.projectId) delete attachments.projects[scope.projectId]
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** Removes one capability's choices without disturbing the other items in each scope. */
|
|
131
|
-
export function forgetId(attachments: Attachments, id: string): void {
|
|
132
|
-
const forgetFrom = (item: Entries): void => {
|
|
133
|
-
item.on = item.on.filter((entry) => entry !== id)
|
|
134
|
-
item.off = item.off.filter((entry) => entry !== id)
|
|
135
|
-
}
|
|
136
|
-
forgetFrom(attachments.global)
|
|
137
|
-
for (const item of Object.values(attachments.agents)) forgetFrom(item)
|
|
138
|
-
for (const item of Object.values(attachments.projects)) forgetFrom(item)
|
|
139
|
-
attachments.agents = Object.fromEntries(Object.entries(attachments.agents).filter(([, item]) => item.on.length || item.off.length))
|
|
140
|
-
attachments.projects = Object.fromEntries(Object.entries(attachments.projects).filter(([, item]) => item.on.length || item.off.length))
|
|
141
|
-
}
|
package/src/plugins/builtin.ts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
// The harness's own parts, described as plugins. Each is a description of code that already
|
|
2
|
-
// exists; none of it is loaded through Pi's extension system.
|
|
3
|
-
import { CONNECTION_TOOLS, NATIVE_GROUP } from '../prompt/compile'
|
|
4
|
-
import { ASK_USER } from '../tools/askUser'
|
|
5
|
-
import { PLUGIN_PROPOSE } from '../tools/pluginPropose'
|
|
6
|
-
import { MEMORY_TOOLS, RECALL_TOOLS, WIKI_TOOLS, type WikiToolDefinition } from '../tools/definitions'
|
|
7
|
-
import { FIRST_PARTY_PLUGINS } from './firstParty'
|
|
8
|
-
import type { PluginDescriptor } from './types'
|
|
9
|
-
|
|
10
|
-
const tools = (definitions: readonly WikiToolDefinition[]): PluginDescriptor['tools'] => definitions.map((tool) => ({ name: tool.name, description: tool.label }))
|
|
11
|
-
|
|
12
|
-
/** Pi itself. Its command's built-in extensions are added to it as they are found. */
|
|
13
|
-
export const PI_PLUGIN: PluginDescriptor = {
|
|
14
|
-
id: 'pi',
|
|
15
|
-
title: 'Pi',
|
|
16
|
-
description: 'The engine every session runs on: its base prompt, its file and shell tools, and the extensions built into its command.',
|
|
17
|
-
required: 'Pi runs every session.',
|
|
18
|
-
tools: NATIVE_GROUP.map((name) => ({ name })),
|
|
19
|
-
toolGroups: ['Native']
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** A person's own registry. It owns the rules and skills sections even while it is empty. */
|
|
23
|
-
export const YOURS_PLUGIN: PluginDescriptor = {
|
|
24
|
-
id: 'yours',
|
|
25
|
-
title: 'Yours',
|
|
26
|
-
description: 'Rules, skills and prompts you wrote, kept as files in the registry folder.',
|
|
27
|
-
manage: 'registry',
|
|
28
|
-
sections: [
|
|
29
|
-
{ id: 'rules', name: 'Rules', description: 'The full text of every rule that is on.' },
|
|
30
|
-
{ id: 'skills', name: 'Skills list', description: 'One line for each skill that is on.' }
|
|
31
|
-
],
|
|
32
|
-
tools: WIKI_TOOLS.filter((tool) => tool.name === 'skill_load').map((tool) => ({ name: tool.name, description: tool.label }))
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export const INCLUDED_PLUGIN: PluginDescriptor = { id: 'included', title: 'Included', description: 'Rules, skills and prompts that ship with the app.', manage: 'registry' }
|
|
36
|
-
|
|
37
|
-
export const HARNESS_PLUGINS: readonly PluginDescriptor[] = [
|
|
38
|
-
PI_PLUGIN,
|
|
39
|
-
{
|
|
40
|
-
id: 'memory',
|
|
41
|
-
title: 'Memory',
|
|
42
|
-
description: 'Blocks of text that are always in context and that the agent edits as it works.',
|
|
43
|
-
required: 'Every agent keeps its own memory, and the background upkeep depends on it.',
|
|
44
|
-
// Facts are memory too: what the agent wrote down, recalled on request.
|
|
45
|
-
tools: tools([...MEMORY_TOOLS, ...WIKI_TOOLS.filter((tool) => tool.name === 'memory_facts')]),
|
|
46
|
-
sections: [{ id: 'blocks', name: 'Memory blocks', description: 'Every block attached to the caller, in full.' }],
|
|
47
|
-
toolGroups: ['Memory']
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
id: 'wiki',
|
|
51
|
-
title: 'Wiki',
|
|
52
|
-
description: 'Pages and facts the agent searches, reads, and proposes changes to.',
|
|
53
|
-
required: 'What was learned is recorded and checked here.',
|
|
54
|
-
// `WIKI_TOOLS` is every memory tool; the Wiki's own are the ones that are not Memory's or History's.
|
|
55
|
-
tools: tools(WIKI_TOOLS.filter((tool) => tool.name.startsWith('wiki_'))),
|
|
56
|
-
sections: [
|
|
57
|
-
{ id: 'knowledge', name: 'Knowledge map', description: 'Project pages, the Library count, and facts that match the request.' },
|
|
58
|
-
{ id: 'references', name: 'Selected references', description: 'Pages and skills pinned to one request.' }
|
|
59
|
-
],
|
|
60
|
-
toolGroups: ['Knowledge']
|
|
61
|
-
},
|
|
62
|
-
{ id: 'history', title: 'History', description: 'Search over earlier conversations and runs.', required: 'Earlier runs are how an agent picks up where work stopped.', tools: tools(RECALL_TOOLS) },
|
|
63
|
-
{
|
|
64
|
-
id: 'plugin-proposals',
|
|
65
|
-
title: 'Plugin proposals',
|
|
66
|
-
description: 'Lets an agent propose a plugin. You accept it in the Inbox, switch it on, and trust its code; an agent can do none of those.',
|
|
67
|
-
required: 'It only proposes. Nothing is saved or run until you decide.',
|
|
68
|
-
tools: [{ name: PLUGIN_PROPOSE, description: 'Propose a plugin' }]
|
|
69
|
-
},
|
|
70
|
-
{ id: 'ask-user', title: 'Ask the user', description: 'Lets the agent stop and ask a question with choices.', required: 'An agent must be able to stop and ask you.', tools: [{ name: ASK_USER }] },
|
|
71
|
-
{
|
|
72
|
-
id: 'connected-apps',
|
|
73
|
-
title: 'Connected apps',
|
|
74
|
-
description: 'Outside services reached over MCP, behind two tools that list and call what is connected.',
|
|
75
|
-
required: 'Connected apps are reached only through it. Each app is switched on its own.',
|
|
76
|
-
manage: 'connections',
|
|
77
|
-
tools: CONNECTION_TOOLS.map((name) => ({ name })),
|
|
78
|
-
toolGroups: ['Connections']
|
|
79
|
-
},
|
|
80
|
-
YOURS_PLUGIN,
|
|
81
|
-
...FIRST_PARTY_PLUGINS
|
|
82
|
-
]
|