@pi-unipi/unipi 3.0.0-alpha.36 → 3.0.0-alpha.38

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +9 -0
  3. package/package.json +25 -23
  4. package/packages/app-bridge/package.json +2 -2
  5. package/packages/ask-user/package.json +4 -2
  6. package/packages/autocomplete/package.json +1 -1
  7. package/packages/background-tasks/package.json +2 -2
  8. package/packages/btw/package.json +2 -2
  9. package/packages/compactor/package.json +3 -3
  10. package/packages/core/package.json +1 -1
  11. package/packages/core/src/hints/index.ts +2 -1
  12. package/packages/dream/package.json +2 -2
  13. package/packages/dream/src/runs.ts +27 -1
  14. package/packages/footer/package.json +3 -3
  15. package/packages/fusion/package.json +4 -4
  16. package/packages/info-screen/package.json +2 -2
  17. package/packages/input-shortcuts/package.json +2 -2
  18. package/packages/kanboard/package.json +7 -7
  19. package/packages/long-horizon/package.json +4 -2
  20. package/packages/long-horizon/src/progress-chart.ts +348 -0
  21. package/packages/long-horizon/src/progress-mermaid.ts +105 -0
  22. package/packages/long-horizon/src/progress-view.ts +31 -4
  23. package/packages/long-horizon/src/visualize.ts +68 -3
  24. package/packages/mcp/package.json +2 -2
  25. package/packages/memory/package.json +4 -3
  26. package/packages/notify/package.json +2 -2
  27. package/packages/skill-registry/package.json +2 -2
  28. package/packages/subagents/package.json +3 -3
  29. package/packages/unipi/bundled.js +1097 -539
  30. package/packages/updater/package.json +2 -2
  31. package/packages/updater/src/channel.ts +87 -0
  32. package/packages/updater/src/checker.ts +56 -31
  33. package/packages/updater/src/index.ts +2 -1
  34. package/packages/updater/src/installer.ts +10 -5
  35. package/packages/updater/src/remote-changelog.ts +19 -6
  36. package/packages/updater/src/tui/changelog-overlay.ts +4 -8
  37. package/packages/updater/src/tui/update-overlay.ts +1 -1
  38. package/packages/updater/types.ts +4 -0
  39. package/packages/utility/package.json +2 -2
  40. package/packages/utility/src/diagnostics/engine.ts +56 -0
  41. package/packages/watchdog/package.json +3 -3
  42. package/packages/web-api/package.json +2 -2
  43. package/packages/web-api/src/engine/dependencies.ts +116 -9
  44. package/packages/web-api/src/engine/extract.ts +4 -4
  45. package/packages/web-api/src/index.ts +2 -2
  46. package/packages/workflow/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -6,6 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [3.0.0-alpha.38] — 2026-10-11
10
+
11
+ ### Fixed
12
+ - Dream: "Run now" (`/unipi:dream run`) failed instantly. The published `memory` and `ask-user` packages were missing files, so Dream's background run could not load. Both packages now ship complete, and a failed Dream run shows the actual error.
13
+ - Release check added: a package is not released if one of its files imports a file the package does not ship.
14
+
15
+ ## [3.0.0-alpha.37] — 2026-10-11
16
+
17
+ ### Added
18
+ - `/unipi:visualize-progress`: **chart mode.** In terminals that show images (Kitty graphics), the run's steps or swarm are drawn as the same chart the UniPi app shows, above the log, and redrawn live as the run moves. Press `m` to switch between chart and text. Other terminals keep the text view, and the footer says why the chart is off. (UNI-258)
19
+ - `/unipi:doctor` reports whether the Microsoft Visual C++ runtime that web reads need on Windows is installed. (UNI-261)
20
+
21
+ ### Fixed
22
+ - Windows: a missing Visual C++ runtime no longer stops UniPi from loading. Web reads fall back to plain fetch; the README says how to install the runtime. (UNI-261)
23
+ - The updater stays on the release channel you installed from. An alpha install checks for newer alphas, never offers an older version (such as the stable 2.x), installs from the same channel, and shows that channel's changelog. (UNI-262)
24
+
9
25
  ## [3.0.0-alpha.36] — 2026-10-11
