# pi-ui-prompt-dialog

A customizable TUI prompt dialog for [pi coding agent](https://pi.dev) extensions.  
**Inline menu + text input in a single overlay** — no more two-step "select then input" dialogs.

## Quick Start

```bash
pi install npm:@2008muyu/pi-ui-prompt-dialog
```

```ts
import { showPromptDialog } from "@2008muyu/pi-ui-prompt-dialog";

const result = await showPromptDialog(ctx, {
  title: "Plan 模式拦截了此操作",
  description: "agent 想跑：npm install lodash",
  actions: [
    { id: "exit", label: "退出并执行", default: true },
    { id: "cancel", label: "取消" },
  ],
  input: { label: "补充指令", placeholder: "想让我怎么做？" },
});

if (!result) {
  // Esc pressed
} else if (result.type === "action") {
  // result.action === "exit" | "cancel"
} else {
  // result.type === "input", result.value is the user's text
}
```

## Usage Patterns

### Actions only (no input)

```ts
const result = await showPromptDialog(ctx, {
  title: "选择操作",
  actions: [
    { id: "open", label: "打开文件", default: true },
    { id: "search", label: "搜索内容" },
    { id: "cancel", label: "取消" },
  ],
});
```

### Pure input (single submit button)

```ts
const result = await showPromptDialog(ctx, {
  title: "输入项目名",
  description: "请输入一个 kebab-case 名称",
  actions: [{ id: "submit", label: "提交", default: true }],
  input: { label: "名称", placeholder: "my-project" },
});
```

## API

### `showPromptDialog<TAction>(ctx, options) => Promise<PromptDialogResult<TAction>>`

| Parameter | Type | Description |
|-----------|------|-------------|
| `ctx` | `ExtensionContext` | Pi extension context |
| `options.title` | `string` | Dialog title |
| `options.description` | `string` (optional) | Context text (shown in muted style) |
| `options.actions` | `PromptAction[]` | 1–10 action items |
| `options.actions[].id` | `TAction` | Unique identifier |
| `options.actions[].label` | `string` | Display label |
| `options.actions[].default` | `boolean` | Default (Enter key) action — max 1 |
| `options.input` | `PromptInput` (optional) | Inline input field configuration |
| `options.input.label` | `string` | Label shown before input |
| `options.input.placeholder` | `string` (optional) | Placeholder when empty |

### Return value

```ts
type PromptDialogResult<TAction extends string> =
  | { type: "action"; action: TAction }  // User selected an action
  | { type: "input"; value: string }      // User typed text
  | undefined;                            // Esc / cancelled
```

### Exported types

```ts
import {
  showPromptDialog,
  type PromptAction,
  type PromptInput,
  type PromptDialogOptions,
  type PromptDialogResult,
} from "@2008muyu/pi-ui-prompt-dialog";
```

## Keyboard Controls

| Key | Action |
|-----|--------|
| `↑` `↓` | Navigate actions / input row |
| `Tab` / `→` on input row | Enter input mode |
| `←` `→` (in input) | Move cursor |
| `Backspace` (in input) | Delete character |
| `↑` / `Esc` (in input) | Exit input mode |
| `Enter` | Submit (action or input) |
| `Esc` | Cancel dialog |

## Limits

- Max 10 actions
- Single-line input only (no multi-line)
- No scrolling (if terminal is too narrow, content is clipped)
- No custom theming (uses pi's built-in theme colors)

## License

MIT
