diff --git a/.oxlintrc.json b/.oxlintrc.json index 877553f49..003359f31 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -150,6 +150,7 @@ "node_modules/", "apps/*/scripts/", "docs/smoke-archive/", + "packages/pi-tui/", "*.generated.ts" ] } diff --git a/apps/kimi-code/package.json b/apps/kimi-code/package.json index 4b05ab8c0..7e0b1d43e 100644 --- a/apps/kimi-code/package.json +++ b/apps/kimi-code/package.json @@ -79,13 +79,13 @@ "node-pty": "^1.1.0" }, "devDependencies": { - "@earendil-works/pi-tui": "^0.78.1", "@moonshot-ai/acp-adapter": "workspace:^", "@moonshot-ai/kimi-code-oauth": "workspace:^", "@moonshot-ai/kimi-code-sdk": "workspace:^", "@moonshot-ai/kimi-telemetry": "workspace:^", "@moonshot-ai/kimi-web": "workspace:^", "@moonshot-ai/migration-legacy": "workspace:^", + "@moonshot-ai/pi-tui": "workspace:^", "@moonshot-ai/server": "workspace:^", "@moonshot-ai/vis-server": "workspace:^", "@moonshot-ai/vis-web": "workspace:*", diff --git a/apps/kimi-code/scripts/native/native-deps.mjs b/apps/kimi-code/scripts/native/native-deps.mjs index f7a28c139..8e26d9229 100644 --- a/apps/kimi-code/scripts/native/native-deps.mjs +++ b/apps/kimi-code/scripts/native/native-deps.mjs @@ -75,7 +75,7 @@ export const nativeDeps = Object.freeze([ }, { id: 'pi-tui', - name: () => '@earendil-works/pi-tui', + name: () => '@moonshot-ai/pi-tui', // pi-tui's JS is bundled into main.cjs, so only the platform-specific // native helper (.node under native/) ships alongside the binary โ€” its // dist/ JS is intentionally NOT collected (it stays in the bundle). This diff --git a/apps/kimi-code/src/migration/migration-screen.ts b/apps/kimi-code/src/migration/migration-screen.ts index b1ebfecfd..d4c4fee7e 100644 --- a/apps/kimi-code/src/migration/migration-screen.ts +++ b/apps/kimi-code/src/migration/migration-screen.ts @@ -11,7 +11,7 @@ * This file implements the ask, progress, and result phases. `beginMigration` * drives the real runMigration flow (injectable for tests). */ -import { Container, matchesKey, Key, truncateToWidth, type Focusable } from '@earendil-works/pi-tui'; +import { Container, matchesKey, Key, truncateToWidth, type Focusable } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import type { ColorPalette } from '#/tui/theme/colors'; diff --git a/apps/kimi-code/src/native/module-hook.ts b/apps/kimi-code/src/native/module-hook.ts index db459bbe9..bc8a1a67b 100644 --- a/apps/kimi-code/src/native/module-hook.ts +++ b/apps/kimi-code/src/native/module-hook.ts @@ -42,7 +42,7 @@ export function installNativeModuleHook(): void { PI_TUI_NATIVE_PATTERN.test(request) && !existsSync(request) ) { - const pkgRoot = getNativePackageRoot('@earendil-works/pi-tui'); + const pkgRoot = getNativePackageRoot('@moonshot-ai/pi-tui'); if (pkgRoot !== null) { const match = request.match(PI_TUI_NATIVE_PATTERN); if (match !== null) { diff --git a/apps/kimi-code/src/native/smoke.ts b/apps/kimi-code/src/native/smoke.ts index de968194f..c77f1419d 100644 --- a/apps/kimi-code/src/native/smoke.ts +++ b/apps/kimi-code/src/native/smoke.ts @@ -3,7 +3,7 @@ import { dirname, join } from 'node:path'; import { getEmbeddedNativeAssetManifest, getNativePackageRoot } from './native-assets'; -const smokePackages = ['@mariozechner/clipboard', '@earendil-works/pi-tui']; +const smokePackages = ['@mariozechner/clipboard', '@moonshot-ai/pi-tui']; // Verify pi-tui's native helper can actually be loaded through the module hook. // pi-tui computes native helper paths from process.execPath and require()s them; diff --git a/apps/kimi-code/src/tui/commands/complete-args.ts b/apps/kimi-code/src/tui/commands/complete-args.ts index 75f76271d..e377c9bb0 100644 --- a/apps/kimi-code/src/tui/commands/complete-args.ts +++ b/apps/kimi-code/src/tui/commands/complete-args.ts @@ -1,4 +1,4 @@ -import type { AutocompleteItem } from '@earendil-works/pi-tui'; +import type { AutocompleteItem } from '@moonshot-ai/pi-tui'; /** * A completable token (subcommand or flag) for a slash command's argument diff --git a/apps/kimi-code/src/tui/commands/dispatch.ts b/apps/kimi-code/src/tui/commands/dispatch.ts index 02226507e..78aaa0a80 100644 --- a/apps/kimi-code/src/tui/commands/dispatch.ts +++ b/apps/kimi-code/src/tui/commands/dispatch.ts @@ -1,4 +1,4 @@ -import type { Component, Focusable } from '@earendil-works/pi-tui'; +import type { Component, Focusable } from '@moonshot-ai/pi-tui'; import type { DeviceAuthorization } from '@moonshot-ai/kimi-code-oauth'; import type { KimiHarness, Session } from '@moonshot-ai/kimi-code-sdk'; diff --git a/apps/kimi-code/src/tui/commands/registry.ts b/apps/kimi-code/src/tui/commands/registry.ts index 966e5ceb7..a25d7708f 100644 --- a/apps/kimi-code/src/tui/commands/registry.ts +++ b/apps/kimi-code/src/tui/commands/registry.ts @@ -2,7 +2,7 @@ import { readdirSync, statSync } from 'node:fs'; import { homedir } from 'node:os'; import { basename, dirname, join, relative, resolve } from 'pathe'; -import type { AutocompleteItem } from '@earendil-works/pi-tui'; +import type { AutocompleteItem } from '@moonshot-ai/pi-tui'; import { completeLeadingArg, type ArgCompletionSpec } from './complete-args'; import type { KimiSlashCommand, SlashCommandAvailability } from './types'; diff --git a/apps/kimi-code/src/tui/commands/types.ts b/apps/kimi-code/src/tui/commands/types.ts index 6ee0a172f..1ec3c6835 100644 --- a/apps/kimi-code/src/tui/commands/types.ts +++ b/apps/kimi-code/src/tui/commands/types.ts @@ -1,4 +1,4 @@ -import type { AutocompleteItem, SlashCommand } from '@earendil-works/pi-tui'; +import type { AutocompleteItem, SlashCommand } from '@moonshot-ai/pi-tui'; import type { FlagId } from '@moonshot-ai/kimi-code-sdk'; export type SlashCommandAvailability = 'always' | 'idle-only'; diff --git a/apps/kimi-code/src/tui/commands/undo.ts b/apps/kimi-code/src/tui/commands/undo.ts index 5a1c963d7..1a4c3e4be 100644 --- a/apps/kimi-code/src/tui/commands/undo.ts +++ b/apps/kimi-code/src/tui/commands/undo.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import type { ContextMessage } from '@moonshot-ai/kimi-code-sdk'; import { isKimiError } from '@moonshot-ai/kimi-code-sdk'; diff --git a/apps/kimi-code/src/tui/components/chrome/banner.ts b/apps/kimi-code/src/tui/components/chrome/banner.ts index 265f0b02e..58b6faa58 100644 --- a/apps/kimi-code/src/tui/components/chrome/banner.ts +++ b/apps/kimi-code/src/tui/components/chrome/banner.ts @@ -1,5 +1,5 @@ -import type { Component } from '@earendil-works/pi-tui'; -import { visibleWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { visibleWidth, wrapTextWithAnsi } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import type { BannerState } from '#/tui/types'; diff --git a/apps/kimi-code/src/tui/components/chrome/device-code-box.ts b/apps/kimi-code/src/tui/components/chrome/device-code-box.ts index 9cc7104b1..26ec211a0 100644 --- a/apps/kimi-code/src/tui/components/chrome/device-code-box.ts +++ b/apps/kimi-code/src/tui/components/chrome/device-code-box.ts @@ -6,8 +6,8 @@ * active palette so theme switches take effect on the next render. */ -import type { Component } from '@earendil-works/pi-tui'; -import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { truncateToWidth, visibleWidth } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/chrome/footer.ts b/apps/kimi-code/src/tui/components/chrome/footer.ts index e77f1a18c..1b55932c5 100644 --- a/apps/kimi-code/src/tui/components/chrome/footer.ts +++ b/apps/kimi-code/src/tui/components/chrome/footer.ts @@ -6,8 +6,8 @@ * Line 2: context: XX.X% (tokens/max) */ -import type { Component } from '@earendil-works/pi-tui'; -import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { truncateToWidth, visibleWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { ALL_TIPS, type ToolbarTip } from '#/tui/constant/tips'; diff --git a/apps/kimi-code/src/tui/components/chrome/gutter-container.ts b/apps/kimi-code/src/tui/components/chrome/gutter-container.ts index be90abf00..72b1e94b1 100644 --- a/apps/kimi-code/src/tui/components/chrome/gutter-container.ts +++ b/apps/kimi-code/src/tui/components/chrome/gutter-container.ts @@ -9,8 +9,8 @@ * the edge and adding them would just churn the diff renderer. */ -import { Container } from '@earendil-works/pi-tui'; -import type { Component } from '@earendil-works/pi-tui'; +import { Container } from '@moonshot-ai/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { isRenderCacheEnabled } from '#/tui/utils/render-cache'; diff --git a/apps/kimi-code/src/tui/components/chrome/moon-loader.ts b/apps/kimi-code/src/tui/components/chrome/moon-loader.ts index 93ab6e7e7..ba19b0c2a 100644 --- a/apps/kimi-code/src/tui/components/chrome/moon-loader.ts +++ b/apps/kimi-code/src/tui/components/chrome/moon-loader.ts @@ -1,5 +1,5 @@ -import { Text, visibleWidth } from '@earendil-works/pi-tui'; -import type { TUI } from '@earendil-works/pi-tui'; +import { Text, visibleWidth } from '@moonshot-ai/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; import { BRAILLE_SPINNER_FRAMES, diff --git a/apps/kimi-code/src/tui/components/chrome/todo-panel.ts b/apps/kimi-code/src/tui/components/chrome/todo-panel.ts index 733d5b8f8..b101b6d6c 100644 --- a/apps/kimi-code/src/tui/components/chrome/todo-panel.ts +++ b/apps/kimi-code/src/tui/components/chrome/todo-panel.ts @@ -9,8 +9,8 @@ * is issued. */ -import type { Component } from '@earendil-works/pi-tui'; -import { truncateToWidth } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { truncateToWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/chrome/welcome.ts b/apps/kimi-code/src/tui/components/chrome/welcome.ts index 3db1de3cf..bd291304e 100644 --- a/apps/kimi-code/src/tui/components/chrome/welcome.ts +++ b/apps/kimi-code/src/tui/components/chrome/welcome.ts @@ -3,8 +3,8 @@ * Renders a round-bordered box with the logo, session, model, and version. */ -import type { Component } from '@earendil-works/pi-tui'; -import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { truncateToWidth, visibleWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { isRainbowDancing, renderDanceWelcomeHeader } from '#/tui/easter-eggs/dance'; diff --git a/apps/kimi-code/src/tui/components/dialogs/api-key-input-dialog.ts b/apps/kimi-code/src/tui/components/dialogs/api-key-input-dialog.ts index f837dc046..d95d9ff93 100644 --- a/apps/kimi-code/src/tui/components/dialogs/api-key-input-dialog.ts +++ b/apps/kimi-code/src/tui/components/dialogs/api-key-input-dialog.ts @@ -6,7 +6,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/dialogs/approval-panel.ts b/apps/kimi-code/src/tui/components/dialogs/approval-panel.ts index 670e612cf..e18f5709b 100644 --- a/apps/kimi-code/src/tui/components/dialogs/approval-panel.ts +++ b/apps/kimi-code/src/tui/components/dialogs/approval-panel.ts @@ -14,7 +14,7 @@ import { truncateToWidth, visibleWidth, wrapTextWithAnsi, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import { highlightLines, langFromPath } from '#/tui/components/media/code-highlight'; import { renderDiffLinesClustered } from '#/tui/components/media/diff-preview'; diff --git a/apps/kimi-code/src/tui/components/dialogs/approval-preview.ts b/apps/kimi-code/src/tui/components/dialogs/approval-preview.ts index 15974959f..b5be012e7 100644 --- a/apps/kimi-code/src/tui/components/dialogs/approval-preview.ts +++ b/apps/kimi-code/src/tui/components/dialogs/approval-preview.ts @@ -24,7 +24,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { highlightLines, langFromPath } from '#/tui/components/media/code-highlight'; import { renderDiffLines } from '#/tui/components/media/diff-preview'; diff --git a/apps/kimi-code/src/tui/components/dialogs/choice-picker.ts b/apps/kimi-code/src/tui/components/dialogs/choice-picker.ts index c85339d90..f0a544d4f 100644 --- a/apps/kimi-code/src/tui/components/dialogs/choice-picker.ts +++ b/apps/kimi-code/src/tui/components/dialogs/choice-picker.ts @@ -15,7 +15,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { CURRENT_MARK, SELECT_POINTER } from '#/tui/constant/symbols'; import { currentTheme, type ColorToken } from '#/tui/theme'; import { printableChar } from '#/tui/utils/printable-key'; diff --git a/apps/kimi-code/src/tui/components/dialogs/compaction.ts b/apps/kimi-code/src/tui/components/dialogs/compaction.ts index 90a924757..a20b947a0 100644 --- a/apps/kimi-code/src/tui/components/dialogs/compaction.ts +++ b/apps/kimi-code/src/tui/components/dialogs/compaction.ts @@ -13,8 +13,8 @@ * reads the same "work in progress" signal across the UI. */ -import { Container, Text, Spacer } from '@earendil-works/pi-tui'; -import type { TUI } from '@earendil-works/pi-tui'; +import { Container, Text, Spacer } from '@moonshot-ai/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/dialogs/custom-registry-import.ts b/apps/kimi-code/src/tui/components/dialogs/custom-registry-import.ts index 8a3150bf4..aa4aa910b 100644 --- a/apps/kimi-code/src/tui/components/dialogs/custom-registry-import.ts +++ b/apps/kimi-code/src/tui/components/dialogs/custom-registry-import.ts @@ -17,7 +17,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/dialogs/experiments-selector.ts b/apps/kimi-code/src/tui/components/dialogs/experiments-selector.ts index 44042f057..1e466f873 100644 --- a/apps/kimi-code/src/tui/components/dialogs/experiments-selector.ts +++ b/apps/kimi-code/src/tui/components/dialogs/experiments-selector.ts @@ -5,7 +5,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import type { ExperimentalFeatureState } from '@moonshot-ai/kimi-code-sdk'; import { SELECT_POINTER } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/dialogs/feedback-input-dialog.ts b/apps/kimi-code/src/tui/components/dialogs/feedback-input-dialog.ts index 38ac3bd9e..c1f108dd7 100644 --- a/apps/kimi-code/src/tui/components/dialogs/feedback-input-dialog.ts +++ b/apps/kimi-code/src/tui/components/dialogs/feedback-input-dialog.ts @@ -19,7 +19,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; export type FeedbackInputDialogResult = diff --git a/apps/kimi-code/src/tui/components/dialogs/goal-queue-manager.ts b/apps/kimi-code/src/tui/components/dialogs/goal-queue-manager.ts index c35d55399..b5c2e7ac1 100644 --- a/apps/kimi-code/src/tui/components/dialogs/goal-queue-manager.ts +++ b/apps/kimi-code/src/tui/components/dialogs/goal-queue-manager.ts @@ -6,7 +6,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { SELECT_POINTER } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/dialogs/help-panel.ts b/apps/kimi-code/src/tui/components/dialogs/help-panel.ts index 1f931eb5a..e1ecfa7e8 100644 --- a/apps/kimi-code/src/tui/components/dialogs/help-panel.ts +++ b/apps/kimi-code/src/tui/components/dialogs/help-panel.ts @@ -15,7 +15,7 @@ import { decodeKittyPrintable, type Focusable, truncateToWidth, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; export interface KeyboardShortcut { diff --git a/apps/kimi-code/src/tui/components/dialogs/model-selector.ts b/apps/kimi-code/src/tui/components/dialogs/model-selector.ts index c319c83a4..dbc80e2eb 100644 --- a/apps/kimi-code/src/tui/components/dialogs/model-selector.ts +++ b/apps/kimi-code/src/tui/components/dialogs/model-selector.ts @@ -6,7 +6,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { DEFAULT_OAUTH_PROVIDER_NAME, PRODUCT_NAME } from '#/constant/app'; import { CURRENT_MARK, SELECT_POINTER } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/dialogs/plugins-selector.ts b/apps/kimi-code/src/tui/components/dialogs/plugins-selector.ts index fcc09941d..c5769def6 100644 --- a/apps/kimi-code/src/tui/components/dialogs/plugins-selector.ts +++ b/apps/kimi-code/src/tui/components/dialogs/plugins-selector.ts @@ -6,7 +6,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import type { PluginInfo, PluginMcpServerInfo, PluginSummary } from '@moonshot-ai/kimi-code-sdk'; import chalk from 'chalk'; diff --git a/apps/kimi-code/src/tui/components/dialogs/provider-manager.ts b/apps/kimi-code/src/tui/components/dialogs/provider-manager.ts index 8805c24a9..7ae0da03d 100644 --- a/apps/kimi-code/src/tui/components/dialogs/provider-manager.ts +++ b/apps/kimi-code/src/tui/components/dialogs/provider-manager.ts @@ -42,7 +42,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { DEFAULT_OAUTH_PROVIDER_NAME } from '#/constant/app'; import { CURRENT_MARK, SELECT_POINTER } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/dialogs/question-dialog.ts b/apps/kimi-code/src/tui/components/dialogs/question-dialog.ts index ba14033f7..6764b88d8 100644 --- a/apps/kimi-code/src/tui/components/dialogs/question-dialog.ts +++ b/apps/kimi-code/src/tui/components/dialogs/question-dialog.ts @@ -15,7 +15,7 @@ import { truncateToWidth, visibleWidth, wrapTextWithAnsi, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import type { diff --git a/apps/kimi-code/src/tui/components/dialogs/session-picker.ts b/apps/kimi-code/src/tui/components/dialogs/session-picker.ts index bb5ec512f..c8bd9017b 100644 --- a/apps/kimi-code/src/tui/components/dialogs/session-picker.ts +++ b/apps/kimi-code/src/tui/components/dialogs/session-picker.ts @@ -9,7 +9,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { formatSessionLabel } from '#/migration/index'; import { CURRENT_MARK, SELECT_POINTER } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/dialogs/start-permission-prompt.ts b/apps/kimi-code/src/tui/components/dialogs/start-permission-prompt.ts index 38c1da2bb..341ced723 100644 --- a/apps/kimi-code/src/tui/components/dialogs/start-permission-prompt.ts +++ b/apps/kimi-code/src/tui/components/dialogs/start-permission-prompt.ts @@ -5,7 +5,7 @@ import { visibleWidth, type Component, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { SELECT_POINTER } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/dialogs/tabbed-model-selector.ts b/apps/kimi-code/src/tui/components/dialogs/tabbed-model-selector.ts index e7287e734..caf56a02a 100644 --- a/apps/kimi-code/src/tui/components/dialogs/tabbed-model-selector.ts +++ b/apps/kimi-code/src/tui/components/dialogs/tabbed-model-selector.ts @@ -20,7 +20,7 @@ import { matchesKey, truncateToWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import { renderTabStrip } from '#/tui/utils/tab-strip'; diff --git a/apps/kimi-code/src/tui/components/dialogs/task-output-viewer.ts b/apps/kimi-code/src/tui/components/dialogs/task-output-viewer.ts index fdcd81aac..c0f647f67 100644 --- a/apps/kimi-code/src/tui/components/dialogs/task-output-viewer.ts +++ b/apps/kimi-code/src/tui/components/dialogs/task-output-viewer.ts @@ -17,7 +17,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@moonshot-ai/kimi-code-sdk'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/dialogs/tasks-browser.ts b/apps/kimi-code/src/tui/components/dialogs/tasks-browser.ts index 0a47a2f83..7902e81e1 100644 --- a/apps/kimi-code/src/tui/components/dialogs/tasks-browser.ts +++ b/apps/kimi-code/src/tui/components/dialogs/tasks-browser.ts @@ -21,7 +21,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@moonshot-ai/kimi-code-sdk'; import { SELECT_POINTER } from '@/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/dialogs/undo-selector.ts b/apps/kimi-code/src/tui/components/dialogs/undo-selector.ts index 77d82ccdd..37320f92b 100644 --- a/apps/kimi-code/src/tui/components/dialogs/undo-selector.ts +++ b/apps/kimi-code/src/tui/components/dialogs/undo-selector.ts @@ -5,7 +5,7 @@ import { truncateToWidth, visibleWidth, type Focusable, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { SELECT_POINTER } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/editor/custom-editor.ts b/apps/kimi-code/src/tui/components/editor/custom-editor.ts index 46f3a6965..18284f4fa 100644 --- a/apps/kimi-code/src/tui/components/editor/custom-editor.ts +++ b/apps/kimi-code/src/tui/components/editor/custom-editor.ts @@ -11,7 +11,7 @@ import { visibleWidth, type SelectItem, type TUI, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import { createEditorTheme } from '#/tui/theme/pi-tui-theme'; diff --git a/apps/kimi-code/src/tui/components/editor/file-mention-provider.ts b/apps/kimi-code/src/tui/components/editor/file-mention-provider.ts index fb6ae3acb..bc9836a88 100644 --- a/apps/kimi-code/src/tui/components/editor/file-mention-provider.ts +++ b/apps/kimi-code/src/tui/components/editor/file-mention-provider.ts @@ -8,7 +8,7 @@ import { type AutocompleteProvider, type AutocompleteSuggestions, type SlashCommand, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; const PATH_DELIMITERS = new Set([' ', '\t', '"', "'", '=']); const MAX_FALLBACK_SCAN = 2000; diff --git a/apps/kimi-code/src/tui/components/editor/wrapping-select-list.ts b/apps/kimi-code/src/tui/components/editor/wrapping-select-list.ts index d9d16936d..b6969c630 100644 --- a/apps/kimi-code/src/tui/components/editor/wrapping-select-list.ts +++ b/apps/kimi-code/src/tui/components/editor/wrapping-select-list.ts @@ -6,7 +6,7 @@ import { type SelectItem, type SelectListLayoutOptions, type SelectListTheme, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; // Mirror pi-tui's private select-list layout constants // (dist/components/select-list.js); keep in sync when bumping pi-tui. diff --git a/apps/kimi-code/src/tui/components/media/image-thumbnail.ts b/apps/kimi-code/src/tui/components/media/image-thumbnail.ts index cc8ef4d56..04e80f534 100644 --- a/apps/kimi-code/src/tui/components/media/image-thumbnail.ts +++ b/apps/kimi-code/src/tui/components/media/image-thumbnail.ts @@ -12,7 +12,7 @@ * the viewport; pi-tui handles proportional scaling internally. */ -import { Container, Image, Text, type ImageTheme, getCapabilities } from '@earendil-works/pi-tui'; +import { Container, Image, Text, type ImageTheme, getCapabilities } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import type { ImageAttachment } from '#/tui/utils/image-attachment-store'; diff --git a/apps/kimi-code/src/tui/components/messages/agent-group.ts b/apps/kimi-code/src/tui/components/messages/agent-group.ts index 71c53332e..6fd1624d5 100644 --- a/apps/kimi-code/src/tui/components/messages/agent-group.ts +++ b/apps/kimi-code/src/tui/components/messages/agent-group.ts @@ -15,8 +15,8 @@ * - Ungrouping is not implemented. Once formed, a group stays grouped. */ -import type { TUI } from '@earendil-works/pi-tui'; -import { Container, Spacer, Text } from '@earendil-works/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; +import { Container, Spacer, Text } from '@moonshot-ai/pi-tui'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/agent-swarm-progress.ts b/apps/kimi-code/src/tui/components/messages/agent-swarm-progress.ts index 173be9951..75c7266a2 100644 --- a/apps/kimi-code/src/tui/components/messages/agent-swarm-progress.ts +++ b/apps/kimi-code/src/tui/components/messages/agent-swarm-progress.ts @@ -1,4 +1,4 @@ -import { truncateToWidth, visibleWidth, type Component } from '@earendil-works/pi-tui'; +import { truncateToWidth, visibleWidth, type Component } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { diff --git a/apps/kimi-code/src/tui/components/messages/assistant-message.ts b/apps/kimi-code/src/tui/components/messages/assistant-message.ts index 721711801..c1b39537d 100644 --- a/apps/kimi-code/src/tui/components/messages/assistant-message.ts +++ b/apps/kimi-code/src/tui/components/messages/assistant-message.ts @@ -5,7 +5,7 @@ * to align after the bullet. */ -import { Container, Markdown, truncateToWidth, visibleWidth, type Component } from '@earendil-works/pi-tui'; +import { Container, Markdown, truncateToWidth, visibleWidth, type Component } from '@moonshot-ai/pi-tui'; import { MESSAGE_INDENT } from '#/tui/constant/rendering'; import { STATUS_BULLET } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/messages/background-agent-status.ts b/apps/kimi-code/src/tui/components/messages/background-agent-status.ts index 3d968bad8..9c1a3d815 100644 --- a/apps/kimi-code/src/tui/components/messages/background-agent-status.ts +++ b/apps/kimi-code/src/tui/components/messages/background-agent-status.ts @@ -1,4 +1,4 @@ -import { Text, truncateToWidth, type Component } from '@earendil-works/pi-tui'; +import { Text, truncateToWidth, type Component } from '@moonshot-ai/pi-tui'; import { MESSAGE_INDENT } from '#/tui/constant/rendering'; import { FAILURE_MARK, STATUS_BULLET } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/messages/cron-message.ts b/apps/kimi-code/src/tui/components/messages/cron-message.ts index 5ca2acf02..8cb81f5d3 100644 --- a/apps/kimi-code/src/tui/components/messages/cron-message.ts +++ b/apps/kimi-code/src/tui/components/messages/cron-message.ts @@ -1,5 +1,5 @@ -import type { Component } from '@earendil-works/pi-tui'; -import { Spacer, Text, visibleWidth } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { Spacer, Text, visibleWidth } from '@moonshot-ai/pi-tui'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/goal-markers.ts b/apps/kimi-code/src/tui/components/messages/goal-markers.ts index 0cff92d50..f4482941f 100644 --- a/apps/kimi-code/src/tui/components/messages/goal-markers.ts +++ b/apps/kimi-code/src/tui/components/messages/goal-markers.ts @@ -7,7 +7,7 @@ * the richer completion card (the `/goal` box), not this marker. */ -import { truncateToWidth, type Component } from '@earendil-works/pi-tui'; +import { truncateToWidth, type Component } from '@moonshot-ai/pi-tui'; import type { GoalChange } from '@moonshot-ai/kimi-code-sdk'; import { STATUS_BULLET } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/messages/goal-panel.ts b/apps/kimi-code/src/tui/components/messages/goal-panel.ts index be9df81af..d01f580fa 100644 --- a/apps/kimi-code/src/tui/components/messages/goal-panel.ts +++ b/apps/kimi-code/src/tui/components/messages/goal-panel.ts @@ -19,7 +19,7 @@ import { visibleWidth, wrapTextWithAnsi, type Component, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import type { GoalSnapshot, GoalStatus } from '@moonshot-ai/kimi-code-sdk'; import { MESSAGE_INDENT } from '#/tui/constant/rendering'; diff --git a/apps/kimi-code/src/tui/components/messages/plan-box.ts b/apps/kimi-code/src/tui/components/messages/plan-box.ts index d6b2c6207..d1eeec03c 100644 --- a/apps/kimi-code/src/tui/components/messages/plan-box.ts +++ b/apps/kimi-code/src/tui/components/messages/plan-box.ts @@ -7,7 +7,7 @@ import path from 'node:path'; import { pathToFileURL } from 'node:url'; -import { Markdown, truncateToWidth, visibleWidth, type Component, type MarkdownTheme } from '@earendil-works/pi-tui'; +import { Markdown, truncateToWidth, visibleWidth, type Component, type MarkdownTheme } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { toTerminalHyperlink } from '#/utils/terminal-hyperlink'; diff --git a/apps/kimi-code/src/tui/components/messages/read-group.ts b/apps/kimi-code/src/tui/components/messages/read-group.ts index 3910be1ab..141562e4c 100644 --- a/apps/kimi-code/src/tui/components/messages/read-group.ts +++ b/apps/kimi-code/src/tui/components/messages/read-group.ts @@ -20,8 +20,8 @@ * src/missing.ts ยท failed */ -import type { TUI } from '@earendil-works/pi-tui'; -import { Container, Spacer, Text } from '@earendil-works/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; +import { Container, Spacer, Text } from '@moonshot-ai/pi-tui'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/shell-execution.ts b/apps/kimi-code/src/tui/components/messages/shell-execution.ts index 1a28c7c64..5e10b84de 100644 --- a/apps/kimi-code/src/tui/components/messages/shell-execution.ts +++ b/apps/kimi-code/src/tui/components/messages/shell-execution.ts @@ -1,5 +1,5 @@ -import type { Component } from '@earendil-works/pi-tui'; -import { Container, Text } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { Container, Text } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import type { ToolCallBlockData, ToolResultBlockData } from '#/tui/types'; diff --git a/apps/kimi-code/src/tui/components/messages/shell-run.ts b/apps/kimi-code/src/tui/components/messages/shell-run.ts index 3c5fc20da..ca99f2e76 100644 --- a/apps/kimi-code/src/tui/components/messages/shell-run.ts +++ b/apps/kimi-code/src/tui/components/messages/shell-run.ts @@ -1,4 +1,4 @@ -import { Container, Text } from '@earendil-works/pi-tui'; +import { Container, Text } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/skill-activation.ts b/apps/kimi-code/src/tui/components/messages/skill-activation.ts index 907e91e9d..f977d21d9 100644 --- a/apps/kimi-code/src/tui/components/messages/skill-activation.ts +++ b/apps/kimi-code/src/tui/components/messages/skill-activation.ts @@ -12,7 +12,7 @@ * metadata. */ -import { Container, Text, Spacer } from '@earendil-works/pi-tui'; +import { Container, Text, Spacer } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import type { SkillActivationTrigger } from '#/tui/types'; diff --git a/apps/kimi-code/src/tui/components/messages/status-message.ts b/apps/kimi-code/src/tui/components/messages/status-message.ts index c23c356ce..f88c1861b 100644 --- a/apps/kimi-code/src/tui/components/messages/status-message.ts +++ b/apps/kimi-code/src/tui/components/messages/status-message.ts @@ -1,4 +1,4 @@ -import { Container, Spacer, Text } from '@earendil-works/pi-tui'; +import { Container, Spacer, Text } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; import type { ColorToken } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/step-summary.ts b/apps/kimi-code/src/tui/components/messages/step-summary.ts index 5a6885ac4..325ae6eb2 100644 --- a/apps/kimi-code/src/tui/components/messages/step-summary.ts +++ b/apps/kimi-code/src/tui/components/messages/step-summary.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/swarm-markers.ts b/apps/kimi-code/src/tui/components/messages/swarm-markers.ts index 0308fada7..4fee9629f 100644 --- a/apps/kimi-code/src/tui/components/messages/swarm-markers.ts +++ b/apps/kimi-code/src/tui/components/messages/swarm-markers.ts @@ -1,4 +1,4 @@ -import { truncateToWidth, type Component } from '@earendil-works/pi-tui'; +import { truncateToWidth, type Component } from '@moonshot-ai/pi-tui'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/thinking.ts b/apps/kimi-code/src/tui/components/messages/thinking.ts index ca0847581..23a038c70 100644 --- a/apps/kimi-code/src/tui/components/messages/thinking.ts +++ b/apps/kimi-code/src/tui/components/messages/thinking.ts @@ -5,7 +5,7 @@ * Supports expand/collapse via Ctrl+O (shared with tool output). */ -import { Text, truncateToWidth, type Component, type TUI } from '@earendil-works/pi-tui'; +import { Text, truncateToWidth, type Component, type TUI } from '@moonshot-ai/pi-tui'; import { BRAILLE_SPINNER_FRAMES, diff --git a/apps/kimi-code/src/tui/components/messages/tool-call.ts b/apps/kimi-code/src/tui/components/messages/tool-call.ts index d83e0b7d9..4bf317ad1 100644 --- a/apps/kimi-code/src/tui/components/messages/tool-call.ts +++ b/apps/kimi-code/src/tui/components/messages/tool-call.ts @@ -5,8 +5,8 @@ import { isAbsolute, relative, sep } from 'node:path'; -import { Container, Spacer, Text, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; -import type { Component, TUI } from '@earendil-works/pi-tui'; +import { Container, Spacer, Text, truncateToWidth, visibleWidth } from '@moonshot-ai/pi-tui'; +import type { Component, TUI } from '@moonshot-ai/pi-tui'; import { highlightLines, langFromPath } from '#/tui/components/media/code-highlight'; import { renderDiffLinesClustered } from '#/tui/components/media/diff-preview'; import { diff --git a/apps/kimi-code/src/tui/components/messages/tool-renderers/goal.ts b/apps/kimi-code/src/tui/components/messages/tool-renderers/goal.ts index 04f20dc35..1b38fd278 100644 --- a/apps/kimi-code/src/tui/components/messages/tool-renderers/goal.ts +++ b/apps/kimi-code/src/tui/components/messages/tool-renderers/goal.ts @@ -1,4 +1,4 @@ -import { Text } from '@earendil-works/pi-tui'; +import { Text } from '@moonshot-ai/pi-tui'; import { STATUS_BULLET } from '#/tui/constant/symbols'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/tool-renderers/media.ts b/apps/kimi-code/src/tui/components/messages/tool-renderers/media.ts index fd753cd27..100968daf 100644 --- a/apps/kimi-code/src/tui/components/messages/tool-renderers/media.ts +++ b/apps/kimi-code/src/tui/components/messages/tool-renderers/media.ts @@ -13,8 +13,8 @@ * message. */ -import type { Component } from '@earendil-works/pi-tui'; -import { Text } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { Text } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import type { ChipProvider } from './chip'; diff --git a/apps/kimi-code/src/tui/components/messages/tool-renderers/summary.ts b/apps/kimi-code/src/tui/components/messages/tool-renderers/summary.ts index a3f929dcc..ac31cec8e 100644 --- a/apps/kimi-code/src/tui/components/messages/tool-renderers/summary.ts +++ b/apps/kimi-code/src/tui/components/messages/tool-renderers/summary.ts @@ -10,8 +10,8 @@ * sees the actual error message, not a synthetic summary. */ -import type { Component } from '@earendil-works/pi-tui'; -import { Text } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { Text } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { renderTruncated } from './truncated'; diff --git a/apps/kimi-code/src/tui/components/messages/tool-renderers/truncated.ts b/apps/kimi-code/src/tui/components/messages/tool-renderers/truncated.ts index e619ff19d..036ae0a20 100644 --- a/apps/kimi-code/src/tui/components/messages/tool-renderers/truncated.ts +++ b/apps/kimi-code/src/tui/components/messages/tool-renderers/truncated.ts @@ -1,4 +1,4 @@ -import { Text, truncateToWidth, type Component } from '@earendil-works/pi-tui'; +import { Text, truncateToWidth, type Component } from '@moonshot-ai/pi-tui'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/src/tui/components/messages/tool-renderers/types.ts b/apps/kimi-code/src/tui/components/messages/tool-renderers/types.ts index 94161d1a8..da3dc3a5a 100644 --- a/apps/kimi-code/src/tui/components/messages/tool-renderers/types.ts +++ b/apps/kimi-code/src/tui/components/messages/tool-renderers/types.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { RESULT_PREVIEW_LINES } from '#/tui/constant/rendering'; import type { ToolCallBlockData, ToolResultBlockData } from '#/tui/types'; diff --git a/apps/kimi-code/src/tui/components/messages/usage-panel.ts b/apps/kimi-code/src/tui/components/messages/usage-panel.ts index 1eeba55e2..23cef0b27 100644 --- a/apps/kimi-code/src/tui/components/messages/usage-panel.ts +++ b/apps/kimi-code/src/tui/components/messages/usage-panel.ts @@ -4,8 +4,8 @@ * the pattern stays consistent across command-triggered panels. */ -import type { Component } from '@earendil-works/pi-tui'; -import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; +import { truncateToWidth, visibleWidth } from '@moonshot-ai/pi-tui'; import type { SessionUsage, TokenUsage } from '@moonshot-ai/kimi-code-sdk'; import { diff --git a/apps/kimi-code/src/tui/components/messages/user-message.ts b/apps/kimi-code/src/tui/components/messages/user-message.ts index 0e9b2c32c..cec7fbd13 100644 --- a/apps/kimi-code/src/tui/components/messages/user-message.ts +++ b/apps/kimi-code/src/tui/components/messages/user-message.ts @@ -2,7 +2,7 @@ * Renders a user message in the transcript. */ -import { Spacer, Text, truncateToWidth, visibleWidth, type Component } from '@earendil-works/pi-tui'; +import { Spacer, Text, truncateToWidth, visibleWidth, type Component } from '@moonshot-ai/pi-tui'; import { ImageThumbnail } from '#/tui/components/media/image-thumbnail'; import { USER_MESSAGE_BULLET } from '#/tui/constant/symbols'; diff --git a/apps/kimi-code/src/tui/components/panes/activity-pane.ts b/apps/kimi-code/src/tui/components/panes/activity-pane.ts index 443f3aa74..22e6f3bc5 100644 --- a/apps/kimi-code/src/tui/components/panes/activity-pane.ts +++ b/apps/kimi-code/src/tui/components/panes/activity-pane.ts @@ -1,4 +1,4 @@ -import { Container, Spacer } from '@earendil-works/pi-tui'; +import { Container, Spacer } from '@moonshot-ai/pi-tui'; import type { MoonLoader } from '#/tui/components/chrome/moon-loader'; diff --git a/apps/kimi-code/src/tui/components/panes/btw-panel.ts b/apps/kimi-code/src/tui/components/panes/btw-panel.ts index 9c4936fa2..f32aa9321 100644 --- a/apps/kimi-code/src/tui/components/panes/btw-panel.ts +++ b/apps/kimi-code/src/tui/components/panes/btw-panel.ts @@ -1,10 +1,10 @@ -import type { Component, MarkdownTheme } from '@earendil-works/pi-tui'; +import type { Component, MarkdownTheme } from '@moonshot-ai/pi-tui'; import { Markdown, Text, truncateToWidth, visibleWidth, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { THINKING_PREVIEW_LINES } from '../../constant/rendering'; diff --git a/apps/kimi-code/src/tui/components/panes/queue-pane.ts b/apps/kimi-code/src/tui/components/panes/queue-pane.ts index a3c959a6a..1a2b26d07 100644 --- a/apps/kimi-code/src/tui/components/panes/queue-pane.ts +++ b/apps/kimi-code/src/tui/components/panes/queue-pane.ts @@ -1,4 +1,4 @@ -import { Container, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; +import { Container, truncateToWidth, visibleWidth } from '@moonshot-ai/pi-tui'; import { SELECT_POINTER } from '../../constant/symbols'; import type { QueuedMessage } from '../../types'; diff --git a/apps/kimi-code/src/tui/controllers/btw-panel.ts b/apps/kimi-code/src/tui/controllers/btw-panel.ts index d984f7082..c29c76460 100644 --- a/apps/kimi-code/src/tui/controllers/btw-panel.ts +++ b/apps/kimi-code/src/tui/controllers/btw-panel.ts @@ -1,4 +1,4 @@ -import { Spacer } from '@earendil-works/pi-tui'; +import { Spacer } from '@moonshot-ai/pi-tui'; import type { Event, KimiHarness, diff --git a/apps/kimi-code/src/tui/controllers/clipboard-image-hint.ts b/apps/kimi-code/src/tui/controllers/clipboard-image-hint.ts index ac1fd8c11..48dd1f8b8 100644 --- a/apps/kimi-code/src/tui/controllers/clipboard-image-hint.ts +++ b/apps/kimi-code/src/tui/controllers/clipboard-image-hint.ts @@ -1,4 +1,4 @@ -import type { TUI } from '@earendil-works/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; import { clipboardHasImage } from '#/utils/clipboard/clipboard-has-image'; diff --git a/apps/kimi-code/src/tui/controllers/session-event-handler.ts b/apps/kimi-code/src/tui/controllers/session-event-handler.ts index 50c66e04b..c644e5858 100644 --- a/apps/kimi-code/src/tui/controllers/session-event-handler.ts +++ b/apps/kimi-code/src/tui/controllers/session-event-handler.ts @@ -1,4 +1,4 @@ -import type { Component, Focusable } from '@earendil-works/pi-tui'; +import type { Component, Focusable } from '@moonshot-ai/pi-tui'; import type { AgentStatusUpdatedEvent, AssistantDeltaEvent, diff --git a/apps/kimi-code/src/tui/controllers/subagent-event-handler.ts b/apps/kimi-code/src/tui/controllers/subagent-event-handler.ts index 6d08330c5..deb407bfc 100644 --- a/apps/kimi-code/src/tui/controllers/subagent-event-handler.ts +++ b/apps/kimi-code/src/tui/controllers/subagent-event-handler.ts @@ -2,7 +2,7 @@ import type { BackgroundTaskInfo, Event, } from '@moonshot-ai/kimi-code-sdk'; -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { AgentSwarmProgressComponent, diff --git a/apps/kimi-code/src/tui/controllers/tasks-browser.ts b/apps/kimi-code/src/tui/controllers/tasks-browser.ts index 90ed3c99e..6994b13b8 100644 --- a/apps/kimi-code/src/tui/controllers/tasks-browser.ts +++ b/apps/kimi-code/src/tui/controllers/tasks-browser.ts @@ -1,5 +1,5 @@ import type { BackgroundTaskInfo, Session } from '@moonshot-ai/kimi-code-sdk'; -import type { Component, ProcessTerminal, TUI } from '@earendil-works/pi-tui'; +import type { Component, ProcessTerminal, TUI } from '@moonshot-ai/pi-tui'; import { TaskOutputViewer } from '../components/dialogs/task-output-viewer'; import { TasksBrowserApp, type TasksFilter } from '../components/dialogs/tasks-browser'; diff --git a/apps/kimi-code/src/tui/easter-eggs/dance.ts b/apps/kimi-code/src/tui/easter-eggs/dance.ts index 6f638aba0..15e3608f8 100644 --- a/apps/kimi-code/src/tui/easter-eggs/dance.ts +++ b/apps/kimi-code/src/tui/easter-eggs/dance.ts @@ -10,7 +10,7 @@ */ import chalk from 'chalk'; -import { truncateToWidth, visibleWidth } from '@earendil-works/pi-tui'; +import { truncateToWidth, visibleWidth } from '@moonshot-ai/pi-tui'; import type { SlashCommandHost } from '../commands/dispatch'; import type { ParsedSlashInput } from '../commands/types'; diff --git a/apps/kimi-code/src/tui/kimi-tui.ts b/apps/kimi-code/src/tui/kimi-tui.ts index f2cee5888..382457a83 100644 --- a/apps/kimi-code/src/tui/kimi-tui.ts +++ b/apps/kimi-code/src/tui/kimi-tui.ts @@ -7,7 +7,7 @@ import { type Focusable, getCapabilities, Spacer, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import type { DeviceAuthorization } from '@moonshot-ai/kimi-code-oauth'; import type { ApprovalRequest, diff --git a/apps/kimi-code/src/tui/theme/pi-tui-theme.ts b/apps/kimi-code/src/tui/theme/pi-tui-theme.ts index d03f309fa..1b53bce0c 100644 --- a/apps/kimi-code/src/tui/theme/pi-tui-theme.ts +++ b/apps/kimi-code/src/tui/theme/pi-tui-theme.ts @@ -8,7 +8,7 @@ * instances reads the *current* palette via the singleton. */ -import type { MarkdownTheme, EditorTheme } from '@earendil-works/pi-tui'; +import type { MarkdownTheme, EditorTheme } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { highlight, supportsLanguage } from 'cli-highlight'; diff --git a/apps/kimi-code/src/tui/tui-state.ts b/apps/kimi-code/src/tui/tui-state.ts index 6a9594f01..5a554f2f5 100644 --- a/apps/kimi-code/src/tui/tui-state.ts +++ b/apps/kimi-code/src/tui/tui-state.ts @@ -2,7 +2,7 @@ import { Container, ProcessTerminal, TUI, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { FooterComponent } from './components/chrome/footer'; import { GutterContainer } from './components/chrome/gutter-container'; diff --git a/apps/kimi-code/src/tui/utils/printable-key.ts b/apps/kimi-code/src/tui/utils/printable-key.ts index 7daa36ab6..d165d52a4 100644 --- a/apps/kimi-code/src/tui/utils/printable-key.ts +++ b/apps/kimi-code/src/tui/utils/printable-key.ts @@ -20,7 +20,7 @@ * `tui/components/**` and rejects bare-literal comparisons. */ -import { decodeKittyPrintable } from '@earendil-works/pi-tui'; +import { decodeKittyPrintable } from '@moonshot-ai/pi-tui'; export function printableChar(data: string): string { return decodeKittyPrintable(data) ?? data; diff --git a/apps/kimi-code/src/tui/utils/searchable-list.ts b/apps/kimi-code/src/tui/utils/searchable-list.ts index b5b7343a7..00a920e1f 100644 --- a/apps/kimi-code/src/tui/utils/searchable-list.ts +++ b/apps/kimi-code/src/tui/utils/searchable-list.ts @@ -8,7 +8,7 @@ * everywhere: โ†‘/โ†“, PgUp/PgDn, and search editing. */ -import { fuzzyFilter, Key, matchesKey } from '@earendil-works/pi-tui'; +import { fuzzyFilter, Key, matchesKey } from '@moonshot-ai/pi-tui'; import { pageView, type PageView } from './paging'; import { isPrintableChar, printableChar } from './printable-key'; diff --git a/apps/kimi-code/src/tui/utils/tab-strip.ts b/apps/kimi-code/src/tui/utils/tab-strip.ts index 3cac6826b..a4b5099a7 100644 --- a/apps/kimi-code/src/tui/utils/tab-strip.ts +++ b/apps/kimi-code/src/tui/utils/tab-strip.ts @@ -8,7 +8,7 @@ * visible, framed by `<`/`>` markers. */ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import type { ColorPalette } from '#/tui/theme/colors'; diff --git a/apps/kimi-code/src/tui/utils/terminal-notification.ts b/apps/kimi-code/src/tui/utils/terminal-notification.ts index ab6f1bff7..c71f41df9 100644 --- a/apps/kimi-code/src/tui/utils/terminal-notification.ts +++ b/apps/kimi-code/src/tui/utils/terminal-notification.ts @@ -1,4 +1,4 @@ -import type { Terminal } from '@earendil-works/pi-tui'; +import type { Terminal } from '@moonshot-ai/pi-tui'; import { BEL, ESC, MAX_TERMINAL_NOTIFICATION_MESSAGE_LENGTH, ST } from '#/tui/constant/terminal'; import type { TUIState } from '#/tui/tui-state'; diff --git a/apps/kimi-code/src/tui/utils/transcript-component-metadata.ts b/apps/kimi-code/src/tui/utils/transcript-component-metadata.ts index 12151958a..94cb45693 100644 --- a/apps/kimi-code/src/tui/utils/transcript-component-metadata.ts +++ b/apps/kimi-code/src/tui/utils/transcript-component-metadata.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import type { TranscriptEntry } from '../types'; diff --git a/apps/kimi-code/test/scripts/native/native-deps.test.ts b/apps/kimi-code/test/scripts/native/native-deps.test.ts index 21bc1183d..980f1c771 100644 --- a/apps/kimi-code/test/scripts/native/native-deps.test.ts +++ b/apps/kimi-code/test/scripts/native/native-deps.test.ts @@ -41,7 +41,7 @@ describe('resolveTargetDeps', () => { const names = deps.map((d) => d.resolvedName); expect(names).toContain('@mariozechner/clipboard'); expect(names).toContain('@mariozechner/clipboard-darwin-arm64'); - expect(names).toContain('@earendil-works/pi-tui'); + expect(names).toContain('@moonshot-ai/pi-tui'); }); it('picks the right clipboard subpackage per target', () => { @@ -58,17 +58,17 @@ describe('resolveTargetDeps', () => { it('encodes pi-tui native file path per target', () => { const linuxPiTui = resolveTargetDeps('linux-arm64').find( - (d) => d.resolvedName === '@earendil-works/pi-tui', + (d) => d.resolvedName === '@moonshot-ai/pi-tui', ); expect(linuxPiTui?.nativeFileRelatives).toEqual([]); const macPiTui = resolveTargetDeps('darwin-x64').find( - (d) => d.resolvedName === '@earendil-works/pi-tui', + (d) => d.resolvedName === '@moonshot-ai/pi-tui', ); expect(macPiTui?.nativeFileRelatives).toEqual([ 'native/darwin/prebuilds/darwin-x64/darwin-modifiers.node', ]); const winArmPiTui = resolveTargetDeps('win32-arm64').find( - (d) => d.resolvedName === '@earendil-works/pi-tui', + (d) => d.resolvedName === '@moonshot-ai/pi-tui', ); expect(winArmPiTui?.nativeFileRelatives).toEqual([ 'native/win32/prebuilds/win32-arm64/win32-console-mode.node', diff --git a/apps/kimi-code/test/tui/components/chrome/banner.test.ts b/apps/kimi-code/test/tui/components/chrome/banner.test.ts index 8f5724e5f..aecf815d9 100644 --- a/apps/kimi-code/test/tui/components/chrome/banner.test.ts +++ b/apps/kimi-code/test/tui/components/chrome/banner.test.ts @@ -1,6 +1,6 @@ import chalk from 'chalk'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { BannerComponent } from '#/tui/components/chrome/banner'; import { currentTheme } from '#/tui/theme'; diff --git a/apps/kimi-code/test/tui/components/chrome/device-code-box.test.ts b/apps/kimi-code/test/tui/components/chrome/device-code-box.test.ts index 440a4ad06..c0d4e929f 100644 --- a/apps/kimi-code/test/tui/components/chrome/device-code-box.test.ts +++ b/apps/kimi-code/test/tui/components/chrome/device-code-box.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { DeviceCodeBoxComponent } from '#/tui/components/chrome/device-code-box'; diff --git a/apps/kimi-code/test/tui/components/chrome/gutter-container.test.ts b/apps/kimi-code/test/tui/components/chrome/gutter-container.test.ts index c26e97a17..295363a74 100644 --- a/apps/kimi-code/test/tui/components/chrome/gutter-container.test.ts +++ b/apps/kimi-code/test/tui/components/chrome/gutter-container.test.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { describe, expect, it, vi } from 'vitest'; import { GutterContainer } from '#/tui/components/chrome/gutter-container'; diff --git a/apps/kimi-code/test/tui/components/chrome/moon-loader.test.ts b/apps/kimi-code/test/tui/components/chrome/moon-loader.test.ts index e8bea6504..ffdc5bcbe 100644 --- a/apps/kimi-code/test/tui/components/chrome/moon-loader.test.ts +++ b/apps/kimi-code/test/tui/components/chrome/moon-loader.test.ts @@ -1,4 +1,4 @@ -import type { TUI } from '@earendil-works/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; import { afterEach, describe, expect, it } from 'vitest'; import { MoonLoader } from '#/tui/components/chrome/moon-loader'; diff --git a/apps/kimi-code/test/tui/components/chrome/welcome.test.ts b/apps/kimi-code/test/tui/components/chrome/welcome.test.ts index 1eb757e67..8f61e1a93 100644 --- a/apps/kimi-code/test/tui/components/chrome/welcome.test.ts +++ b/apps/kimi-code/test/tui/components/chrome/welcome.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; diff --git a/apps/kimi-code/test/tui/components/dialogs/api-key-input-dialog.test.ts b/apps/kimi-code/test/tui/components/dialogs/api-key-input-dialog.test.ts index 939242383..610ea23e2 100644 --- a/apps/kimi-code/test/tui/components/dialogs/api-key-input-dialog.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/api-key-input-dialog.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { ApiKeyInputDialogComponent } from '#/tui/components/dialogs/api-key-input-dialog'; diff --git a/apps/kimi-code/test/tui/components/dialogs/approval-panel.test.ts b/apps/kimi-code/test/tui/components/dialogs/approval-panel.test.ts index 612ec152f..d02df500e 100644 --- a/apps/kimi-code/test/tui/components/dialogs/approval-panel.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/approval-panel.test.ts @@ -1,4 +1,4 @@ -import { CURSOR_MARKER } from '@earendil-works/pi-tui'; +import { CURSOR_MARKER } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { ApprovalPanelComponent } from '#/tui/components/dialogs/approval-panel'; diff --git a/apps/kimi-code/test/tui/components/dialogs/approval-preview.test.ts b/apps/kimi-code/test/tui/components/dialogs/approval-preview.test.ts index d4ba77fa9..a1b8b563e 100644 --- a/apps/kimi-code/test/tui/components/dialogs/approval-preview.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/approval-preview.test.ts @@ -1,4 +1,4 @@ -import type { Terminal } from '@earendil-works/pi-tui'; +import type { Terminal } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { diff --git a/apps/kimi-code/test/tui/components/dialogs/custom-registry-import.test.ts b/apps/kimi-code/test/tui/components/dialogs/custom-registry-import.test.ts index b46ba311c..68c79974d 100644 --- a/apps/kimi-code/test/tui/components/dialogs/custom-registry-import.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/custom-registry-import.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/kimi-code/test/tui/components/dialogs/feedback-input-dialog.test.ts b/apps/kimi-code/test/tui/components/dialogs/feedback-input-dialog.test.ts index 068b7f00f..7ab1b3312 100644 --- a/apps/kimi-code/test/tui/components/dialogs/feedback-input-dialog.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/feedback-input-dialog.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { beforeAll, describe, expect, it } from 'vitest'; diff --git a/apps/kimi-code/test/tui/components/dialogs/goal-queue-manager.test.ts b/apps/kimi-code/test/tui/components/dialogs/goal-queue-manager.test.ts index 547b30a66..ec0f9d03b 100644 --- a/apps/kimi-code/test/tui/components/dialogs/goal-queue-manager.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/goal-queue-manager.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/kimi-code/test/tui/components/dialogs/model-selector.test.ts b/apps/kimi-code/test/tui/components/dialogs/model-selector.test.ts index 4d0ad439b..d27d00326 100644 --- a/apps/kimi-code/test/tui/components/dialogs/model-selector.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/model-selector.test.ts @@ -1,5 +1,5 @@ import type { ModelAlias } from '@moonshot-ai/kimi-code-sdk'; -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it, vi } from 'vitest'; import { ModelSelectorComponent } from '#/tui/components/dialogs/model-selector'; diff --git a/apps/kimi-code/test/tui/components/dialogs/question-dialog.test.ts b/apps/kimi-code/test/tui/components/dialogs/question-dialog.test.ts index 12ca62ed7..812ac0d94 100644 --- a/apps/kimi-code/test/tui/components/dialogs/question-dialog.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/question-dialog.test.ts @@ -1,4 +1,4 @@ -import { CURSOR_MARKER } from '@earendil-works/pi-tui'; +import { CURSOR_MARKER } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { beforeAll, describe, expect, it } from 'vitest'; diff --git a/apps/kimi-code/test/tui/components/dialogs/session-picker.test.ts b/apps/kimi-code/test/tui/components/dialogs/session-picker.test.ts index 70f7dfe30..3c885488b 100644 --- a/apps/kimi-code/test/tui/components/dialogs/session-picker.test.ts +++ b/apps/kimi-code/test/tui/components/dialogs/session-picker.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { SessionPickerComponent } from '#/tui/components/dialogs/session-picker'; diff --git a/apps/kimi-code/test/tui/components/editor/custom-editor.test.ts b/apps/kimi-code/test/tui/components/editor/custom-editor.test.ts index 1aa68aa90..be5fb7251 100644 --- a/apps/kimi-code/test/tui/components/editor/custom-editor.test.ts +++ b/apps/kimi-code/test/tui/components/editor/custom-editor.test.ts @@ -3,7 +3,7 @@ import type { AutocompleteProvider, AutocompleteSuggestions, TUI, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import { describe, expect, it, vi } from 'vitest'; import { CustomEditor } from '#/tui/components/editor/custom-editor'; diff --git a/apps/kimi-code/test/tui/components/editor/wrapping-select-list.test.ts b/apps/kimi-code/test/tui/components/editor/wrapping-select-list.test.ts index 8a8a7ba00..c4147ab40 100644 --- a/apps/kimi-code/test/tui/components/editor/wrapping-select-list.test.ts +++ b/apps/kimi-code/test/tui/components/editor/wrapping-select-list.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth, type SelectItem, type SelectListTheme } from '@earendil-works/pi-tui'; +import { visibleWidth, type SelectItem, type SelectListTheme } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { WrappingSelectList } from '#/tui/components/editor/wrapping-select-list'; diff --git a/apps/kimi-code/test/tui/components/media/image-thumbnail.test.ts b/apps/kimi-code/test/tui/components/media/image-thumbnail.test.ts index d2bac1561..b6378f389 100644 --- a/apps/kimi-code/test/tui/components/media/image-thumbnail.test.ts +++ b/apps/kimi-code/test/tui/components/media/image-thumbnail.test.ts @@ -1,4 +1,4 @@ -import { resetCapabilitiesCache, setCapabilities, visibleWidth } from '@earendil-works/pi-tui'; +import { resetCapabilitiesCache, setCapabilities, visibleWidth } from '@moonshot-ai/pi-tui'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { ImageThumbnail } from '#/tui/components/media/image-thumbnail'; diff --git a/apps/kimi-code/test/tui/components/messages/agent-group.test.ts b/apps/kimi-code/test/tui/components/messages/agent-group.test.ts index fc0e0ba30..adf4d3b0b 100644 --- a/apps/kimi-code/test/tui/components/messages/agent-group.test.ts +++ b/apps/kimi-code/test/tui/components/messages/agent-group.test.ts @@ -1,4 +1,4 @@ -import type { TUI } from '@earendil-works/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { AgentGroupComponent } from '#/tui/components/messages/agent-group'; diff --git a/apps/kimi-code/test/tui/components/messages/agent-swarm-progress.test.ts b/apps/kimi-code/test/tui/components/messages/agent-swarm-progress.test.ts index 485a171ba..ad6389418 100644 --- a/apps/kimi-code/test/tui/components/messages/agent-swarm-progress.test.ts +++ b/apps/kimi-code/test/tui/components/messages/agent-swarm-progress.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { diff --git a/apps/kimi-code/test/tui/components/messages/assistant-message.test.ts b/apps/kimi-code/test/tui/components/messages/assistant-message.test.ts index 8d42ca5e0..e078e6dd2 100644 --- a/apps/kimi-code/test/tui/components/messages/assistant-message.test.ts +++ b/apps/kimi-code/test/tui/components/messages/assistant-message.test.ts @@ -1,4 +1,4 @@ -import { Markdown, visibleWidth } from '@earendil-works/pi-tui'; +import { Markdown, visibleWidth } from '@moonshot-ai/pi-tui'; import * as cliHighlight from 'cli-highlight'; import { describe, expect, it, vi } from 'vitest'; diff --git a/apps/kimi-code/test/tui/components/messages/background-agent-status.test.ts b/apps/kimi-code/test/tui/components/messages/background-agent-status.test.ts index fbc2efbc5..e8f395ec8 100644 --- a/apps/kimi-code/test/tui/components/messages/background-agent-status.test.ts +++ b/apps/kimi-code/test/tui/components/messages/background-agent-status.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { BackgroundAgentStatusComponent } from '#/tui/components/messages/background-agent-status'; diff --git a/apps/kimi-code/test/tui/components/messages/goal-markers.test.ts b/apps/kimi-code/test/tui/components/messages/goal-markers.test.ts index 316c30af7..f098cc931 100644 --- a/apps/kimi-code/test/tui/components/messages/goal-markers.test.ts +++ b/apps/kimi-code/test/tui/components/messages/goal-markers.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { SwarmModeMarkerComponent } from '#/tui/components/messages/swarm-markers'; diff --git a/apps/kimi-code/test/tui/components/messages/goal-panel.test.ts b/apps/kimi-code/test/tui/components/messages/goal-panel.test.ts index b5b89ab0d..ed69d3a85 100644 --- a/apps/kimi-code/test/tui/components/messages/goal-panel.test.ts +++ b/apps/kimi-code/test/tui/components/messages/goal-panel.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; diff --git a/apps/kimi-code/test/tui/components/messages/notice.test.ts b/apps/kimi-code/test/tui/components/messages/notice.test.ts index 6e5e261d8..09f727556 100644 --- a/apps/kimi-code/test/tui/components/messages/notice.test.ts +++ b/apps/kimi-code/test/tui/components/messages/notice.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { CronMessageComponent } from '#/tui/components/messages/cron-message'; diff --git a/apps/kimi-code/test/tui/components/messages/thinking.test.ts b/apps/kimi-code/test/tui/components/messages/thinking.test.ts index 40f609be1..e615d7f5c 100644 --- a/apps/kimi-code/test/tui/components/messages/thinking.test.ts +++ b/apps/kimi-code/test/tui/components/messages/thinking.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth, type TUI } from '@earendil-works/pi-tui'; +import { visibleWidth, type TUI } from '@moonshot-ai/pi-tui'; import { describe, expect, it, vi } from 'vitest'; import { ThinkingComponent } from '#/tui/components/messages/thinking'; diff --git a/apps/kimi-code/test/tui/components/messages/tool-call.test.ts b/apps/kimi-code/test/tui/components/messages/tool-call.test.ts index 3b7e82469..eabe7fbe4 100644 --- a/apps/kimi-code/test/tui/components/messages/tool-call.test.ts +++ b/apps/kimi-code/test/tui/components/messages/tool-call.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth, type TUI } from '@earendil-works/pi-tui'; +import { visibleWidth, type TUI } from '@moonshot-ai/pi-tui'; import chalk from 'chalk'; import { afterEach, describe, expect, it, vi } from 'vitest'; diff --git a/apps/kimi-code/test/tui/components/messages/tool-renderers/media.test.ts b/apps/kimi-code/test/tui/components/messages/tool-renderers/media.test.ts index ab4a53fd6..e56cb8e0e 100644 --- a/apps/kimi-code/test/tui/components/messages/tool-renderers/media.test.ts +++ b/apps/kimi-code/test/tui/components/messages/tool-renderers/media.test.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { diff --git a/apps/kimi-code/test/tui/components/messages/tool-renderers/registry.test.ts b/apps/kimi-code/test/tui/components/messages/tool-renderers/registry.test.ts index 7dcd55bed..6570aac46 100644 --- a/apps/kimi-code/test/tui/components/messages/tool-renderers/registry.test.ts +++ b/apps/kimi-code/test/tui/components/messages/tool-renderers/registry.test.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { diff --git a/apps/kimi-code/test/tui/components/messages/tool-renderers/truncated.test.ts b/apps/kimi-code/test/tui/components/messages/tool-renderers/truncated.test.ts index bcab35a48..ecdf2a1f5 100644 --- a/apps/kimi-code/test/tui/components/messages/tool-renderers/truncated.test.ts +++ b/apps/kimi-code/test/tui/components/messages/tool-renderers/truncated.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { TruncatedOutputComponent } from '#/tui/components/messages/tool-renderers/truncated'; diff --git a/apps/kimi-code/test/tui/components/messages/usage-panel.test.ts b/apps/kimi-code/test/tui/components/messages/usage-panel.test.ts index 5540b9b75..ff39cb7e6 100644 --- a/apps/kimi-code/test/tui/components/messages/usage-panel.test.ts +++ b/apps/kimi-code/test/tui/components/messages/usage-panel.test.ts @@ -1,4 +1,4 @@ -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { afterEach, describe, expect, it } from 'vitest'; import { buildUsageReportLines, UsagePanelComponent } from '#/tui/components/messages/usage-panel'; diff --git a/apps/kimi-code/test/tui/components/messages/user-message.test.ts b/apps/kimi-code/test/tui/components/messages/user-message.test.ts index 23ec702ae..e6a10a05c 100644 --- a/apps/kimi-code/test/tui/components/messages/user-message.test.ts +++ b/apps/kimi-code/test/tui/components/messages/user-message.test.ts @@ -1,4 +1,4 @@ -import { resetCapabilitiesCache, setCapabilities, visibleWidth } from '@earendil-works/pi-tui'; +import { resetCapabilitiesCache, setCapabilities, visibleWidth } from '@moonshot-ai/pi-tui'; import { afterEach, describe, expect, it } from 'vitest'; import { UserMessageComponent } from '#/tui/components/messages/user-message'; diff --git a/apps/kimi-code/test/tui/components/panels/plan-box.test.ts b/apps/kimi-code/test/tui/components/panels/plan-box.test.ts index 9f067b168..1d970bb80 100644 --- a/apps/kimi-code/test/tui/components/panels/plan-box.test.ts +++ b/apps/kimi-code/test/tui/components/panels/plan-box.test.ts @@ -1,6 +1,6 @@ import { pathToFileURL } from 'node:url'; -import { visibleWidth } from '@earendil-works/pi-tui'; +import { visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { PlanBoxComponent } from '#/tui/components/messages/plan-box'; diff --git a/apps/kimi-code/test/tui/components/panes/activity-pane.test.ts b/apps/kimi-code/test/tui/components/panes/activity-pane.test.ts index 56601592d..76acd438c 100644 --- a/apps/kimi-code/test/tui/components/panes/activity-pane.test.ts +++ b/apps/kimi-code/test/tui/components/panes/activity-pane.test.ts @@ -1,4 +1,4 @@ -import { Text, visibleWidth } from '@earendil-works/pi-tui'; +import { Text, visibleWidth } from '@moonshot-ai/pi-tui'; import { describe, expect, it } from 'vitest'; import { ActivityPaneComponent } from '#/tui/components/panes/activity-pane'; diff --git a/apps/kimi-code/test/tui/controllers/clipboard-image-hint.test.ts b/apps/kimi-code/test/tui/controllers/clipboard-image-hint.test.ts index 0c69ebac9..2bc4c5b4e 100644 --- a/apps/kimi-code/test/tui/controllers/clipboard-image-hint.test.ts +++ b/apps/kimi-code/test/tui/controllers/clipboard-image-hint.test.ts @@ -1,4 +1,4 @@ -import type { TUI } from '@earendil-works/pi-tui'; +import type { TUI } from '@moonshot-ai/pi-tui'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { diff --git a/apps/kimi-code/test/tui/kimi-tui-message-flow.test.ts b/apps/kimi-code/test/tui/kimi-tui-message-flow.test.ts index d5a0328f1..4e67b664f 100644 --- a/apps/kimi-code/test/tui/kimi-tui-message-flow.test.ts +++ b/apps/kimi-code/test/tui/kimi-tui-message-flow.test.ts @@ -7,7 +7,7 @@ import { deleteAllKittyImages, resetCapabilitiesCache, setCapabilities, -} from '@earendil-works/pi-tui'; +} from '@moonshot-ai/pi-tui'; import type { ApprovalRequest, ApprovalResponse, Event } from '@moonshot-ai/kimi-code-sdk'; import { afterEach, describe, expect, it, vi } from 'vitest'; diff --git a/apps/kimi-code/test/tui/render-memo.bench.ts b/apps/kimi-code/test/tui/render-memo.bench.ts index 2bfd246f0..63bf79df6 100644 --- a/apps/kimi-code/test/tui/render-memo.bench.ts +++ b/apps/kimi-code/test/tui/render-memo.bench.ts @@ -16,7 +16,7 @@ import { bench, describe } from 'vitest'; -import type { Component } from '@earendil-works/pi-tui'; +import type { Component } from '@moonshot-ai/pi-tui'; import { GutterContainer } from '#/tui/components/chrome/gutter-container'; import { AssistantMessageComponent } from '#/tui/components/messages/assistant-message'; diff --git a/apps/kimi-code/test/tui/task-output-viewer.test.ts b/apps/kimi-code/test/tui/task-output-viewer.test.ts index 2a3880e3d..5948ec6c8 100644 --- a/apps/kimi-code/test/tui/task-output-viewer.test.ts +++ b/apps/kimi-code/test/tui/task-output-viewer.test.ts @@ -1,4 +1,4 @@ -import type { Terminal } from '@earendil-works/pi-tui'; +import type { Terminal } from '@moonshot-ai/pi-tui'; import type { BackgroundTaskInfo } from '@moonshot-ai/kimi-code-sdk'; import { describe, expect, it, vi } from 'vitest'; diff --git a/apps/kimi-code/test/tui/tasks-browser.test.ts b/apps/kimi-code/test/tui/tasks-browser.test.ts index 11bc06287..dacf75f5f 100644 --- a/apps/kimi-code/test/tui/tasks-browser.test.ts +++ b/apps/kimi-code/test/tui/tasks-browser.test.ts @@ -1,4 +1,4 @@ -import type { Terminal } from '@earendil-works/pi-tui'; +import type { Terminal } from '@moonshot-ai/pi-tui'; import type { BackgroundTaskInfo, BackgroundTaskStatus } from '@moonshot-ai/kimi-code-sdk'; import { describe, expect, it, vi } from 'vitest'; diff --git a/flake.nix b/flake.nix index 8583c6d8f..81a5a1d71 100644 --- a/flake.nix +++ b/flake.nix @@ -72,6 +72,7 @@ ./packages/migration-legacy ./packages/node-sdk ./packages/oauth + ./packages/pi-tui ./packages/protocol ./packages/telemetry ./apps/kimi-code @@ -92,6 +93,7 @@ "@moonshot-ai/migration-legacy" "@moonshot-ai/kimi-code-sdk" "@moonshot-ai/kimi-code-oauth" + "@moonshot-ai/pi-tui" "@moonshot-ai/protocol" "@moonshot-ai/kimi-telemetry" "@moonshot-ai/kimi-code" diff --git a/packages/pi-tui/CHANGELOG.md b/packages/pi-tui/CHANGELOG.md deleted file mode 100644 index 5c207d8c6..000000000 --- a/packages/pi-tui/CHANGELOG.md +++ /dev/null @@ -1,977 +0,0 @@ -# Changelog - -## [Unreleased] - -### Added - -- Added an opt-in Markdown renderer option to preserve source backslash escapes for transcript rendering ([#6105](https://github.com/earendil-works/pi/issues/6105)). - -## [0.80.2] - 2026-06-23 - -## [0.80.1] - 2026-06-23 - -## [0.80.0] - 2026-06-23 - -### Changed - -- Added `Ctrl+J` as a default newline keybinding alongside `Shift+Enter`. - -## [0.79.10] - 2026-06-22 - -## [0.79.9] - 2026-06-20 - -### Fixed - -- Fixed Markdown streaming code fence rendering so partial closing fences no longer make code blocks shrink or flicker while content streams ([#5846](https://github.com/earendil-works/pi/pull/5846) by [@xl0](https://github.com/xl0)). - -## [0.79.8] - 2026-06-19 - -## [0.79.7] - 2026-06-18 - -### Added - -- Added terminal color-scheme query and notification support for light/dark appearance detection (`TUI.queryTerminalColorScheme()`, `TUI.onTerminalColorSchemeChange()`, and `TUI.setTerminalColorSchemeNotifications()`) ([#5874](https://github.com/earendil-works/pi/pull/5874)). -- Added Warp terminal detection for Kitty graphics inline image support ([#5841](https://github.com/earendil-works/pi/pull/5841) by [@dodiego](https://github.com/dodiego)). -- Exported `sliceByColumn` for ANSI-aware horizontal column slicing. - -## [0.79.6] - 2026-06-16 - -## [0.79.5] - 2026-06-16 - -### Changed - -- Updated Markdown parsing to `marked` 18.0.5. - -### Fixed - -- Fixed editor Cursor Up handling so non-empty drafts jump to the start of the line before browsing input history ([#5789](https://github.com/earendil-works/pi/pull/5789) by [@4h9fbZ](https://github.com/4h9fbZ)). - -## [0.79.4] - 2026-06-15 - -### Added - -- Added terminal background color query support for OSC 11 replies ([#5385](https://github.com/earendil-works/pi/pull/5385) by [@vegarsti](https://github.com/vegarsti)). - -### Fixed - -- Fixed overlay compositing over CJK wide characters so borders stay aligned when an overlay starts inside a full-width cell ([#5297](https://github.com/earendil-works/pi/issues/5297)). -- Fixed WezTerm inline Kitty image rendering during full redraw fallbacks so image padding rows are reserved before the placement is drawn without regressing tall-image placement ([#5618](https://github.com/earendil-works/pi/issues/5618), [#4415](https://github.com/earendil-works/pi/issues/4415)). - -## [0.79.3] - 2026-06-13 - -## [0.79.2] - 2026-06-12 - -### Fixed - -- Fixed Markdown source list marker preservation to include unordered markers, so standalone `+` user messages no longer render as `-` ([#5657](https://github.com/earendil-works/pi/issues/5657)). -- Fixed slash-separated fuzzy queries so provider/model completions remain matchable after insertion. -- Fixed WezTerm inline Kitty image rendering so reserved row clears do not erase all but the top strip of tool image previews ([#5618](https://github.com/earendil-works/pi/issues/5618)). -- Fixed editor wrapping for CJK text to break at character boundaries instead of leaving large trailing gaps ([#5585](https://github.com/earendil-works/pi/pull/5585) by [@haoqixu](https://github.com/haoqixu)). -- Fixed loose Markdown list rendering to preserve blank-line separation between list items ([#5562](https://github.com/earendil-works/pi/pull/5562) by [@Perlence](https://github.com/Perlence)). - -## [0.79.1] - 2026-06-09 - -### Added - -- Added `AutocompleteProvider.triggerCharacters` so editor autocomplete can naturally trigger on provider-defined token prefixes ([#4703](https://github.com/earendil-works/pi/issues/4703)). - -### Fixed - -- Fixed IME hardware cursor positioning while slash-command autocomplete is visible ([#5283](https://github.com/earendil-works/pi/pull/5283) by [@smoosex](https://github.com/smoosex)). -- Fixed prompt history navigation to restore the current draft when returning from history browsing ([#5494](https://github.com/earendil-works/pi/issues/5494)). -- Fixed wrapping for mixed Latin and CJK text so unspaced CJK runs can break at grapheme boundaries without leaving large trailing gaps ([#5495](https://github.com/earendil-works/pi/issues/5495)). - -## [0.79.0] - 2026-06-08 - -### Fixed - -- Fixed prompt history navigation to place the cursor at the start when browsing upward and at the end when browsing downward, so repeated Up/Down traverses multiline prompts immediately ([#5454](https://github.com/earendil-works/pi/issues/5454)). -- Fixed intermittent Shift+Enter handling by making Kitty keyboard protocol fallback response-driven instead of timeout-driven ([#5188](https://github.com/earendil-works/pi/issues/5188)). -- Fixed TUI rendering to clear stale lines when content shrinks to zero. -- Fixed autocomplete suggestions to re-query after editor cursor movement ([#5499](https://github.com/earendil-works/pi/pull/5499) by [@Roman-Galeev](https://github.com/Roman-Galeev)). - -## [0.78.1] - 2026-06-04 - -### Fixed - -- Fixed overlay focus restoration so non-capturing overlays remain interactive after UI rerenders and explicit focus release ([#5235](https://github.com/earendil-works/pi/pull/5235) by [@nicobailon](https://github.com/nicobailon)). -- Fixed tab width accounting in column slicing and overlay compositing so tab-containing output cannot exceed the terminal width ([#5218](https://github.com/earendil-works/pi/issues/5218)). - -## [0.78.0] - 2026-05-29 - -### Fixed - -- Fixed ANSI text wrapping to avoid stack overflows on very long wrapped lines ([#5185](https://github.com/earendil-works/pi-mono/issues/5185)). -- Clarified the IME hardware cursor docs to state that cursor visibility remains opt-in ([#5200](https://github.com/earendil-works/pi-mono/issues/5200)). -- Fixed OSC 8 hyperlinks to pass through tmux when the client supports them ([#5189](https://github.com/earendil-works/pi-mono/pull/5189) by [@mpazik](https://github.com/mpazik)). - -## [0.77.0] - 2026-05-28 - -### Fixed - -- Fixed keyboard protocol negotiation to ignore mismatched or delayed terminal responses, avoiding false Kitty keyboard protocol detection ([#5091](https://github.com/earendil-works/pi/pull/5091) by [@mitsuhiko](https://github.com/mitsuhiko)). - -## [0.76.0] - 2026-05-27 - -### Added - -- Added an opt-in Markdown renderer option to preserve source ordered-list markers for transcript rendering ([#5013](https://github.com/earendil-works/pi/issues/5013)). - -### Fixed - -- Fixed `Shift+Enter` in Apple Terminal by detecting local macOS modifier state when Terminal.app sends plain Return. -- Fixed Windows Terminal capability detection to enable OSC 8 hyperlinks, preserving clickable long URLs across wrapped lines ([#4923](https://github.com/earendil-works/pi/issues/4923)). -- Fixed JetBrains terminal capability detection to enable truecolor while disabling unsupported OSC 8 hyperlinks ([#5037](https://github.com/earendil-works/pi-mono/pull/5037) by [@Perlence](https://github.com/Perlence)). -- Fixed editor and input word navigation/deletion to use Unicode word boundaries while preserving ASCII punctuation boundaries ([#5022](https://github.com/earendil-works/pi-mono/pull/5022) by [@haoqixu](https://github.com/haoqixu), [#5067](https://github.com/earendil-works/pi-mono/pull/5067) by [@haoqixu](https://github.com/haoqixu), [#5068](https://github.com/earendil-works/pi-mono/pull/5068) by [@haoqixu](https://github.com/haoqixu)). - -## [0.75.5] - 2026-05-23 - -### Changed - -- Replaced the optional `koffi` dependency for Windows VT input with a tiny vendored native helper, reducing install size while preserving Shift+Tab handling ([#4480](https://github.com/earendil-works/pi/issues/4480)). - -## [0.75.4] - 2026-05-20 - -### Changed - -- Removed the package-level development watch script now that the root TypeScript check validates strip-only-compatible sources. - -### Fixed - -- Fixed loader initialization so indicator startup cannot run before frames are initialized. -- Fixed truecolor capability detection to align terminal image rendering with the interactive theme detector. - -## [0.75.3] - 2026-05-18 - -## [0.75.2] - 2026-05-18 - -## [0.75.1] - 2026-05-18 - -## [0.75.0] - 2026-05-17 - -### Breaking Changes - -- Raised the minimum supported Node.js version to 22.19.0. - -## [0.74.1] - 2026-05-16 - -### Added - -- Added markdown list-item wrapping that preserves indentation for wrapped continuation lines ([#4327](https://github.com/earendil-works/pi-mono/pull/4327) by [@Perlence](https://github.com/Perlence)). - -### Fixed - -- Fixed markdown task-list checkbox rendering ([#4379](https://github.com/earendil-works/pi-mono/pull/4379) by [@Perlence](https://github.com/Perlence)). -- Fixed markdown rendering robustness for very large markdown files ([#4463](https://github.com/earendil-works/pi-mono/pull/4463) by [@ndanielherrera](https://github.com/ndanielherrera)). -- Fixed Kitty image placement when the viewport is shorter than the rendered image ([#4461](https://github.com/earendil-works/pi-mono/pull/4461) by [@xu0o0](https://github.com/xu0o0)). -- Fixed WezTerm Kitty keyboard protocol edge cases so escape handling remains correct ([#4482](https://github.com/earendil-works/pi-mono/pull/4482) by [@Felixoid](https://github.com/Felixoid)). -- Fixed inline image rendering to cap portrait images by height instead of always scaling them to the configured maximum width. - -## [0.74.0] - 2026-05-07 - -## [0.73.1] - 2026-05-07 - -### Fixed - -- Fixed wrapped OSC 8 hyperlinks to preserve BEL terminators so OAuth login URLs remain clickable on every wrapped line. -- Fixed Kitty inline image redraws to stay within TUI-owned terminal regions and avoid writing below the active viewport. -- Fixed Kitty inline image rendering by letting the terminal allocate image ids and bounding parsed image ids to valid values. -- Fixed inline image capability detection to disable inline images in cmux terminals. - -## [0.73.0] - 2026-05-04 - -### Fixed - -- Fixed fuzzy ranking to prioritize exact matches in selector and autocomplete results. - -## [0.72.1] - 2026-05-02 - -## [0.72.0] - 2026-05-01 - -## [0.71.1] - 2026-05-01 - -## [0.71.0] - 2026-04-30 - -### Fixed - -- Fixed `ProcessTerminal` to fall back to `COLUMNS` and `LINES` before defaulting to 80x24 dimensions ([#4004](https://github.com/badlogic/pi-mono/issues/4004)) -- Fixed editor rendering artifacts for Thai Sara Am and Lao AM vowel characters ([#3904](https://github.com/badlogic/pi-mono/issues/3904)) - -## [0.70.6] - 2026-04-28 - -## [0.70.5] - 2026-04-27 - -## [0.70.4] - 2026-04-27 - -## [0.70.3] - 2026-04-27 - -### Fixed - -- Fixed duplicate printable characters from Kitty keyboard protocol CSI-u plus raw character input on layouts such as Italian ([#3780](https://github.com/badlogic/pi-mono/issues/3780)) - -## [0.70.2] - 2026-04-24 - -## [0.70.1] - 2026-04-24 - -### Fixed - -- Fixed CSI-u Ctrl+letter decoding inside bracketed paste, so pasted modified-key escape sequences no longer become literal editor text ([#3623](https://github.com/badlogic/pi-mono/pull/3623) by [@Exrun94](https://github.com/Exrun94)) - -## [0.70.0] - 2026-04-23 - -### Fixed - -- Kept OSC 9;4 terminal progress alive with periodic updates so Ghostty does not clear the indicator during long-running agent work ([#3610](https://github.com/badlogic/pi-mono/issues/3610)) - -## [0.69.0] - 2026-04-22 - -### Added - -- Added `setProgress(active: boolean)` to the `Terminal` interface for OSC 9;4 progress indicator support -- Added generic stacked autocomplete support for extension wrappers via `AutocompleteProvider.shouldTriggerFileCompletion?()` and `#` as a natural autocomplete trigger alongside `@` ([#2983](https://github.com/badlogic/pi-mono/issues/2983)) - -## [0.68.1] - 2026-04-22 - -### Fixed - -- Fixed `@` autocomplete fuzzy search to follow symlinked directories and include symlinked paths in results ([#3507](https://github.com/badlogic/pi-mono/issues/3507)) - -## [0.68.0] - 2026-04-20 - -### Added - -- Added `LoaderIndicatorOptions` and `Loader.setIndicator()` support for custom loader frames and animation intervals, allowing TUI consumers to use animated, static, or hidden loader indicators ([#3413](https://github.com/badlogic/pi-mono/issues/3413)) - -### Fixed - -- Fixed `@` autocomplete fuzzy search to stop matching against the full base path for plain queries, so worktree or cwd paths containing the query text no longer crowd out real results such as `@plan` suggestions ([#2778](https://github.com/badlogic/pi-mono/issues/2778)) -- Fixed xterm `modifyOtherKeys` printable input so shifted uppercase letters insert correctly in the editor and shifted letter bindings parse and match consistently ([#3436](https://github.com/badlogic/pi-mono/issues/3436)) - -## [0.67.68] - 2026-04-17 - -## [0.67.67] - 2026-04-17 - -## [0.67.6] - 2026-04-16 - -### Added - -- Added OSC 8 hyperlink rendering for markdown links when the terminal advertises support. Introduces a public `hyperlink(text, url)` helper and a `setCapabilities()` test override in `packages/tui` ([#3248](https://github.com/badlogic/pi-mono/pull/3248) by [@ofa1](https://github.com/ofa1)). -- Added `argumentHint` to `SlashCommand` interface, displayed before the description in the autocomplete dropdown ([#2780](https://github.com/badlogic/pi-mono/pull/2780) by [@andresvi94](https://github.com/andresvi94)) - -### Changed - -- Tightened `detectCapabilities()` to default `hyperlinks: false` for unknown terminals and to force `hyperlinks: false` under tmux/screen (including nested sessions where the outer terminal would otherwise advertise OSC 8). Prevents markdown link URLs from disappearing on terminals that silently swallow OSC 8 sequences ([#3248](https://github.com/badlogic/pi-mono/pull/3248)). - -## [0.67.5] - 2026-04-16 - -### Fixed - -- Fixed Zellij `Shift+Enter` regressions by reverting the Zellij-specific Kitty keyboard query bypass and restoring the previous keyboard negotiation behavior ([#3259](https://github.com/badlogic/pi-mono/issues/3259)) - -## [0.67.4] - 2026-04-16 - -### Fixed - -- Fixed markdown strikethrough parsing to require strict double-tilde delimiters (`~~text~~`) with non-whitespace boundaries, preventing accidental strikethrough from loose tilde usage. - -## [0.67.2] - 2026-04-14 - -### Added - -- Added full helper support for Kitty `super`-modified shortcuts, including combinations such as `super+k`, `super+enter`, and `ctrl+super+k` ([#2979](https://github.com/badlogic/pi-mono/issues/2979)) - -### Fixed - -- Fixed Ctrl+Alt letter key matching in tmux by falling through from legacy ESC-prefixed handling to CSI-u and xterm `modifyOtherKeys` parsing when the legacy form does not match ([#2989](https://github.com/badlogic/pi-mono/pull/2989) by [@kaofelix](https://github.com/kaofelix)) - -## [0.67.1] - 2026-04-13 - -## [0.67.0] - 2026-04-13 - -### Fixed - -- Fixed `Container.render()` stack overflow on long sessions by replacing `Array.push(...spread)` with a loop-based push, preventing `RangeError: Maximum call stack size exceeded` when child output exceeds the V8 call stack argument limit ([#2651](https://github.com/badlogic/pi-mono/issues/2651)) -- Fixed editor sticky-column tracking around paste markers so vertical cursor navigation restores the column from before the cursor entered a paste marker instead of jumping inside or past pasted content ([#3092](https://github.com/badlogic/pi-mono/pull/3092) by [@Perlence](https://github.com/Perlence)) -- Fixed TUI test suite failures caused by render throttle scheduling: added `VirtualTerminal.waitForRender()` helper that waits for the 16ms throttled render pipeline to settle before asserting viewport state ([#3076](https://github.com/badlogic/pi-mono/pull/3076) by [@aliou](https://github.com/aliou)) - -## [0.66.1] - 2026-04-08 - -## [0.66.0] - 2026-04-08 - -## [0.65.2] - 2026-04-06 - -### Fixed - -- Fixed render scheduling under heavy streaming output by coalescing `requestRender()` calls to a 16ms frame budget while preserving immediate `requestRender(true)` behavior. - -## [0.65.1] - 2026-04-05 - -## [0.65.0] - 2026-04-03 - -### Fixed - -- Fixed markdown H1 headings ending with inline code from leaking underline styling into trailing line padding -- Fixed slash-command argument autocomplete to await async `getArgumentCompletions()` results and ignore invalid return values, preventing crashes when extension commands provide asynchronous completions ([#2719](https://github.com/badlogic/pi-mono/issues/2719)) -- Fixed non-capturing overlay padding from inflating scrollback and corrupting the viewport on terminal widen ([#2758](https://github.com/badlogic/pi-mono/pull/2758) by [@dotBeeps](https://github.com/dotBeeps)) - -## [0.64.0] - 2026-03-29 - -### Fixed - -- Fixed TUI cell size response handling to consume only exact `CSI 6 ; height ; width t` replies, so bare `Escape` is no longer swallowed while waiting for terminal image metadata ([#2661](https://github.com/badlogic/pi-mono/issues/2661)) -- Fixed Kitty keyboard protocol keypad functional keys to normalize to logical digits, symbols, and navigation keys, so numpad input in terminals such as iTerm2 no longer inserts Private Use Area gibberish or gets ignored ([#2650](https://github.com/badlogic/pi-mono/issues/2650)) - -## [0.63.2] - 2026-03-29 - -## [0.63.1] - 2026-03-27 - -## [0.63.0] - 2026-03-27 - -### Added - -- Added support for `PI_TUI_WRITE_LOG` directory paths, creating a unique log file (`tui--.log`) per instance for easier debugging of multiple pi sessions ([#2508](https://github.com/badlogic/pi-mono/pull/2508) by [@mrexodia](https://github.com/mrexodia)) - -### Fixed - -- Fixed blockquote text color breaking after inline links (and other inline elements) due to missing style restoration prefix -- Fixed slash-command Tab completion from immediately chaining into argument autocomplete after completing the command name, restoring flows like `/model` that submit into a selector dialog ([#2577](https://github.com/badlogic/pi-mono/issues/2577)) -- Fixed stale content and incorrect viewport tracking after TUI content shrinks or transient components inflate the working area ([#2126](https://github.com/badlogic/pi-mono/pull/2126) by [@Perlence](https://github.com/Perlence)) -- Fixed `@` autocomplete to debounce editor-triggered searches, cancel in-flight `fd` lookups cleanly, and keep suggestions visible while results refresh ([#1278](https://github.com/badlogic/pi-mono/issues/1278)) - - -## [0.62.0] - 2026-03-23 - -### Fixed - -- Fixed `truncateToWidth()` to stream truncation for very large strings, keep contiguous prefixes, and always terminate truncated SGR styling safely ([#2447](https://github.com/badlogic/pi-mono/issues/2447)) -- Fixed markdown heading styling being lost after inline code spans within headings - -## [0.61.1] - 2026-03-20 - -### Fixed - -- Fixed shared keybinding resolution to stop user overrides from evicting unrelated default shortcuts such as selector confirm and editor cursor keys ([#2455](https://github.com/badlogic/pi-mono/issues/2455)) -- Fixed Termux software keyboard height changes from forcing full-screen redraws and replaying TUI history on every toggle ([#2467](https://github.com/badlogic/pi-mono/issues/2467)) - -## [0.61.0] - 2026-03-20 - -### Breaking Changes - -- Replaced the editor-only keybinding store with a single global keybindings manager in `@mariozechner/pi-tui`. TUI keybinding ids are now namespaced: `cursorUp` -> `tui.editor.cursorUp`, `cursorDown` -> `tui.editor.cursorDown`, `cursorLeft` -> `tui.editor.cursorLeft`, `cursorRight` -> `tui.editor.cursorRight`, `cursorWordLeft` -> `tui.editor.cursorWordLeft`, `cursorWordRight` -> `tui.editor.cursorWordRight`, `cursorLineStart` -> `tui.editor.cursorLineStart`, `cursorLineEnd` -> `tui.editor.cursorLineEnd`, `jumpForward` -> `tui.editor.jumpForward`, `jumpBackward` -> `tui.editor.jumpBackward`, `pageUp` -> `tui.editor.pageUp`, `pageDown` -> `tui.editor.pageDown`, `deleteCharBackward` -> `tui.editor.deleteCharBackward`, `deleteCharForward` -> `tui.editor.deleteCharForward`, `deleteWordBackward` -> `tui.editor.deleteWordBackward`, `deleteWordForward` -> `tui.editor.deleteWordForward`, `deleteToLineStart` -> `tui.editor.deleteToLineStart`, `deleteToLineEnd` -> `tui.editor.deleteToLineEnd`, `yank` -> `tui.editor.yank`, `yankPop` -> `tui.editor.yankPop`, `undo` -> `tui.editor.undo`, `newLine` -> `tui.input.newLine`, `submit` -> `tui.input.submit`, `tab` -> `tui.input.tab`, `copy` -> `tui.input.copy`, `selectUp` -> `tui.select.up`, `selectDown` -> `tui.select.down`, `selectPageUp` -> `tui.select.pageUp`, `selectPageDown` -> `tui.select.pageDown`, `selectConfirm` -> `tui.select.confirm`, `selectCancel` -> `tui.select.cancel`. `keybindings.json` stays backward compatible because each keybinding definition maps the new internal id back to the existing public config key. Apps extend `interface Keybindings` via declaration merging, create one manager with both TUI and app definitions, then install it with `setKeybindings(...)` ([#2391](https://github.com/badlogic/pi-mono/issues/2391)) - -### Fixed - -- Fixed user-defined keybindings to shadow conflicting default bindings across the shared registry, so app-level defaults no longer stay active when the same key is explicitly reassigned ([#2391](https://github.com/badlogic/pi-mono/issues/2391)) - -## [0.60.0] - 2026-03-18 - -### Fixed - -- Fixed tmux xterm `modifyOtherKeys` matching for `Backspace`, `Escape`, and `Space`, and resolved raw `\x08` backspace ambiguity by treating Windows Terminal sessions differently from legacy terminals ([#2293](https://github.com/badlogic/pi-mono/issues/2293)) - -## [0.59.0] - 2026-03-17 - -## [0.58.4] - 2026-03-16 - -## [0.58.3] - 2026-03-15 - -## [0.58.2] - 2026-03-15 - -### Added - -- Added configurable `SelectList` primary column sizing via `SelectListLayoutOptions`, including custom primary-label truncation hooks ([#2154](https://github.com/badlogic/pi-mono/pull/2154) by [@markusylisiurunen](https://github.com/markusylisiurunen)) - -### Fixed - -- Fixed stale scrollback remaining after full-screen redraws such as session switches by clearing the screen before wiping scrollback ([#2155](https://github.com/badlogic/pi-mono/pull/2155) by [@Perlence](https://github.com/Perlence)) -- Fixed trailing blank lines after markdown block elements when they are followed immediately by the next block or end of document ([#2152](https://github.com/badlogic/pi-mono/pull/2152) by [@markusylisiurunen](https://github.com/markusylisiurunen)) - -## [0.58.1] - 2026-03-14 - -### Fixed - -- Fixed Windows shell and path handling in autocomplete to properly handle drive letters and mixed path separators -- Fixed editor paste to preserve literal content instead of normalizing newlines, preventing content corruption for text with embedded escape sequences ([#2064](https://github.com/badlogic/pi-mono/issues/2064)) -- Fixed tab completion to preserve `./` prefix when completing relative paths ([#2087](https://github.com/badlogic/pi-mono/issues/2087)) -- Fixed `ctrl+backspace` being indistinguishable from plain `backspace` on Windows Terminal. `0x08` is now recognized as `ctrl+backspace` instead of `backspace`, making `ctrl+backspace` bindable on terminals where it produces a distinct byte ([#2139](https://github.com/badlogic/pi-mono/issues/2139)) - -## [0.58.0] - 2026-03-14 - -### Added - -- Added paste marker atomic segment handling in editor, treating paste markers as indivisible units during word wrapping and cursor navigation ([#2111](https://github.com/badlogic/pi-mono/pull/2111) by [@haoqixu](https://github.com/haoqixu)) - -### Fixed - -- Fixed `Input` horizontal scrolling for wide Unicode text (CJK, fullwidth characters) to use visual column width and strict slice boundaries, preventing rendered line overflow and TUI crashes ([#1982](https://github.com/badlogic/pi-mono/issues/1982)) -- Fixed xterm `modifyOtherKeys` handling for `Tab` in `matchesKey()`, restoring `shift+tab` and other modified Tab bindings in tmux when `extended-keys-format` is left at the default `xterm` -- Fixed editor scroll indicator rendering crash in narrow terminal widths ([#2103](https://github.com/badlogic/pi-mono/pull/2103) by [@haoqixu](https://github.com/haoqixu)) -- Fixed tab characters in editor `setText()` and input paths not being normalized to spaces ([#2027](https://github.com/badlogic/pi-mono/pull/2027) by [@haoqixu](https://github.com/haoqixu)) -- Fixed `wordWrapLine` overflow when wide characters (CJK, fullwidth) fall exactly at the wrap boundary ([#2082](https://github.com/badlogic/pi-mono/pull/2082) by [@haoqixu](https://github.com/haoqixu)) -- Fixed tab characters in `Input` paste not being normalized to spaces ([#1975](https://github.com/badlogic/pi-mono/pull/1975) by [@haoqixu](https://github.com/haoqixu)) - -## [0.57.1] - 2026-03-07 - -### Added - -- Added `treeFoldOrUp` and `treeUnfoldOrDown` editor actions with default bindings for `Ctrl+โ†`/`Ctrl+โ†’` and `Alt+โ†`/`Alt+โ†’` ([#1724](https://github.com/badlogic/pi-mono/pull/1724) by [@Perlence](https://github.com/Perlence)) -- Added digit keys (`0-9`) to the keybinding system, including Kitty CSI-u and xterm `modifyOtherKeys` support for bindings like `ctrl+1` ([#1905](https://github.com/badlogic/pi-mono/issues/1905)) - -### Fixed - -- Fixed autocomplete selection ignoring typed text: highlight now follows the first prefix match as the user types, and exact matches are always selected on Enter ([#1931](https://github.com/badlogic/pi-mono/pull/1931) by [@aliou](https://github.com/aliou)) -- Fixed xterm `modifyOtherKeys` parsing in `matchesKey()` and `parseKey()`, restoring Ctrl-based keybindings and modified Enter keys in tmux when `extended-keys-format` is left at the default `xterm` ([#1872](https://github.com/badlogic/pi-mono/issues/1872)) -- Fixed slash-command Tab completion to immediately open argument completions when available ([#1481](https://github.com/badlogic/pi-mono/pull/1481) by [@barapa](https://github.com/barapa)) - -## [0.57.0] - 2026-03-07 - -### Added - -- Added non-capturing overlays via `OverlayOptions.nonCapturing` and new `OverlayHandle` methods: `focus()`, `unfocus()`, and `isFocused()` for programmatic overlay focus control ([#1916](https://github.com/badlogic/pi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon)) - -### Changed - -- Overlay compositing order now uses focus order so focused overlays render on top while preserving stack semantics for show/hide behavior ([#1916](https://github.com/badlogic/pi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon)) - -### Fixed - -- Fixed automatic focus restoration to skip non-capturing overlays and fixed `hideOverlay()` to only reassign focus when the popped overlay had focus ([#1916](https://github.com/badlogic/pi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon)) - -## [0.56.3] - 2026-03-06 - -### Added - -- Added xterm modifyOtherKeys mode 2 fallback when Kitty keyboard protocol is not available, enabling modified enter keys (Shift+Enter, Ctrl+Enter) inside tmux ([#1872](https://github.com/badlogic/pi-mono/issues/1872)) - -## [0.56.2] - 2026-03-05 - -### Added - -- Exported `decodeKittyPrintable()` from `keys.ts` for decoding Kitty CSI-u sequences into printable characters - -### Fixed - -- Fixed `Input` component not accepting typed characters when Kitty keyboard protocol is active (e.g., VS Code 1.110+), causing model selector filter to ignore keystrokes ([#1857](https://github.com/badlogic/pi-mono/issues/1857)) -- Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/badlogic/pi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)). - -## [0.56.1] - 2026-03-05 - -### Fixed - -- Fixed markdown blockquote rendering to isolate blockquote styling from default text style, preventing style leakage. - -## [0.56.0] - 2026-03-04 - -### Fixed - -- Fixed TUI width calculation for regional indicator symbols (e.g. partial flag sequences like `๐Ÿ‡จ` during streaming) to prevent wrap drift and stale character artifacts in differential rendering. -- Fixed Kitty CSI-u handling to ignore unsupported modifiers so modifier-only events do not insert stray printable characters ([#1807](https://github.com/badlogic/pi-mono/issues/1807)) -- Fixed single-line paste performance by inserting pasted text atomically instead of character-by-character, preventing repeated `@` autocomplete scans during paste ([#1812](https://github.com/badlogic/pi-mono/issues/1812)) -- Fixed `visibleWidth()` to ignore generic OSC escape sequences (including OSC 133 semantic prompt markers), preventing width drift when terminals emit semantic zone markers ([#1805](https://github.com/badlogic/pi-mono/issues/1805)) -- Fixed markdown blockquotes dropping nested list content by rendering blockquote children as block-level tokens ([#1787](https://github.com/badlogic/pi-mono/issues/1787)) - -## [0.55.4] - 2026-03-02 - -## [0.55.3] - 2026-02-27 - -## [0.55.2] - 2026-02-27 - -## [0.55.1] - 2026-02-26 - -### Fixed - -- Fixed Windows VT input initialization in ESM by loading `koffi` via `createRequire`, restoring VT input mode while keeping `koffi` externalized from compiled binaries ([#1627](https://github.com/badlogic/pi-mono/pull/1627) by [@kaste](https://github.com/kaste)) - -## [0.55.0] - 2026-02-24 - -## [0.54.2] - 2026-02-23 - -## [0.54.1] - 2026-02-22 - -### Fixed - -- Changed koffi import from top-level to dynamic require in `enableWindowsVTInput()` to prevent bun from embedding all 18 platform `.node` files (~74MB) into every compiled binary. Koffi is only needed on Windows. - -## [0.54.0] - 2026-02-19 - -## [0.53.1] - 2026-02-19 - -## [0.53.0] - 2026-02-17 - -## [0.52.12] - 2026-02-13 - -## [0.52.11] - 2026-02-13 - -## [0.52.10] - 2026-02-12 - -### Added - -- Added terminal input listeners in `TUI` (`addInputListener` and `removeInputListener`) to let callers intercept, transform, or consume raw input before component handling. - -### Fixed - -- Fixed `@` autocomplete fuzzy matching to score against path segments and prefixes, reducing irrelevant matches for nested paths ([#1423](https://github.com/badlogic/pi-mono/issues/1423)) - -## [0.52.9] - 2026-02-08 - -## [0.52.8] - 2026-02-07 - -### Added - -- Added `pasteToEditor` to `EditorComponent` API for programmatic paste support ([#1351](https://github.com/badlogic/pi-mono/pull/1351) by [@kaofelix](https://github.com/kaofelix)) -- Added kill ring (ctrl+k/ctrl+y/alt+y) and undo (ctrl+z) support to the Input component ([#1373](https://github.com/badlogic/pi-mono/pull/1373) by [@Perlence](https://github.com/Perlence)) - -## [0.52.7] - 2026-02-06 - -## [0.52.6] - 2026-02-05 - -## [0.52.5] - 2026-02-05 - -## [0.52.4] - 2026-02-05 - -## [0.52.3] - 2026-02-05 - -## [0.52.2] - 2026-02-05 - -## [0.52.1] - 2026-02-05 - -## [0.52.0] - 2026-02-05 - -## [0.51.6] - 2026-02-04 - -### Changed - -- Slash command menu now triggers on the first line even when other lines have content, allowing commands to be prepended to existing text ([#1227](https://github.com/badlogic/pi-mono/pull/1227) by [@aliou](https://github.com/aliou)) - -### Fixed - -- Fixed `/settings` crashing in narrow terminals by handling small widths in the settings list ([#1246](https://github.com/badlogic/pi-mono/pull/1246) by [@haoqixu](https://github.com/haoqixu)) - -## [0.51.5] - 2026-02-04 - -## [0.51.4] - 2026-02-03 - -### Fixed - -- Fixed input scrolling to avoid splitting emoji sequences ([#1228](https://github.com/badlogic/pi-mono/pull/1228) by [@haoqixu](https://github.com/haoqixu)) - -## [0.51.3] - 2026-02-03 - -## [0.51.2] - 2026-02-03 - -### Added - -- Added `Terminal.drainInput()` to drain stdin before exit (prevents Kitty key release events leaking over slow SSH) - -### Fixed - -- Fixed Kitty key release events leaking to parent shell over slow SSH connections by draining stdin for up to 1s ([#1204](https://github.com/badlogic/pi-mono/issues/1204)) -- Fixed legacy newline handling in the editor to preserve previous newline behavior -- Fixed @ autocomplete to include hidden paths -- Fixed submit fallback to honor configured keybindings - -## [0.51.1] - 2026-02-02 - -### Added - -- Added `PI_DEBUG_REDRAW=1` env var for debugging full redraws (logs triggers to `~/.pi/agent/pi-debug.log`) - -### Changed - -- Terminal height changes no longer trigger full redraws, reducing flicker on resize -- `clearOnShrink` now defaults to `false` (use `PI_CLEAR_ON_SHRINK=1` or `setClearOnShrink(true)` to enable) - -### Fixed - -- Fixed emoji cursor positioning in Input component ([#1183](https://github.com/badlogic/pi-mono/pull/1183) by [@haoqixu](https://github.com/haoqixu)) - -- Fixed unnecessary full redraws when appending many lines after content had previously shrunk (viewport check now uses actual previous content size instead of stale maximum) -- Fixed Ctrl+D exit closing the parent SSH session due to stdin buffer race condition ([#1185](https://github.com/badlogic/pi-mono/issues/1185)) - -## [0.51.0] - 2026-02-01 - -## [0.50.9] - 2026-02-01 - -## [0.50.8] - 2026-02-01 - -### Added - -- Added sticky column tracking for vertical cursor navigation so the editor restores the preferred column when moving across short lines. ([#1120](https://github.com/badlogic/pi-mono/pull/1120) by [@Perlence](https://github.com/Perlence)) - -### Fixed - -- Fixed Kitty keyboard protocol base layout fallback so non-QWERTY layouts do not trigger wrong shortcuts ([#1096](https://github.com/badlogic/pi-mono/pull/1096) by [@rytswd](https://github.com/rytswd)) - -## [0.50.7] - 2026-01-31 - -## [0.50.6] - 2026-01-30 - -### Changed - -- Optimized `isImageLine()` with `startsWith` short-circuit for faster image line detection - -### Fixed - -- Fixed empty rows appearing below footer when content shrinks (e.g., closing `/tree`, clearing multi-line editor) ([#1095](https://github.com/badlogic/pi-mono/pull/1095) by [@marckrenn](https://github.com/marckrenn)) -- Fixed terminal cursor remaining hidden after exiting TUI via `stop()` when a render was pending ([#1099](https://github.com/badlogic/pi-mono/pull/1099) by [@haoqixu](https://github.com/haoqixu)) - -## [0.50.5] - 2026-01-30 - -### Fixed - -- Fixed `isImageLine()` to check for image escape sequences anywhere in a line, not just at the start. This prevents TUI crashes when rendering lines containing image data. ([#1091](https://github.com/badlogic/pi-mono/pull/1091) by [@zedrdave](https://github.com/zedrdave)) - -## [0.50.4] - 2026-01-30 - -### Added - -- Added Ctrl+B and Ctrl+F as alternative keybindings for cursor word left/right navigation ([#1053](https://github.com/badlogic/pi-mono/pull/1053) by [@ninlds](https://github.com/ninlds)) -- Added character jump navigation: Ctrl+] jumps forward to next character, Ctrl+Alt+] jumps backward ([#1074](https://github.com/badlogic/pi-mono/pull/1074) by [@Perlence](https://github.com/Perlence)) -- Editor now jumps to line start when pressing Up at first visual line, and line end when pressing Down at last visual line ([#1050](https://github.com/badlogic/pi-mono/pull/1050) by [@4h9fbZ](https://github.com/4h9fbZ)) - -### Changed - -- Optimized image line detection and box rendering cache for better performance ([#1084](https://github.com/badlogic/pi-mono/pull/1084) by [@can1357](https://github.com/can1357)) - -### Fixed - -- Fixed autocomplete for paths with spaces by supporting quoted path tokens ([#1077](https://github.com/badlogic/pi-mono/issues/1077)) -- Fixed quoted path completions to avoid duplicating closing quotes during autocomplete ([#1077](https://github.com/badlogic/pi-mono/issues/1077)) - -## [0.50.3] - 2026-01-29 - -## [0.50.2] - 2026-01-29 - -### Added - -- Added `autocompleteMaxVisible` option to `EditorOptions` with getter/setter methods for configurable autocomplete dropdown height ([#972](https://github.com/badlogic/pi-mono/pull/972) by [@masonc15](https://github.com/masonc15)) -- Added `alt+b` and `alt+f` as alternative keybindings for word navigation (`cursorWordLeft`, `cursorWordRight`) and `ctrl+d` for `deleteCharForward` ([#1043](https://github.com/badlogic/pi-mono/issues/1043) by [@jasonish](https://github.com/jasonish)) -- Editor auto-applies single suggestion when force file autocomplete triggers with exactly one match ([#993](https://github.com/badlogic/pi-mono/pull/993) by [@Perlence](https://github.com/Perlence)) - -### Changed - -- Improved `extractCursorPosition` performance: scans lines in reverse order, early-outs when cursor is above viewport, and limits scan to bottom terminal height ([#1004](https://github.com/badlogic/pi-mono/pull/1004) by [@can1357](https://github.com/can1357)) -- Autocomplete improvements: better handling of partial matches and edge cases ([#1024](https://github.com/badlogic/pi-mono/pull/1024) by [@Perlence](https://github.com/Perlence)) - -### Fixed - -- Fixed backslash input buffering causing delayed character display in editor and input components ([#1037](https://github.com/badlogic/pi-mono/pull/1037) by [@Perlence](https://github.com/Perlence)) -- Fixed markdown table rendering with proper row dividers and minimum column width ([#997](https://github.com/badlogic/pi-mono/pull/997) by [@tmustier](https://github.com/tmustier)) - -## [0.50.1] - 2026-01-26 - -## [0.50.0] - 2026-01-26 - -### Added - -- Added `fullRedraws` readonly property to TUI class for tracking full screen redraws -- Added `PI_TUI_WRITE_LOG` environment variable to capture raw ANSI output for debugging - -### Fixed - -- Fixed appended lines not being committed to scrollback, causing earlier content to be overwritten when viewport fills ([#954](https://github.com/badlogic/pi-mono/issues/954)) -- Slash command menu now only triggers when the editor input is otherwise empty ([#904](https://github.com/badlogic/pi-mono/issues/904)) -- Center-anchored overlays now stay vertically centered when resizing the terminal taller after a shrink ([#950](https://github.com/badlogic/pi-mono/pull/950) by [@nicobailon](https://github.com/nicobailon)) -- Fixed editor multi-line insertion handling and lastAction tracking ([#945](https://github.com/badlogic/pi-mono/pull/945) by [@Perlence](https://github.com/Perlence)) -- Fixed editor word wrapping to reserve a cursor column ([#934](https://github.com/badlogic/pi-mono/pull/934) by [@Perlence](https://github.com/Perlence)) -- Fixed editor word wrapping to use single-pass backtracking for whitespace handling ([#924](https://github.com/badlogic/pi-mono/pull/924) by [@Perlence](https://github.com/Perlence)) -- Fixed Kitty image ID allocation and cleanup to prevent image ID collisions between modules - -## [0.49.3] - 2026-01-22 - -### Added - -- `codeBlockIndent` property on `MarkdownTheme` to customize code block content indentation (default: 2 spaces) ([#855](https://github.com/badlogic/pi-mono/pull/855) by [@terrorobe](https://github.com/terrorobe)) -- Added Alt+Delete as hotkey for delete word forwards ([#878](https://github.com/badlogic/pi-mono/pull/878) by [@Perlence](https://github.com/Perlence)) - -### Changed - -- Fuzzy matching now scores consecutive matches higher and penalizes gaps more heavily for better relevance ([#860](https://github.com/badlogic/pi-mono/pull/860) by [@mitsuhiko](https://github.com/mitsuhiko)) - -### Fixed - -- Autolinked emails no longer display redundant `(mailto:...)` suffix in markdown output ([#888](https://github.com/badlogic/pi-mono/pull/888) by [@terrorobe](https://github.com/terrorobe)) -- Fixed viewport tracking and cursor positioning for overlays and content shrink scenarios -- Autocomplete now allows searches with `/` characters (e.g., `folder1/folder2`) ([#882](https://github.com/badlogic/pi-mono/pull/882) by [@richardgill](https://github.com/richardgill)) -- Directory completions for `@` file attachments no longer add trailing space, allowing continued autocomplete into subdirectories - -## [0.49.2] - 2026-01-19 - -## [0.49.1] - 2026-01-18 - -### Added - -- Added undo support to Editor with Ctrl+- hotkey. Undo coalesces consecutive word characters into one unit (fish-style). ([#831](https://github.com/badlogic/pi-mono/pull/831) by [@Perlence](https://github.com/Perlence)) -- Added legacy terminal support for Ctrl+symbol keys (Ctrl+\, Ctrl+], Ctrl+-) and their Ctrl+Alt variants. ([#831](https://github.com/badlogic/pi-mono/pull/831) by [@Perlence](https://github.com/Perlence)) - -## [0.49.0] - 2026-01-17 - -### Added - -- Added `showHardwareCursor` getter and setter to control cursor visibility while keeping IME positioning active. ([#800](https://github.com/badlogic/pi-mono/pull/800) by [@ghoulr](https://github.com/ghoulr)) -- Added Emacs-style kill ring editing with yank and yank-pop keybindings. ([#810](https://github.com/badlogic/pi-mono/pull/810) by [@Perlence](https://github.com/Perlence)) -- Added legacy Alt+letter handling and Alt+D delete word forward support in the editor keymap. ([#810](https://github.com/badlogic/pi-mono/pull/810) by [@Perlence](https://github.com/Perlence)) - -## [0.48.0] - 2026-01-16 - -### Added - -- `EditorOptions` with optional `paddingX` for horizontal content padding, plus `getPaddingX()`/`setPaddingX()` methods ([#791](https://github.com/badlogic/pi-mono/pull/791) by [@ferologics](https://github.com/ferologics)) - -### Changed - -- Hardware cursor is now disabled by default for better terminal compatibility. Set `PI_HARDWARE_CURSOR=1` to enable (replaces `PI_NO_HARDWARE_CURSOR=1` which disabled it). - -### Fixed - -- Decode Kitty CSI-u printable sequences in the editor so shifted symbol keys (e.g., `@`, `?`) work in terminals that enable Kitty keyboard protocol ([#779](https://github.com/badlogic/pi-mono/pull/779) by [@iamd3vil](https://github.com/iamd3vil)) - -## [0.47.0] - 2026-01-16 - -### Breaking Changes - -- `Editor` constructor now requires `TUI` as first parameter: `new Editor(tui, theme)`. This enables automatic vertical scrolling when content exceeds terminal height. ([#732](https://github.com/badlogic/pi-mono/issues/732)) - -### Added - -- Hardware cursor positioning for IME support in `Editor` and `Input` components. The terminal cursor now follows the text cursor position, enabling proper IME candidate window placement for CJK input. ([#719](https://github.com/badlogic/pi-mono/pull/719)) -- `Focusable` interface for components that need hardware cursor positioning. Implement `focused: boolean` and emit `CURSOR_MARKER` in render output when focused. -- `CURSOR_MARKER` constant and `isFocusable()` type guard exported from the package -- Editor now supports Page Up/Down keys (Fn+Up/Down on MacBook) for scrolling through large content ([#732](https://github.com/badlogic/pi-mono/issues/732)) -- Expanded keymap coverage for terminal compatibility: added support for Home/End keys in tmux, additional modifier combinations, and improved key sequence parsing ([#752](https://github.com/badlogic/pi-mono/pull/752) by [@richardgill](https://github.com/richardgill)) - -### Fixed - -- Editor no longer corrupts terminal display when text exceeds screen height. Content now scrolls vertically with indicators showing lines above/below the viewport. Max height is 30% of terminal (minimum 5 lines). ([#732](https://github.com/badlogic/pi-mono/issues/732)) -- `visibleWidth()` and `extractAnsiCode()` now handle APC escape sequences (`ESC _ ... BEL`), fixing width calculation and string slicing for strings containing cursor markers -- SelectList now handles multi-line descriptions by replacing newlines with spaces ([#728](https://github.com/badlogic/pi-mono/pull/728) by [@richardgill](https://github.com/richardgill)) - -## [0.46.0] - 2026-01-15 - -### Fixed - -- Keyboard shortcuts (Ctrl+C, Ctrl+D, etc.) now work on non-Latin keyboard layouts (Russian, Ukrainian, Bulgarian, etc.) in terminals supporting Kitty keyboard protocol with alternate key reporting ([#718](https://github.com/badlogic/pi-mono/pull/718) by [@dannote](https://github.com/dannote)) - -## [0.45.7] - 2026-01-13 - -## [0.45.6] - 2026-01-13 - -### Added - -- `OverlayOptions` API for overlay positioning and sizing with CSS-like values: `width`, `maxHeight`, `row`, `col` accept numbers (absolute) or percentage strings (e.g., `"50%"`). Also supports `minWidth`, `anchor`, `offsetX`, `offsetY`, `margin`. ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon)) -- `OverlayOptions.visible` callback for responsive overlays - receives terminal dimensions, return false to hide ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon)) -- `showOverlay()` now returns `OverlayHandle` with `hide()`, `setHidden(boolean)`, `isHidden()` for programmatic visibility control ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon)) -- New exported types: `OverlayAnchor`, `OverlayHandle`, `OverlayMargin`, `OverlayOptions`, `SizeValue` ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon)) -- `truncateToWidth()` now accepts optional `pad` parameter to pad result with spaces to exactly `maxWidth` ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon)) - -### Fixed - -- Overlay compositing crash when rendered lines exceed terminal width due to complex ANSI/OSC sequences (e.g., hyperlinks in subagent output) ([#667](https://github.com/badlogic/pi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon)) - -## [0.45.5] - 2026-01-13 - -## [0.45.4] - 2026-01-13 - -## [0.45.3] - 2026-01-13 - -## [0.45.2] - 2026-01-13 - -## [0.45.1] - 2026-01-13 - -## [0.45.0] - 2026-01-13 - -## [0.44.0] - 2026-01-12 - -### Added - -- `SettingsListOptions` with `enableSearch` for fuzzy filtering in `SettingsList` ([#643](https://github.com/badlogic/pi-mono/pull/643) by [@ninlds](https://github.com/ninlds)) -- `pageUp` and `pageDown` key support with `selectPageUp`/`selectPageDown` editor actions ([#662](https://github.com/badlogic/pi-mono/pull/662) by [@aliou](https://github.com/aliou)) - -### Fixed - -- Numbered list items showing "1." for all items when code blocks break list continuity ([#660](https://github.com/badlogic/pi-mono/pull/660) by [@ogulcancelik](https://github.com/ogulcancelik)) - -## [0.43.0] - 2026-01-11 - -### Added - -- `fuzzyFilter()` and `fuzzyMatch()` utilities for fuzzy text matching -- Slash command autocomplete now uses fuzzy matching instead of prefix matching - -### Fixed - -- Cursor now moves to end of content on exit, preventing status line from being overwritten ([#629](https://github.com/badlogic/pi-mono/pull/629) by [@tallshort](https://github.com/tallshort)) -- Reset ANSI styles after each rendered line to prevent style leakage - -## [0.42.5] - 2026-01-11 - -### Fixed - -- Reduced flicker by only re-rendering changed lines ([#617](https://github.com/badlogic/pi-mono/pull/617) by [@ogulcancelik](https://github.com/ogulcancelik)) -- Cursor position tracking when content shrinks with unchanged remaining lines -- TUI renders with wrong dimensions after suspend/resume if terminal was resized while suspended ([#599](https://github.com/badlogic/pi-mono/issues/599)) -- Pasted content containing Kitty key release patterns (e.g., `:3F` in MAC addresses) was incorrectly filtered out ([#623](https://github.com/badlogic/pi-mono/pull/623) by [@ogulcancelik](https://github.com/ogulcancelik)) - -## [0.42.4] - 2026-01-10 - -## [0.42.3] - 2026-01-10 - -## [0.42.2] - 2026-01-10 - -## [0.42.1] - 2026-01-09 - -## [0.42.0] - 2026-01-09 - -## [0.41.0] - 2026-01-09 - -## [0.40.1] - 2026-01-09 - -## [0.40.0] - 2026-01-08 - -## [0.39.1] - 2026-01-08 - -## [0.39.0] - 2026-01-08 - -### Added - -- **Experimental:** Overlay compositing for `ctx.ui.custom()` with `{ overlay: true }` option ([#558](https://github.com/badlogic/pi-mono/pull/558) by [@nicobailon](https://github.com/nicobailon)) - -## [0.38.0] - 2026-01-08 - -### Added - -- `EditorComponent` interface for custom editor implementations -- `StdinBuffer` class to split batched stdin into individual sequences (adapted from [OpenTUI](https://github.com/anomalyco/opentui), MIT license) - -### Fixed - -- Key presses no longer dropped when batched with other events over SSH ([#538](https://github.com/badlogic/pi-mono/pull/538)) - -## [0.37.8] - 2026-01-07 - -### Added - -- `Component.wantsKeyRelease` property to opt-in to key release events (default false) - -### Fixed - -- TUI now filters out key release events by default, preventing double-processing of keys in editors and other components - -## [0.37.7] - 2026-01-07 - -### Fixed - -- `matchesKey()` now correctly matches Kitty protocol sequences for unmodified letter keys (needed for key release events) - -## [0.37.6] - 2026-01-06 - -### Added - -- Kitty keyboard protocol flag 2 support for key release events. New exports: `isKeyRelease(data)`, `isKeyRepeat(data)`, `KeyEventType` type. Terminals supporting Kitty protocol (Kitty, Ghostty, WezTerm) now send proper key-up events. - -## [0.37.5] - 2026-01-06 - -## [0.37.4] - 2026-01-06 - -## [0.37.3] - 2026-01-06 - -## [0.37.2] - 2026-01-05 - -## [0.37.1] - 2026-01-05 - -## [0.37.0] - 2026-01-05 - -### Fixed - -- Crash when pasting text with trailing whitespace exceeding terminal width through Markdown rendering ([#457](https://github.com/badlogic/pi-mono/pull/457) by [@robinwander](https://github.com/robinwander)) - -## [0.36.0] - 2026-01-05 - -## [0.35.0] - 2026-01-05 - -## [0.34.2] - 2026-01-04 - -## [0.34.1] - 2026-01-04 - -### Added - -- Symbol key support in keybinding system: `SymbolKey` type with 32 symbol keys, `Key` constants (e.g., `Key.backtick`, `Key.comma`), updated `matchesKey()` and `parseKey()` to handle symbol input ([#450](https://github.com/badlogic/pi-mono/pull/450) by [@kaofelix](https://github.com/kaofelix)) - -## [0.34.0] - 2026-01-04 - -### Added - -- `Editor.getExpandedText()` method that returns text with paste markers expanded to their actual content ([#444](https://github.com/badlogic/pi-mono/pull/444) by [@aliou](https://github.com/aliou)) - -## [0.33.0] - 2026-01-04 - -### Breaking Changes - -- **Key detection functions removed**: All `isXxx()` key detection functions (`isEnter()`, `isEscape()`, `isCtrlC()`, etc.) have been removed. Use `matchesKey(data, keyId)` instead (e.g., `matchesKey(data, "enter")`, `matchesKey(data, "ctrl+c")`). This affects hooks and custom tools that use `ctx.ui.custom()` with keyboard input handling. ([#405](https://github.com/badlogic/pi-mono/pull/405)) - -### Added - -- `Editor.insertTextAtCursor(text)` method for programmatic text insertion ([#419](https://github.com/badlogic/pi-mono/issues/419)) -- `EditorKeybindingsManager` for configurable editor keybindings. Components now use `matchesKey()` and keybindings manager instead of individual `isXxx()` functions. ([#405](https://github.com/badlogic/pi-mono/pull/405) by [@hjanuschka](https://github.com/hjanuschka)) - -### Changed - -- Key detection refactored: consolidated `is*()` functions into generic `matchesKey(data, keyId)` function that accepts key identifiers like `"ctrl+c"`, `"shift+enter"`, `"alt+left"`, etc. - -## [0.32.3] - 2026-01-03 - -## [0.32.2] - 2026-01-03 - -### Fixed - -- Slash command autocomplete now triggers for commands starting with `.`, `-`, or `_` (e.g., `/.land`, `/-foo`) ([#422](https://github.com/badlogic/pi-mono/issues/422)) - -## [0.32.1] - 2026-01-03 - -## [0.32.0] - 2026-01-03 - -### Changed - -- Editor component now uses word wrapping instead of character-level wrapping for better readability ([#382](https://github.com/badlogic/pi-mono/pull/382) by [@nickseelert](https://github.com/nickseelert)) - -### Fixed - -- Shift+Space, Shift+Backspace, and Shift+Delete now work correctly in Kitty-protocol terminals (Kitty, WezTerm, etc.) instead of being silently ignored ([#411](https://github.com/badlogic/pi-mono/pull/411) by [@nathyong](https://github.com/nathyong)) - -## [0.31.1] - 2026-01-02 - -### Fixed - -- `visibleWidth()` now strips OSC 8 hyperlink sequences, fixing text wrapping for clickable links ([#396](https://github.com/badlogic/pi-mono/pull/396) by [@Cursivez](https://github.com/Cursivez)) - -## [0.31.0] - 2026-01-02 - -### Added - -- `isShiftCtrlO()` key detection function for Shift+Ctrl+O (Kitty protocol) -- `isShiftCtrlD()` key detection function for Shift+Ctrl+D (Kitty protocol) -- `TUI.onDebug` callback for global debug key handling (Shift+Ctrl+D) -- `wrapTextWithAnsi()` utility now exported (wraps text to width, preserving ANSI codes) - -### Changed - -- README.md completely rewritten with accurate component documentation, theme interfaces, and examples -- `visibleWidth()` reimplemented with grapheme-based width calculation, 10x faster on Bun and ~15% faster on Node ([#369](https://github.com/badlogic/pi-mono/pull/369) by [@nathyong](https://github.com/nathyong)) - -### Fixed - -- Markdown component now renders HTML tags as plain text instead of silently dropping them ([#359](https://github.com/badlogic/pi-mono/issues/359)) -- Crash in `visibleWidth()` and grapheme iteration when encountering undefined code points ([#372](https://github.com/badlogic/pi-mono/pull/372) by [@HACKE-RC](https://github.com/HACKE-RC)) -- ZWJ emoji sequences (rainbow flag, family, etc.) now render with correct width instead of being split into multiple characters ([#369](https://github.com/badlogic/pi-mono/pull/369) by [@nathyong](https://github.com/nathyong)) - -## [0.29.0] - 2025-12-25 - -### Added - -- **Auto-space before pasted file paths**: When pasting a file path (starting with `/`, `~`, or `.`) and the cursor is after a word character, a space is automatically prepended for better readability. Useful when dragging screenshots from macOS. ([#307](https://github.com/badlogic/pi-mono/pull/307) by [@mitsuhiko](https://github.com/mitsuhiko)) -- **Word navigation for Input component**: Added Ctrl+Left/Right and Alt+Left/Right support for word-by-word cursor movement. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0)) -- **Full Unicode input**: Input component now accepts Unicode characters beyond ASCII. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0)) - -### Fixed - -- **Readline-style Ctrl+W**: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0)) diff --git a/packages/pi-tui/README.md b/packages/pi-tui/README.md index d0aae4005..01c388034 100644 --- a/packages/pi-tui/README.md +++ b/packages/pi-tui/README.md @@ -1,4 +1,4 @@ -# @earendil-works/pi-tui +# @moonshot-ai/pi-tui Minimal terminal UI framework with differential rendering and synchronized output for flicker-free interactive CLI applications. @@ -16,7 +16,7 @@ Minimal terminal UI framework with differential rendering and synchronized outpu ## Quick Start ```typescript -import { TUI, Text, Editor, ProcessTerminal, matchesKey } from "@earendil-works/pi-tui"; +import { TUI, Text, Editor, ProcessTerminal, matchesKey } from "@moonshot-ai/pi-tui"; // Create terminal const terminal = new ProcessTerminal(); @@ -171,7 +171,7 @@ The TUI appends a full SGR reset and OSC 8 reset at the end of each rendered lin Components that display a text cursor and need IME (Input Method Editor) support should implement the `Focusable` interface: ```typescript -import { CURSOR_MARKER, type Component, type Focusable } from "@earendil-works/pi-tui"; +import { CURSOR_MARKER, type Component, type Focusable } from "@moonshot-ai/pi-tui"; class MyInput implements Component, Focusable { focused: boolean = false; // Set by TUI when focus changes @@ -195,7 +195,7 @@ The cursor remains hidden by default. This keeps the fake cursor rendering, whil **Container components with embedded inputs:** When a container component (dialog, selector, etc.) contains an `Input` or `Editor` child, the container must implement `Focusable` and propagate the focus state to the child: ```typescript -import { Container, type Focusable, Input } from "@earendil-works/pi-tui"; +import { Container, type Focusable, Input } from "@moonshot-ai/pi-tui"; class SearchDialog extends Container implements Focusable { private searchInput: Input; @@ -542,7 +542,7 @@ Supported formats: PNG, JPEG, GIF, WebP. Dimensions are parsed from the image he Supports both slash commands and file paths. ```typescript -import { CombinedAutocompleteProvider } from "@earendil-works/pi-tui"; +import { CombinedAutocompleteProvider } from "@moonshot-ai/pi-tui"; const provider = new CombinedAutocompleteProvider( [ @@ -567,7 +567,7 @@ editor.setAutocompleteProvider(provider); Use `matchesKey()` with the `Key` helper for detecting keyboard input (supports Kitty keyboard protocol): ```typescript -import { matchesKey, Key } from "@earendil-works/pi-tui"; +import { matchesKey, Key } from "@moonshot-ai/pi-tui"; if (matchesKey(data, Key.ctrl("c"))) { process.exit(0); @@ -625,7 +625,7 @@ interface Terminal { ## Utilities ```typescript -import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui"; +import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@moonshot-ai/pi-tui"; // Get visible width of string (ignoring ANSI codes) const width = visibleWidth("\x1b[31mHello\x1b[0m"); // 5 @@ -650,8 +650,8 @@ When creating custom components, **each line returned by `render()` must not exc Use `matchesKey()` with the `Key` helper for keyboard input: ```typescript -import { matchesKey, Key, truncateToWidth } from "@earendil-works/pi-tui"; -import type { Component } from "@earendil-works/pi-tui"; +import { matchesKey, Key, truncateToWidth } from "@moonshot-ai/pi-tui"; +import type { Component } from "@moonshot-ai/pi-tui"; class MyInteractiveComponent implements Component { private selectedIndex = 0; @@ -686,8 +686,8 @@ class MyInteractiveComponent implements Component { Use the provided utilities to ensure lines fit: ```typescript -import { visibleWidth, truncateToWidth } from "@earendil-works/pi-tui"; -import type { Component } from "@earendil-works/pi-tui"; +import { visibleWidth, truncateToWidth } from "@moonshot-ai/pi-tui"; +import type { Component } from "@moonshot-ai/pi-tui"; class MyComponent implements Component { private text: string; diff --git a/packages/pi-tui/package.json b/packages/pi-tui/package.json index e407a72d1..60bbbfc2c 100644 --- a/packages/pi-tui/package.json +++ b/packages/pi-tui/package.json @@ -1,21 +1,19 @@ { - "name": "@earendil-works/pi-tui", + "name": "@moonshot-ai/pi-tui", "version": "0.80.2", + "private": true, "description": "Terminal User Interface library with differential rendering for efficient text-based applications", - "type": "module", - "main": "dist/index.js", - "scripts": { - "clean": "shx rm -rf dist", - "build": "tsgo -p tsconfig.build.json", - "test": "node --test test/*.test.ts", - "prepublishOnly": "npm run clean && npm run build" + "license": "MIT", + "author": "Moonshot AI", + "homepage": "https://github.com/MoonshotAI/kimi-code/tree/main/packages/pi-tui#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/MoonshotAI/kimi-code.git", + "directory": "packages/pi-tui" + }, + "bugs": { + "url": "https://github.com/MoonshotAI/kimi-code/issues" }, - "files": [ - "dist/**/*", - "native/win32/prebuilds/**/*.node", - "native/darwin/prebuilds/**/*.node", - "README.md" - ], "keywords": [ "tui", "terminal", @@ -25,23 +23,50 @@ "typescript", "cli" ], - "author": "Mario Zechner", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/earendil-works/pi.git", - "directory": "packages/tui" + "files": [ + "dist", + "native", + "README.md" + ], + "type": "module", + "imports": { + "#/*": [ + "./src/*.ts", + "./src/*/index.ts" + ] }, - "engines": { - "node": ">=22.19.0" + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + } + }, + "publishConfig": { + "access": "public", + "exports": { + ".": { + "types": "./dist/index.d.mts", + "import": "./dist/index.mjs", + "default": "./dist/index.mjs" + } + }, + "provenance": true + }, + "scripts": { + "build": "tsdown", + "typecheck": "tsc -p tsconfig.json --noEmit", + "test": "node --test test/*.test.ts", + "clean": "rm -rf dist" }, - "types": "./dist/index.d.ts", "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.5" }, "devDependencies": { "@xterm/headless": "5.5.0", - "chalk": "5.6.2" + "chalk": "^5.4.1" + }, + "engines": { + "node": ">=22.19.0" } } diff --git a/packages/pi-tui/src/components/editor.ts b/packages/pi-tui/src/components/editor.ts index bedd01057..f7b7fbcdf 100644 --- a/packages/pi-tui/src/components/editor.ts +++ b/packages/pi-tui/src/components/editor.ts @@ -1345,7 +1345,7 @@ export class Editor implements Component, Focusable { let currentVisualCol: number; if (this.snappedFromCursorCol !== null) { const vlIndex = this.findVisualLineAt(visualLines, currentVL.logicalLine, this.snappedFromCursorCol); - currentVisualCol = this.snappedFromCursorCol - visualLines[vlIndex].startCol; + currentVisualCol = this.snappedFromCursorCol - visualLines[vlIndex]!.startCol; } else { currentVisualCol = this.state.cursorCol - currentVL.startCol; } @@ -1388,8 +1388,8 @@ export class Editor implements Component, Focusable { let next = targetVisualLine + 1; while ( next < visualLines.length && - visualLines[next].logicalLine === targetVL.logicalLine && - visualLines[next].startCol < segEnd + visualLines[next]!.logicalLine === targetVL.logicalLine && + visualLines[next]!.startCol < segEnd ) { next++; } diff --git a/packages/pi-tui/src/components/loader.ts b/packages/pi-tui/src/components/loader.ts index 4a93eb08f..9467ccf61 100644 --- a/packages/pi-tui/src/components/loader.ts +++ b/packages/pi-tui/src/components/loader.ts @@ -40,7 +40,7 @@ export class Loader extends Text { this.setIndicator(indicator); } - render(width: number): string[] { + override render(width: number): string[] { return ["", ...super.render(width)]; } diff --git a/packages/pi-tui/src/components/markdown.ts b/packages/pi-tui/src/components/markdown.ts index 88c2358bc..9231cd456 100644 --- a/packages/pi-tui/src/components/markdown.ts +++ b/packages/pi-tui/src/components/markdown.ts @@ -12,7 +12,7 @@ class StrictStrikethroughTokenizer extends Tokenizer { return undefined; } - const text = match[2]; + const text = match[2]!; return { type: "del", raw: match[0], @@ -178,7 +178,7 @@ export class Markdown implements Component { const renderedLines: string[] = []; for (let i = 0; i < tokens.length; i++) { - const token = tokens[i]; + const token = tokens[i]!; const nextToken = tokens[i + 1]; const tokenLines = this.renderToken(token, contentWidth, nextToken?.type); for (const tokenLine of tokenLines) { @@ -435,7 +435,7 @@ export class Markdown implements Component { const quoteTokens = token.tokens || []; const renderedQuoteLines: string[] = []; for (let i = 0; i < quoteTokens.length; i++) { - const quoteToken = quoteTokens[i]; + const quoteToken = quoteTokens[i]!; const nextQuoteToken = quoteTokens[i + 1]; renderedQuoteLines.push( ...this.renderToken(quoteToken, quoteContentWidth, nextQuoteToken?.type, quoteInlineStyleContext), @@ -608,7 +608,7 @@ export class Markdown implements Component { const startNumber = typeof token.start === "number" ? token.start : 1; for (let i = 0; i < token.items.length; i++) { - const item = token.items[i]; + const item = token.items[i]!; const isLastItem = i === token.items.length - 1; const bullet = token.ordered ? this.options.preserveOrderedListMarkers @@ -714,13 +714,13 @@ export class Markdown implements Component { const naturalWidths: number[] = []; const minWordWidths: number[] = []; for (let i = 0; i < numCols; i++) { - const headerText = this.renderInlineTokens(token.header[i].tokens || [], styleContext); + const headerText = this.renderInlineTokens(token.header[i]!.tokens || [], styleContext); naturalWidths[i] = visibleWidth(headerText); minWordWidths[i] = Math.max(1, this.getLongestWordWidth(headerText, maxUnbrokenWordWidth)); } for (const row of token.rows) { for (let i = 0; i < row.length; i++) { - const cellText = this.renderInlineTokens(row[i].tokens || [], styleContext); + const cellText = this.renderInlineTokens(row[i]!.tokens || [], styleContext); naturalWidths[i] = Math.max(naturalWidths[i] || 0, visibleWidth(cellText)); minWordWidths[i] = Math.max( minWordWidths[i] || 1, @@ -744,13 +744,13 @@ export class Markdown implements Component { }); for (let i = 0; i < numCols; i++) { - minColumnWidths[i] += growth[i] ?? 0; + minColumnWidths[i]! += growth[i] ?? 0; } const allocated = growth.reduce((total, width) => total + width, 0); let leftover = remaining - allocated; for (let i = 0; leftover > 0 && i < numCols; i++) { - minColumnWidths[i]++; + minColumnWidths[i]!++; leftover--; } } @@ -764,15 +764,15 @@ export class Markdown implements Component { if (totalNaturalWidth <= availableWidth) { // Everything fits naturally - columnWidths = naturalWidths.map((width, index) => Math.max(width, minColumnWidths[index])); + columnWidths = naturalWidths.map((width, index) => Math.max(width, minColumnWidths[index]!)); } else { // Need to shrink columns to fit const totalGrowPotential = naturalWidths.reduce((total, width, index) => { - return total + Math.max(0, width - minColumnWidths[index]); + return total + Math.max(0, width - minColumnWidths[index]!); }, 0); const extraWidth = Math.max(0, availableForCells - minCellsWidth); columnWidths = minColumnWidths.map((minWidth, index) => { - const naturalWidth = naturalWidths[index]; + const naturalWidth = naturalWidths[index]!; const minWidthDelta = Math.max(0, naturalWidth - minWidth); let grow = 0; if (totalGrowPotential > 0) { @@ -787,8 +787,8 @@ export class Markdown implements Component { while (remaining > 0) { let grew = false; for (let i = 0; i < numCols && remaining > 0; i++) { - if (columnWidths[i] < naturalWidths[i]) { - columnWidths[i]++; + if (columnWidths[i]! < naturalWidths[i]!) { + columnWidths[i]!++; remaining--; grew = true; } @@ -806,14 +806,14 @@ export class Markdown implements Component { // Render header with wrapping const headerCellLines: string[][] = token.header.map((cell, i) => { const text = this.renderInlineTokens(cell.tokens || [], styleContext); - return this.wrapCellText(text, columnWidths[i]); + return this.wrapCellText(text, columnWidths[i]!); }); const headerLineCount = Math.max(...headerCellLines.map((c) => c.length)); for (let lineIdx = 0; lineIdx < headerLineCount; lineIdx++) { const rowParts = headerCellLines.map((cellLines, colIdx) => { const text = cellLines[lineIdx] || ""; - const padded = text + " ".repeat(Math.max(0, columnWidths[colIdx] - visibleWidth(text))); + const padded = text + " ".repeat(Math.max(0, columnWidths[colIdx]! - visibleWidth(text))); return this.theme.bold(padded); }); lines.push(`โ”‚ ${rowParts.join(" โ”‚ ")} โ”‚`); @@ -826,17 +826,17 @@ export class Markdown implements Component { // Render rows with wrapping for (let rowIndex = 0; rowIndex < token.rows.length; rowIndex++) { - const row = token.rows[rowIndex]; + const row = token.rows[rowIndex]!; const rowCellLines: string[][] = row.map((cell, i) => { const text = this.renderInlineTokens(cell.tokens || [], styleContext); - return this.wrapCellText(text, columnWidths[i]); + return this.wrapCellText(text, columnWidths[i]!); }); const rowLineCount = Math.max(...rowCellLines.map((c) => c.length)); for (let lineIdx = 0; lineIdx < rowLineCount; lineIdx++) { const rowParts = rowCellLines.map((cellLines, colIdx) => { const text = cellLines[lineIdx] || ""; - return text + " ".repeat(Math.max(0, columnWidths[colIdx] - visibleWidth(text))); + return text + " ".repeat(Math.max(0, columnWidths[colIdx]! - visibleWidth(text))); }); lines.push(`โ”‚ ${rowParts.join(" โ”‚ ")} โ”‚`); } diff --git a/packages/pi-tui/src/components/settings-list.ts b/packages/pi-tui/src/components/settings-list.ts index 88e9433f7..8711923a1 100644 --- a/packages/pi-tui/src/components/settings-list.ts +++ b/packages/pi-tui/src/components/settings-list.ts @@ -214,7 +214,7 @@ export class SettingsList implements Component { // Cycle through values const currentIndex = item.values.indexOf(item.currentValue); const nextIndex = (currentIndex + 1) % item.values.length; - const newValue = item.values[nextIndex]; + const newValue = item.values[nextIndex]!; item.currentValue = newValue; this.onChange(item.id, newValue); } diff --git a/packages/pi-tui/src/fuzzy.ts b/packages/pi-tui/src/fuzzy.ts index 73c10dcf4..26d59b087 100644 --- a/packages/pi-tui/src/fuzzy.ts +++ b/packages/pi-tui/src/fuzzy.ts @@ -75,9 +75,9 @@ export function fuzzyMatch(query: string, text: string): FuzzyMatch { const alphaNumericMatch = queryLower.match(/^(?[a-z]+)(?[0-9]+)$/); const numericAlphaMatch = queryLower.match(/^(?[0-9]+)(?[a-z]+)$/); const swappedQuery = alphaNumericMatch - ? `${alphaNumericMatch.groups?.digits ?? ""}${alphaNumericMatch.groups?.letters ?? ""}` + ? `${alphaNumericMatch.groups?.["digits"] ?? ""}${alphaNumericMatch.groups?.["letters"] ?? ""}` : numericAlphaMatch - ? `${numericAlphaMatch.groups?.letters ?? ""}${numericAlphaMatch.groups?.digits ?? ""}` + ? `${numericAlphaMatch.groups?.["letters"] ?? ""}${numericAlphaMatch.groups?.["digits"] ?? ""}` : ""; if (!swappedQuery) { diff --git a/packages/pi-tui/src/keybindings.ts b/packages/pi-tui/src/keybindings.ts index eaf0838b4..3aea1fed4 100644 --- a/packages/pi-tui/src/keybindings.ts +++ b/packages/pi-tui/src/keybindings.ts @@ -204,7 +204,7 @@ export class KeybindingsManager { } getDefinition(keybinding: Keybinding): KeybindingDefinition { - return this.definitions[keybinding]; + return this.definitions[keybinding]!; } getConflicts(): KeybindingConflict[] { diff --git a/packages/pi-tui/src/keys.ts b/packages/pi-tui/src/keys.ts index 0d3c7085f..a543db6d5 100644 --- a/packages/pi-tui/src/keys.ts +++ b/packages/pi-tui/src/keys.ts @@ -714,7 +714,7 @@ function matchesModifyOtherKeys(data: string, expectedKeycode: number, expectedM function isWindowsTerminalSession(): boolean { return ( - Boolean(process.env.WT_SESSION) && !process.env.SSH_CONNECTION && !process.env.SSH_CLIENT && !process.env.SSH_TTY + Boolean(process.env['WT_SESSION']) && !process.env['SSH_CONNECTION'] && !process.env['SSH_CLIENT'] && !process.env['SSH_TTY'] ); } diff --git a/packages/pi-tui/src/stdin-buffer.ts b/packages/pi-tui/src/stdin-buffer.ts index a8b0b8478..89ddfdf38 100644 --- a/packages/pi-tui/src/stdin-buffer.ts +++ b/packages/pi-tui/src/stdin-buffer.ts @@ -95,7 +95,7 @@ function isCompleteCsiSequence(data: string): "complete" | "incomplete" { // CSI sequences end with a byte in the range 0x40-0x7E (@-~) // This includes all letters and several special characters - const lastChar = payload[payload.length - 1]; + const lastChar = payload[payload.length - 1]!; const lastCharCode = lastChar.charCodeAt(0); if (lastCharCode >= 0x40 && lastCharCode <= 0x7e) { diff --git a/packages/pi-tui/src/terminal-colors.ts b/packages/pi-tui/src/terminal-colors.ts index cff6dc8e8..fec02c6b9 100644 --- a/packages/pi-tui/src/terminal-colors.ts +++ b/packages/pi-tui/src/terminal-colors.ts @@ -38,7 +38,7 @@ export function parseOsc11BackgroundColor(data: string): RgbColor | undefined { return undefined; } - const value = match[1].trim(); + const value = match[1]!.trim(); if (value.startsWith("#")) { const hex = value.slice(1); if (/^[0-9a-f]{6}$/i.test(hex)) { diff --git a/packages/pi-tui/src/terminal-image.ts b/packages/pi-tui/src/terminal-image.ts index 8854a86a7..e7878de7a 100644 --- a/packages/pi-tui/src/terminal-image.ts +++ b/packages/pi-tui/src/terminal-image.ts @@ -63,15 +63,15 @@ function probeTmuxHyperlinks(): boolean { } export function detectCapabilities(tmuxForwardsHyperlink: () => boolean = probeTmuxHyperlinks): TerminalCapabilities { - const termProgram = process.env.TERM_PROGRAM?.toLowerCase() || ""; - const terminalEmulator = process.env.TERMINAL_EMULATOR?.toLowerCase() || ""; - const term = process.env.TERM?.toLowerCase() || ""; - const colorTerm = process.env.COLORTERM?.toLowerCase() || ""; + const termProgram = process.env['TERM_PROGRAM']?.toLowerCase() || ""; + const terminalEmulator = process.env['TERMINAL_EMULATOR']?.toLowerCase() || ""; + const term = process.env['TERM']?.toLowerCase() || ""; + const colorTerm = process.env['COLORTERM']?.toLowerCase() || ""; const hasTrueColorHint = colorTerm === "truecolor" || colorTerm === "24bit"; // Emit OSC 8 hyperlinks only when tmux confirms it forwards. // Image protocols are unreliable under tmux, so leave `images: null`. - if (process.env.TMUX || term.startsWith("tmux")) { + if (process.env['TMUX'] || term.startsWith("tmux")) { return { images: null, trueColor: hasTrueColorHint, hyperlinks: tmuxForwardsHyperlink() }; } @@ -80,28 +80,28 @@ export function detectCapabilities(tmuxForwardsHyperlink: () => boolean = probeT return { images: null, trueColor: hasTrueColorHint, hyperlinks: false }; } - if (process.env.KITTY_WINDOW_ID || termProgram === "kitty") { + if (process.env['KITTY_WINDOW_ID'] || termProgram === "kitty") { return { images: "kitty", trueColor: true, hyperlinks: true }; } - if (termProgram === "ghostty" || term.includes("ghostty") || process.env.GHOSTTY_RESOURCES_DIR) { + if (termProgram === "ghostty" || term.includes("ghostty") || process.env['GHOSTTY_RESOURCES_DIR']) { return { images: "kitty", trueColor: true, hyperlinks: true }; } - if (process.env.WEZTERM_PANE || termProgram === "wezterm") { + if (process.env['WEZTERM_PANE'] || termProgram === "wezterm") { return { images: "kitty", trueColor: true, hyperlinks: true }; } // Warp supports the Kitty graphics protocol and OSC 8 hyperlinks. - if (termProgram === "warpterminal" || process.env.WARP_SESSION_ID || process.env.WARP_TERMINAL_SESSION_UUID) { + if (termProgram === "warpterminal" || process.env['WARP_SESSION_ID'] || process.env['WARP_TERMINAL_SESSION_UUID']) { return { images: "kitty", trueColor: true, hyperlinks: true }; } - if (process.env.ITERM_SESSION_ID || termProgram === "iterm.app") { + if (process.env['ITERM_SESSION_ID'] || termProgram === "iterm.app") { return { images: "iterm2", trueColor: true, hyperlinks: true }; } - if (process.env.WT_SESSION) { + if (process.env['WT_SESSION']) { return { images: null, trueColor: true, hyperlinks: true }; } @@ -328,7 +328,7 @@ export function getJpegDimensions(base64Data: string): ImageDimensions | null { continue; } - const marker = buffer[offset + 1]; + const marker = buffer[offset + 1]!; if (marker >= 0xc0 && marker <= 0xc2) { const height = buffer.readUInt16BE(offset + 5); @@ -402,8 +402,8 @@ export function getWebpDimensions(base64Data: string): ImageDimensions | null { return { widthPx: width, heightPx: height }; } else if (chunk === "VP8X") { if (buffer.length < 30) return null; - const width = (buffer[24] | (buffer[25] << 8) | (buffer[26] << 16)) + 1; - const height = (buffer[27] | (buffer[28] << 8) | (buffer[29] << 16)) + 1; + const width = (buffer[24]! | (buffer[25]! << 8) | (buffer[26]! << 16)) + 1; + const height = (buffer[27]! | (buffer[28]! << 8) | (buffer[29]! << 16)) + 1; return { widthPx: width, heightPx: height }; } diff --git a/packages/pi-tui/src/terminal.ts b/packages/pi-tui/src/terminal.ts index 2542286ae..3caba9789 100644 --- a/packages/pi-tui/src/terminal.ts +++ b/packages/pi-tui/src/terminal.ts @@ -38,7 +38,7 @@ function isKeyboardProtocolNegotiationSequencePrefix(sequence: string): boolean } export function isAppleTerminalSession(): boolean { - return process.platform === "darwin" && process.env.TERM_PROGRAM === "Apple_Terminal"; + return process.platform === "darwin" && process.env['TERM_PROGRAM'] === "Apple_Terminal"; } export function normalizeAppleTerminalInput(data: string, isAppleTerminal: boolean, isShiftPressed: boolean): string { @@ -109,7 +109,7 @@ export class ProcessTerminal implements Terminal { private stdinDataHandler?: (data: string) => void; private progressInterval?: ReturnType; private writeLogPath = (() => { - const env = process.env.PI_TUI_WRITE_LOG || ""; + const env = process.env['PI_TUI_WRITE_LOG'] || ""; if (!env) return ""; try { if (fs.statSync(env).isDirectory()) { @@ -463,11 +463,11 @@ export class ProcessTerminal implements Terminal { } get columns(): number { - return process.stdout.columns || Number(process.env.COLUMNS) || 80; + return process.stdout.columns || Number(process.env['COLUMNS']) || 80; } get rows(): number { - return process.stdout.rows || Number(process.env.LINES) || 24; + return process.stdout.rows || Number(process.env['LINES']) || 24; } moveBy(lines: number): void { diff --git a/packages/pi-tui/src/tui.ts b/packages/pi-tui/src/tui.ts index a7054888a..0f549b72f 100644 --- a/packages/pi-tui/src/tui.ts +++ b/packages/pi-tui/src/tui.ts @@ -155,13 +155,13 @@ function parseSizeValue(value: SizeValue | undefined, referenceSize: number): nu // Parse percentage string like "50%" const match = value.match(/^(\d+(?:\.\d+)?)%$/); if (match) { - return Math.floor((referenceSize * parseFloat(match[1])) / 100); + return Math.floor((referenceSize * parseFloat(match[1]!)) / 100); } return undefined; } function isTermuxSession(): boolean { - return Boolean(process.env.TERMUX_VERSION); + return Boolean(process.env['TERMUX_VERSION']); } /** @@ -309,8 +309,8 @@ export class TUI extends Container { private static readonly MIN_RENDER_INTERVAL_MS = 16; private cursorRow = 0; // Logical cursor row (end of rendered content) private hardwareCursorRow = 0; // Actual terminal cursor row (may differ due to IME positioning) - private showHardwareCursor = process.env.PI_HARDWARE_CURSOR === "1"; - private clearOnShrink = process.env.PI_CLEAR_ON_SHRINK === "1"; // Clear empty rows when content shrinks (default: off) + private showHardwareCursor = process.env['PI_HARDWARE_CURSOR'] === "1"; + private clearOnShrink = process.env['PI_CLEAR_ON_SHRINK'] === "1"; // Clear empty rows when content shrinks (default: off) private maxLinesRendered = 0; // Track terminal's working area (max lines ever rendered) private previousViewportTop = 0; // Track previous viewport top for resize-aware cursor moves private fullRedrawCount = 0; @@ -877,8 +877,8 @@ export class TUI extends Container { return false; } - const heightPx = parseInt(match[1], 10); - const widthPx = parseInt(match[2], 10); + const heightPx = parseInt(match[1]!, 10); + const widthPx = parseInt(match[2]!, 10); if (heightPx <= 0 || widthPx <= 0) { return true; } @@ -945,7 +945,7 @@ export class TUI extends Container { const match = opt.row.match(/^(\d+(?:\.\d+)?)%$/); if (match) { const maxRow = Math.max(0, availHeight - effectiveHeight); - const percent = parseFloat(match[1]) / 100; + const percent = parseFloat(match[1]!) / 100; row = marginTop + Math.floor(maxRow * percent); } else { // Invalid format, fall back to center @@ -967,7 +967,7 @@ export class TUI extends Container { const match = opt.col.match(/^(\d+(?:\.\d+)?)%$/); if (match) { const maxCol = Math.max(0, availWidth - width); - const percent = parseFloat(match[1]) / 100; + const percent = parseFloat(match[1]!) / 100; col = marginLeft + Math.floor(maxCol * percent); } else { // Invalid format, fall back to center @@ -1081,8 +1081,8 @@ export class TUI extends Container { // Defensive: truncate overlay line to declared width before compositing // (components should already respect width, but this ensures it) const truncatedOverlayLine = - visibleWidth(overlayLines[i]) > w ? sliceByColumn(overlayLines[i], 0, w, true) : overlayLines[i]; - result[idx] = this.compositeLineAt(result[idx], truncatedOverlayLine, col, w, termWidth); + visibleWidth(overlayLines[i]!) > w ? sliceByColumn(overlayLines[i]!, 0, w, true) : overlayLines[i]!; + result[idx] = this.compositeLineAt(result[idx]!, truncatedOverlayLine, col, w, termWidth); } } } @@ -1095,7 +1095,7 @@ export class TUI extends Container { private applyLineResets(lines: string[]): string[] { const reset = TUI.SEGMENT_RESET; for (let i = 0; i < lines.length; i++) { - const line = lines[i]; + const line = lines[i]!; if (!isImageLine(line)) { lines[i] = normalizeTerminalOutput(line) + reset; } @@ -1144,7 +1144,7 @@ export class TUI extends Container { let expandedLastChanged = lastChanged; const expandForLines = (lines: string[]): void => { for (let i = 0; i < lines.length; i++) { - if (extractKittyImageIds(lines[i]).length === 0) continue; + if (extractKittyImageIds(lines[i]!).length === 0) continue; const blockEnd = i + this.getKittyImageReservedRows(lines, i) - 1; if (i >= firstChanged || (i <= lastChanged && blockEnd >= firstChanged)) { expandedFirstChanged = Math.min(expandedFirstChanged, i); @@ -1235,7 +1235,7 @@ export class TUI extends Container { // Only scan the bottom `height` lines (visible viewport) const viewportTop = Math.max(0, lines.length - height); for (let row = lines.length - 1; row >= viewportTop; row--) { - const line = lines[row]; + const line = lines[row]!; const markerIndex = line.indexOf(CURSOR_MARKER); if (markerIndex !== -1) { // Calculate visual column (width of text before marker) @@ -1290,7 +1290,7 @@ export class TUI extends Container { } for (let i = 0; i < newLines.length; i++) { if (i > 0) buffer += "\r\n"; - const line = newLines[i]; + const line = newLines[i]!; const isImage = isImageLine(line); const imageReservedRows = isImage ? this.getKittyImageReservedRows(newLines, i) : 1; if (imageReservedRows > 1 && imageReservedRows <= height) { @@ -1324,7 +1324,7 @@ export class TUI extends Container { this.previousHeight = height; }; - const debugRedraw = process.env.PI_DEBUG_REDRAW === "1"; + const debugRedraw = process.env['PI_DEBUG_REDRAW'] === "1"; const logRedraw = (reason: string): void => { if (!debugRedraw) return; const logPath = path.join(os.homedir(), ".pi", "agent", "pi-debug.log"); @@ -1492,7 +1492,7 @@ export class TUI extends Container { const renderEnd = Math.min(lastChanged, newLines.length - 1); for (let i = firstChanged; i <= renderEnd; i++) { if (i > firstChanged) buffer += "\r\n"; - const line = newLines[i]; + const line = newLines[i]!; const isImage = isImageLine(line); const imageReservedRows = isImage ? this.getKittyImageReservedRows(newLines, i, renderEnd) : 1; if (imageReservedRows > 1) { @@ -1569,7 +1569,7 @@ export class TUI extends Container { buffer += "\x1b[?2026l"; // End synchronized output - if (process.env.PI_TUI_DEBUG === "1") { + if (process.env['PI_TUI_DEBUG'] === "1") { const debugDir = "/tmp/tui"; fs.mkdirSync(debugDir, { recursive: true }); const debugPath = path.join(debugDir, `render-${Date.now()}-${Math.random().toString(36).slice(2)}.log`); diff --git a/packages/pi-tui/src/utils.ts b/packages/pi-tui/src/utils.ts index b074a3a24..3823c386b 100644 --- a/packages/pi-tui/src/utils.ts +++ b/packages/pi-tui/src/utils.ts @@ -399,7 +399,7 @@ class AnsiCodeTracker { const match = ansiCode.match(/\x1b\[([\d;]*)m/); if (!match) return; - const params = match[1]; + const params = match[1]!; if (params === "" || params === "0") { // Full reset this.reset(); @@ -410,7 +410,7 @@ class AnsiCodeTracker { const parts = params.split(";"); let i = 0; while (i < parts.length) { - const code = Number.parseInt(parts[i], 10); + const code = Number.parseInt(parts[i]!, 10); // Handle 256-color and RGB codes which consume multiple parameters if (code === 38 || code === 48) { @@ -755,7 +755,7 @@ function wrapSingleLine(line: string, width: number): string[] { for (let i = 0; i < broken.length - 1; i++) { wrapped.push(broken[i]!); } - currentLine = broken[broken.length - 1]; + currentLine = broken[broken.length - 1]!; currentVisibleLength = visibleWidth(currentLine); continue; } diff --git a/packages/pi-tui/tsconfig.build.json b/packages/pi-tui/tsconfig.build.json deleted file mode 100644 index 5ce430296..000000000 --- a/packages/pi-tui/tsconfig.build.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} \ No newline at end of file diff --git a/packages/pi-tui/tsconfig.json b/packages/pi-tui/tsconfig.json new file mode 100644 index 000000000..5c3ca434f --- /dev/null +++ b/packages/pi-tui/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "lib": ["ESNext"] + }, + "include": ["src"] +} diff --git a/packages/pi-tui/vitest.config.ts b/packages/pi-tui/vitest.config.ts index a90c176d9..8dbb6fd11 100644 --- a/packages/pi-tui/vitest.config.ts +++ b/packages/pi-tui/vitest.config.ts @@ -1,7 +1,13 @@ import { defineConfig } from "vitest/config"; +// pi-tui's suite is written for `node:test` and runs through the package +// `test` script (`node --test test/*.test.ts`). Vitest cannot execute +// `node:test`-style tests, so the repo's projects-mode `vitest run` is +// pointed at no files here and allowed to pass with none. Convert a test +// file to vitest's API and add it to `include` to opt it in. export default defineConfig({ test: { - include: ["test/wrap-ansi.test.ts"], + include: [], + passWithNoTests: true, }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0762021c4..a3708f5cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,9 +72,6 @@ importers: apps/kimi-code: devDependencies: - '@earendil-works/pi-tui': - specifier: ^0.78.1 - version: 0.78.1 '@moonshot-ai/acp-adapter': specifier: workspace:^ version: link:../../packages/acp-adapter @@ -93,6 +90,9 @@ importers: '@moonshot-ai/migration-legacy': specifier: workspace:^ version: link:../../packages/migration-legacy + '@moonshot-ai/pi-tui': + specifier: workspace:^ + version: link:../../packages/pi-tui '@moonshot-ai/server': specifier: workspace:^ version: link:../../packages/server @@ -527,6 +527,22 @@ importers: specifier: ^4.1.4 version: 4.1.4 + packages/pi-tui: + dependencies: + get-east-asian-width: + specifier: 1.6.0 + version: 1.6.0 + marked: + specifier: 18.0.5 + version: 18.0.5 + devDependencies: + '@xterm/headless': + specifier: 5.5.0 + version: 5.5.0 + chalk: + specifier: ^5.4.1 + version: 5.6.2 + packages/protocol: dependencies: ulid: @@ -981,10 +997,6 @@ packages: search-insights: optional: true - '@earendil-works/pi-tui@0.78.1': - resolution: {integrity: sha512-07GVQo/38a0yvIPlWDr3RJn1B8gk3ZuIX9h2oIQ+Biyu3JN0KppWmgWHfaWRydQgse5JtC++KDw5MWaIRnV0mw==} - engines: {node: '>=22.19.0'} - '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -2928,6 +2940,9 @@ packages: '@xterm/addon-fit@0.11.0': resolution: {integrity: sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==} + '@xterm/headless@5.5.0': + resolution: {integrity: sha512-5xXB7kdQlFBP82ViMJTwwEc3gKCLGKR/eoxQm4zge7GPBl86tCdI0IdPJjoKd8mUSFXz5V7i/25sfsEkP4j46g==} + '@xterm/xterm@6.0.0': resolution: {integrity: sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==} @@ -3922,10 +3937,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} - engines: {node: '>=18'} - get-east-asian-width@1.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} @@ -4567,16 +4578,16 @@ packages: peerDependencies: marked: '>=1 <16' - marked@15.0.12: - resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} - engines: {node: '>= 18'} - hasBin: true - marked@16.4.2: resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} engines: {node: '>= 20'} hasBin: true + marked@18.0.5: + resolution: {integrity: sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==} + engines: {node: '>= 20'} + hasBin: true + marked@9.1.6: resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} engines: {node: '>= 16'} @@ -6862,11 +6873,6 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@earendil-works/pi-tui@0.78.1': - dependencies: - get-east-asian-width: 1.6.0 - marked: 15.0.12 - '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -8463,6 +8469,8 @@ snapshots: '@xterm/addon-fit@0.11.0': {} + '@xterm/headless@5.5.0': {} + '@xterm/xterm@6.0.0': {} a-sync-waterfall@1.0.1: {} @@ -9607,8 +9615,6 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} - get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: @@ -9875,7 +9881,7 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 is-generator-function@1.1.2: dependencies: @@ -10271,10 +10277,10 @@ snapshots: node-emoji: 2.2.0 supports-hyperlinks: 3.2.0 - marked@15.0.12: {} - marked@16.4.2: {} + marked@18.0.5: {} + marked@9.1.6: {} markstream-core@1.0.3: {} @@ -11556,12 +11562,12 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 string-width@8.2.0: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 string.prototype.trim@1.2.10: diff --git a/tsconfig.json b/tsconfig.json index d133d0122..39db3e2cd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,9 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2024", "module": "preserve", "moduleResolution": "bundler", + "allowImportingTsExtensions": true, "lib": ["ES2023"], "jsx": "react-jsx", "jsxImportSource": "react",