pi-studio 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +106 -219
- package/assets/screenshots/dark-workspace.png +0 -0
- package/assets/screenshots/light-workspace.png +0 -0
- package/assets/screenshots/theme-zen-code.png +0 -0
- package/client/studio-client.js +7 -0
- package/client/studio.css +13 -1
- package/package.json +1 -1
- package/assets/screenshots/dark-code-mode.png +0 -0
- package/assets/screenshots/dark-critique.png +0 -0
- package/assets/screenshots/dark-fenced-code.png +0 -0
- package/assets/screenshots/dark-focus-mode.png +0 -0
- package/assets/screenshots/dark-julia-fenced.png +0 -0
- package/assets/screenshots/dark-math.png +0 -0
- package/assets/screenshots/dark-mermaid.png +0 -0
- package/assets/screenshots/dark-zen.png +0 -0
- package/assets/screenshots/light-code-mode.png +0 -0
- package/assets/screenshots/light-fenced-code.png +0 -0
- package/assets/screenshots/light-math.png +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@ All notable changes to `pi-studio` are documented here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.10.1] — 2026-10-14
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- Between clicking **Run Prompt** and Pi starting, the button no longer flashes hollow, and the toolbar no longer drops a row and jumps back. The status beside Run now says "Starting…", with the detail kept in the footer; the button keeps its colour, dimmed, until it becomes Stop.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- A shorter, plainer README with new screenshots. The npm package drops from about 8.4 MB to 1.8 MB.
|
|
14
|
+
|
|
7
15
|
## [0.10.0] — 2026-10-14
|
|
8
16
|
|
|
9
17
|
### Added
|
package/README.md
CHANGED
|
@@ -1,242 +1,127 @@
|
|
|
1
1
|
# pi-studio
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
See [`ROADMAP.md`](./ROADMAP.md) for the current release plan.
|
|
6
|
-
|
|
7
|
-
## Single and dual editor mode
|
|
8
|
-
|
|
9
|
-
Studio 0.10 has two editor modes.
|
|
10
|
-
|
|
11
|
-
**Dual editor mode** is the default. The left pane holds a **Prompt**, which is what Run sends to Pi, and a **Document**, the file you're working on. Switch between them with the Prompt and Document tabs, or Cmd/Ctrl+Shift+1 and 2. Each keeps its own edits, preview and reading position, and selecting the Document never changes what Run sends.
|
|
12
|
-
|
|
13
|
-
- **Open a file** in the Document from **File**, the **Files** pane or a link's menu. **Add to Prompt** adds the Document's selection, or all of it, to the Prompt as a labelled copy; Undo takes it back.
|
|
14
|
-
- **Document windows:** **File** can open a file in a new Document window, or move or copy the Document to one. Each file has one editor; opening a file that's already open finds that editor.
|
|
15
|
-
- **Recovery:** unsaved Prompt and Document text survives reloads and dropped connections. If you close the tab, `/studio` reopens the same workspace. After a clean exit it just reopens; otherwise Studio asks before resuming. `/studio --blank` and `--last` start afresh, and `/studio <file>` opens that file, finding its editor if it's already open. Recovery isn't a backup, so save work you want to keep.
|
|
16
|
-
- **Studio open somewhere you can't find**, such as another browser: `/studio-replace` moves it here, or open its URL and choose **Move it here**. The old tab hands over its text and disconnects; if it doesn't answer, Studio asks before resuming.
|
|
17
|
-
- `/studio-current`, editable `/studio-editor-only` and Office-to-Markdown opening aren't available in dual editor mode. Use Studio's Document controls, or single editor mode.
|
|
18
|
-
|
|
19
|
-
**Single editor mode** is the one-editor Studio of earlier versions, where Run sends the editor's text.
|
|
20
|
-
|
|
21
|
-
**Switching:** use the footer button (**Switch to single editor** / **Switch to dual editor**), or `/studio --single` and `/studio --dual`. Studio restarts and reopens the tab, and the Prompt's text comes with you. The choice is kept for your Pi profile. Studio won't switch from the footer while the Document or a closed Document window has unsaved text, other Studio tabs are open, or a run, save or side question is in progress; it says why. The commands work even if the page won't load. Like `/studio --stop`, they disconnect open tabs, which keep their text on screen, and they ask in Pi before dropping text that only Studio's server holds.
|
|
22
|
-
|
|
23
|
-
See [BUFFER-DESIGN.md](./BUFFER-DESIGN.md) for the design.
|
|
24
|
-
|
|
25
|
-
## Quick demo
|
|
26
|
-
|
|
27
|
-
[Watch the 2-minute demo (MP4, 2x speed, no audio)](https://github.com/omaclaren/pi-studio/releases/latest/download/pi-studio-demo-2min.mp4)
|
|
28
|
-
|
|
29
|
-
_The video shows an earlier version of the Studio interface. The basic workflow is the same, but there have been minor UI changes since it was recorded; the screenshots show the more recent version._
|
|
3
|
+
A browser workspace for [Pi](https://pi.dev). Write and run prompts, read responses with rendered math and diagrams, edit and annotate documents, and follow what Pi is doing, side by side.
|
|
30
4
|
|
|
31
5
|
## Screenshots
|
|
32
6
|
|
|
33
|
-
**
|
|
34
|
-
|
|
35
|
-

|
|
36
|
-
|
|
37
|
-
**Light workspace**
|
|
38
|
-
|
|
39
|
-

|
|
40
|
-
|
|
41
|
-
**Zen mode**
|
|
7
|
+
**The Prompt: a question, plus a section added from the Document, and its preview:**
|
|
42
8
|
|
|
43
|
-

|
|
44
10
|
|
|
45
|
-
**
|
|
11
|
+
**The Document: the file you're working on, with its preview:**
|
|
46
12
|
|
|
47
|
-

|
|
48
14
|
|
|
49
|
-
|
|
15
|
+
**Zen mode, on the code (rose-pine-dawn theme):**
|
|
50
16
|
|
|
51
|
-
|
|
52
|
-
- Lets you choose a persisted pane layout from **View → Workspace**: side by side, Editor above, or Response above; the same divider resizes width or height and either pane can still be focused independently
|
|
53
|
-
- Supports one canonical full Studio view per Pi session, plus additional editor-only companion views when you want extra editing/preview surfaces; editor-only views can also browse files and use the Studio REPL send controls without taking over the full Studio session view
|
|
54
|
-
- Includes a global **Zen** mode that hides the Studio header and secondary chrome without changing the current pane layout; the header can also be hidden independently and restored from the top-right edge
|
|
55
|
-
- Runs editor text directly, asks for structured critique (auto/writing/code focus), offers explicit **Show me** actions for a one-turn compact visual or structural explanation of the editor selection/document, displayed response, or current conversation topic, provides a manual **Suggest completion** action for short cursor-aware continuations (`Option/Alt+Tab` where available or `Cmd/Ctrl+Shift+Space` from the editor, `Tab` to insert a visible suggestion) with an optional editor-plus-latest-response context mode, or opens **Quiz me** for a Studio-native active-recall loop over the current editor text, selection, current file, folder, or repo, with optional focus guidance for shaping question selection
|
|
56
|
-
- Treats text copied from or staged in Pi's terminal input editor as a linked draft: ordinary Studio edits retain the link, and an accepted **Run editor text** clears the terminal draft only when it has not changed in the meantime; a confirmed **Clear Pi editor text…** action remains available explicitly
|
|
57
|
-
- Adds a right-pane **Side questions** thread for contextual questions that stay outside the main Pi conversation unless explicitly promoted. It can start with the editor selection, the Markdown/LaTeX heading block at the cursor, nearby unstructured text, the whole editor, the displayed response, or no starting text; independently, it can use read-only tools to map, search, and read the document folder, repository, or another chosen folder—including extracted PDF, DOCX, ODT, and EPUB text—and can optionally search the web through Brave Search.
|
|
58
|
-
- Working displays codemode JavaScript as **Code**, with light highlighting and preserved indentation. Code/Input and Output fold independently: short sections start visible and long ones compact. That initial default stays stable as content streams; empty pending placeholders do not choose for the first real output. Explicit choices survive streaming, including nested Raw/Write/Edit disclosures. **Collapse all / Expand all** affect displayed sections only; full output remains a separate bounded/full choice. **Control+Shift+[ / ]** works only while focused in Working, outside editable controls. Tool/status/timing and collapsed errors stay visible. This is display formatting, not a tool tree or REPL change; the blank-until-interaction report remains unreproduced.
|
|
59
|
-
- Includes a live **Working** view for following current model/tool activity, with `All` / `Thinking` / `Tools` filters, image previews for image-producing tool outputs, plus **Load visible into editor** and **Copy visible** actions; optional browser-stored **Follow activity** (`Cmd/Ctrl+Option/Alt+A`; off by default under **View → Workspace**) switches to Working when the main Pi agent starts generating and to Response Preview when it completes, unless you manually choose another view during that request. When cycling response history, Working follows saved working details for the selected response when available, and `Cmd/Ctrl+Option/Alt+1–8` switches directly between right-pane views while `Cmd/Ctrl+Option/Alt+P` / `Cmd/Ctrl+Option/Alt+E` / `Cmd/Ctrl+Option/Alt+W` / `Cmd/Ctrl+Option/Alt+F` / `Cmd/Ctrl+Option/Alt+R` / `Cmd/Ctrl+Option/Alt+Q` keep quick mnemonic shortcuts for Response Preview, Editor Preview, Working, Files, REPL, and Side questions
|
|
60
|
-
- Includes a right-pane **Changes** view for browsing the current git diff by file, previewing per-file diffs, opening changed files, loading the full diff into the editor, and copying the diff
|
|
61
|
-
- Includes a right-pane **Files** view rooted in folders allowed for the current Studio session, with an **Allow folder…** action and location selector; exact-file grants can still be opened independently without exposing their parent folders. Files supports sorting by name/modified time/size, opening folders or the current root in Finder/the system file manager, loading text/code/CSV/TSV documents into the editor, opening a read-only **Preview (follow)** tab whose disk content is authoritative, previewing PDFs/images, opening previews in new Studio tabs, converting DOCX/ODT documents to editable Markdown when Pandoc is available after confirmation, copying paths, setting the current folder as the Studio working directory, and revealing files in the file manager
|
|
62
|
-
- Imports detached text-file copies either through the browser's file picker or from a path on the computer running Pi, keeping the path option available in embedded and remote browser views; imported copies remain detached until saved or opened as file-backed documents
|
|
63
|
-
- Includes an optional tmux-backed **REPL** view for Shell, Python, IPython, Julia, R, GHCi, and Clojure sessions, with a scoped **Quick send** composer (`Cmd/Ctrl+Enter`), Raw/Literate editor send modes, `Cmd/Ctrl+Shift+Enter` **Send to REPL**, session start/stop/interrupt controls, a privacy-conscious Off/Summary/Full pane-echo selector, a compact refresh-persistent **Shared REPL Record** of compatible-client submissions, a secondary raw tmux mirror, agent-facing `studio_repl_status` / `studio_repl_send` tools, and Markdown/PDF/HTML export
|
|
64
|
-
- Includes a local persistent scratchpad for quick notes you want to keep out of the main editor until you're ready to copy or insert them, with a **Recent…** picker for recovering scratchpads saved under earlier file/draft identities
|
|
65
|
-
- Includes a docked **Outline** rail for navigating document structure in the current editor text, with clickable entries that jump in the raw editor and reveal matching preview locations when available
|
|
66
|
-
- Restores each browser tab’s editor workspace after refresh or cmux hidden-surface reconstruction, and provides an explicit **Reset editor** action when you want to discard the restored draft and return the tab to a fresh blank draft without changing responses or saved files
|
|
67
|
-
- Tracks an SHA-256 disk revision for file-backed editors: `Cmd/Ctrl+S` checks that revision before staging and again immediately before atomic replacement, external changes produce an explicit **Reload / Save As… / Overwrite / Cancel** decision, and even **Overwrite** / Save As **Replace** must still match the revision Studio reported when confirmation opened. `Cmd/Ctrl+Shift+S` performs no-clobber Save As unless you explicitly confirm the current target. Studio preserves ordinary mode and ownership metadata where the platform permits and refuses to split hard-linked files; file-system-specific ACLs and extended attributes may not survive atomic replacement. As with other file system editors, unrelated writers do not participate in a shared atomic compare-and-swap, so version control remains appropriate for highly concurrent files.
|
|
68
|
-
- Opens text/code documents as read-only followed previews through **Preview file (follow changes)**, Files' **Preview (follow)** action, or `/studio --watch <file>`; updates are debounced and content-hashed, atomic-save replacements are followed, reading position is restored by a stable content anchor with ratio fallback, and temporary read/render failures retain the last good preview
|
|
69
|
-
- Turns local preview links, including links inside sandboxed HTML previews, into Studio actions: PDFs open in the embedded viewer, images open in a zoomable focus viewer, PDF/image links can open in a new Studio preview tab, text/code/CSV/TSV document links can open in a new editor tab, DOCX/ODT links can be converted to editable Markdown, and right-click menus provide **Open here**, **Reveal in file manager**, and **Copy path** for local resources
|
|
70
|
-
- Includes local comments anchored to selections/lines, shown in a docked **Comments** rail, with transient **Comment** / **Jump** actions from raw-editor selections plus editor-preview selections for Markdown, LaTeX, code/text/diff previews, and an opt-in comment mode for editor HTML previews; source-anchored comments can be toggled into inline `[an: ...]` annotations when you want comments reflected in the document text
|
|
71
|
-
- Browses response history (`Prev/Next/Last`) and loads either:
|
|
72
|
-
- response text, with **Annotate response** (`Cmd/Ctrl+Option/Alt+Enter` from either main pane) also opening **Editor (Preview)**; add Shift (`Cmd/Ctrl+Option/Alt+Shift+Enter`) for **Load response into editor** without switching views (choose another view first if file-backed Quarto Preview is active)
|
|
73
|
-
- critique notes/full critique
|
|
74
|
-
- the prompt that generated a selected response
|
|
75
|
-
- Keeps the prompt → accepted Run → **Annotate response** loop confirmation-free when the submitted editor text is unchanged. **Annotate response**, **Load response into editor**, and the critique notes/full loaders ask before replacing unsubmitted edits or unsaved file changes; Cancel preserves the editor and its view so you can save or copy first. A failed submission or late acknowledgement cannot mark later typing as submitted, and sending file text does not save it. This bounded accepted-prompt baseline stays in page memory, is not restored after a page reload, and is separate from Pi-terminal draft cleanup.
|
|
76
|
-
- Supports an annotation workflow for `[an: ...]` markers:
|
|
77
|
-
- inserts/removes the annotated-reply header
|
|
78
|
-
- shows/hides annotation markers in preview
|
|
79
|
-
- strips markers before send (optional)
|
|
80
|
-
- saves `.annotated.md`
|
|
81
|
-
- Renders Markdown/LaTeX/code previews (math + Mermaid) plus lightweight CSV/TSV table previews, theme-synced with pi, with an explicit H1–H6 hierarchy, zoomable images across Studio-owned Markdown surfaces, and copy buttons for code blocks and blockquotes; already allowed local media loads silently, while blocked images and embedded PDFs remain unloaded behind an explicit per-file or containing-folder allow action; Mermaid previews include Lucide/Logos icon nodes and accessible label contrast over custom fills
|
|
82
|
-
- Adds a contextual **Editor (Quarto Preview)** right-pane view for file-backed `.qmd`, `.md`, and `.markdown` documents. Studio checks Quarto and the document/project configuration before showing an explicit start action, launches a single loopback `quarto preview` process with `--no-execute`, embeds Quarto's authoritative saved-file output without restyling it, and provides open-in-browser, restart, stop, logs, and unsaved-editor warnings. If Quarto is missing, the view remains available with an actionable dependency message.
|
|
83
|
-
- Renders straight, unfenced interactive HTML in preview via a sandboxed browser iframe with zoom controls, while fenced `html` blocks remain source code
|
|
84
|
-
- Embeds local PDFs in Studio Markdown previews via explicit `studio-pdf` fenced blocks and opens existing PDFs directly with `/studio <path.pdf>`, with visible enlarge, browser-tab, system-viewer, show-in-folder, copy-path, manual refresh, and opt-in stable-file auto-refresh actions; true browser fullscreen is offered only when the browser supports it
|
|
85
|
-
- Ships optional `pi-studio-dark` and `pi-studio-light` themes tuned for Studio's browser workspace
|
|
86
|
-
- Exports right-pane preview as PDF (pandoc + LaTeX) or standalone HTML into the source file directory, Studio working directory, or Pi session directory; PDF export can open in a Studio preview tab or the default PDF viewer, and HTML export can open in the default browser or in a new Studio editor tab for inspection/commenting, while preserving authored HTML previews as HTML and rendering CSV/TSV editor previews as tables
|
|
87
|
-
- Exports local files headlessly via `/studio-pdf <path>` to `<name>.studio.pdf` or `/studio-html <path>` to `<name>.studio.html`; without a path, those commands export the last model response to a timestamped file. Agent tools `studio_export_pdf` and `studio_export_html` expose the same export pipeline for remote/Telegram-style sessions.
|
|
88
|
-
- Shows model/session/context usage in the footer, plus compact-context and active-theme controls
|
|
17
|
+

|
|
89
18
|
|
|
90
|
-
|
|
19
|
+
There's also a [2-minute demo](https://github.com/omaclaren/pi-studio/releases/latest/download/pi-studio-demo-2min.mp4) (MP4, 2x speed, no audio) of an earlier version; the workflow is the same.
|
|
91
20
|
|
|
92
|
-
|
|
21
|
+
## Features
|
|
93
22
|
|
|
94
|
-
|
|
23
|
+
- **Prompt and Document** — the default, dual editor mode. The Prompt holds what you send to Pi; the Document holds the file you're working on. Each keeps its own edits, preview and place. See [Single and dual editor mode](#single-and-dual-editor-mode).
|
|
24
|
+
- **Run, critique, annotate** — run the Prompt, ask for a critique, or annotate a response with `[an: ...]` markers and send it back.
|
|
25
|
+
- **Response history** — step back through earlier responses, and load a response, its critique or the prompt that produced it.
|
|
26
|
+
- **Working** — follow Pi's thinking and tool use as it happens. **Follow activity** switches to it during a run and back to the response afterwards.
|
|
27
|
+
- **Rendering** — Markdown and LaTeX with math, syntax highlighting, Mermaid diagrams (with Lucide and Logos icons), CSV tables, interactive HTML and embedded PDFs, themed to match Pi.
|
|
28
|
+
- **Files and Changes** — browse folders you've allowed, open or preview files, and see the current git diff.
|
|
29
|
+
- **Comments and scratchpad** — comments anchored to lines or selections, and a scratchpad per document.
|
|
30
|
+
- **Side questions** — ask about the text, a folder or the repository in a separate thread that stays out of the main conversation, optionally with web search.
|
|
31
|
+
- **REPL** — send code to tmux-backed Shell, Python, IPython, Julia, R, GHCi or Clojure sessions, shared with [pi-repl](https://github.com/omaclaren/pi-repl).
|
|
32
|
+
- **Quiz me, Show me, completions** — active-recall quizzes over the text or a folder, one-turn visual explanations, and short completions at the cursor.
|
|
33
|
+
- **Export** — PDF (Pandoc and LaTeX) or standalone HTML, from the preview, a file or the last response.
|
|
34
|
+
- **Careful saving** — a save checks the file hasn't changed on disk since you opened it, and asks if it has.
|
|
35
|
+
- **Quarto** — preview a saved Quarto document through `quarto preview`, without running its code.
|
|
36
|
+
- **Layout** — side by side or stacked panes, and a Zen mode that hides everything but the text.
|
|
95
37
|
|
|
96
|
-
|
|
38
|
+
## Requirements
|
|
97
39
|
|
|
98
|
-
|
|
40
|
+
- [Pi](https://pi.dev)
|
|
41
|
+
- [Pandoc](https://pandoc.org/installing.html) for full previews and exports (`brew install pandoc` on macOS), and LaTeX (TeX Live or MacTeX) for PDF export
|
|
42
|
+
- Optional:
|
|
43
|
+
- `tmux` for the REPL;
|
|
44
|
+
- `quarto` for Quarto previews;
|
|
45
|
+
- Mermaid CLI 11.12+ for diagrams in exported PDFs;
|
|
46
|
+
- `pdftotext` so side questions can read PDFs;
|
|
47
|
+
- `BRAVE_API_KEY` for side-question web search.
|
|
99
48
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
## Commands
|
|
103
|
-
|
|
104
|
-
| Command | Description |
|
|
105
|
-
|---|---|
|
|
106
|
-
| `/studio` | Open in Muxy or cmux when available, otherwise the system browser, with the last assistant response (fallback: blank). In dual editor mode, if your last workspace's tab is gone, reopen that workspace instead |
|
|
107
|
-
| `/studio <path>` | Open a text file in the editor, or a PDF in a read-only companion preview tab |
|
|
108
|
-
| `/studio --watch <file>` | Open a local text/code file in a read-only preview that follows disk changes, or a PDF with stable-file auto-refresh enabled |
|
|
109
|
-
| `/studio --last` | Force last response |
|
|
110
|
-
| `/studio --blank` | Force blank editor |
|
|
111
|
-
| `/studio --no-browser` | Start/print the Studio URL without opening a browser, useful for forwarded or phone/browser sessions |
|
|
112
|
-
| `/studio --port <port>` | Bind Studio to a fixed port instead of a random free port; the default host remains localhost |
|
|
113
|
-
| `/studio --listen-all` | Explicitly bind Studio to all IPv4 interfaces (`0.0.0.0`) for a container or trusted private-network workflow |
|
|
114
|
-
| `/studio --status` | Show studio server status, including its listening address |
|
|
115
|
-
| `/studio --stop` | Stop studio server |
|
|
116
|
-
| `/studio --single` | Use single editor mode, and remember it; restarts Studio if it's running in dual editor mode |
|
|
117
|
-
| `/studio --dual` | Use dual editor mode (the default), and remember it |
|
|
118
|
-
| `/studio --help` | Show help |
|
|
119
|
-
| `/studio-replace [path\|--blank\|--last]` | Replace the current full Studio view with a new full Studio view; in dual editor mode, move the open Studio here |
|
|
120
|
-
| `/studio-editor-only [path\|--blank\|--last]` | Open an editor-only view, or a read-only PDF preview; add `--watch <file>` for a followed text/PDF companion view |
|
|
121
|
-
| `/studio-current <path>` | Load a file into currently open Studio tab(s) without opening a new browser window |
|
|
122
|
-
| `/studio-pdf [path] [options]` | Export a local file, or the last model response when no path is given, via the Studio PDF pipeline |
|
|
123
|
-
| `/studio-html [path]` | Export a local file, or the last model response when no path is given, to standalone HTML via the Studio preview pipeline |
|
|
124
|
-
|
|
125
|
-
## Agent tools
|
|
126
|
-
|
|
127
|
-
| Tool | Description |
|
|
128
|
-
|---|---|
|
|
129
|
-
| `studio_export_pdf` | Export direct Markdown/LaTeX, a local file, or the last model response to PDF. Defaults to writing a file without opening a viewer. |
|
|
130
|
-
| `studio_export_html` | Export direct Markdown/LaTeX, a local file, or the last model response to standalone HTML. Defaults to writing a file without opening a viewer. |
|
|
131
|
-
| `studio_repl_status` | Inspect tmux-backed REPL sessions, including shared clean-record identity, compatible-client entries, and raw-mirror details. |
|
|
132
|
-
| `studio_repl_send` | Send code to a visible REPL under the cross-client send lease, optionally choose its raw-pane `echoMode`, and add its captured output to the shared clean record. |
|
|
49
|
+
Studio is developed on macOS. It should work on Linux, which has had less testing.
|
|
133
50
|
|
|
134
51
|
## Install
|
|
135
52
|
|
|
136
53
|
```bash
|
|
137
|
-
# npm
|
|
138
54
|
pi install npm:pi-studio
|
|
139
|
-
|
|
140
|
-
# GitHub
|
|
141
|
-
pi install https://github.com/omaclaren/pi-studio
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Run once without installing:
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
pi -e https://github.com/omaclaren/pi-studio
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## Container and network access
|
|
151
|
-
|
|
152
|
-
Studio binds to `127.0.0.1` by default. For a container or sandbox whose port must be published to the host, opt in explicitly and choose a stable port:
|
|
153
|
-
|
|
154
|
-
```text
|
|
155
|
-
/studio --no-browser --listen-all --port 4321
|
|
156
55
|
```
|
|
157
56
|
|
|
158
|
-
|
|
57
|
+
Or from GitHub, `pi install https://github.com/omaclaren/pi-studio`, or once without installing, `pi -e https://github.com/omaclaren/pi-studio`.
|
|
159
58
|
|
|
160
|
-
|
|
59
|
+
## Usage
|
|
161
60
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
The browser choice is stored locally for that Studio origin. `studio_repl_send` accepts the same per-call `echoMode`; `PI_STUDIO_REPL_ECHO_MODE=off|summary|full` changes the tool-send startup default from Off. Display text escapes terminal, line-separator, and bidirectional control characters. The anchors improve raw-history alignment but do not make direct pane activity without instrumentation authoritative or alter protocol-v1 entries.
|
|
183
|
-
|
|
184
|
-
Runtime wrappers use compact request-unique paths such as `/tmp/pi-rc-<user-key>/<token>.py` rather than a long Studio/session directory tree. The per-user root is current-user-owned mode `0700`, source files are mode `0600`, and files are removed after capture or by the timeout/abort watcher once execution settles. This keeps the unavoidable echoed loader command short without reverting to a collision-prone shared filename.
|
|
185
|
-
|
|
186
|
-
See [`shared/REPL_SESSION_RECORD_PROTOCOL.md`](./shared/REPL_SESSION_RECORD_PROTOCOL.md) for protocol, safety, retention, and compatibility details.
|
|
61
|
+
| Command | Description |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `/studio` | Open Studio with the last response. In dual editor mode, reopen your last workspace if its tab is gone |
|
|
64
|
+
| `/studio <file>` | Open a text file, or a PDF in a read-only preview |
|
|
65
|
+
| `/studio --watch <file>` | Open a read-only preview that follows changes on disk |
|
|
66
|
+
| `/studio --blank`, `--last` | Start with a blank editor, or the last response |
|
|
67
|
+
| `/studio --single`, `--dual` | Switch editor mode, and remember it |
|
|
68
|
+
| `/studio --no-browser` | Print the URL without opening a browser |
|
|
69
|
+
| `/studio --port <port>` | Use a fixed port |
|
|
70
|
+
| `/studio --listen-all` | Listen on all interfaces, for containers ([see below](#network-and-ssh)) |
|
|
71
|
+
| `/studio --status`, `--stop` | Show the server's status, or stop it |
|
|
72
|
+
| `/studio-replace` | Replace the open Studio view. In dual editor mode, move it to a new tab here |
|
|
73
|
+
| `/studio-editor-only [file]` | Open an extra editor tab (single editor mode) |
|
|
74
|
+
| `/studio-current <file>` | Load a file into the open Studio tab (single editor mode) |
|
|
75
|
+
| `/studio-pdf [file]` | Export a file, or the last response, to PDF |
|
|
76
|
+
| `/studio-html [file]` | Export a file, or the last response, to HTML |
|
|
77
|
+
|
|
78
|
+
Studio opens in Muxy's or cmux's built-in browser when Pi runs there, and otherwise in the system browser. Press `?` in Studio for keyboard shortcuts.
|
|
79
|
+
|
|
80
|
+
Pi's agent can also use these tools:
|
|
187
81
|
|
|
188
|
-
|
|
82
|
+
| Tool | Description |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `studio_export_pdf`, `studio_export_html` | Export Markdown/LaTeX, a file or the last response |
|
|
85
|
+
| `studio_repl_status` | List REPL sessions |
|
|
86
|
+
| `studio_repl_send` | Send code to a REPL and record its output |
|
|
189
87
|
|
|
190
|
-
##
|
|
88
|
+
## Single and dual editor mode
|
|
191
89
|
|
|
192
|
-
|
|
90
|
+
**Dual editor mode** is the default. The left pane has a **Prompt**, which is what Run sends to Pi, and a **Document**, the file you're working on. Switch with the tabs or Cmd/Ctrl+Shift+1 and 2. Selecting the Document never changes what Run sends.
|
|
193
91
|
|
|
194
|
-
- **
|
|
195
|
-
-
|
|
196
|
-
-
|
|
197
|
-
-
|
|
198
|
-
-
|
|
199
|
-
- **Include the current main conversation snapshot** is opt-in. Side questions and answers otherwise never enter the main Pi history; **Bring to main conversation** is the explicit handoff.
|
|
200
|
-
- During an active thread, **Next thread settings** holds the next scope, thinking and tool choices separately. Follow-ups keep the captured context shown above it. The choices apply only after confirmed **New thread**; starting text is captured and folder access checked when you ask its first question. Cancel keeps the thread, follow-up draft and staged choices in this page. Remembered thinking, scope and tool preferences change only after New is accepted; a reload discards unapplied next-thread choices. Setup preferences before any thread retain their existing immediate persistence.
|
|
201
|
-
- **Thinking** defaults to **Low** for quick asides. **X-high** and **Max** appear when the active model advertises support, for complex side questions where the extra latency is worthwhile.
|
|
202
|
-
- Local context tools can map filenames, search readable text, and read selected ranges. Studio revalidates the allowed context root before prompts and built-in local tool calls; symlinks, root replacement, and traversal outside that root are rejected. PDF extraction uses `pdftotext`; DOCX, ODT, and EPUB extraction uses Pandoc.
|
|
203
|
-
- **Allow web search** is opt-in and appears when `BRAVE_API_KEY` is available to the Pi process. Model-chosen search queries are sent to Brave Search; the side agent is instructed not to copy private local passages into queries. Web answers cite result URLs and identify when they rely on search-result snippets rather than full page content.
|
|
204
|
-
- **Additional Pi tools** lists eligible tools already registered by the user's installed Pi extensions. Selection is explicit, remembered locally, and frozen when the thread starts. Studio reloads only the extensions owning the selected tools into the isolated side runtime and activates only those tool names; it does not import or depend on any particular third-party extension. Gateway tools are labelled and require an additional confirmation because selecting one may expose further services configured behind it.
|
|
92
|
+
- **Add to Prompt** copies the Document's selection, or all of it, into the Prompt as a labelled snapshot, with Undo.
|
|
93
|
+
- **File** opens a file in the Document, or in a new Document window. Each file has one editor; opening a file that's already open finds that editor.
|
|
94
|
+
- Unsaved Prompt and Document text survives reloads and dropped connections. If you close the tab, `/studio` reopens the same workspace, asking first if the tab didn't close cleanly. This isn't a backup: save work you want to keep.
|
|
95
|
+
- If Studio opened somewhere you can't find, such as another browser, `/studio-replace` moves it here, or open its URL and choose **Move it here**.
|
|
96
|
+
- `/studio-current`, editable `/studio-editor-only` and Office-to-Markdown conversion aren't available in dual editor mode.
|
|
205
97
|
|
|
206
|
-
|
|
98
|
+
**Single editor mode** is the one-editor Studio of earlier versions, where Run sends the editor's text.
|
|
207
99
|
|
|
208
|
-
|
|
100
|
+
To switch, use the footer button or `/studio --single` and `/studio --dual`. Studio restarts and reopens the tab, carrying over the Prompt's text, and the choice is kept for your Pi profile. The footer button waits, and says why, while there's unsaved text in the Document or a closed Document window, another Studio tab is open, or a run, save or side question is in progress. The commands work even if the page won't load; they disconnect open tabs, which keep their text, and ask before dropping anything only Studio's server holds.
|
|
209
101
|
|
|
210
|
-
|
|
102
|
+
## Details
|
|
211
103
|
|
|
212
|
-
|
|
104
|
+
### Local files
|
|
213
105
|
|
|
214
|
-
|
|
215
|
-

|
|
216
|
-
```
|
|
106
|
+
Studio reads files in the opened document's folder and in folders you allow from **Files**. A link or image elsewhere asks first, offering that file or its folder, for the rest of the session.
|
|
217
107
|
|
|
218
|
-
|
|
108
|
+
Embed a PDF in a Markdown preview with a `studio-pdf` block. `path` is relative to the document; the other fields are optional:
|
|
219
109
|
|
|
220
110
|
````md
|
|
221
111
|
```studio-pdf
|
|
222
112
|
path: attachments/paper.pdf
|
|
223
|
-
title:
|
|
113
|
+
title: A title
|
|
224
114
|
page: 3
|
|
225
115
|
height: 760
|
|
226
116
|
watch: true
|
|
227
|
-
caption: Optional caption
|
|
228
117
|
```
|
|
229
118
|
````
|
|
230
119
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
To view an existing PDF directly, run `/studio report.pdf` (or `/studio "path with spaces/report.pdf"`). The PDF opens read-only in a focused companion preview, even when the full Studio workspace is already open. A `#page=N` suffix selects the initial page. Auto-refresh is off by default; use `/studio --watch report.pdf` to start with it on, or toggle **Auto-refresh** in the PDF card or focused viewer. Studio checks only while the tab is visible and waits for two matching file-version observations before reloading, which avoids reading a PDF while LaTeX is still writing it. **Cmd/Ctrl+Option/Alt+Shift+R** manually refreshes the focused or visible PDF. This is distinct from `/studio-pdf`, which exports Markdown, LaTeX, code, or the last response to a new PDF.
|
|
234
|
-
|
|
235
|
-
For a disk-authoritative text or code preview, run `/studio --watch notes.md` or choose **Preview file (follow changes)** from a local-link menu / **Preview (follow)** in Files. This opens a transient read-only companion tab with the preview pane focused; leaving pane focus reveals the same disk-following text as **Source** with a visible **Read-only · follows disk** badge rather than as an editable buffer. Studio polls the canonical file, debounces change bursts, compares SHA-256 content revisions, accepts ordinary and atomic-replacement saves, and never writes back. Each watcher socket is bound to the exact path in a bounded, expiring server-created tab capability; if that identity expires before a reload or reconnect, the tab stays read-only and asks you to open a fresh watched preview. A missing, unreadable, oversized, binary, or path-replaced source leaves the last good preview visible and automatically recovers when the same canonical file becomes readable again. Render failures likewise retain the last successfully staged document rather than replacing it with partial output. On successful updates, Studio restores a nearby stable content anchor where possible and falls back to the previous scroll ratio.
|
|
120
|
+
To view a PDF, run `/studio report.pdf`; it opens read-only, and `#page=N` picks the page. `/studio --watch report.pdf` also reloads it when the file changes: Studio waits for two matching file-version observations, so it doesn't read a PDF that LaTeX is still writing. This is distinct from `/studio-pdf`, which exports to a new PDF.
|
|
236
121
|
|
|
237
122
|
### Mermaid icons
|
|
238
123
|
|
|
239
|
-
|
|
124
|
+
Diagrams can use `lucide:*` and `logos:*` icons; the icon packs load only when a diagram uses them.
|
|
240
125
|
|
|
241
126
|
````md
|
|
242
127
|
```mermaid
|
|
@@ -247,40 +132,42 @@ flowchart LR
|
|
|
247
132
|
```
|
|
248
133
|
````
|
|
249
134
|
|
|
250
|
-
|
|
135
|
+
Icons in exported PDFs need Mermaid CLI 11.12+ (`npm install -g @mermaid-js/mermaid-cli`, or set `MERMAID_CLI_PATH`).
|
|
251
136
|
|
|
252
|
-
|
|
137
|
+
### Pi's input editor
|
|
253
138
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
139
|
+
**Load from pi editor** (Cmd/Ctrl+Shift+L) copies the draft in Pi's terminal input into Studio, as tools like [pi-nvim-context](https://github.com/omaclaren/pi-nvim-context) build it up. When Studio runs that text, it clears the terminal draft only if the draft hasn't changed since.
|
|
140
|
+
|
|
141
|
+
### REPL
|
|
142
|
+
|
|
143
|
+
The REPL pane runs code in tmux sessions. It can start its own, and it shares a record of submissions and output with [pi-repl](https://github.com/omaclaren/pi-repl) when both use the same session. Pane echo (Off, Summary, Full) controls how much submitted code appears in the raw tmux history; Full writes your code into that history. The record format is in [`shared/REPL_SESSION_RECORD_PROTOCOL.md`](./shared/REPL_SESSION_RECORD_PROTOCOL.md).
|
|
144
|
+
|
|
145
|
+
### Side questions
|
|
146
|
+
|
|
147
|
+
**Review → Side question**, or Cmd/Ctrl+Option/Alt+Q, opens a separate thread. It starts from the selection, the section at the cursor or the whole text, and can read the document's folder, the repository or another folder you allow, including PDF, DOCX, ODT and EPUB text. Its tools are read-only. With `BRAVE_API_KEY` set, it can also search the web; queries go to Brave Search. Nothing enters the main conversation unless you choose **Bring to main conversation**.
|
|
148
|
+
|
|
149
|
+
### Network and SSH
|
|
150
|
+
|
|
151
|
+
Studio listens on `127.0.0.1` only, and every URL carries a token. Over SSH, forward the port and open the printed URL with its token; `/studio --no-browser --port <port>` gives a stable port to forward.
|
|
152
|
+
|
|
153
|
+
For a container, `/studio --no-browser --listen-all --port 4321` listens on all interfaces. Anyone with the full URL can control Studio, including running prompts and reading or writing files, and there's no TLS. Treat the URL like a password, never expose the port to the internet, and bind the host side to loopback (`-p 127.0.0.1:4321:4321`). Quarto previews use a second port, which must be forwarded too.
|
|
154
|
+
|
|
155
|
+
### Environment variables
|
|
156
|
+
|
|
157
|
+
| Variable | Effect |
|
|
158
|
+
|---|---|
|
|
159
|
+
| `PANDOC_PATH`, `PANDOC_PDF_ENGINE` | Pandoc binary, and the LaTeX engine for PDFs (default `xelatex`) |
|
|
160
|
+
| `MERMAID_CLI_PATH` | Mermaid CLI for diagrams in PDFs |
|
|
161
|
+
| `BRAVE_API_KEY` | Enables web search in side questions |
|
|
162
|
+
| `PI_STUDIO_FONT_MONO`, `PI_STUDIO_FONT_UI`, `PI_STUDIO_FONT_PROSE` | CSS font stacks for code, interface and previews |
|
|
163
|
+
| `PI_STUDIO_REPL_ECHO_MODE` | Default pane echo for `studio_repl_send`: `off`, `summary` or `full` |
|
|
164
|
+
| `PI_STUDIO_PANDOC_TIMEOUT_MS`, `PI_STUDIO_LATEX_TIMEOUT_MS`, `PI_STUDIO_MERMAID_TIMEOUT_MS` | Export time limits |
|
|
258
165
|
|
|
259
|
-
|
|
166
|
+
Installing pi-studio also adds `pi-studio-dark` and `pi-studio-light` to Pi's themes, without changing your current theme.
|
|
260
167
|
|
|
261
168
|
## Acknowledgements
|
|
262
169
|
|
|
263
|
-
Thanks to [Hal Gumbert / CampSoftware](https://github.com/campsoftware) for
|
|
264
|
-
|
|
265
|
-
## Notes
|
|
266
|
-
|
|
267
|
-
- The Studio server is localhost-only (`127.0.0.1`) by default and every Studio URL carries a server-lifetime token. The explicit `--listen-all` option changes the listening address to `0.0.0.0` without changing the advertised loopback URL or removing token authentication; `/studio --status` reports the active binding.
|
|
268
|
-
- When Pi runs inside Muxy or cmux, Studio opens in that terminal app’s built-in browser. Muxy is detected from its pane/socket environment without installing global hooks; cmux targets and focuses the caller’s workspace. If the detected terminal browser is unavailable, disabled, or declines the request, Studio falls back once to the system browser.
|
|
269
|
-
- For remote SSH sessions, keep Studio bound to localhost and use SSH local port forwarding; `/studio` and `/studio --status` print the full tokenized localhost URL. The SSH hint repeats the full URL so it is visible even if your terminal only shows the latest notification. Open that URL through the tunnel, preserving the `?token=...` parameter. If SSH is not auto-detected, use `/studio --no-browser`; for stable forwarding, use `/studio --port <port>` or combine them, e.g. `/studio --no-browser --port 3417`.
|
|
270
|
-
- Full Studio is a singleton per Pi session: use `/studio` to open it, `/studio-replace` to explicitly replace it, and `/studio-editor-only` for extra editing/preview tabs that do not take over the full Studio session view.
|
|
271
|
-
- Studio is designed as a complement to terminal pi, not a replacement.
|
|
272
|
-
- Installing pi-studio makes the optional `pi-studio-dark` and `pi-studio-light` themes available in pi's theme selector; it does not change your active theme.
|
|
273
|
-
- Editor/code font uses a best-effort terminal-monospace match when the current terminal config exposes it; set `PI_STUDIO_FONT_MONO` to force a specific CSS `font-family` stack. Use `PI_STUDIO_FONT_UI` or `PI_STUDIO_FONT_PROSE` to override the Studio UI or rendered-preview font stacks.
|
|
274
|
-
- The optional REPL view requires `tmux`. Studio can start and stop Studio-owned `pi-studio-repl-*` sessions and can mirror detected `pi-repl-*` sessions, but it will not stop external `pi-repl-*` sessions. Compatible clients synchronize their clean record automatically; direct pane interaction remains available only in the raw mirror. A send timeout or tool abort does not stop submitted runtime code, so Studio keeps that session's cross-client lease until the runtime completion signal appears or the exact tmux session ends. The visible request-specific completion anchor is separate presentation metadata and stays in raw history when pane echo is enabled.
|
|
275
|
-
- Side-question web search requires `BRAVE_API_KEY`; without it, local and conversation context still work, and the web option is shown as unavailable. Side sub-sessions are deliberately read-only and can run independently while the main Pi agent is busy.
|
|
276
|
-
- Full preview/PDF quality depends on `pandoc` (and `xelatex` for PDF):
|
|
277
|
-
- `brew install pandoc`
|
|
278
|
-
- install TeX Live/MacTeX for PDF export
|
|
279
|
-
- LaTeX browser previews and **Export right preview** are semantic Pandoc conversions rather than authoritative compilation of the original source layout. If a local legacy `.sty` package overrides LaTeX document startup in a way that prevents Pandoc from reading the document, Studio omits that package from the conversion only, preserves local includes, and shows a warning; compile the original source directly with LaTeX for exact package-specific layout.
|
|
280
|
-
- **Editor (Quarto Preview)** is optional and requires the `quarto` CLI on Studio's `PATH`. It supports saved `.qmd`, `.md`, and `.markdown` files, whether standalone or part of a Quarto project. Selecting the view only inspects the saved document; starting the preview is explicit. Studio passes `--no-execute`, which prevents computational cells from running, but trusted Quarto project extensions, filters, configuration, and render hooks are still processed, and Quarto may create or update its normal rendered output files. The preview reflects disk, not unsaved editor text.
|
|
281
|
-
- Quarto serves its embedded page on a second random loopback port. When Studio itself is reached through SSH port forwarding, that Quarto port (shown in **Show log**) must also be forwarded, or the preview should be opened from a Studio process running on the browser's machine.
|
|
282
|
-
- Export subprocess timeouts default to bounded values and can be tuned with `PI_STUDIO_PANDOC_TIMEOUT_MS`, `PI_STUDIO_LATEX_TIMEOUT_MS`, `PI_STUDIO_MERMAID_TIMEOUT_MS`, and `PI_STUDIO_HTML_RENDER_OUTPUT_MAX_BYTES` for unusually large embedded-asset HTML exports.
|
|
283
|
-
- Mermaid diagrams in exported PDFs require Mermaid CLI (`mmdc` / `@mermaid-js/mermaid-cli`) when you want diagram blocks rendered as diagrams rather than left as code; PDF icon nodes require Mermaid CLI 11.12+.
|
|
170
|
+
Thanks to [Hal Gumbert / CampSoftware](https://github.com/campsoftware) for [Pi Studio Activity](https://campsoftware.com/blog/post.php?post=20260507-ai-ollama-pi-studio-activity), which inspired **Follow activity** and the stacked layouts.
|
|
284
171
|
|
|
285
172
|
## License
|
|
286
173
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/client/studio-client.js
CHANGED
|
@@ -920,6 +920,9 @@
|
|
|
920
920
|
const seconds = Math.max(0, Math.floor((Date.now() - run.startedAt) / 1000));
|
|
921
921
|
return "Running " + Math.floor(seconds / 60) + ":" + String(seconds % 60).padStart(2, "0");
|
|
922
922
|
}
|
|
923
|
+
// Oliver, 14 Oct: a Run waiting for Pi to start says so briefly here, so Queue steering fits
|
|
924
|
+
// beside it and the toolbar doesn't wrap and jump back. The footer keeps the detail.
|
|
925
|
+
if (uiBusy && pendingKind === "direct") return "Starting…";
|
|
923
926
|
return uiBusy ? getStudioBusyStatus(pendingKind) : "";
|
|
924
927
|
}
|
|
925
928
|
|
|
@@ -936,6 +939,7 @@
|
|
|
936
939
|
ui.headerStop.hidden = isEditorOnlyMode || !rightFocused || (!activeKind && !stopping && !ownedRun);
|
|
937
940
|
ui.headerStop.textContent = stopping ? "Stopping…" : "Stop";
|
|
938
941
|
ui.headerStop.disabled = Boolean(stopping) || !activeKind;
|
|
942
|
+
if (run && sendRunBtn) sendRunBtn.classList.toggle("request-pending", false);
|
|
939
943
|
if (run && !isEditorOnlyMode && sendRunBtn) {
|
|
940
944
|
const owned = run.origin === "studio" && Boolean(run.requestId && run.kind);
|
|
941
945
|
if (owned) {
|
|
@@ -27685,6 +27689,9 @@
|
|
|
27685
27689
|
// The new-layout Document has the Prompt tab just above, so no Return to Prompt here (Oliver, 10 Oct).
|
|
27686
27690
|
sendRunBtn.hidden = workspaceLayout && documentView && !directIsStop;
|
|
27687
27691
|
sendRunBtn.classList.toggle("request-stop-active", directIsStop);
|
|
27692
|
+
// Between the click and Stop the button keeps its look, dimmed, instead of flashing empty.
|
|
27693
|
+
sendRunBtn.classList.toggle("request-pending", !directIsStop && !documentView && uiBusy && pendingKind === "direct" && !studioRuntimeActivity?.run
|
|
27694
|
+
&& wsState !== "Disconnected" && wsState !== "Connecting");
|
|
27688
27695
|
sendRunBtn.classList.toggle("repl-secondary-action", rightView === "repl" && !directIsStop && !workspaceLayout);
|
|
27689
27696
|
sendRunBtn.disabled = documentView && !directIsStop ? !studioBuffersCanSwitch(true)
|
|
27690
27697
|
: wsState === "Disconnected" || (!directIsStop && (uiBusy || critiqueIsStop || !promptReady));
|
package/client/studio.css
CHANGED
|
@@ -294,6 +294,17 @@
|
|
|
294
294
|
filter: brightness(0.95);
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
+
/* Oliver, 14 Oct: from the click until Stop, Run keeps its shape and colour, dimmed, and
|
|
298
|
+
can't be clicked, so it doesn't flash empty while Pi starts. */
|
|
299
|
+
#sendRunBtn.request-pending:disabled:not(.repl-secondary-action) {
|
|
300
|
+
background: var(--accent);
|
|
301
|
+
border-color: var(--accent);
|
|
302
|
+
color: var(--accent-contrast);
|
|
303
|
+
font-weight: 600;
|
|
304
|
+
opacity: 0.7;
|
|
305
|
+
cursor: progress;
|
|
306
|
+
}
|
|
307
|
+
|
|
297
308
|
#sendRunBtn.request-stop-active,
|
|
298
309
|
#critiqueBtn.request-stop-active,
|
|
299
310
|
#showMeBtn.request-stop-active {
|
|
@@ -7528,7 +7539,8 @@
|
|
|
7528
7539
|
/* Honor existing handler eligibility after controls are regrouped. */
|
|
7529
7540
|
body.studio-ui-refresh [hidden] { display: none !important; }
|
|
7530
7541
|
/* Dogfood workspace: two logical rows, with normal wrapping in small panes. */
|
|
7531
|
-
|
|
7542
|
+
/* Room for "Running 00:00" from the start, so nothing moves when "Starting…" becomes the clock (Oliver, 14 Oct). */
|
|
7543
|
+
.studio-run-status { color: var(--muted); font-size: 12px; min-width: 13ch; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
7532
7544
|
body.studio-ui-refresh #rightSectionHeader .studio-follow-button {
|
|
7533
7545
|
color: var(--muted); border: 0; border-radius: 0; background: transparent;
|
|
7534
7546
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-studio",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Two-pane browser workspace for pi with prompt/response editing, annotations, critiques, active quiz, prompt/response history, live previews, and tmux-backed REPL/literate REPL workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|