10
26
 
11
27
  ### Added
package/README.md CHANGED
@@ -41,6 +41,15 @@ UniPi needs [Pi](https://www.npmjs.com/package/@earendil-works/pi-coding-agent)
41
41
  `0.87.1` or later. This command installs 21 extension packages. Each package
42
42
  also works alone.
43
43
 
44
+ > [!TIP]
45
+ > **Windows:** web reads use a native module that needs the Microsoft Visual
46
+ > C++ 2015-2022 runtime. Most Windows installs have it; slimmed images such as
47
+ > tiny11 do not. Without it UniPi still loads and web reads fall back to plain
48
+ > fetch. To install it, run
49
+ > `winget install Microsoft.VCRedist.2015+.x64` or download
50
+ > [vc_redist.x64.exe](https://aka.ms/vs/17/release/vc_redist.x64.exe).
51
+ > `/unipi:doctor` reports whether it is missing.
52
+
44
53
  <p align="center">
45
54
  <img src="docs/assets/screenshots/simple-memory-glance.png" alt="A UniPi session in simple mode with memory recall, memory save and the glance footer">
46
55
  </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/unipi",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "All-in-one extension suite for Pi coding agent",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -80,28 +80,30 @@
80
80
  "typebox": "^1.1.38"
81
81
  },
82
82
  "dependencies": {
83
- "@pi-unipi/app-bridge": "3.0.0-alpha.36",
84
- "@pi-unipi/ask-user": "3.0.0-alpha.36",
85
- "@pi-unipi/background-tasks": "3.0.0-alpha.36",
86
- "@pi-unipi/btw": "3.0.0-alpha.36",
87
- "@pi-unipi/command-enchantment": "3.0.0-alpha.36",
88
- "@pi-unipi/compactor": "3.0.0-alpha.36",
89
- "@pi-unipi/core": "3.0.0-alpha.36",
90
- "@pi-unipi/dream": "3.0.0-alpha.36",
91
- "@pi-unipi/footer": "3.0.0-alpha.36",
92
- "@pi-unipi/fusion": "3.0.0-alpha.36",
93
- "@pi-unipi/info-screen": "3.0.0-alpha.36",
94
- "@pi-unipi/input-shortcuts": "3.0.0-alpha.36",
95
- "@pi-unipi/kanboard": "3.0.0-alpha.36",
96
- "@pi-unipi/mcp": "3.0.0-alpha.36",
97
- "@pi-unipi/memory": "3.0.0-alpha.36",
98
- "@pi-unipi/notify": "3.0.0-alpha.36",
99
- "@pi-unipi/skill-registry": "3.0.0-alpha.36",
100
- "@pi-unipi/subagents": "3.0.0-alpha.36",
101
- "@pi-unipi/updater": "3.0.0-alpha.36",
102
- "@pi-unipi/utility": "3.0.0-alpha.36",
103
- "@pi-unipi/web-api": "3.0.0-alpha.36",
104
- "@pi-unipi/workflow": "3.0.0-alpha.36"
83
+ "@pi-unipi/app-bridge": "3.0.0-alpha.38",
84
+ "@pi-unipi/ask-user": "3.0.0-alpha.38",
85
+ "@pi-unipi/background-tasks": "3.0.0-alpha.38",
86
+ "@pi-unipi/btw": "3.0.0-alpha.38",
87
+ "@pi-unipi/command-enchantment": "3.0.0-alpha.38",
88
+ "@pi-unipi/compactor": "3.0.0-alpha.38",
89
+ "@pi-unipi/core": "3.0.0-alpha.38",
90
+ "@pi-unipi/dream": "3.0.0-alpha.38",
91
+ "@pi-unipi/footer": "3.0.0-alpha.38",
92
+ "@pi-unipi/fusion": "3.0.0-alpha.38",
93
+ "@pi-unipi/info-screen": "3.0.0-alpha.38",
94
+ "@pi-unipi/input-shortcuts": "3.0.0-alpha.38",
95
+ "@pi-unipi/kanboard": "3.0.0-alpha.38",
96
+ "@pi-unipi/mcp": "3.0.0-alpha.38",
97
+ "@pi-unipi/memory": "3.0.0-alpha.38",
98
+ "@pi-unipi/notify": "3.0.0-alpha.38",
99
+ "@pi-unipi/skill-registry": "3.0.0-alpha.38",
100
+ "@pi-unipi/subagents": "3.0.0-alpha.38",
101
+ "@pi-unipi/updater": "3.0.0-alpha.38",
102
+ "@pi-unipi/utility": "3.0.0-alpha.38",
103
+ "@pi-unipi/web-api": "3.0.0-alpha.38",
104
+ "@pi-unipi/workflow": "3.0.0-alpha.38",
105
+ "@resvg/resvg-wasm": "^2.6.2",
106
+ "beautiful-mermaid": "^1.1.3"
105
107
  },
106
108
  "devDependencies": {
107
109
  "@earendil-works/pi-agent-core": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/app-bridge",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Live bridge between a pi TUI session and the UniPi phone app — streaming chat, prompts, steering and dialogs from the phone",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -31,7 +31,7 @@
31
31
  "access": "public"
32
32
  },
33
33
  "dependencies": {
34
- "@pi-unipi/core": "3.0.0-alpha.36"
34
+ "@pi-unipi/core": "3.0.0-alpha.38"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@earendil-works/pi-coding-agent": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/ask-user",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Structured user input tool for Pi coding agent — single-select, multi-select, freeform",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -21,6 +21,8 @@
21
21
  "user-input"
22
22
  ],
23
23
  "files": [
24
+ "clipboard.ts",
25
+ "questions.ts",
24
26
  "index.ts",
25
27
  "types.ts",
26
28
  "tools.ts",
@@ -40,7 +42,7 @@
40
42
  "access": "public"
41
43
  },
42
44
  "dependencies": {
43
- "@pi-unipi/core": "3.0.0-alpha.36"
45
+ "@pi-unipi/core": "3.0.0-alpha.38"
44
46
  },
45
47
  "peerDependencies": {
46
48
  "@earendil-works/pi-coding-agent": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/command-enchantment",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Enhanced TUI autocomplete for /unipi:* commands — colored, sorted, and grouped by package",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/background-tasks",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Background tasks for UniPi — durable shell jobs and delegated background agents with a footer dock",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@earendil-works/pi-ai": "^0.87.1",
13
- "@pi-unipi/core": "3.0.0-alpha.36",
13
+ "@pi-unipi/core": "3.0.0-alpha.38",
14
14
  "turndown": "^7.2.4"
15
15
  },
16
16
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/btw",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "A pi extension for parallel side conversations with /unipi:btw — part of the Unipi suite",
5
5
  "type": "module",
6
6
  "main": "extensions/btw.ts",
@@ -37,7 +37,7 @@
37
37
  "@earendil-works/pi-tui": "^0.87.1"
38
38
  },
