AGENTS.md · agegr/pi-web
AGENTS.md from agegr/pi-web: 293 lines covering Quick Start, Architecture, File Map, Topic Notes and more.
Template by agegr
Install
Works with Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode, Claude Code. Read the repository before you give any tool access to your data.
curl -fsSL https://raw.githubusercontent.com/agegr/pi-web/main/AGENTS.md -o AGENTS.md
Read it and adapt it to your project before use.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: prompt-engineering
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
What's in it
An AGENTS.md file: instructions coding agents (Codex, Cursor, Copilot, Gemini CLI and others) read before working in a repo.
- For
- Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode, Claude Code
- Length
- 293 lines
- File
AGENTS.md
Sections
- Quick Start
- Architecture
- File Map
- Topic Notes
- Old Safari (iOS 16.2)
- Pi Session File Format
- CSS Variables (app/globals.css)
First lines (shown under the repo's MIT license)
# Pi Web - Development Notes
## Quick Start
```bash
npm run dev # port 30141
```
Typecheck: `node_modules/.bin/tsc --noEmit` · Lint: `npm run lint`
**Never run `next build` during dev**: it pollutes `.next/` and breaks `npm run dev`.
### Dev server troubleshooting
- First run `lsof -nP -iTCP:30141 -sTCP:LISTEN` and reuse a healthy Pi Web process. A second `next dev` on another port is no workaround: both contend for `.next/dev/lock`.
- A browser-only `Module ... factory is not available` overlay usually means that tab has a stale Turbopack/HMR graph, not a broken server or source. Use the browser's explicit reload, then compare the server log and a direct HTTP/API request.
- Restart only when the failure reproduces from a fresh page and the server-side checks fail too: stop that exact dev process gracefully, move `.next` into a `mktemp -d` backup, restart with `npm run dev`.
- Never fall back to `next dev --webpack`: the dev graph can fail on `undici` imports such as `node:console`. Development uses Turbopack.
- `next dev` may append a generated `BEGIN:nextjs-agent-rules` block to `AGENTS.md`. It is tooling output: check `git status` and keep it out of unrelated commits.
### Upgrading pi
pi's packages up to 1.2.0 depend on each other with `^` ranges (1.3.0 pins them exactly), and the published pi-web's dependencies resolve afresh on install (no lockfile ships). Install every `@earendil-works/*` package the tree holds, the SDK's own dependencies included (`pi-codemode`, `pi-mcp`, `pi-telemetry`, …), with `npm install --save-exact`, so npm reuses those exact versions for the SDK's ranges. `lib/pi-packages.test.mjs` fails on any pi package that is not pinned that way; pi-web 0.12.0 pinned four, and installs after pi 1.2.0 paired pi-coding-agent 1.1.0 with pi-codemode 1.2.0.
---
## Architecture
- **Browsing** (read-only, no AgentSession): `GET /api/sessions` lists `~/.pi/agent/sessions/`; `GET /api/sessions/[id]` reads the `.jsonl` through SDK `SessionManager` helpers and `lib/session-reader.ts`, or an open wrapper's in-memory `SessionManager`. `GET /api/agent/running` snapshots the running ids.
- **Sending**: `POST /api/agent/[id]` → `startRpcSession()` (`lib/rpc-manager.ts`) creates the AgentSession in-process (`createAgentSessionFromServices()`); `session.send(cmd)` → `session.prompt()`.
- **Events**: `GET /api/agent/[id]/events` streams SSE `data: {...}` from `session.onEvent()`, fed by `session.subscribe()`.
- **Product scope**: a light web wrapper around pi, not an IDE or a platform of its own. Before adding a feature, check the out-of-scope list in [CONTRIBUTING.md](CONTRIBUTING.md).
- **Extension compatibility (principle)**: extensions written for the pi CLI must behave the same here. Fix display problems in the web client; never add pi-web-only options or fields to the extension API (`ctx.ui.*` options, `extension_ui_request`). pi's TUI (`node_modules/@earendil-works/pi-tui`) is the reference for what an extension asking for something means.
---
## File Map
```
app/api/
sessions/route.ts GET list all sessions
sessions/[id]/route.ts GET/PATCH/DELETE a session
sessions/[id]/context/route.ts GET ?leafId=&tail=&before= a page of a leaf's context (tail defaults to 50; before pages upward)
sessions/[id]/export/route.ts GET exported HTML
sessions/[id]/fork/route.ts POST copy the session's current branch into a new session (never starts an AgentSession)
sessions/delete/route.ts POST { ids } delete sessions and their subagents (a project's Delete all sessions); running ones kept
sessions/stats/route.ts POST { ids } each session's tokens, cost, tool calls, active time (the agent switcher's rows)
sessions/[id]/state/route.ts GET live wrapper state while running
sessions/ui-state/route.ts GET/POST sidebar pins, archive, project order and names (set, restore, pin-project, add-projects, move-project, rename-project)
sessions/[id]/auto-name/route.ts POST generate a session title
sessions/search/route.ts GET session search
agent/new/route.ts POST { cwd, type: prompt|ensure_session (start only), message?, toolNames?, provider?, modelId?, thinkingLevel? }
agent/[id]/route.ts GET state (?systemPrompt=0: without the prompt) | POST any command
agent/[id]/events/route.ts GET SSE stream
agent/[id]/lease/route.ts POST reset the selected session's idle timer (with or without its stream; never starts one); reply: running, awaitingInput, subagentsActive
agent/running/route.ts GET running + awaiting-input session ids, sidebar pins/archive revision
agent/debug/route.ts GET ?session= the Debug panel's read-only snapshot: wrappers, streams, subagents, MCP, terminals, file watches
auth/api-key/[provider]/route.ts POST/DELETE stored provider API key
auth/login/[provider]/route.ts GET OAuth/device-code SSE | POST manual code
auth/logout/[provider]/route.ts POST OAuth logout
auth/providers/route.ts GET OAuth and API-key provider lists
cwd/validate/route.ts POST validate/select a cwd
cwd/browse/route.ts GET browse any readable directory for the cwd picker | POST create child directory
default-cwd/route.ts POST create ~/pi-cwd/YYYYMMDD (local date)
home/route.ts GET user home directory
open-in-explorer/route.ts GET availability | POST open a cwd in the OS file manager (loopback only)
files/[...path]/route.ts GET ?type=list|read|download|meta|preview|watch | POST ?type=upload|upload-check|allow-link
file-index/route.ts GET file list for @-mentions
git/status/route.ts GET changed files for a cwd
git/diff/route.ts GET diff of one changed file
worktrees/route.ts GET/POST/DELETE git worktrees
terminal/route.ts POST create a terminal session
terminal/[id]/route.ts GET { id, cwd } (404 once closed; stream at [id]/events) | POST input/resize | DELETE kill
mcp/route.ts GET [?cwd=] Settings › MCP overview, files only | POST add/enable/disable/remove/undo/set-enabled/set-exposure/set-in-project/sign-out
mcp/test/route.ts POST { scope, name, cwd? } test one server once (entry read from its file)
mcp/sign-in/route.ts POST { scope, name, cwd? } start or join an OAuth sign-in
mcp/sign-in/[flowId]/route.ts GET flow state (polled) | POST { redirectUrl } | DELETE cancel
project-trust/route.ts GET trust status + project .pi/mcp.json servers (files only) | POST trust, rebuild the cwd's wrappers
tools/settings/route.ts GET/PUT defaultTools switches: PowerShell (Windows), Code mode automatic/always; codemode.mode, codemode.inlineBudget
cache-miss-notices/route.ts GET/PUT pi's global showCacheMissNotices (Settings › General)
models/route.ts GET ?cwd= { models, modelList, defaultModel, … }
models/enabled/route.ts GET/PUT enabledModels switches
models/default/route.ts PUT default model / reasoning level for new sessions
models/refresh/route.ts POST fetch provider catalogs from pi.dev on demand
models-config/route.ts GET/PUT ~/.pi/agent/models.json
models-config/catalog/route.ts GET models.dev pricing presets
models-config/discover/route.ts POST fetch a configured provider's upstream model list
models-config/test/route.ts POST test a configured model/provider
plugins/route.ts GET/POST package plugin management
plugins/check/route.ts POST check plugin package updates
skills/route.ts GET/PATCH loaded skills, disable-model-invocation
skills/content/route.ts GET one loaded skill's bounded Markdown source, or ?document= a Markdown file in its folder
skills/install/route.ts POST install skills via npx skills add
skills/search/route.ts POST skills.sh search
subagents/settings/route.ts GET/PUT built-in subagent switch and maxConcurrent
web-auth/route.ts GET status | POST login | DELETE logout (browser password)
provider-usage/query/route.ts POST provider usage quotas
push/config/route.ts GET VAPID public key
push/subscribe/route.ts POST register a push subscription
app-update/route.ts GET current vs latest published pi-web version
lib/
agent-client.ts typed fetch helper for /api/agent commands
missing-cwd.ts client-safe `reason: "cwd-missing"` refusal of a folder that no longer exists: error class, body fields, parsing
debug-types.ts client-safe shapes of the Debug panel: GET /api/agent/debug and the page's own snapshot
debug-snapshot.ts buildDebugSnapshot(): the debug route's synchronous field reads, each source guarded
page-debug.ts client: the page's EventSources, visibility history, protocol and running-poll record (Debug panel)
file-watch-registry.ts open ?type=watch streams, counted on globalThis for the Debug panel
rpc-manager.ts AgentSessionWrapper, registry, startRpcSession
session-reader.ts SessionManager wrappers, path cache, buildSessionContext adapter
session-fork.ts forkSessionBranch(): the sidebar's Fork, a leaf-branch copy on a fresh SessionManager named after its source, typed refusals
session-fork-name.ts client-safe Fork naming: source title + " · " + 4 hex; splitting the suffix off for the row and toast
session-delete.ts deleteSessions(): session files with their subagents, re-parenting what stays, wrapper shutdown, pins/archive cleanup
session-tree.ts sidebar row model: pinned section, project groups and their order, archived predicate, virtual rows, drop targets
session-ui-state.ts pi-web-session-state.json (pins, archive, project order and names): lock, atomic write, revision, corrupt backup
session-ui-state-shared.ts client-safe types and rules of that state: request parsing, apply, undo snapshot
sidebar-prefs.ts per-browser sidebar tab, group expand choices, archive folds, pinned-section collapse, files-section fold, folders found outside git
sidebar-actions.ts session row menu entries, a project group's name entries and rename request, fork refusal messages, delete-all requests
session-links.ts same-instance links: a session's (?session=<id>), a fresh composer's (?cwd=<dir>); the plain-click rule the sidebar keeps in the page
new-session-context.ts client-safe: what the project/worktree pickers show (project, worktrees, project list), lag-safe contextForCwd, the directory a group's + and Open in new tab use
normalize.ts normalizeToolCalls(): file-format vs our toolCall field names
message-keys.ts client-safe React keys of chat messages: a run's messages keep theirs when the file is read again
types.ts shared TypeScript types
pi-types.ts local structural types for pi SDK objects
pi-sdk-internals.ts loader for SDK modules the package does not export (MCP connection, config, OAuth)
tool-presets.ts PRESET_NONE/READ_ONLY/DEFAULT/FULL + getPresetFromTools()
tool-preset-preference.ts browser-persisted default preset for fresh sessions
tool-fields.ts a tool call's arguments as flat rows: all of them or no table
builtin-extensions.ts codemode / tool-search / mcp built-ins, sandbox self-test, -builtin: switches
codemode-settings.ts Code mode automatic/always (+codemode in global defaultTools), codemode.mode and inlineBudget; project overrides
codemode-view.ts display helpers for codemode cards
global-settings-file.ts locked read-modify-write of global settings.json (SettingsManager's lock)
regular-file.ts readRegularFileText(): non-blocking read of a regular file only, optional size cap
default-preferences.ts write defaultModel/defaultThinkingLevel; detect project shadowing
deferred-provider-models.ts models of providers an extension registers only at session_start, re-added to listings
enabled-models.ts pure minimal-edit engine for the enabledModels pattern list
enabled-models-runtime.ts SDK adapter for enabledModels: pattern resolution, provider kinds, settings IO
model-context.ts client-safe: managed models' contextWindow overrides in the models.json draft, the Save check
model-provider-check.ts client-safe: Save refuses a models.json provider entry pi rejects on its own (Add provider's empty stub, oauth without a Base URL)
subagent-settings.ts read/write ~/.pi/agent/agents/settings.json
file-access.ts allowed file roots for /api/files and worktrees
file-upload-client.ts browser upload to /api/files ?type=upload, shared by the explorer and chat drops
linked-directory.ts directory links leading outside the allowed roots + the allow-link check
file-paths.ts client/server path encoding helpers
file-version.ts a watched file's size+mtime version: viewers skip reloading an unchanged file on reconnect
delimited-table.ts client-safe CSV/TSV parsing (RFC 4180, delimiter detection, file line per record) and table layout
file-tree-visibility.ts which entries the file tree lists (git check-ignore, name-list fallback)
file-tree-expansion.ts the file tree's open directories per cwd: page-memory LRU of 20 folders
display-path.ts display-only ~ / ./ path shortening for settings panels
default-cwd.ts dated ~/pi-cwd/YYYYMMDD path for "Use default directory"
worktree.ts project/worktree resolution and git worktree operations
draft-store.ts local draft persistence
extension-ui-queue.ts FIFO queues for extension dialogs and custom panels, by request id; isBlockingExtensionUiRequest() (which method a run waits on)
session-stats-format.ts client-safe compact counts, costs and active durations of the stats toolbar and agent switcher
turn-duration.ts getTurnDurationMs() / formatTurnDuration(): a finished turn's length from its anchor to its last response's end, on pi's timestamps
transcript-notices.ts client-safe: showCacheMissNotices notices on chat messages, TUI number formats, a fold's cache-miss sum
transcript-notices-server.ts the notices derived from session entries (cache-stats port), live ones for message_end, the setting
markdown.ts shared markdown helpers
markdown-blocks.ts splitMarkdownBlocks(): where a streaming reply may be cut into blocks parsed apart
highlight-queue.ts code fences past a task's highlight budget get their colors in idle slicesSignals
- Stars
- 7,759
- Forks
- 1,161
- Open issues
- 25
- Last commit (this folder)
- Oct 20, 2026 (8 days ago)
- Last release
- Oct 15, 2026 (13 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/agegr/pi-web
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
Cite this page
AGENTS.md · agegr/pi-web. Agent Mart. https://agentmart.dev/templates/agegr-pi-web-agents-md (last updated 2026-10-24)