@glassesneo/pi-decision-ui

Accessible adaptive decision flows and a Pi question extension

Packages

Package details

extension

Install @glassesneo/pi-decision-ui from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:@glassesneo/pi-decision-ui
Package
@glassesneo/pi-decision-ui
Version
0.1.1
Published
Aug 31, 2026
Downloads
273/mo · 13/wk
Author
glassesneo
License
MIT
Types
extension
Size
191.7 KB
Dependencies
0 dependencies · 4 peers
Pi manifest JSON
{
  "extensions": [
    "./dist/question.js"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

@glassesneo/pi-decision-ui

An accessible keyboard-first decision flow for Pi, including a compatible question tool and a small library API.

Security: Pi extensions run with the installing user's full process permissions. Review this package before installing it.

Installation

Install with:

pi install npm:@glassesneo/pi-decision-ui@0.1.1

Pi loads the included question extension. The package supports Pi 0.84.4 and Node 22.19.0 or later.

Question tool

The extension registers one sequential question tool. Questions are single, multi, or text; single and multi options have value, label, optional description, and optional noteRequired.

{
  "questions": [{
    "id": "approach",
    "prompt": "Which approach?",
    "kind": "single",
    "options": [{ "value": "safe", "label": "Safe" }, { "value": "fast", "label": "Fast" }]
  }]
}

Results are JSON in both tool content and details:

{"status":"submitted","responses":{"approach":{"kind":"single","value":"safe"}}}

Write-ins are answers. Absent response IDs are skipped. Cancellation preserves completed responses and includes currentQuestionId only while an active question is cancelled. TUI mode uses one keyboard-operated custom component; RPC uses Pi dialogs; print/JSON and unavailable UI return {"status":"unavailable","responses":{}}.

Library API

import { runDecisionFlow, type DecisionItem } from "@glassesneo/pi-decision-ui";

const items: DecisionItem[] = [{ id: "approve", prompt: "Approve?", kind: "single", options: [
  { value: "yes", label: "Yes" }, { value: "no", label: "No" },
]}];
const result = await runDecisionFlow(ctx, items, {
  policy: { allowWriteIn: false, autoSubmitSingle: true },
});

Optional keybindings

No configuration is required. To override an action, create pi-decision-ui.json in the Pi agent directory (normally ~/.pi/agent):

{
  "schemaVersion": 1,
  "keybindings": {
    "common.next-question": ["ctrl+f"],
    "choice.move-down": ["ctrl+n"]
  }
}

Listed actions replace lower-precedence bindings; [] explicitly unbinds. Unknown fields, schema versions, actions, invalid keys, collisions, and missing required effective actions fail with an actionable configuration error.

Development

corepack pnpm install --frozen-lockfile
corepack pnpm check
corepack pnpm pack:check

These commands run type checking, linting, tests, the build, and packed-artifact verification.