39
39
  "dependencies": {
40
- "@pi-unipi/core": "3.0.0-alpha.36"
40
+ "@pi-unipi/core": "3.0.0-alpha.38"
41
41
  },
42
42
  "pi": {
43
43
  "extensions": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/compactor",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Compaction for Pi — lossless zero-LLM or model summaries, rebuilt from full history, with session recall",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -33,8 +33,8 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@pi-unipi/core": "3.0.0-alpha.36",
37
- "@pi-unipi/info-screen": "3.0.0-alpha.36",
36
+ "@pi-unipi/core": "3.0.0-alpha.38",
37
+ "@pi-unipi/info-screen": "3.0.0-alpha.38",
38
38
  "@earendil-works/pi-agent-core": "^0.87.1"
39
39
  },
40
40
  "peerDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/core",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Shared utilities, event types, and constants for Unipi extension suite",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -12,6 +12,7 @@
12
12
  * - Settings: namespace "hints" (enabled, header, crab, reset)
13
13
  */
14
14
 
15
+ import { fileURLToPath } from "node:url";
15
16
  import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
16
17
  import {
17
18
  encodeKitty,
@@ -617,7 +618,7 @@ export function installHints(pi: ExtensionAPI): void {
617
618
  try {
618
619
  const v = getInstalledPackageVersion(cwd, "@pi-unipi/unipi");
619
620
  if (v !== "0.0.0") return v;
620
- const thisDir = new URL(".", import.meta.url).pathname;
621
+ const thisDir = fileURLToPath(new URL(".", import.meta.url));
621
622
  return getInstalledPackageVersion(thisDir, "@pi-unipi/unipi");
622
623
  } catch {
623
624
  return "0.0.0";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/dream",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "A pi extension that dreams: reviews past session struggles in the background, turns repeated false paths into memory lessons, and crafts skills from errors — part of the Unipi suite",
5
5
  "type": "module",
6
6
  "main": "extensions/dream.ts",
@@ -39,7 +39,7 @@
39
39
  "@earendil-works/pi-tui": "^0.87.1"
40
40
  },
41
41
  "dependencies": {
42
- "@pi-unipi/core": "3.0.0-alpha.36"
42
+ "@pi-unipi/core": "3.0.0-alpha.38"
43
43
  },
44
44
  "pi": {
45
45
  "extensions": [
@@ -127,7 +127,10 @@ export function runFromStaging(staging: string, decisions: DreamState["decisions
127
127
  let error: string | undefined;
128
128
  if (status === "failed") {
129
129
  if (meta?.exitCode === 124) error = "timed out (max runtime)";
130
- else if (typeof meta?.exitCode === "number") error = `exit ${String(meta.exitCode)} without a report`;
130
+ else if (typeof meta?.exitCode === "number") {
131
+ const why = logErrorLine(path.join(staging, "trajectory.log"));
132
+ error = why ? `exit ${String(meta.exitCode)}: ${why}` : `exit ${String(meta.exitCode)} without a report`;
133
+ }
131
134
  else if (meta?.signal) error = `killed by ${meta.signal}`;
132
135
  else error = "ended without a report";
133
136
  }
@@ -328,3 +331,26 @@ export function summarizeReport(report: string): string[] {
328
331
  export function reportSummary(staging: string): string[] {
329
332
  return summarizeReport(readReport(staging));
330
333
  }
334
+
335
+ /** The child's own reason for failing: the last `Error:` line of its log
336
+ * (pi prints "Error: Failed to load extension …" and exits 1), clipped. */
337
+ export function logErrorLine(logFile: string): string | undefined {
338
+ try {
339
+ const fd = fs.openSync(logFile, "r");
340
+ try {
341
+ const size = fs.fstatSync(fd).size;
342
+ const len = Math.min(size, 16 * 1024);
343
+ const buf = Buffer.alloc(len);
344
+ fs.readSync(fd, buf, 0, len, size - len);
345
+ const lines = buf.toString("utf8").split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
346
+ const hit = [...lines].reverse().find((l) => /^(Error|TypeError|SyntaxError|ReferenceError)\b/.test(l));
347
+ if (!hit) return undefined;
348
+ const msg = hit.replace(/^Error:\s*/, "");
349
+ return msg.length > 240 ? `${msg.slice(0, 239)}…` : msg;
350
+ } finally {
351
+ fs.closeSync(fd);
352
+ }
353
+ } catch {
354
+ return undefined;
355
+ }
356
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/footer",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Persistent status bar for Unipi — subscribes to UNIPI_EVENTS and renders key stats from all unipi packages",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -32,8 +32,8 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "3.0.0-alpha.36",
36
- "@pi-unipi/background-tasks": "3.0.0-alpha.36"
35
+ "@pi-unipi/core": "3.0.0-alpha.38",
36
+ "@pi-unipi/background-tasks": "3.0.0-alpha.38"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/fusion",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Devin-style model picker, fusion presets (lead + sidekick), and Local Fusion runtime for UniPi",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -32,9 +32,9 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "3.0.0-alpha.36",
36
- "@pi-unipi/subagents": "3.0.0-alpha.36",
37
- "@pi-unipi/utility": "3.0.0-alpha.36"
35
+ "@pi-unipi/core": "3.0.0-alpha.38",
36
+ "@pi-unipi/subagents": "3.0.0-alpha.38",
37
+ "@pi-unipi/utility": "3.0.0-alpha.38"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@earendil-works/pi-ai": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/info-screen",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Unicrab startup splash and the /unipi:info dashboard — this session, context, usage, compaction savings",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@pi-unipi/core": "3.0.0-alpha.36"
36
+ "@pi-unipi/core": "3.0.0-alpha.38"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/input-shortcuts",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Keyboard shortcuts for stash/restore, undo/redo, clipboard, and thinking toggle — chord-based overlay system",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@pi-unipi/core": "3.0.0-alpha.36"
36
+ "@pi-unipi/core": "3.0.0-alpha.38"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.87.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/kanboard",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Kanboard v3 — deferred-work board: CLI/daemon bridge, task runner and skill",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -31,7 +31,7 @@
31
31
  "access": "public"
32
32
  },
33
33
  "dependencies": {
34
- "@pi-unipi/core": "3.0.0-alpha.36"
34
+ "@pi-unipi/core": "3.0.0-alpha.38"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@earendil-works/pi-coding-agent": "^0.87.1",
@@ -48,10 +48,10 @@
48
48
  "themes": []
49
49
  },
50
50
  "optionalDependencies": {
51
- "@pi-unipi/kanboard-linux-x64": "3.0.0-alpha.36",
52
- "@pi-unipi/kanboard-linux-arm64": "3.0.0-alpha.36",
53
- "@pi-unipi/kanboard-darwin-x64": "3.0.0-alpha.36",
54
- "@pi-unipi/kanboard-darwin-arm64": "3.0.0-alpha.36",
55
- "@pi-unipi/kanboard-win32-x64": "3.0.0-alpha.36"
51
+ "@pi-unipi/kanboard-linux-x64": "3.0.0-alpha.38",
52
+ "@pi-unipi/kanboard-linux-arm64": "3.0.0-alpha.38",
53
+ "@pi-unipi/kanboard-darwin-x64": "3.0.0-alpha.38",
54
+ "@pi-unipi/kanboard-darwin-arm64": "3.0.0-alpha.38",
55
+ "@pi-unipi/kanboard-win32-x64": "3.0.0-alpha.38"
56
56
  }
57
57
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/long-horizon",
3
- "version": "3.0.0-alpha.36",
3
+ "version": "3.0.0-alpha.38",
4
4
  "description": "Long-horizon execution for Pi — mode-gated /goal /ralph /swarm /graph orchestration with a TypeSafe prompt judge",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -37,7 +37,9 @@
37
37
  "access": "public"
38
38
  },
39
39
  "dependencies": {
40
- "@pi-unipi/core": "3.0.0-alpha.36"
40
+ "@pi-unipi/core": "3.0.0-alpha.38",
41
+ "@resvg/resvg-wasm": "^2.6.2",
42
+ "beautiful-mermaid": "^1.1.3"
41
43
  },
42
44
  "peerDependencies": {
43
45
  "@earendil-works/pi-coding-agent": "^0.87.1",