gsd-pi 2.20.0 → 2.22.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/README.md +12 -0
- package/dist/cli.js +21 -18
- package/dist/help-text.d.ts +2 -0
- package/dist/help-text.js +47 -0
- package/dist/loader.js +2 -16
- package/dist/mcp-server.d.ts +18 -0
- package/dist/mcp-server.js +53 -0
- package/dist/onboarding.d.ts +0 -6
- package/dist/onboarding.js +0 -28
- package/dist/resources/agents/javascript-pro.md +280 -0
- package/dist/resources/agents/typescript-pro.md +255 -0
- package/dist/resources/extensions/bg-shell/index.ts +14 -2
- package/dist/resources/extensions/bg-shell/utilities.ts +14 -0
- package/dist/resources/extensions/browser-tools/{core.js → core.ts} +329 -190
- package/dist/resources/extensions/gsd/auto-dashboard.ts +2 -1
- package/dist/resources/extensions/gsd/auto-prompts.ts +42 -1
- package/dist/resources/extensions/gsd/auto-worktree.ts +35 -2
- package/dist/resources/extensions/gsd/auto.ts +116 -10
- package/dist/resources/extensions/gsd/claude-import.ts +656 -0
- package/dist/resources/extensions/gsd/collision-diagnostics.ts +332 -0
- package/dist/resources/extensions/gsd/commands.ts +60 -7
- package/dist/resources/extensions/gsd/diff-context.ts +220 -0
- package/dist/resources/extensions/gsd/docs/claude-marketplace-import.md +214 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -1
- package/dist/resources/extensions/gsd/doctor.ts +12 -4
- package/dist/resources/extensions/gsd/file-watcher.ts +97 -0
- package/dist/resources/extensions/gsd/files.ts +1 -1
- package/dist/resources/extensions/gsd/forensics.ts +596 -0
- package/dist/resources/extensions/gsd/git-service.ts +2 -1
- package/dist/resources/extensions/gsd/github-client.ts +235 -0
- package/dist/resources/extensions/gsd/gitignore.ts +1 -0
- package/dist/resources/extensions/gsd/marketplace-discovery.ts +507 -0
- package/dist/resources/extensions/gsd/mcp-server.ts +87 -0
- package/dist/resources/extensions/gsd/namespaced-registry.ts +467 -0
- package/dist/resources/extensions/gsd/namespaced-resolver.ts +307 -0
- package/dist/resources/extensions/gsd/plugin-importer.ts +410 -0
- package/dist/resources/extensions/gsd/preferences.ts +14 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/forensics.md +71 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +12 -3
- package/dist/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/dist/resources/extensions/gsd/session-forensics.ts +5 -5
- package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +351 -0
- package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +705 -0
- package/dist/resources/extensions/gsd/tests/context-compression.test.ts +13 -0
- package/dist/resources/extensions/gsd/tests/diff-context.test.ts +136 -0
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +118 -0
- package/dist/resources/extensions/gsd/tests/marketplace-discovery.test.ts +202 -0
- package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +91 -0
- package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +1027 -0
- package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +671 -0
- package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +105 -0
- package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +481 -0
- package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +1383 -0
- package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +21 -2
- package/dist/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +8 -1
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +11 -0
- package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +120 -0
- package/dist/resources/extensions/gsd/token-counter.ts +45 -0
- package/dist/resources/extensions/gsd/visualizer-data.ts +2 -2
- package/dist/resources/extensions/gsd/worktree-manager.ts +29 -1
- package/dist/resources/extensions/gsd/worktree.ts +3 -0
- package/dist/resources/extensions/mcporter/index.ts +90 -7
- package/dist/resources/extensions/search-the-web/native-search.ts +2 -0
- package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +9 -1
- package/dist/resources/extensions/search-the-web/url-utils.ts +35 -1
- package/dist/resources/extensions/shared/terminal.ts +1 -1
- package/dist/resources/extensions/universal-config/discovery.ts +4 -0
- package/dist/resources/extensions/universal-config/format.ts +35 -4
- package/dist/resources/extensions/universal-config/index.ts +5 -3
- package/dist/resources/extensions/universal-config/scanners.ts +65 -2
- package/dist/resources/extensions/universal-config/tests/discovery.test.ts +9 -1
- package/dist/resources/extensions/universal-config/tests/format.test.ts +22 -6
- package/dist/resources/extensions/universal-config/tests/scanners.test.ts +18 -0
- package/dist/resources/extensions/universal-config/types.ts +20 -1
- package/dist/resources/skills/lint/SKILL.md +141 -0
- package/dist/resources/skills/review/SKILL.md +214 -0
- package/dist/resources/skills/test/SKILL.md +201 -0
- package/dist/tool-bootstrap.js +2 -1
- package/dist/wizard.js +2 -0
- package/package.json +12 -7
- package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.js +12 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +12 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +201 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +9 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +762 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +19 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +1 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +9 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +3 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +230 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +87 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +32 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +169 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +21 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +88 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +36 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +21 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +22 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +23 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +8 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +41 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +21 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +4 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +63 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +10 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +5 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +4 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +3 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +46 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +24 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +12 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +63 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +13 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +12 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +2 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +6 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +6 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +2 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +5 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +6 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +13 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +8 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +10 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +5 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +4 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +3 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +46 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +24 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +12 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +63 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +13 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +12 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +2 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +6 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +6 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +2 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +5 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +6 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +13 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +8 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +12 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +12 -0
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +68 -0
- package/packages/pi-ai/package.json +3 -0
- package/packages/pi-ai/pnpm-lock.yaml +2022 -0
- package/packages/pi-ai/src/providers/azure-openai-responses.ts +12 -1
- package/packages/pi-ai/src/providers/openai-responses.ts +12 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +12 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +113 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/project-trust.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/extensions/project-trust.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/project-trust.js +42 -0
- package/packages/pi-coding-agent/dist/core/extensions/project-trust.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js +18 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +114 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +8 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +23 -9
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +67 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/pnpm-lock.yaml +454 -0
- package/packages/pi-coding-agent/scripts/copy-assets.cjs +24 -0
- package/packages/pi-coding-agent/src/core/extensions/index.ts +3 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +141 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +14 -1
- package/packages/pi-coding-agent/src/core/extensions/project-trust.ts +51 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +132 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +7 -2
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +98 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +24 -9
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +2 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +3 -1
- package/packages/pi-tui/src/tui.ts +2 -2
- package/src/resources/agents/javascript-pro.md +280 -0
- package/src/resources/agents/typescript-pro.md +255 -0
- package/src/resources/extensions/bg-shell/index.ts +14 -2
- package/src/resources/extensions/bg-shell/utilities.ts +14 -0
- package/src/resources/extensions/browser-tools/{core.js → core.ts} +329 -190
- package/src/resources/extensions/gsd/auto-dashboard.ts +2 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +42 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +35 -2
- package/src/resources/extensions/gsd/auto.ts +116 -10
- package/src/resources/extensions/gsd/claude-import.ts +656 -0
- package/src/resources/extensions/gsd/collision-diagnostics.ts +332 -0
- package/src/resources/extensions/gsd/commands.ts +60 -7
- package/src/resources/extensions/gsd/diff-context.ts +220 -0
- package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +214 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -1
- package/src/resources/extensions/gsd/doctor.ts +12 -4
- package/src/resources/extensions/gsd/file-watcher.ts +97 -0
- package/src/resources/extensions/gsd/files.ts +1 -1
- package/src/resources/extensions/gsd/forensics.ts +596 -0
- package/src/resources/extensions/gsd/git-service.ts +2 -1
- package/src/resources/extensions/gsd/github-client.ts +235 -0
- package/src/resources/extensions/gsd/gitignore.ts +1 -0
- package/src/resources/extensions/gsd/marketplace-discovery.ts +507 -0
- package/src/resources/extensions/gsd/mcp-server.ts +87 -0
- package/src/resources/extensions/gsd/namespaced-registry.ts +467 -0
- package/src/resources/extensions/gsd/namespaced-resolver.ts +307 -0
- package/src/resources/extensions/gsd/plugin-importer.ts +410 -0
- package/src/resources/extensions/gsd/preferences.ts +14 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/forensics.md +71 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +12 -3
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/session-forensics.ts +5 -5
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +705 -0
- package/src/resources/extensions/gsd/tests/context-compression.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/diff-context.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/marketplace-discovery.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +91 -0
- package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +1027 -0
- package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +671 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/plugin-importer-live.test.ts +481 -0
- package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +1383 -0
- package/src/resources/extensions/gsd/tests/preferences-git.test.ts +21 -2
- package/src/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +120 -0
- package/src/resources/extensions/gsd/token-counter.ts +45 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +2 -2
- package/src/resources/extensions/gsd/worktree-manager.ts +29 -1
- package/src/resources/extensions/gsd/worktree.ts +3 -0
- package/src/resources/extensions/mcporter/index.ts +90 -7
- package/src/resources/extensions/search-the-web/native-search.ts +2 -0
- package/src/resources/extensions/search-the-web/tool-fetch-page.ts +9 -1
- package/src/resources/extensions/search-the-web/url-utils.ts +35 -1
- package/src/resources/extensions/shared/terminal.ts +1 -1
- package/src/resources/extensions/universal-config/discovery.ts +4 -0
- package/src/resources/extensions/universal-config/format.ts +35 -4
- package/src/resources/extensions/universal-config/index.ts +5 -3
- package/src/resources/extensions/universal-config/scanners.ts +65 -2
- package/src/resources/extensions/universal-config/tests/discovery.test.ts +9 -1
- package/src/resources/extensions/universal-config/tests/format.test.ts +22 -6
- package/src/resources/extensions/universal-config/tests/scanners.test.ts +18 -0
- package/src/resources/extensions/universal-config/types.ts +20 -1
- package/src/resources/skills/lint/SKILL.md +141 -0
- package/src/resources/skills/review/SKILL.md +214 -0
- package/src/resources/skills/test/SKILL.md +201 -0
- package/dist/resources/extensions/browser-tools/core.d.ts +0 -205
- package/src/resources/extensions/browser-tools/core.d.ts +0 -205
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
|
|
4
|
+
const TRUSTED_PROJECTS_FILE = "trusted-projects.json";
|
|
5
|
+
|
|
6
|
+
function getTrustedProjectsPath(agentDir: string): string {
|
|
7
|
+
return path.join(agentDir, TRUSTED_PROJECTS_FILE);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function readTrustedProjects(agentDir: string): Set<string> {
|
|
11
|
+
const filePath = getTrustedProjectsPath(agentDir);
|
|
12
|
+
try {
|
|
13
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
14
|
+
const parsed = JSON.parse(content);
|
|
15
|
+
if (Array.isArray(parsed)) {
|
|
16
|
+
return new Set(parsed.filter((p) => typeof p === "string"));
|
|
17
|
+
}
|
|
18
|
+
} catch {
|
|
19
|
+
// File missing or malformed — start with empty set
|
|
20
|
+
}
|
|
21
|
+
return new Set();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function writeTrustedProjects(agentDir: string, trusted: Set<string>): void {
|
|
25
|
+
const filePath = getTrustedProjectsPath(agentDir);
|
|
26
|
+
fs.mkdirSync(agentDir, { recursive: true });
|
|
27
|
+
fs.writeFileSync(filePath, JSON.stringify([...trusted], null, 2), "utf-8");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function isProjectTrusted(projectPath: string, agentDir: string): boolean {
|
|
31
|
+
const canonical = path.resolve(projectPath);
|
|
32
|
+
return readTrustedProjects(agentDir).has(canonical);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function trustProject(projectPath: string, agentDir: string): void {
|
|
36
|
+
const canonical = path.resolve(projectPath);
|
|
37
|
+
const trusted = readTrustedProjects(agentDir);
|
|
38
|
+
trusted.add(canonical);
|
|
39
|
+
writeTrustedProjects(agentDir, trusted);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function getUntrustedExtensionPaths(
|
|
43
|
+
projectPath: string,
|
|
44
|
+
extensionPaths: string[],
|
|
45
|
+
agentDir: string,
|
|
46
|
+
): string[] {
|
|
47
|
+
if (isProjectTrusted(projectPath, agentDir)) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
return extensionPaths;
|
|
51
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { describe, it, beforeEach } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import {
|
|
4
|
+
resolveConfigValue,
|
|
5
|
+
clearConfigValueCache,
|
|
6
|
+
SAFE_COMMAND_PREFIXES,
|
|
7
|
+
} from "./resolve-config-value.js";
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
clearConfigValueCache();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe("SAFE_COMMAND_PREFIXES", () => {
|
|
14
|
+
it("exports the allowlist array", () => {
|
|
15
|
+
assert.ok(Array.isArray(SAFE_COMMAND_PREFIXES));
|
|
16
|
+
assert.ok(SAFE_COMMAND_PREFIXES.length > 0);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("includes expected credential tools", () => {
|
|
20
|
+
assert.ok(SAFE_COMMAND_PREFIXES.includes("pass"));
|
|
21
|
+
assert.ok(SAFE_COMMAND_PREFIXES.includes("op"));
|
|
22
|
+
assert.ok(SAFE_COMMAND_PREFIXES.includes("aws"));
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("resolveConfigValue — non-command values", () => {
|
|
27
|
+
it("returns the literal value when it does not match an env var", () => {
|
|
28
|
+
const result = resolveConfigValue("my-literal-key");
|
|
29
|
+
assert.equal(result, "my-literal-key");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("returns the env var value when the config matches an env var name", () => {
|
|
33
|
+
process.env["TEST_RESOLVE_CONFIG_VAR"] = "env-value";
|
|
34
|
+
const result = resolveConfigValue("TEST_RESOLVE_CONFIG_VAR");
|
|
35
|
+
assert.equal(result, "env-value");
|
|
36
|
+
delete process.env["TEST_RESOLVE_CONFIG_VAR"];
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("resolveConfigValue — command allowlist enforcement", () => {
|
|
41
|
+
it("blocks a disallowed command and returns undefined", () => {
|
|
42
|
+
const stderrChunks: string[] = [];
|
|
43
|
+
const originalWrite = process.stderr.write.bind(process.stderr);
|
|
44
|
+
process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
|
|
45
|
+
stderrChunks.push(chunk.toString());
|
|
46
|
+
return true;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
const result = resolveConfigValue("!curl http://evil.com");
|
|
51
|
+
assert.equal(result, undefined);
|
|
52
|
+
assert.ok(stderrChunks.some((line) => line.includes("curl")));
|
|
53
|
+
} finally {
|
|
54
|
+
process.stderr.write = originalWrite;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("blocks another disallowed command (rm)", () => {
|
|
59
|
+
const result = resolveConfigValue("!rm -rf /tmp/test");
|
|
60
|
+
assert.equal(result, undefined);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("blocks a disallowed command with no arguments", () => {
|
|
64
|
+
const result = resolveConfigValue("!wget");
|
|
65
|
+
assert.equal(result, undefined);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("allows a safe command prefix to proceed to execution", () => {
|
|
69
|
+
// `pass` is unlikely to be installed in CI, so we just verify it does NOT
|
|
70
|
+
// return undefined due to the allowlist check — it may return undefined if
|
|
71
|
+
// the binary is absent, but the block path must not be taken.
|
|
72
|
+
// We confirm by checking no "Blocked" message appears on stderr.
|
|
73
|
+
const stderrChunks: string[] = [];
|
|
74
|
+
const originalWrite = process.stderr.write.bind(process.stderr);
|
|
75
|
+
process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
|
|
76
|
+
stderrChunks.push(chunk.toString());
|
|
77
|
+
return true;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
resolveConfigValue("!pass show nonexistent-entry-for-test");
|
|
82
|
+
const blocked = stderrChunks.some((line) =>
|
|
83
|
+
line.includes("Blocked disallowed command")
|
|
84
|
+
);
|
|
85
|
+
assert.equal(blocked, false, "pass should not be blocked by the allowlist");
|
|
86
|
+
} finally {
|
|
87
|
+
process.stderr.write = originalWrite;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe("resolveConfigValue — caching", () => {
|
|
93
|
+
it("caches the result of a blocked command", () => {
|
|
94
|
+
const callCount = { n: 0 };
|
|
95
|
+
const originalWrite = process.stderr.write.bind(process.stderr);
|
|
96
|
+
process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
|
|
97
|
+
callCount.n++;
|
|
98
|
+
return true;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
resolveConfigValue("!curl http://evil.com");
|
|
103
|
+
resolveConfigValue("!curl http://evil.com");
|
|
104
|
+
// The block warning should only fire once; the second call hits the cache
|
|
105
|
+
// before reaching the allowlist check, so stderr count is 1.
|
|
106
|
+
assert.equal(callCount.n, 1);
|
|
107
|
+
} finally {
|
|
108
|
+
process.stderr.write = originalWrite;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("clearConfigValueCache resets cached entries", () => {
|
|
113
|
+
const stderrChunks: string[] = [];
|
|
114
|
+
const originalWrite = process.stderr.write.bind(process.stderr);
|
|
115
|
+
process.stderr.write = (chunk: string | Uint8Array, ...args: unknown[]) => {
|
|
116
|
+
stderrChunks.push(chunk.toString());
|
|
117
|
+
return true;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
resolveConfigValue("!curl http://evil.com");
|
|
122
|
+
assert.equal(stderrChunks.length, 1);
|
|
123
|
+
|
|
124
|
+
clearConfigValueCache();
|
|
125
|
+
|
|
126
|
+
resolveConfigValue("!curl http://evil.com");
|
|
127
|
+
assert.equal(stderrChunks.length, 2);
|
|
128
|
+
} finally {
|
|
129
|
+
process.stderr.write = originalWrite;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -8,6 +8,19 @@ import { execSync } from "child_process";
|
|
|
8
8
|
// Cache for shell command results (persists for process lifetime)
|
|
9
9
|
const commandResultCache = new Map<string, string | undefined>();
|
|
10
10
|
|
|
11
|
+
export const SAFE_COMMAND_PREFIXES = [
|
|
12
|
+
"pass",
|
|
13
|
+
"op",
|
|
14
|
+
"aws",
|
|
15
|
+
"gcloud",
|
|
16
|
+
"vault",
|
|
17
|
+
"security",
|
|
18
|
+
"gpg",
|
|
19
|
+
"bw",
|
|
20
|
+
"gopass",
|
|
21
|
+
"lpass",
|
|
22
|
+
];
|
|
23
|
+
|
|
11
24
|
/**
|
|
12
25
|
* Resolve a config value (API key, header value, etc.) to an actual value.
|
|
13
26
|
* - If starts with "!", executes the rest as a shell command and uses stdout (cached)
|
|
@@ -27,6 +40,13 @@ function executeCommand(commandConfig: string): string | undefined {
|
|
|
27
40
|
}
|
|
28
41
|
|
|
29
42
|
const command = commandConfig.slice(1);
|
|
43
|
+
const firstToken = command.split(/\s+/)[0];
|
|
44
|
+
if (!SAFE_COMMAND_PREFIXES.includes(firstToken)) {
|
|
45
|
+
process.stderr.write(`[resolve-config-value] Blocked disallowed command: "${firstToken}". Allowed: ${SAFE_COMMAND_PREFIXES.join(", ")}\n`);
|
|
46
|
+
commandResultCache.set(commandConfig, undefined);
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
30
50
|
let result: string | undefined;
|
|
31
51
|
try {
|
|
32
52
|
const output = execSync(command, {
|
|
@@ -132,9 +132,14 @@ export class LoginDialogComponent extends Container implements Focusable {
|
|
|
132
132
|
this.contentContainer.addChild(new Text(theme.fg("warning", instructions), 1, 0));
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
// Try to open browser
|
|
135
|
+
// Try to open browser — on Windows, `start` needs an empty title arg
|
|
136
|
+
// so it treats the URL as a target, not a window title
|
|
136
137
|
const openCmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
137
|
-
|
|
138
|
+
if (process.platform === "win32") {
|
|
139
|
+
exec(`start "" "${url}"`);
|
|
140
|
+
} else {
|
|
141
|
+
exec(`${openCmd} "${url}"`);
|
|
142
|
+
}
|
|
138
143
|
|
|
139
144
|
this.tui.requestRender();
|
|
140
145
|
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it, mock } from "node:test";
|
|
3
|
+
import { mkdtempSync, rmSync, readFileSync, existsSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
|
|
7
|
+
import { MemoryStorage } from "./storage.js";
|
|
8
|
+
|
|
9
|
+
function makeTmpDir(): string {
|
|
10
|
+
return mkdtempSync(join(tmpdir(), "gsd-memory-storage-test-"));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function wait(ms: number): Promise<void> {
|
|
14
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe("MemoryStorage debounced persistence", () => {
|
|
18
|
+
it("multiple rapid mutations only trigger one persist write", async () => {
|
|
19
|
+
const dir = makeTmpDir();
|
|
20
|
+
const dbPath = join(dir, "test.db");
|
|
21
|
+
try {
|
|
22
|
+
const storage = await MemoryStorage.create(dbPath);
|
|
23
|
+
|
|
24
|
+
const initialStat = readFileSync(dbPath);
|
|
25
|
+
const initialMtime = initialStat.length;
|
|
26
|
+
|
|
27
|
+
storage.upsertThreads([
|
|
28
|
+
{ threadId: "t1", filePath: "/a.txt", fileSize: 100, fileMtime: 1000, cwd: "/proj" },
|
|
29
|
+
]);
|
|
30
|
+
storage.upsertThreads([
|
|
31
|
+
{ threadId: "t2", filePath: "/b.txt", fileSize: 200, fileMtime: 2000, cwd: "/proj" },
|
|
32
|
+
]);
|
|
33
|
+
storage.upsertThreads([
|
|
34
|
+
{ threadId: "t3", filePath: "/c.txt", fileSize: 300, fileMtime: 3000, cwd: "/proj" },
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
const afterMutationsBuf = readFileSync(dbPath);
|
|
38
|
+
assert.deepEqual(
|
|
39
|
+
afterMutationsBuf,
|
|
40
|
+
initialStat,
|
|
41
|
+
"File should not have been written yet (debounce window has not elapsed)",
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
await wait(700);
|
|
45
|
+
|
|
46
|
+
const afterDebounceBuf = readFileSync(dbPath);
|
|
47
|
+
assert.notDeepEqual(
|
|
48
|
+
afterDebounceBuf,
|
|
49
|
+
initialStat,
|
|
50
|
+
"File should have been written after debounce window elapsed",
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const stats = storage.getStats();
|
|
54
|
+
assert.equal(stats.totalThreads, 3);
|
|
55
|
+
|
|
56
|
+
storage.close();
|
|
57
|
+
} finally {
|
|
58
|
+
rmSync(dir, { recursive: true, force: true });
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("close() flushes pending changes immediately without waiting for debounce", async () => {
|
|
63
|
+
const dir = makeTmpDir();
|
|
64
|
+
const dbPath = join(dir, "test.db");
|
|
65
|
+
try {
|
|
66
|
+
const storage = await MemoryStorage.create(dbPath);
|
|
67
|
+
|
|
68
|
+
const initialBuf = readFileSync(dbPath);
|
|
69
|
+
|
|
70
|
+
storage.upsertThreads([
|
|
71
|
+
{ threadId: "t1", filePath: "/a.txt", fileSize: 100, fileMtime: 1000, cwd: "/proj" },
|
|
72
|
+
]);
|
|
73
|
+
|
|
74
|
+
const beforeCloseBuf = readFileSync(dbPath);
|
|
75
|
+
assert.deepEqual(
|
|
76
|
+
beforeCloseBuf,
|
|
77
|
+
initialBuf,
|
|
78
|
+
"File should not have been written yet (debounce window has not elapsed)",
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
storage.close();
|
|
82
|
+
|
|
83
|
+
const afterCloseBuf = readFileSync(dbPath);
|
|
84
|
+
assert.notDeepEqual(
|
|
85
|
+
afterCloseBuf,
|
|
86
|
+
initialBuf,
|
|
87
|
+
"File should have been written immediately on close()",
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const reopened = await MemoryStorage.create(dbPath);
|
|
91
|
+
const stats = reopened.getStats();
|
|
92
|
+
assert.equal(stats.totalThreads, 1, "Data should be persisted and readable after close");
|
|
93
|
+
reopened.close();
|
|
94
|
+
} finally {
|
|
95
|
+
rmSync(dir, { recursive: true, force: true });
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
@@ -46,6 +46,7 @@ export interface JobRow {
|
|
|
46
46
|
export class MemoryStorage {
|
|
47
47
|
private db: SqlJsDatabase;
|
|
48
48
|
private dbPath: string;
|
|
49
|
+
private persistTimer: ReturnType<typeof setTimeout> | null = null;
|
|
49
50
|
|
|
50
51
|
private constructor(db: SqlJsDatabase, dbPath: string) {
|
|
51
52
|
this.db = db;
|
|
@@ -76,6 +77,16 @@ export class MemoryStorage {
|
|
|
76
77
|
writeFileSync(this.dbPath, Buffer.from(data));
|
|
77
78
|
}
|
|
78
79
|
|
|
80
|
+
private schedulePersist(): void {
|
|
81
|
+
if (this.persistTimer) {
|
|
82
|
+
clearTimeout(this.persistTimer);
|
|
83
|
+
}
|
|
84
|
+
this.persistTimer = setTimeout(() => {
|
|
85
|
+
this.persistTimer = null;
|
|
86
|
+
this.persist();
|
|
87
|
+
}, 500);
|
|
88
|
+
}
|
|
89
|
+
|
|
79
90
|
private initSchema(): void {
|
|
80
91
|
this.db.run(`
|
|
81
92
|
CREATE TABLE IF NOT EXISTS threads (
|
|
@@ -184,7 +195,7 @@ export class MemoryStorage {
|
|
|
184
195
|
}
|
|
185
196
|
}
|
|
186
197
|
|
|
187
|
-
this.
|
|
198
|
+
this.schedulePersist();
|
|
188
199
|
return { inserted, updated, skipped };
|
|
189
200
|
}
|
|
190
201
|
|
|
@@ -221,7 +232,7 @@ export class MemoryStorage {
|
|
|
221
232
|
[token],
|
|
222
233
|
);
|
|
223
234
|
|
|
224
|
-
this.
|
|
235
|
+
this.schedulePersist();
|
|
225
236
|
|
|
226
237
|
return rows.map((r) => ({
|
|
227
238
|
jobId: r.id,
|
|
@@ -246,7 +257,7 @@ export class MemoryStorage {
|
|
|
246
257
|
"UPDATE threads SET status = 'done', updated_at = datetime('now') WHERE thread_id = ?",
|
|
247
258
|
[threadId],
|
|
248
259
|
);
|
|
249
|
-
this.
|
|
260
|
+
this.schedulePersist();
|
|
250
261
|
}
|
|
251
262
|
|
|
252
263
|
/**
|
|
@@ -261,7 +272,7 @@ export class MemoryStorage {
|
|
|
261
272
|
"UPDATE threads SET status = 'error', error_message = ?, updated_at = datetime('now') WHERE thread_id = ?",
|
|
262
273
|
[errorMessage, threadId],
|
|
263
274
|
);
|
|
264
|
-
this.
|
|
275
|
+
this.schedulePersist();
|
|
265
276
|
}
|
|
266
277
|
|
|
267
278
|
/**
|
|
@@ -305,7 +316,7 @@ export class MemoryStorage {
|
|
|
305
316
|
[jobId, workerId, token, expiresAt],
|
|
306
317
|
);
|
|
307
318
|
|
|
308
|
-
this.
|
|
319
|
+
this.schedulePersist();
|
|
309
320
|
return { jobId, ownershipToken: token };
|
|
310
321
|
}
|
|
311
322
|
|
|
@@ -317,7 +328,7 @@ export class MemoryStorage {
|
|
|
317
328
|
"UPDATE jobs SET status = 'done', updated_at = datetime('now') WHERE id = ? AND phase = 'stage2'",
|
|
318
329
|
[jobId],
|
|
319
330
|
);
|
|
320
|
-
this.
|
|
331
|
+
this.schedulePersist();
|
|
321
332
|
}
|
|
322
333
|
|
|
323
334
|
/**
|
|
@@ -406,7 +417,7 @@ export class MemoryStorage {
|
|
|
406
417
|
this.db.run("DELETE FROM stage1_outputs");
|
|
407
418
|
this.db.run("DELETE FROM jobs");
|
|
408
419
|
this.db.run("DELETE FROM threads");
|
|
409
|
-
this.
|
|
420
|
+
this.schedulePersist();
|
|
410
421
|
}
|
|
411
422
|
|
|
412
423
|
/**
|
|
@@ -422,7 +433,7 @@ export class MemoryStorage {
|
|
|
422
433
|
[cwd],
|
|
423
434
|
);
|
|
424
435
|
this.db.run("DELETE FROM threads WHERE cwd = ?", [cwd]);
|
|
425
|
-
this.
|
|
436
|
+
this.schedulePersist();
|
|
426
437
|
}
|
|
427
438
|
|
|
428
439
|
/**
|
|
@@ -453,10 +464,14 @@ export class MemoryStorage {
|
|
|
453
464
|
[randomUUID(), t.thread_id],
|
|
454
465
|
);
|
|
455
466
|
}
|
|
456
|
-
this.
|
|
467
|
+
this.schedulePersist();
|
|
457
468
|
}
|
|
458
469
|
|
|
459
470
|
close(): void {
|
|
471
|
+
if (this.persistTimer) {
|
|
472
|
+
clearTimeout(this.persistTimer);
|
|
473
|
+
this.persistTimer = null;
|
|
474
|
+
}
|
|
460
475
|
this.persist();
|
|
461
476
|
this.db.close();
|
|
462
477
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -80,7 +80,7 @@ export class TUI extends Container {
|
|
|
80
80
|
this.hardwareCursorRow = 0; // Actual terminal cursor row (may differ due to IME positioning)
|
|
81
81
|
this.inputBuffer = ""; // Buffer for parsing terminal responses
|
|
82
82
|
this.cellSizeQueryPending = false;
|
|
83
|
-
this.showHardwareCursor = process.env.PI_HARDWARE_CURSOR === "1";
|
|
83
|
+
this.showHardwareCursor = process.env.PI_HARDWARE_CURSOR === "1" || process.env.TERM_PROGRAM === "WarpTerminal";
|
|
84
84
|
this.clearOnShrink = process.env.PI_CLEAR_ON_SHRINK === "1"; // Clear empty rows when content shrinks (default: off)
|
|
85
85
|
this.maxLinesRendered = 0; // Track terminal's working area (max lines ever rendered)
|
|
86
86
|
this.previousViewportTop = 0; // Track previous viewport top for resize-aware cursor moves
|
|
@@ -688,7 +688,7 @@ export class TUI extends Container {
|
|
|
688
688
|
this.fullRedrawCount += 1;
|
|
689
689
|
let buffer = "\x1b[?2026h"; // Begin synchronized output
|
|
690
690
|
if (clear)
|
|
691
|
-
buffer += "\x1b[
|
|
691
|
+
buffer += "\x1b[2J\x1b[H"; // Clear screen and home (no scrollback clear — preserves view position)
|
|
692
692
|
for (let i = 0; i < newLines.length; i++) {
|
|
693
693
|
if (i > 0)
|
|
694
694
|
buffer += "\r\n";
|