@oh-my-pi/pi-coding-agent 12.15.0 → 12.15.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 CHANGED
@@ -2,10 +2,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [12.15.1] - 2026-02-20
5
6
 
6
7
  ### Changed
7
8
 
8
- - Updated browser tool prompt to bias towards `observe` over `screenshot` by default
9
+ - Replaced nerd font pie-chart spinner with clock-outline icons for smoother looping
10
+ - Moved status icon to front of code-cell headers in formatHeader
11
+
12
+ ### Fixed
13
+
14
+ - Fixed ReadToolGroupComponent to show status icon before title instead of trailing
15
+ - Fixed bash-interactive status badge to dim only bracket characters, not the enclosed text
9
16
 
10
17
  ## [12.15.0] - 2026-02-20
11
18
 
@@ -16,6 +23,7 @@
16
23
 
17
24
  ### Changed
18
25
 
26
+ - Updated browser tool prompt to bias towards `observe` over `screenshot` by default
19
27
  - Changed auth credential removal to use soft-delete (disable) instead of hard-delete when OAuth refresh fails, keeping credentials in database for audit purposes
20
28
  - Changed default value of `tools.intentTracing` setting from false to true
21
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-coding-agent",
3
- "version": "12.15.0",
3
+ "version": "12.15.1",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "bin": {
@@ -85,12 +85,12 @@
85
85
  },
86
86
  "dependencies": {
87
87
  "@mozilla/readability": "0.6.0",
88
- "@oh-my-pi/omp-stats": "12.15.0",
89
- "@oh-my-pi/pi-agent-core": "12.15.0",
90
- "@oh-my-pi/pi-ai": "12.15.0",
91
- "@oh-my-pi/pi-natives": "12.15.0",
92
- "@oh-my-pi/pi-tui": "12.15.0",
93
- "@oh-my-pi/pi-utils": "12.15.0",
88
+ "@oh-my-pi/omp-stats": "12.15.1",
89
+ "@oh-my-pi/pi-agent-core": "12.15.1",
90
+ "@oh-my-pi/pi-ai": "12.15.1",
91
+ "@oh-my-pi/pi-natives": "12.15.1",
92
+ "@oh-my-pi/pi-tui": "12.15.1",
93
+ "@oh-my-pi/pi-utils": "12.15.1",
94
94
  "@sinclair/typebox": "^0.34.48",
95
95
  "@xterm/headless": "^6.0.0",
96
96
  "ajv": "^8.18.0",
@@ -84,9 +84,7 @@ export class ReadToolGroupComponent extends Container implements ToolExecutionHa
84
84
  const entry = entries[0];
85
85
  const statusSymbol = this.#formatStatus(entry.status);
86
86
  const pathDisplay = this.#formatPath(entry);
87
- this.#text.setText(
88
- ` ${theme.format.bullet} ${theme.fg("toolTitle", theme.bold("Read"))} ${pathDisplay} ${statusSymbol}`.trimEnd(),
89
- );
87
+ this.#text.setText(` ${statusSymbol} ${theme.fg("toolTitle", theme.bold("Read"))} ${pathDisplay}`.trimEnd());
90
88
  return;
91
89
  }
92
90
 
@@ -765,7 +765,7 @@ const SPINNER_FRAMES: Record<SymbolPreset, Record<SpinnerType, string[]>> = {
765
765
  activity: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
766
766
  },
767
767
  nerd: {
768
- status: ["󰪥", "󰪤", "󰪣", "󰪢", "󰪡", "󰪠", "󰪟", "󰪞", "󰪥"],
768
+ status: ["󱑖", "󱑋", "󱑌", "󱑍", "󱑎", "󱑏", "󱑐", "󱑑", "󱑒", "󱑓", "󱑔", "󱑕"],
769
769
  activity: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
770
770
  },
