137 lines
7.7 KiB
Markdown
137 lines
7.7 KiB
Markdown
---
|
||
title: "pi-interview Package"
|
||
task: ""
|
||
lineage_type: import
|
||
upstream_source: https://github.com/K-Dense-AI/scientific-agent-skills/blob/b2a92ba0/skills/pi-agent/references/pi-interview.md
|
||
upstream_sha: b2a92ba0
|
||
imported_at: 2026-08-14
|
||
prompt_class: prompt
|
||
upstream_changes: accepted
|
||
author: upstream
|
||
validated: false
|
||
---
|
||
|
||
# pi-interview Package
|
||
|
||
Source: https://pi.dev/packages/pi-interview
|
||
|
||
Interactive interview forms: the agent collects structured user responses through a form with single/multi-select, text input, image upload, and info panels, plus rich media (code, diffs, Markdown, images, Chart.js charts, Mermaid diagrams, tables, HTML).
|
||
|
||
```bash
|
||
pi install npm:pi-interview
|
||
pi install npm:glimpseui # optional: native macOS window; browser fallback otherwise
|
||
```
|
||
|
||
Requires Pi v0.82.1 or later. Restart Pi after installing.
|
||
|
||
## Invocation
|
||
|
||
```javascript
|
||
await interview({
|
||
questions: '/path/to/questions.json',
|
||
timeout: 600, // optional, seconds (default 600)
|
||
verbose: false // optional, debug logging
|
||
});
|
||
```
|
||
|
||
Lifecycle: the tool starts a local server and opens a Glimpse window (macOS), an Orca tab, or a browser tab → the user answers at their own pace with auto-save and timeout reset on any activity → the session ends by Submit (`⌘+Enter`), timeout (warning overlay with an option to stay), or Escape twice → the window closes and the agent receives responses, or `null` if cancelled.
|
||
|
||
Remote and Moshi sessions: when the session looks remote (ssh/mosh env, or an active remote login on the host), the tool skips or supplements the local window and prints the form URL with access hints — a Moshi tip when the moshi-hook gateway is running (tap the preview button in the terminal title bar and pick the interview server), and an exact `ssh -L` command for plain SSH (mosh cannot forward ports). The server binds low ports (8377+, scanning forward on collision) and answers tokenless loopback opens with a landing page that hops to the form, so Moshi's browser preview reaches it in one tap. Requests with a non-loopback `Host` header are rejected.
|
||
|
||
With multiple concurrent interviews, only the first auto-opens; the rest are queued and surfaced as URLs in tool output, plus a top-right toast with a dropdown to open queued sessions. Submitting the active interview redirects the window to the next queued one. A status bar shows project path, git branch, and session ID.
|
||
|
||
## Question Schema
|
||
|
||
```json
|
||
{
|
||
"title": "Project Setup",
|
||
"description": "Review my suggestions and adjust as needed.",
|
||
"questions": [
|
||
{ "id": "context", "type": "info", "question": "Architecture context",
|
||
"context": "This project needs SSR and edge deployment support." },
|
||
{ "id": "framework", "type": "single", "question": "Which framework?",
|
||
"options": ["React", "Vue", "Svelte"],
|
||
"recommended": "React", "conviction": "strong", "weight": "critical" },
|
||
{ "id": "features", "type": "multi", "question": "Which features?",
|
||
"options": ["Auth", "Database", "API"], "recommended": ["Auth", "Database"] },
|
||
{ "id": "notes", "type": "text", "question": "Additional requirements?" },
|
||
{ "id": "mockup", "type": "image", "question": "Upload a design mockup" }
|
||
]
|
||
}
|
||
```
|
||
|
||
Question types: `single` (radio), `multi` (checkbox), `text`, `image` (upload), `info` (non-interactive panel).
|
||
|
||
| Field | Purpose |
|
||
|---|---|
|
||
| `id`, `type`, `question` | Identifier, type, question text |
|
||
| `options` | Choices for single/multi; strings or `{ label, content? }` objects |
|
||
| `recommended` | Pre-selected option(s) with a "Recommended" badge |
|
||
| `conviction` | `"strong"` or `"slight"` (slight opts out of pre-selection); requires `recommended` |
|
||
| `weight` | `"critical"` (prominent card) or `"minor"` (compact card) |
|
||
| `context` | Help text below the question |
|
||
| `content` | Code/diff/Markdown block: `{ source, lang, file, lines, highlights, showSource }`; `lang: "diff"` renders a diff, `lang: "md"`/`"markdown"` previews Markdown |
|
||
| `media` | Object or array of `image`, `table`, `chart`, `mermaid`, `html`; each supports `position` (`"above"`/`"below"`/`"side"`) and `caption`; tables take `{ headers, rows, highlights }` |
|
||
|
||
Single/multi questions also support an "Other" custom-text option, per-question image attachments (button or drag & drop), "✦ Generate more" and "↻ Review options" LLM actions, an "Ask about an option" inline assistant panel with prompt chips and provider/model overrides, and an optional per-option clarification field.
|
||
|
||
## Response Format
|
||
|
||
```typescript
|
||
interface Response {
|
||
id: string;
|
||
value: string | string[];
|
||
attachments?: string[]; // image paths attached to non-image questions
|
||
}
|
||
```
|
||
|
||
## Settings
|
||
|
||
`~/.pi/agent/settings.json`:
|
||
|
||
```json
|
||
{
|
||
"interview": {
|
||
"timeout": 600,
|
||
"port": 19847,
|
||
"snapshotDir": "~/.pi/interview-snapshots/",
|
||
"autoSaveOnSubmit": true,
|
||
"generateModel": "anthropic/claude-haiku-4-5",
|
||
"launcher": "browser",
|
||
"browser": "Firefox",
|
||
"glimpseFloating": false,
|
||
"theme": {
|
||
"mode": "auto",
|
||
"name": "default",
|
||
"lightPath": "/path/to/light.css",
|
||
"darkPath": "/path/to/dark.css",
|
||
"toggleHotkey": "mod+shift+l"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
Timeout precedence: function parameter > settings > default 600s. A fixed `port` keeps the URL stable across sessions. `generateModel` drives the generate/review option actions, defaulting to the agent's current model then a cheap available model; if an explicitly configured model fails and the session uses a different one, it retries once with the session model. `glimpseFloating` keeps the native macOS window above others (browser fallback unaffected).
|
||
|
||
`launcher` chooses where the form opens; omit it for the default (Glimpse on a local macOS session with `glimpseui` installed, otherwise a browser tab):
|
||
|
||
- `"glimpse"` — native macOS Glimpse window; requires a local macOS session with `glimpseui`, and reports why the window could not open instead of falling back to a browser.
|
||
- `"browser"` — browser tab even when Glimpse is installed.
|
||
- `"orca"` — a browser tab in the current [Orca](https://github.com/stablyai/orca)-managed worktree, or Orca's focused worktree when the cwd is outside one; the tab is focused when that worktree is visible, otherwise staged in its tab bar. Needs `orca` on `PATH`.
|
||
|
||
`browser` names the application used for browser tabs (`"Firefox"`, `"Brave Browser"`, …). It applies to `launcher: "browser"` and to an omitted `launcher` when Glimpse is unavailable; it has no effect under `"glimpse"` or `"orca"`.
|
||
|
||
Themes: built-ins are `default` (monospace) and `tufte` (serif); modes are `dark` (default), `light`, and `auto` (follows the OS, user override persists in localStorage). Custom themes are CSS files overriding variables such as `--bg-body`, `--bg-card`, `--bg-elevated`, `--bg-selected`, `--fg`, `--fg-muted`, `--accent`, `--border`, `--success`, `--warning`, `--error`, `--focus-ring`.
|
||
|
||
## Keyboard
|
||
|
||
`↑`/`↓` navigate options, `⌘+←`/`⌘+→` navigate questions (Ctrl off macOS), `Tab` cycles, `Enter`/`Space` selects, `⌘+V` pastes into the focused input, `⌘+Enter` submits, `Esc` shows the exit overlay (twice to quit), `⌘+Shift+L` toggles the theme when enabled.
|
||
|
||
## Recovery and Snapshots
|
||
|
||
Abandoned or timed-out interviews save their questions to `~/.pi/interview-recovery/{date}_{time}_{project}_{branch}_{sessionId}.json`, auto-deleted after 7 days. Snapshots (manual Save button, or automatic on submit with `autoSaveOnSubmit`) land in `~/.pi/interview-snapshots/{title}-{project}-{branch}-{timestamp}[-submitted]/` as `index.html` plus an `images/` subfolder. Resume either by passing the recovery JSON or the snapshot `index.html` path as `questions` — the form reopens with answers pre-populated.
|
||
|
||
## Limits
|
||
|
||
Max 12 images per submission, 5 MB per image, 4096×4096 pixels, types PNG/JPG/GIF/WebP.
|