@xingular/harness 0.1.6 → 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 +107 -0
- package/LICENSE +202 -0
- package/NOTICE.md +60 -0
- package/README.md +265 -71
- package/THIRD_PARTY_LICENSES.md +942 -0
- package/dist/cli.js +14842 -9445
- 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 +1170 -62
- package/docs/README.md +34 -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-0001-owned-terminal.md +87 -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 +671 -0
- package/package.json +48 -12
- package/src/accounts/accounts.test.ts +0 -223
- package/src/accounts/accounts.ts +0 -522
- 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 -114
- 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 -299
- package/src/index.ts +0 -70
- 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 -289
- package/src/memory/blocks.test.ts +0 -78
- package/src/memory/blocks.ts +0 -406
- package/src/memory/caller.ts +0 -57
- 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 -330
- package/src/memory/migrate.ts +0 -79
- package/src/memory/operations.ts +0 -138
- package/src/memory/proposals.test.ts +0 -168
- package/src/memory/proposals.ts +0 -576
- package/src/memory/recall.test.ts +0 -104
- package/src/memory/recall.ts +0 -271
- 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 -314
- 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 -310
- package/src/sessions/conversation.test.ts +0 -150
- 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 -32
- package/src/sessions/pricing.ts +0 -60
- package/src/sessions/reasoningSummaries.ts +0 -59
- package/src/sessions/registry.ts +0 -294
- 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 -569
- package/src/sessions/runtimeResources.test.ts +0 -61
- package/src/sessions/sessions.test.ts +0 -455
- package/src/sessions/sessions.ts +0 -295
- package/src/skills/registry.test.ts +0 -104
- package/src/skills/registry.ts +0 -407
- package/src/terminal/cli.ts +0 -149
- package/src/terminal/client.ts +0 -74
- package/src/terminal/controller.ts +0 -227
- package/src/terminal/launch.test.ts +0 -34
- package/src/terminal/launch.ts +0 -88
- package/src/terminal/piExtension.ts +0 -210
- 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 -221
- package/src/terminal/standalone.test.ts +0 -130
- package/src/terminal/standalone.ts +0 -144
- package/src/terminal/terminal.test.ts +0 -330
- package/src/terminal/terminals.ts +0 -443
- package/src/tools/askUser.ts +0 -45
- package/src/tools/definitions.ts +0 -187
- package/src/tools/memoryTools.ts +0 -22
- package/src/tools/pluginPropose.ts +0 -41
- 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
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
|
|
2
|
+
import { FilterList } from "../list.js";
|
|
3
|
+
const SECTIONS = [
|
|
4
|
+
{ id: 'overview', title: 'Overview' },
|
|
5
|
+
{ id: 'tools', title: 'Tools' }
|
|
6
|
+
];
|
|
7
|
+
const FULL = 'full';
|
|
8
|
+
const NOTE = 'Applies to future approvals only. Hard denials and disabled tools still apply.';
|
|
9
|
+
const FULL_WARNING = 'Automatically approve eligible future requests in every Pi terminal session sharing this local Harness state. Hard denials and disabled tools still apply; human-only requests stay manual unless the host explicitly opts them in. Requests already waiting are not approved.';
|
|
10
|
+
export class PermissionsPage {
|
|
11
|
+
options;
|
|
12
|
+
state;
|
|
13
|
+
section = 'overview';
|
|
14
|
+
error;
|
|
15
|
+
busy = false;
|
|
16
|
+
disposed = false;
|
|
17
|
+
list;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.list = new FilterList({
|
|
21
|
+
theme: options.theme, search: 'always', noun: ['tool', 'tools'], empty: 'No tools to show',
|
|
22
|
+
onActivate: row => { void this.toggle(row.id); },
|
|
23
|
+
onToggle: row => { void this.toggle(row.id); }
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
get focused() { return this.list.focused; }
|
|
27
|
+
set focused(value) { this.list.focused = value; }
|
|
28
|
+
activate() { void this.reload(); }
|
|
29
|
+
dispose() { this.disposed = true; }
|
|
30
|
+
tabs() { return SECTIONS; }
|
|
31
|
+
activeTab() { return this.section; }
|
|
32
|
+
hint() { return this.list.query ? 'Enter toggle · Esc clear' : 'Space or Enter toggle · type to search'; }
|
|
33
|
+
async reload() {
|
|
34
|
+
try {
|
|
35
|
+
this.state = await this.options.permissions();
|
|
36
|
+
this.error = undefined;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
this.error = error instanceof Error ? error.message : String(error);
|
|
40
|
+
}
|
|
41
|
+
if (this.disposed)
|
|
42
|
+
return;
|
|
43
|
+
this.fill();
|
|
44
|
+
this.options.changed();
|
|
45
|
+
}
|
|
46
|
+
fill() {
|
|
47
|
+
this.list.setRows(this.rows());
|
|
48
|
+
}
|
|
49
|
+
rows() {
|
|
50
|
+
const state = this.state;
|
|
51
|
+
if (!state)
|
|
52
|
+
return [];
|
|
53
|
+
if (this.section === 'overview') {
|
|
54
|
+
return [{ id: FULL, label: 'Full Permission', group: 'Mode', detail: state.full ? 'ON' : 'OFF', tone: state.full ? 'warning' : 'muted', searchText: 'full permission approve everything' }];
|
|
55
|
+
}
|
|
56
|
+
const granted = new Set(state.globalTools);
|
|
57
|
+
const active = this.options.activeTools();
|
|
58
|
+
const inactive = [...granted].filter(tool => !active.includes(tool));
|
|
59
|
+
const byName = (left, right) => left.localeCompare(right);
|
|
60
|
+
const tool = (name, group) => ({
|
|
61
|
+
id: 'tool:' + name, label: name, group,
|
|
62
|
+
detail: granted.has(name) ? '● allowed everywhere' : '○ asks each time',
|
|
63
|
+
tone: granted.has(name) ? 'success' : 'muted'
|
|
64
|
+
});
|
|
65
|
+
return [
|
|
66
|
+
...[...active].sort(byName).map(name => tool(name, 'Tools in this session')),
|
|
67
|
+
...inactive.sort(byName).map(name => tool(name, 'Granted, not active here'))
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
async toggle(id) {
|
|
71
|
+
if (this.busy || !this.state)
|
|
72
|
+
return;
|
|
73
|
+
this.busy = true;
|
|
74
|
+
try {
|
|
75
|
+
if (id === FULL) {
|
|
76
|
+
const desired = !this.state.full;
|
|
77
|
+
const latest = await this.options.permissions();
|
|
78
|
+
if (latest.full !== desired && (!desired || await this.options.confirm('Enable Full Permission?', FULL_WARNING)))
|
|
79
|
+
await this.options.setFullPermission(desired);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const tool = id.slice('tool:'.length);
|
|
83
|
+
if (!tool)
|
|
84
|
+
return;
|
|
85
|
+
const desired = !this.state.globalTools.includes(tool);
|
|
86
|
+
const latest = await this.options.permissions();
|
|
87
|
+
if (latest.globalTools.includes(tool) !== desired)
|
|
88
|
+
await this.options.setGlobalTool(tool, desired);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
this.options.notify(error instanceof Error ? error.message : String(error), 'error');
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
this.busy = false;
|
|
96
|
+
}
|
|
97
|
+
await this.reload();
|
|
98
|
+
}
|
|
99
|
+
handleMouse(event) {
|
|
100
|
+
return this.list.handleMouse(event);
|
|
101
|
+
}
|
|
102
|
+
handleInput(data) {
|
|
103
|
+
if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
|
|
104
|
+
if (!this.list.query) {
|
|
105
|
+
this.section = this.section === 'overview' ? 'tools' : 'overview';
|
|
106
|
+
this.fill();
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return this.list.handleInput(data);
|
|
111
|
+
}
|
|
112
|
+
render(width, rows) {
|
|
113
|
+
const theme = this.options.theme();
|
|
114
|
+
if (width < 1 || rows < 1)
|
|
115
|
+
return [];
|
|
116
|
+
if (!this.state)
|
|
117
|
+
return [theme.fg(this.error ? 'error' : 'dim', this.error ? `Could not read permissions: ${this.error}` : 'Reading permissions…')];
|
|
118
|
+
const note = this.section === 'overview' && rows >= 8 ? wrapTextWithAnsi(NOTE, width).slice(0, 2) : [];
|
|
119
|
+
const lines = this.list.render(width, Math.max(1, rows - (note.length ? note.length + 1 : 0)));
|
|
120
|
+
if (note.length)
|
|
121
|
+
lines.push('', ...note.map(line => theme.fg('dim', line)));
|
|
122
|
+
return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Plugins page: what this session loads, switched on or off, with trust for plugin code.
|
|
3
|
+
* Enter opens what can be done with a row; nothing changes without a choice made here. A plugin
|
|
4
|
+
* with settings has a Settings row that opens them as a subpage; Esc goes back to the list.
|
|
5
|
+
*/
|
|
6
|
+
import type { Theme } from '@earendil-works/pi-coding-agent';
|
|
7
|
+
import { type MenuCall, type MenuUi } from "../../pluginMenu.js";
|
|
8
|
+
import type { TabInfo } from "../chrome.js";
|
|
9
|
+
import type { TerminalPage } from "../page.js";
|
|
10
|
+
import type { TerminalMouseInput } from "../mouse.js";
|
|
11
|
+
export interface PluginsPageOptions {
|
|
12
|
+
theme: () => Theme;
|
|
13
|
+
call: MenuCall;
|
|
14
|
+
ui: MenuUi & {
|
|
15
|
+
input(title: string, placeholder?: string): Promise<string | undefined>;
|
|
16
|
+
};
|
|
17
|
+
changed(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare class PluginsPage implements TerminalPage {
|
|
20
|
+
private readonly options;
|
|
21
|
+
private plugins;
|
|
22
|
+
private section;
|
|
23
|
+
private projectId;
|
|
24
|
+
private error;
|
|
25
|
+
private restart;
|
|
26
|
+
private busy;
|
|
27
|
+
private disposed;
|
|
28
|
+
private readonly list;
|
|
29
|
+
/** The plugin whose settings are open, or null on the list. */
|
|
30
|
+
private settingsFor;
|
|
31
|
+
private saved;
|
|
32
|
+
private readonly settingsList;
|
|
33
|
+
constructor(options: PluginsPageOptions);
|
|
34
|
+
get focused(): boolean;
|
|
35
|
+
set focused(value: boolean);
|
|
36
|
+
activate(): void;
|
|
37
|
+
dispose(): void;
|
|
38
|
+
tabs(): readonly TabInfo[];
|
|
39
|
+
activeTab(): string;
|
|
40
|
+
hint(): string;
|
|
41
|
+
private settingsPlugin;
|
|
42
|
+
private reload;
|
|
43
|
+
private fill;
|
|
44
|
+
/** The menu rows, with a Settings row after the last row of each plugin that has settings. */
|
|
45
|
+
private rows;
|
|
46
|
+
private menu;
|
|
47
|
+
private key;
|
|
48
|
+
private toRow;
|
|
49
|
+
private open;
|
|
50
|
+
private back;
|
|
51
|
+
/** Flips a switch, or asks for a number inside the setting's range, and saves it. */
|
|
52
|
+
private change;
|
|
53
|
+
handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
|
|
54
|
+
handleInput(data: string): boolean;
|
|
55
|
+
render(width: number, rows: number): string[];
|
|
56
|
+
private renderSettings;
|
|
57
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
|
|
2
|
+
import { BACK, applyPluginAction, menuRows, rowActions } from "../../pluginMenu.js";
|
|
3
|
+
import { safeText } from "../chrome.js";
|
|
4
|
+
import { FilterList } from "../list.js";
|
|
5
|
+
const SECTIONS = [
|
|
6
|
+
{ id: 'plugins', title: 'Plugins' },
|
|
7
|
+
{ id: 'trust', title: 'Trust' }
|
|
8
|
+
];
|
|
9
|
+
const SETTINGS_ROW = 'settings:';
|
|
10
|
+
const isSwitch = (setting) => setting.min === 0 && setting.max === 1;
|
|
11
|
+
const settingValueText = (setting) => isSwitch(setting)
|
|
12
|
+
? setting.value === 1 ? 'on' : 'off'
|
|
13
|
+
: `${setting.value.toLocaleString('en-US')}${setting.value === setting.default ? ' · default' : ''}`;
|
|
14
|
+
const settingsOf = (plugin) => plugin.settings ?? [];
|
|
15
|
+
export class PluginsPage {
|
|
16
|
+
options;
|
|
17
|
+
plugins;
|
|
18
|
+
section = 'plugins';
|
|
19
|
+
projectId = null;
|
|
20
|
+
error;
|
|
21
|
+
restart = false;
|
|
22
|
+
busy = false;
|
|
23
|
+
disposed = false;
|
|
24
|
+
list;
|
|
25
|
+
/** The plugin whose settings are open, or null on the list. */
|
|
26
|
+
settingsFor = null;
|
|
27
|
+
saved = false;
|
|
28
|
+
settingsList;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.options = options;
|
|
31
|
+
this.list = new FilterList({
|
|
32
|
+
theme: options.theme, search: 'always', noun: ['item', 'items'], empty: 'There is nothing to switch or trust here yet.',
|
|
33
|
+
onActivate: row => { void this.open(row.id); }
|
|
34
|
+
});
|
|
35
|
+
this.settingsList = new FilterList({
|
|
36
|
+
theme: options.theme, search: 'always', noun: ['setting', 'settings'], empty: 'This plugin has no settings.',
|
|
37
|
+
onActivate: row => { void this.change(row.id); },
|
|
38
|
+
onCancel: () => this.back()
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
get focused() { return this.list.focused; }
|
|
42
|
+
set focused(value) {
|
|
43
|
+
this.list.focused = value;
|
|
44
|
+
this.settingsList.focused = value;
|
|
45
|
+
}
|
|
46
|
+
activate() { void this.reload(); }
|
|
47
|
+
dispose() { this.disposed = true; }
|
|
48
|
+
tabs() {
|
|
49
|
+
const plugin = this.settingsPlugin();
|
|
50
|
+
return plugin ? [{ id: 'settings', title: `Plugins › ${safeText(plugin.title)}` }] : SECTIONS;
|
|
51
|
+
}
|
|
52
|
+
activeTab() { return this.settingsPlugin() ? 'settings' : this.section; }
|
|
53
|
+
hint() {
|
|
54
|
+
if (this.settingsPlugin())
|
|
55
|
+
return this.settingsList.query ? 'Enter change · Esc clear' : 'Enter change · Esc back';
|
|
56
|
+
return this.list.query ? 'Enter actions · Esc clear' : 'Enter actions · type to search';
|
|
57
|
+
}
|
|
58
|
+
settingsPlugin() {
|
|
59
|
+
return this.settingsFor ? this.plugins?.find(plugin => plugin.id === this.settingsFor) : undefined;
|
|
60
|
+
}
|
|
61
|
+
async reload() {
|
|
62
|
+
try {
|
|
63
|
+
const { call } = this.options;
|
|
64
|
+
this.projectId = (await call('plugins.session').catch(() => ({ projectId: null }))).projectId;
|
|
65
|
+
this.plugins = await call('plugins.list');
|
|
66
|
+
this.error = undefined;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.error = error instanceof Error ? error.message : String(error);
|
|
70
|
+
}
|
|
71
|
+
if (this.disposed)
|
|
72
|
+
return;
|
|
73
|
+
this.fill();
|
|
74
|
+
this.options.changed();
|
|
75
|
+
}
|
|
76
|
+
fill() {
|
|
77
|
+
if (this.settingsFor && !this.settingsPlugin())
|
|
78
|
+
this.settingsFor = null;
|
|
79
|
+
this.list.setRows(this.rows());
|
|
80
|
+
const plugin = this.settingsPlugin();
|
|
81
|
+
if (plugin)
|
|
82
|
+
this.settingsList.setRows(settingsOf(plugin).map(setting => ({
|
|
83
|
+
id: setting.key, label: safeText(setting.label), detail: settingValueText(setting),
|
|
84
|
+
tone: isSwitch(setting) ? (setting.value === 1 ? 'success' : 'dim') : 'muted',
|
|
85
|
+
searchText: `${setting.label} ${setting.description}`
|
|
86
|
+
})));
|
|
87
|
+
}
|
|
88
|
+
/** The menu rows, with a Settings row after the last row of each plugin that has settings. */
|
|
89
|
+
rows() {
|
|
90
|
+
const menu = this.menu();
|
|
91
|
+
const out = [];
|
|
92
|
+
const placed = new Set();
|
|
93
|
+
const settingsRow = (plugin) => {
|
|
94
|
+
const count = settingsOf(plugin).length;
|
|
95
|
+
placed.add(plugin.id);
|
|
96
|
+
return { id: `${SETTINGS_ROW}${plugin.id}`, group: safeText(plugin.title), label: 'Settings', detail: `${count} ${count === 1 ? 'setting' : 'settings'} ›`, tone: 'muted', searchText: `${plugin.title} settings ${settingsOf(plugin).map(setting => setting.label).join(' ')}` };
|
|
97
|
+
};
|
|
98
|
+
menu.forEach((row, index) => {
|
|
99
|
+
out.push(this.toRow(row));
|
|
100
|
+
const last = menu[index + 1]?.plugin.id !== row.plugin.id;
|
|
101
|
+
if (this.section === 'plugins' && last && settingsOf(row.plugin).length)
|
|
102
|
+
out.push(settingsRow(row.plugin));
|
|
103
|
+
});
|
|
104
|
+
if (this.section === 'plugins') {
|
|
105
|
+
for (const plugin of this.plugins ?? [])
|
|
106
|
+
if (settingsOf(plugin).length && !placed.has(plugin.id))
|
|
107
|
+
out.push(settingsRow(plugin));
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
menu() {
|
|
112
|
+
const rows = menuRows(this.plugins ?? [], this.projectId);
|
|
113
|
+
return this.section === 'trust'
|
|
114
|
+
? rows.filter(row => row.whole && Boolean(row.plugin.code))
|
|
115
|
+
: rows.filter(row => rowActions(row, this.projectId).some(action => action.startsWith('Switch ')));
|
|
116
|
+
}
|
|
117
|
+
key(row) { return `${row.whole ? 'plugin' : 'item'}:${row.id}`; }
|
|
118
|
+
toRow(row) {
|
|
119
|
+
const kind = row.whole ? row.note : row.note.replace(/ in .*$/, '');
|
|
120
|
+
return {
|
|
121
|
+
id: this.key(row), group: safeText(row.plugin.title), label: row.whole ? 'Whole plugin' : safeText(row.name),
|
|
122
|
+
detail: `${row.on ? 'on' : 'off'}${kind ? ` · ${kind}` : ''}`, tone: row.on ? 'success' : 'dim',
|
|
123
|
+
searchText: `${row.name} ${row.plugin.title} ${row.note}`
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async open(id) {
|
|
127
|
+
if (id.startsWith(SETTINGS_ROW)) {
|
|
128
|
+
this.settingsFor = id.slice(SETTINGS_ROW.length);
|
|
129
|
+
this.saved = false;
|
|
130
|
+
this.fill();
|
|
131
|
+
this.options.changed();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const row = this.menu().find(candidate => this.key(candidate) === id);
|
|
135
|
+
if (!row || this.busy)
|
|
136
|
+
return;
|
|
137
|
+
this.busy = true;
|
|
138
|
+
try {
|
|
139
|
+
const action = await this.options.ui.select(`${row.plugin.title}: ${row.plugin.description || 'No description.'}`, rowActions(row, this.projectId));
|
|
140
|
+
if (action && action !== BACK && await applyPluginAction(this.options.ui, this.options.call, row, action))
|
|
141
|
+
this.restart = true;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
this.busy = false;
|
|
145
|
+
}
|
|
146
|
+
await this.reload();
|
|
147
|
+
}
|
|
148
|
+
back() {
|
|
149
|
+
this.settingsFor = null;
|
|
150
|
+
this.saved = false;
|
|
151
|
+
this.fill();
|
|
152
|
+
}
|
|
153
|
+
/** Flips a switch, or asks for a number inside the setting's range, and saves it. */
|
|
154
|
+
async change(key) {
|
|
155
|
+
const plugin = this.settingsPlugin();
|
|
156
|
+
const setting = plugin && settingsOf(plugin).find(candidate => candidate.key === key);
|
|
157
|
+
if (!plugin || !setting || this.busy)
|
|
158
|
+
return;
|
|
159
|
+
this.busy = true;
|
|
160
|
+
try {
|
|
161
|
+
let value;
|
|
162
|
+
if (isSwitch(setting))
|
|
163
|
+
value = setting.value === 1 ? 0 : 1;
|
|
164
|
+
else {
|
|
165
|
+
const answer = await this.options.ui.input(`${setting.label} (${setting.min.toLocaleString('en-US')}–${setting.max.toLocaleString('en-US')})`, String(setting.value));
|
|
166
|
+
if (answer === undefined || !answer.trim())
|
|
167
|
+
return;
|
|
168
|
+
const typed = answer.trim().replace(/[,_]/g, '');
|
|
169
|
+
value = Number(typed);
|
|
170
|
+
if (!/^-?\d+$/.test(typed) || value < setting.min || value > setting.max) {
|
|
171
|
+
this.options.ui.notify(`${setting.label} must be a whole number from ${setting.min.toLocaleString('en-US')} to ${setting.max.toLocaleString('en-US')}.`, 'error');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const fresh = await this.options.call('plugins.configure', { pluginId: plugin.id, settings: { [setting.key]: value } });
|
|
176
|
+
if (Array.isArray(fresh))
|
|
177
|
+
this.plugins = fresh;
|
|
178
|
+
else
|
|
179
|
+
await this.reload();
|
|
180
|
+
this.saved = true;
|
|
181
|
+
this.fill();
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
this.options.ui.notify(error instanceof Error ? error.message : String(error), 'error');
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
this.busy = false;
|
|
188
|
+
if (!this.disposed)
|
|
189
|
+
this.options.changed();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
handleMouse(event) {
|
|
193
|
+
return this.settingsPlugin() ? this.settingsList.handleMouse(event) : this.list.handleMouse(event);
|
|
194
|
+
}
|
|
195
|
+
handleInput(data) {
|
|
196
|
+
if (this.settingsPlugin()) {
|
|
197
|
+
if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab'))
|
|
198
|
+
return true;
|
|
199
|
+
return this.settingsList.handleInput(data);
|
|
200
|
+
}
|
|
201
|
+
if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
|
|
202
|
+
if (!this.list.query) {
|
|
203
|
+
this.section = this.section === 'plugins' ? 'trust' : 'plugins';
|
|
204
|
+
this.fill();
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
return this.list.handleInput(data);
|
|
209
|
+
}
|
|
210
|
+
render(width, rows) {
|
|
211
|
+
const theme = this.options.theme();
|
|
212
|
+
if (width < 1 || rows < 1)
|
|
213
|
+
return [];
|
|
214
|
+
if (!this.plugins)
|
|
215
|
+
return [theme.fg(this.error ? 'error' : 'dim', this.error ? `Could not read plugins: ${this.error}` : 'Reading plugins…')];
|
|
216
|
+
const plugin = this.settingsPlugin();
|
|
217
|
+
if (plugin)
|
|
218
|
+
return this.renderSettings(plugin, width, rows);
|
|
219
|
+
const selectedId = this.list.selected?.id;
|
|
220
|
+
const selected = selectedId?.startsWith(SETTINGS_ROW)
|
|
221
|
+
? this.plugins.find(candidate => `${SETTINGS_ROW}${candidate.id}` === selectedId)
|
|
222
|
+
: this.menu().find(candidate => this.key(candidate) === selectedId)?.plugin;
|
|
223
|
+
const detail = selected && rows >= 8 ? wrapTextWithAnsi(safeText(selected.description || 'No description.'), width).slice(0, 2) : [];
|
|
224
|
+
const note = this.restart ? ['Saved. Changes apply when this session restarts.'] : [];
|
|
225
|
+
const extra = detail.length + note.length;
|
|
226
|
+
const lines = this.list.render(width, Math.max(2, rows - (extra ? extra + 1 : 0)));
|
|
227
|
+
if (extra)
|
|
228
|
+
lines.push('', ...detail.map(line => theme.fg('muted', line)), ...note.map(line => theme.fg('warning', line)));
|
|
229
|
+
return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
|
|
230
|
+
}
|
|
231
|
+
renderSettings(plugin, width, rows) {
|
|
232
|
+
const theme = this.options.theme();
|
|
233
|
+
const setting = settingsOf(plugin).find(candidate => candidate.key === this.settingsList.selected?.id);
|
|
234
|
+
const range = setting && !isSwitch(setting) ? [`From ${setting.min.toLocaleString('en-US')} to ${setting.max.toLocaleString('en-US')} · default ${setting.default.toLocaleString('en-US')}`] : [];
|
|
235
|
+
const detail = setting && rows >= 8 ? [...wrapTextWithAnsi(safeText(setting.description), width).slice(0, 3), ...range] : [];
|
|
236
|
+
const note = this.saved ? ['Saved.'] : [];
|
|
237
|
+
const extra = detail.length + note.length;
|
|
238
|
+
const lines = this.settingsList.render(width, Math.max(2, rows - (extra ? extra + 1 : 0)));
|
|
239
|
+
if (extra)
|
|
240
|
+
lines.push('', ...detail.map(line => theme.fg('muted', line)), ...note.map(line => theme.fg('success', line)));
|
|
241
|
+
return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Settings page. It lists existing host settings and asks the host to change one; the values
|
|
3
|
+
* and actions belong to the host. Categories are page-local tabs (Tab / Shift+Tab).
|
|
4
|
+
*/
|
|
5
|
+
import type { Theme } from '@earendil-works/pi-coding-agent';
|
|
6
|
+
import type { TerminalPage } from "../page.js";
|
|
7
|
+
import type { TerminalMouseInput } from "../mouse.js";
|
|
8
|
+
export interface TerminalSettingItem {
|
|
9
|
+
id: string;
|
|
10
|
+
tab: string;
|
|
11
|
+
group: string;
|
|
12
|
+
label: string;
|
|
13
|
+
value: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SettingsPageOptions {
|
|
17
|
+
theme: () => Theme;
|
|
18
|
+
items(): TerminalSettingItem[];
|
|
19
|
+
/** Changes the setting; the page reads the items again afterwards. */
|
|
20
|
+
apply(id: string): Promise<void>;
|
|
21
|
+
notify(message: string, type?: string): void;
|
|
22
|
+
changed(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare class SettingsPage implements TerminalPage {
|
|
25
|
+
private readonly options;
|
|
26
|
+
private items;
|
|
27
|
+
private category;
|
|
28
|
+
private readonly list;
|
|
29
|
+
constructor(options: SettingsPageOptions);
|
|
30
|
+
set focused(value: boolean);
|
|
31
|
+
get focused(): boolean;
|
|
32
|
+
private categories;
|
|
33
|
+
private rowsFor;
|
|
34
|
+
private reload;
|
|
35
|
+
/** Searching looks through every category; otherwise the page shows the current one. */
|
|
36
|
+
private fill;
|
|
37
|
+
tabs(): ({
|
|
38
|
+
readonly id: "appearance";
|
|
39
|
+
readonly title: "Appearance";
|
|
40
|
+
} | {
|
|
41
|
+
readonly id: "model";
|
|
42
|
+
readonly title: "Model";
|
|
43
|
+
} | {
|
|
44
|
+
readonly id: "interaction";
|
|
45
|
+
readonly title: "Interaction";
|
|
46
|
+
} | {
|
|
47
|
+
readonly id: "context";
|
|
48
|
+
readonly title: "Context";
|
|
49
|
+
})[];
|
|
50
|
+
activeTab(): string;
|
|
51
|
+
hint(): string;
|
|
52
|
+
handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
|
|
53
|
+
handleInput(data: string): boolean;
|
|
54
|
+
render(width: number, rows: number): string[];
|
|
55
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
|
|
2
|
+
import { safeText } from "../chrome.js";
|
|
3
|
+
import { FilterList } from "../list.js";
|
|
4
|
+
const CATEGORIES = [
|
|
5
|
+
{ id: 'appearance', title: 'Appearance' }, { id: 'model', title: 'Model' },
|
|
6
|
+
{ id: 'interaction', title: 'Interaction' }, { id: 'context', title: 'Context' }
|
|
7
|
+
];
|
|
8
|
+
const tabOf = (item) => item.tab.toLowerCase();
|
|
9
|
+
export class SettingsPage {
|
|
10
|
+
options;
|
|
11
|
+
items = [];
|
|
12
|
+
category = '';
|
|
13
|
+
list;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.options = options;
|
|
16
|
+
this.list = new FilterList({
|
|
17
|
+
theme: options.theme, search: 'always', noun: ['setting', 'settings'], empty: 'No settings',
|
|
18
|
+
searchContext: () => 'every category',
|
|
19
|
+
onActivate: row => {
|
|
20
|
+
void options.apply(row.id).then(() => this.reload(), error => options.notify(error instanceof Error ? error.message : String(error), 'error'));
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
this.reload();
|
|
24
|
+
}
|
|
25
|
+
set focused(value) { this.list.focused = value; }
|
|
26
|
+
get focused() { return this.list.focused; }
|
|
27
|
+
categories() {
|
|
28
|
+
return CATEGORIES.filter(category => this.items.some(item => tabOf(item) === category.id));
|
|
29
|
+
}
|
|
30
|
+
rowsFor(items) {
|
|
31
|
+
return items.map(item => ({
|
|
32
|
+
id: item.id, label: safeText(item.label), detail: safeText(item.value), group: safeText(item.group), data: item,
|
|
33
|
+
searchText: `${item.label} ${item.id} ${item.value} ${item.description ?? ''} ${item.group} ${item.tab}`
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
reload() {
|
|
37
|
+
const selected = this.list.selected?.id;
|
|
38
|
+
this.items = this.options.items().filter(item => CATEGORIES.some(category => category.id === tabOf(item)));
|
|
39
|
+
if (!this.categories().some(category => category.id === this.category))
|
|
40
|
+
this.category = this.categories()[0]?.id ?? '';
|
|
41
|
+
this.fill();
|
|
42
|
+
if (selected)
|
|
43
|
+
this.list.select(selected);
|
|
44
|
+
this.options.changed();
|
|
45
|
+
}
|
|
46
|
+
/** Searching looks through every category; otherwise the page shows the current one. */
|
|
47
|
+
fill() {
|
|
48
|
+
this.list.setRows(this.rowsFor(this.list.query ? this.items : this.items.filter(item => tabOf(item) === this.category)));
|
|
49
|
+
}
|
|
50
|
+
tabs() { return this.categories(); }
|
|
51
|
+
activeTab() { return this.category; }
|
|
52
|
+
hint() { return this.list.query ? 'Enter change · Esc clear' : 'Enter change · type to search'; }
|
|
53
|
+
handleMouse(event) {
|
|
54
|
+
return this.list.handleMouse(event);
|
|
55
|
+
}
|
|
56
|
+
handleInput(data) {
|
|
57
|
+
if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
|
|
58
|
+
const categories = this.categories();
|
|
59
|
+
if (!this.list.query && categories.length > 1) {
|
|
60
|
+
const at = Math.max(0, categories.findIndex(category => category.id === this.category));
|
|
61
|
+
this.category = categories[(at + (matchesKey(data, 'shift+tab') ? -1 : 1) + categories.length) % categories.length].id;
|
|
62
|
+
this.fill();
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const before = this.list.query;
|
|
67
|
+
const used = this.list.handleInput(data);
|
|
68
|
+
if (this.list.query !== before)
|
|
69
|
+
this.fill();
|
|
70
|
+
return used;
|
|
71
|
+
}
|
|
72
|
+
render(width, rows) {
|
|
73
|
+
if (width < 1 || rows < 1)
|
|
74
|
+
return [];
|
|
75
|
+
const theme = this.options.theme();
|
|
76
|
+
const description = this.list.selected?.data?.description;
|
|
77
|
+
const descriptionRows = Math.min(3, Math.max(0, rows - 7));
|
|
78
|
+
const reserved = descriptionRows ? descriptionRows + 1 : 0;
|
|
79
|
+
const lines = this.list.render(width, Math.max(2, rows - 1 - reserved));
|
|
80
|
+
if (descriptionRows) {
|
|
81
|
+
lines.push('');
|
|
82
|
+
const wrapped = description ? wrapTextWithAnsi(safeText(description), Math.max(1, width)) : [];
|
|
83
|
+
for (let index = 0; index < descriptionRows; index++)
|
|
84
|
+
lines.push(theme.fg('muted', wrapped[index] ?? ''));
|
|
85
|
+
}
|
|
86
|
+
return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Saved run evidence for the current conversation: runs, their events, and the selected event's payload. */
|
|
2
|
+
import type { Theme } from '@earendil-works/pi-coding-agent';
|
|
3
|
+
import { type TuiMouseEventResult } from '@earendil-works/pi-tui';
|
|
4
|
+
import type { RunEvent } from "../../../sessions/contracts.js";
|
|
5
|
+
import type { TerminalTrajectoryRun, TerminalTrajectorySnapshot } from "../../trajectory.js";
|
|
6
|
+
import { type TabInfo } from "../chrome.js";
|
|
7
|
+
import type { TerminalPage } from "../page.js";
|
|
8
|
+
import { type TerminalMouseInput } from "../mouse.js";
|
|
9
|
+
export interface TrajectoryPageOptions {
|
|
10
|
+
theme: () => Theme;
|
|
11
|
+
runs(): Promise<TerminalTrajectoryRun[]>;
|
|
12
|
+
read(runId: string, afterSequence?: number): Promise<TerminalTrajectorySnapshot>;
|
|
13
|
+
copy(text: string): Promise<void>;
|
|
14
|
+
/** Opens on this run when it is in the list; otherwise the newest. */
|
|
15
|
+
initialRunId?: string;
|
|
16
|
+
notify(message: string, type?: string): void;
|
|
17
|
+
changed(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare class TrajectoryPage implements TerminalPage {
|
|
20
|
+
private readonly options;
|
|
21
|
+
private runs;
|
|
22
|
+
private section;
|
|
23
|
+
private readonly runList;
|
|
24
|
+
private runIndex;
|
|
25
|
+
private run;
|
|
26
|
+
private events;
|
|
27
|
+
private selected;
|
|
28
|
+
private detailOffset;
|
|
29
|
+
private eventRowsStart;
|
|
30
|
+
private eventRowsFirst;
|
|
31
|
+
private eventRowsCount;
|
|
32
|
+
private loading;
|
|
33
|
+
private loaded;
|
|
34
|
+
private disposed;
|
|
35
|
+
private timer;
|
|
36
|
+
private error;
|
|
37
|
+
constructor(options: TrajectoryPageOptions);
|
|
38
|
+
get selectedRunId(): string | undefined;
|
|
39
|
+
get selectedEvent(): RunEvent | undefined;
|
|
40
|
+
get focused(): boolean;
|
|
41
|
+
set focused(value: boolean);
|
|
42
|
+
tabs(): readonly TabInfo[];
|
|
43
|
+
activeTab(): string;
|
|
44
|
+
activate(): void;
|
|
45
|
+
deactivate(): void;
|
|
46
|
+
dispose(): void;
|
|
47
|
+
private load;
|
|
48
|
+
private open;
|
|
49
|
+
private refresh;
|
|
50
|
+
/** `[` is the older run, `]` the newer one. */
|
|
51
|
+
private runRows;
|
|
52
|
+
private selectRun;
|
|
53
|
+
private changeRun;
|
|
54
|
+
hint(): string;
|
|
55
|
+
handleMouse(event: TerminalMouseInput): TuiMouseEventResult | undefined;
|
|
56
|
+
handleInput(data: string): boolean;
|
|
57
|
+
render(width: number, rows: number): string[];
|
|
58
|
+
}
|