771
771
  ascii: {
@@ -288,9 +288,7 @@ User works in a high-reliability industry—defense, finance, healthcare, infras
288
288
 
289
289
  <critical>
290
290
  - Every turn must advance the deliverable. A non-final turn without at least one side-effect is invalid.
291
- - Quote only what's needed; rest is noise.
292
- - Don't claim unverified correctness.
291
+ - Default to action. Never ask for confirmation to continue work. If you hit an error, fix it. If you know the next step, take it. The user will intervene if needed.
293
292
  - Do not ask when it may be obtained from available tools or repo context/files.
294
- - Touch only requested; no incidental refactors/cleanup.
295
- {{#has tools "ask"}}- If files differ from expectations: ask before discarding uncommitted work.{{/has}}
293
+ - Verify the effect. When a task involves a behavioral change, confirm the change is observable before yielding: run the specific test, command, or scenario that covers your change.
296
294
  </critical>
@@ -14,7 +14,7 @@ import xterm from "@xterm/headless";
14
14
  import type { Theme } from "../modes/theme/theme";
15
15
  import { OutputSink, type OutputSummary } from "../session/streaming-output";
16
16
  import { getStateIcon } from "../tui";
17
- import { replaceTabs, wrapBrackets } from "./render-utils";
17
+ import { replaceTabs } from "./render-utils";
18
18
 
19
19
  export interface BashInteractiveResult extends OutputSummary {
20
20
  exitCode: number | undefined;
@@ -240,7 +240,7 @@ class BashInteractiveOverlayComponent implements Component {
240
240
  ? getStateIcon("success", this.uiTheme)
241
241
  : getStateIcon("warning", this.uiTheme);
242
242
  const title = this.uiTheme.fg("accent", "Console");
243
- const statusBadge = this.uiTheme.fg("dim", wrapBrackets(this.#stateText(), this.uiTheme));
243
+ const statusBadge = `${this.uiTheme.fg("dim", this.uiTheme.format.bracketLeft)}${this.#stateText()}${this.uiTheme.fg("dim", this.uiTheme.format.bracketRight)}`;
244
244
  const prefix = `${statusIcon} ${title} `;
245
245
  const suffix = ` ${statusBadge}`;
246
246
  const available = Math.max(1, innerWidth - visibleWidth(prefix) - visibleWidth(suffix));
@@ -34,18 +34,6 @@ function getState(status?: CodeCellOptions["status"]): State | undefined {
34
34
  function formatHeader(options: CodeCellOptions, theme: Theme): { title: string; meta?: string } {
35
35
  const { index, total, title, status, spinnerFrame, duration } = options;
36
36
  const parts: string[] = [];
37
- if (index !== undefined && total !== undefined) {
38
- parts.push(theme.fg("accent", `[${index + 1}/${total}]`));
39
- }
40
- if (title) {
41
- parts.push(theme.fg("toolTitle", title));
42
- }
43
- const headerTitle = parts.length > 0 ? parts.join(" ") : theme.fg("toolTitle", "Code");
44
-
45
- const metaParts: string[] = [];
46
- if (duration !== undefined) {
47
- metaParts.push(theme.fg("dim", `(${formatDuration(duration)})`));
48
- }
49
37
  if (status) {
50
38
  const icon = getStateIcon(
51
39
  status === "complete"
@@ -59,12 +47,23 @@ function formatHeader(options: CodeCellOptions, theme: Theme): { title: string;
59
47
  spinnerFrame,
60
48
  );
61
49
  if (status === "pending" || status === "running") {
62
- metaParts.push(`${icon} ${theme.fg("muted", status)}`);
50
+ parts.push(`${icon} ${theme.fg("muted", status)}`);
63
51
  } else {
64
- metaParts.push(icon);
52
+ parts.push(icon);
65
53
  }
66
54
  }
55
+ if (index !== undefined && total !== undefined) {
56
+ parts.push(theme.fg("accent", `[${index + 1}/${total}]`));
57
+ }
58
+ if (title) {
59
+ parts.push(theme.fg("toolTitle", title));
60
+ }
61
+ const headerTitle = parts.length > 0 ? parts.join(" ") : theme.fg("toolTitle", "Code");
67
62
 
63
+ const metaParts: string[] = [];
64
+ if (duration !== undefined) {
65
+ metaParts.push(theme.fg("dim", `(${formatDuration(duration)})`));
66
+ }
68
67
  if (metaParts.length === 0) return { title: headerTitle };
69
68
  return { title: headerTitle, meta: metaParts.join(theme.fg("dim", theme.sep.dot)) };
70
69
  }