@oh-my-pi/pi-coding-agent 15.10.6 → 15.10.7

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,6 +2,13 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [15.10.7] - 2026-06-08
6
+
7
+ ### Fixed
8
+
9
+ - Fixed MCP OAuth fallback rendering to show a short terminal hyperlink and keep the raw authorization URL on one unwrapped copy line ([#2121](https://github.com/can1357/oh-my-pi/issues/2121)).
10
+ - Fixed `omp` startup blocking 25–30 s on a single unresponsive MCP server when no cached tools were available for it. `MCPManager.connectServers` used to fall through to an unbounded `Promise.allSettled` over every still-pending server without a cached tool list, so one server stuck waiting on the per-request MCP timeout (`OMP_MCP_TIMEOUT_MS`, default 30 000 ms) gated the entire UI ready signal. Pending-without-cache servers are now left in flight: their tools surface via the existing background `#onToolsChanged` → `refreshMCPTools` path the moment the connect completes, and failures continue to log through the background catch handler ([#2100](https://github.com/can1357/oh-my-pi/issues/2100)).
11
+
5
12
  ## [15.10.6] - 2026-06-08
6
13
 
7
14
  ### Added
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-coding-agent",
4
- "version": "15.10.6",
4
+ "version": "15.10.7",
5
5
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://omp.sh",
7
7
  "author": "Can Boluk",
@@ -47,14 +47,14 @@
47
47
  "@agentclientprotocol/sdk": "0.22.1",
48
48
  "@babel/parser": "^7.29.7",
49
49
  "@mozilla/readability": "^0.6.0",
50
- "@oh-my-pi/hashline": "15.10.6",
51
- "@oh-my-pi/omp-stats": "15.10.6",
52
- "@oh-my-pi/pi-agent-core": "15.10.6",
53
- "@oh-my-pi/pi-ai": "15.10.6",
54
- "@oh-my-pi/pi-mnemopi": "15.10.6",
55
- "@oh-my-pi/pi-natives": "15.10.6",
56
- "@oh-my-pi/pi-tui": "15.10.6",
57
- "@oh-my-pi/pi-utils": "15.10.6",
50
+ "@oh-my-pi/hashline": "15.10.7",
51
+ "@oh-my-pi/omp-stats": "15.10.7",
52
+ "@oh-my-pi/pi-agent-core": "15.10.7",
53
+ "@oh-my-pi/pi-ai": "15.10.7",
54
+ "@oh-my-pi/pi-mnemopi": "15.10.7",
55
+ "@oh-my-pi/pi-natives": "15.10.7",
56
+ "@oh-my-pi/pi-tui": "15.10.7",
57
+ "@oh-my-pi/pi-utils": "15.10.7",
58
58
  "@opentelemetry/api": "^1.9.1",
59
59
  "@opentelemetry/context-async-hooks": "^2.7.1",
60
60
  "@opentelemetry/exporter-trace-otlp-proto": "^0.218.0",
@@ -472,24 +472,25 @@ export class MCPManager {
472
472
  const cachedTools = new Map<string, MCPToolDefinition[]>();
473
473
  const pendingTasks = connectionTasks.filter(task => task.tracked.status === "pending");
474
474
 
475
- if (pendingTasks.length > 0) {
476
- if (this.toolCache) {
477
- await Promise.all(
478
- pendingTasks.map(async task => {
479
- const cached = await this.toolCache?.get(task.name, task.config);
480
- if (cached) {
481
- cachedTools.set(task.name, cached);
482
- }
483
- }),
484
- );
485
- }
486
-
487
- const pendingWithoutCache = pendingTasks.filter(task => !cachedTools.has(task.name));
488
- if (pendingWithoutCache.length > 0) {
489
- await Promise.allSettled(pendingWithoutCache.map(task => task.tracked.promise));
490
- }
475
+ if (pendingTasks.length > 0 && this.toolCache) {
476
+ await Promise.all(
477
+ pendingTasks.map(async task => {
478
+ const cached = await this.toolCache?.get(task.name, task.config);
479
+ if (cached) {
480
+ cachedTools.set(task.name, cached);
481
+ }
482
+ }),
483
+ );
491
484
  }
492
485
 
486
+ // Pending tasks without cached tools used to be awaited synchronously here,
487
+ // which gated the entire UI on the slowest server's per-request timeout
488
+ // (issue #2100: a single unresponsive MCP server blocked startup for the
489
+ // full 30 s `OMP_MCP_TIMEOUT_MS`). Leave them in flight — the background
490
+ // `void toolsPromise.then(...)` chain above registers their tools and
491
+ // fires `#onToolsChanged` once the connect finishes, or logs the failure
492
+ // after `allowBackgroundLogging` flips below.
493
+
493
494
  for (const task of connectionTasks) {
494
495
  const { name } = task;
495
496
  if (task.tracked.status === "fulfilled") {
@@ -79,7 +79,6 @@ For `.sqlite`, `.sqlite3`, `.db`, `.db3`:
79
79
  <critical>
80
80
  - You MUST use `read` for every file, directory, archive, and URL inspection. `cat`, `head`, `tail`, `less`, `more`, `ls`, `tar`, `unzip`, `curl`, `wget` are FORBIDDEN — any such bash call is a bug, regardless of how short or convenient it looks.
81
81
  - You MUST prefer `read` over a browser/puppeteer tool for URL content; only reach for a browser when `read` cannot deliver reasonable content.
82
- - You MUST always include `path`. NEVER call `read` with `{}`.
83
82
  - For line ranges, append the selector to `path` (`path="src/foo.ts:50-200"`, `path="src/foo.ts:50+150"`). NEVER substitute `sed -n`, `awk NR`, or `head`/`tail` pipelines.
84
83
  - Summary footer says `read <path>:raw …`? Re-issue the exact selector it names. NEVER guess what's inside `..` / `…` markers — they carry no content.
85
84
  - You MAY combine selectors with URL reads and internal URIs; both paginate the cached resolved output.