@pi-unipi/unipi 2.4.2 → 2.5.0
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 +25 -0
- package/package.json +23 -22
- package/packages/ask-user/package.json +2 -2
- package/packages/autocomplete/package.json +1 -1
- package/packages/btw/package.json +2 -2
- package/packages/cocoindex/package.json +2 -2
- package/packages/compactor/package.json +3 -3
- package/packages/core/package.json +1 -1
- package/packages/core/sandbox.ts +7 -6
- package/packages/footer/package.json +2 -2
- package/packages/image/package.json +2 -2
- package/packages/info-screen/package.json +2 -2
- package/packages/input-shortcuts/package.json +2 -2
- package/packages/kanboard/package.json +2 -2
- package/packages/mcp/README.md +9 -0
- package/packages/mcp/package.json +5 -2
- package/packages/mcp/src/bridge/registry.ts +244 -137
- package/packages/mcp/src/bridge/translator.ts +77 -9
- package/packages/mcp/src/index.ts +43 -67
- package/packages/mcp/src/tui/settings-overlay.ts +3 -9
- package/packages/memory/README.md +15 -11
- package/packages/memory/bridge/mempalace_bridge.py +636 -0
- package/packages/memory/mempalace.ts +169 -18
- package/packages/memory/package.json +3 -3
- package/packages/memory/storage.ts +27 -10
- package/packages/milestone/README.md +11 -3
- package/packages/milestone/hooks.ts +103 -29
- package/packages/milestone/index.ts +1 -1
- package/packages/milestone/package.json +5 -2
- package/packages/notify/package.json +2 -2
- package/packages/ralph/package.json +3 -3
- package/packages/subagents/package.json +1 -1
- package/packages/unipi/bundled.js +693 -408
- package/packages/updater/package.json +2 -2
- package/packages/utility/package.json +2 -2
- package/packages/web-api/package.json +2 -2
- package/packages/workflow/README.md +8 -0
- package/packages/workflow/commands.ts +16 -26
- package/packages/workflow/index.ts +165 -85
- package/packages/workflow/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,31 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [2.5.0] — 2026-08-14
|
|
10
|
+
|
|
11
|
+
This release makes persistent memory migration reliable across standalone and all-in-one installs, while stabilizing workflow tool schemas and MCP registration.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **Verified MemPalace catch-up:** migration state now records a source fingerprint and explicit discovered/imported/skipped/failed/verified counts. New or changed legacy memories trigger an idempotent catch-up, and partial runs retry instead of being marked complete.
|
|
16
|
+
- **MemPalace packaging contracts:** the umbrella tarball now ships the Python bridge and resolves it across standalone, bundled, nested npm, and explicit override layouts.
|
|
17
|
+
- **Deterministic MCP registration:** server discovery runs in parallel behind an atomic registration barrier with canonical tool ordering, duplicate-name rejection, rollback, and orderly disconnect.
|
|
18
|
+
- **Workflow lifecycle tests:** added coverage for call-time tool enforcement, nested workflow restoration, MCP schema stability, concurrent completion, and Milestone completion fallback.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **Workflow tools are enforced at execution time.** UniPi no longer mutates Pi's active tool list between workflow phases, preserving provider prefix-cache stability and avoiding stale tool schemas.
|
|
23
|
+
- **MCP schemas are canonicalized.** Equivalent JSON schemas now produce stable key/required ordering and Pi-compatible complete object schemas.
|
|
24
|
+
- **Milestone completion is per workflow run.** Overlapping runs are tracked independently and agent shutdown only reconciles runs that missed their normal completion event.
|
|
25
|
+
- **Memory markdown records preserve authoritative IDs** in frontmatter while retaining the legacy filename/title fallback for existing files.
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- **All-in-one UniPi installs no longer silently fall back to SQLite** because `mempalace_bridge.py` was absent from the umbrella artifact or resolved relative to the wrong module.
|
|
30
|
+
- **MemPalace migration no longer false-completes** after bridge errors, timeouts, partial writes, or stale timestamp markers; exact persisted documents are re-read and verified before completion is recorded.
|
|
31
|
+
- **MCP no longer registers tools in network-completion order,** leak partial registrations after failure, or retain clients during shutdown.
|
|
32
|
+
- **Workflow completion and sandbox rules no longer bleed across nested or concurrent runs.**
|
|
33
|
+
|
|
9
34
|
## [2.4.2] — 2026-08-13
|
|
10
35
|
|
|
11
36
|
This release closes the unreachable-code and misleading-contract audit across runtime behavior, package artifacts, and integration events.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/unipi",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "All-in-one extension suite for Pi coding agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"prepare": "node scripts/build-bundle.mjs --if-missing",
|
|
28
28
|
"prepublishOnly": "npm run build",
|
|
29
29
|
"publish:all": "npm publish --workspaces --access public",
|
|
30
|
-
"test": "npx tsx --test tests/*.test.js && npm test --workspaces --if-present",
|
|
30
|
+
"test": "npx tsx --test tests/*.test.js packages/memory/tests/*.test.ts && npm test --workspaces --if-present",
|
|
31
31
|
"typecheck": "npx tsc --noEmit --skipLibCheck"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"packages/*/*.ts",
|
|
37
37
|
"packages/*/src/**/*.ts",
|
|
38
38
|
"packages/*/extensions/**/*.ts",
|
|
39
|
+
"packages/*/bridge/**/*.py",
|
|
39
40
|
"packages/*/platforms/*",
|
|
40
41
|
"packages/*/tui/*",
|
|
41
42
|
"packages/*/SKILL.md",
|
|
@@ -75,26 +76,26 @@
|
|
|
75
76
|
"typebox": "^1.1.38"
|
|
76
77
|
},
|
|
77
78
|
"dependencies": {
|
|
78
|
-
"@pi-unipi/ask-user": "2.
|
|
79
|
-
"@pi-unipi/btw": "2.
|
|
80
|
-
"@pi-unipi/compactor": "2.
|
|
81
|
-
"@pi-unipi/notify": "2.
|
|
82
|
-
"@pi-unipi/command-enchantment": "2.
|
|
83
|
-
"@pi-unipi/core": "2.
|
|
84
|
-
"@pi-unipi/info-screen": "2.
|
|
85
|
-
"@pi-unipi/mcp": "2.
|
|
86
|
-
"@pi-unipi/memory": "2.
|
|
87
|
-
"@pi-unipi/ralph": "2.
|
|
88
|
-
"@pi-unipi/subagents": "2.
|
|
89
|
-
"@pi-unipi/utility": "2.
|
|
90
|
-
"@pi-unipi/milestone": "2.
|
|
91
|
-
"@pi-unipi/kanboard": "2.
|
|
92
|
-
"@pi-unipi/web-api": "2.
|
|
93
|
-
"@pi-unipi/workflow": "2.
|
|
94
|
-
"@pi-unipi/footer": "2.
|
|
95
|
-
"@pi-unipi/updater": "2.
|
|
96
|
-
"@pi-unipi/input-shortcuts": "2.
|
|
97
|
-
"@pi-unipi/cocoindex": "2.
|
|
79
|
+
"@pi-unipi/ask-user": "2.5.0",
|
|
80
|
+
"@pi-unipi/btw": "2.5.0",
|
|
81
|
+
"@pi-unipi/compactor": "2.5.0",
|
|
82
|
+
"@pi-unipi/notify": "2.5.0",
|
|
83
|
+
"@pi-unipi/command-enchantment": "2.5.0",
|
|
84
|
+
"@pi-unipi/core": "2.5.0",
|
|
85
|
+
"@pi-unipi/info-screen": "2.5.0",
|
|
86
|
+
"@pi-unipi/mcp": "2.5.0",
|
|
87
|
+
"@pi-unipi/memory": "2.5.0",
|
|
88
|
+
"@pi-unipi/ralph": "2.5.0",
|
|
89
|
+
"@pi-unipi/subagents": "2.5.0",
|
|
90
|
+
"@pi-unipi/utility": "2.5.0",
|
|
91
|
+
"@pi-unipi/milestone": "2.5.0",
|
|
92
|
+
"@pi-unipi/kanboard": "2.5.0",
|
|
93
|
+
"@pi-unipi/web-api": "2.5.0",
|
|
94
|
+
"@pi-unipi/workflow": "2.5.0",
|
|
95
|
+
"@pi-unipi/footer": "2.5.0",
|
|
96
|
+
"@pi-unipi/updater": "2.5.0",
|
|
97
|
+
"@pi-unipi/input-shortcuts": "2.5.0",
|
|
98
|
+
"@pi-unipi/cocoindex": "2.5.0"
|
|
98
99
|
},
|
|
99
100
|
"devDependencies": {
|
|
100
101
|
"@earendil-works/pi-agent-core": "^0.80.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/ask-user",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
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",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"access": "public"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@pi-unipi/core": "2.
|
|
43
|
+
"@pi-unipi/core": "2.5.0"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"@earendil-works/pi-coding-agent": "^0.80.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/btw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
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.80.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@pi-unipi/core": "2.
|
|
40
|
+
"@pi-unipi/core": "2.5.0"
|
|
41
41
|
},
|
|
42
42
|
"pi": {
|
|
43
43
|
"extensions": [],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/cocoindex",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "CocoIndex integration for Pi — AST-aware content indexing, semantic vector search, and incremental pipeline management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.ts",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"typebox": "^1.1.38"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@pi-unipi/core": "2.
|
|
28
|
+
"@pi-unipi/core": "2.5.0"
|
|
29
29
|
},
|
|
30
30
|
"optionalDependencies": {
|
|
31
31
|
"@lancedb/lancedb": "^0.21.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/compactor",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Context engine for Pi — zero-LLM compaction, session continuity, sandbox execution, and tool display optimization",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.ts",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@pi-unipi/core": "2.
|
|
38
|
-
"@pi-unipi/info-screen": "2.
|
|
37
|
+
"@pi-unipi/core": "2.5.0",
|
|
38
|
+
"@pi-unipi/info-screen": "2.5.0",
|
|
39
39
|
"@earendil-works/pi-agent-core": "^0.80.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
package/packages/core/sandbox.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* @unipi/core — Sandbox module
|
|
3
3
|
*
|
|
4
4
|
* Defines tool access levels for workflow commands.
|
|
5
|
-
*
|
|
5
|
+
* Workflow enforces blocked names at tool_call time so provider tool schemas
|
|
6
|
+
* and ordering remain stable; filtering helpers remain available to other callers.
|
|
6
7
|
*/
|
|
7
8
|
|
|
8
9
|
import { WORKFLOW_COMMANDS } from "./constants.js";
|
|
@@ -13,9 +14,9 @@ export type SandboxLevel = "read_only" | "brainstorm" | "write_unipi" | "review"
|
|
|
13
14
|
/**
|
|
14
15
|
* Built-in workflow tools used when no active tool list is supplied.
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* Legacy fallback list used by callers that need an explicit filtered tool set.
|
|
18
|
+
* The workflow package itself keeps Pi's active tools unchanged and enforces
|
|
19
|
+
* BLOCKED_TOOLS at tool_call time.
|
|
19
20
|
*/
|
|
20
21
|
const FALLBACK_TOOLS: Record<SandboxLevel, readonly string[]> = {
|
|
21
22
|
/** Only read-only file tools — no bash, no write, no edit */
|
|
@@ -78,8 +79,8 @@ export function getSandboxLevel(commandName: string): SandboxLevel {
|
|
|
78
79
|
/**
|
|
79
80
|
* Get fallback tools for a sandbox level.
|
|
80
81
|
*
|
|
81
|
-
* Prefer
|
|
82
|
-
*
|
|
82
|
+
* Prefer isToolAllowed() for cache-stable call-time enforcement. Filtering is
|
|
83
|
+
* retained for compatibility with callers that intentionally alter tool sets.
|
|
83
84
|
*/
|
|
84
85
|
export function getToolsForLevel(level: SandboxLevel): readonly string[] {
|
|
85
86
|
return FALLBACK_TOOLS[level];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/footer",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
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,7 +32,7 @@
|
|
|
32
32
|
"access": "public"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@pi-unipi/core": "2.
|
|
35
|
+
"@pi-unipi/core": "2.5.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"@earendil-works/pi-coding-agent": "^0.80.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/image",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Image generation and image recognition tools for the Pi coding agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.ts",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@pi-unipi/core": "2.
|
|
37
|
+
"@pi-unipi/core": "2.5.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@earendil-works/pi-ai": "^0.80.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/info-screen",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Dashboard and module registry for Unipi — configurable info overlay with tabbed groups",
|
|
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": "2.
|
|
36
|
+
"@pi-unipi/core": "2.5.0"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@earendil-works/pi-coding-agent": "^0.80.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/input-shortcuts",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
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": "2.
|
|
36
|
+
"@pi-unipi/core": "2.5.0"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@earendil-works/pi-coding-agent": "^0.80.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/kanboard",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Visualization layer for unipi workflow — HTTP server with htmx/Alpine.js UI, modular parsers, TUI overlay, and kanban board",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.ts",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"access": "public"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@pi-unipi/core": "2.
|
|
42
|
+
"@pi-unipi/core": "2.5.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"@earendil-works/pi-coding-agent": "^0.80.0",
|
package/packages/mcp/README.md
CHANGED
|
@@ -12,6 +12,7 @@ The add command opens a split-pane overlay: server browser on the left, JSON con
|
|
|
12
12
|
| `/unipi:mcp-settings` | Interactive settings with enable/disable/edit |
|
|
13
13
|
| `/unipi:mcp-sync` | Force sync server catalog from GitHub |
|
|
14
14
|
| `/unipi:mcp-status` | Text summary of all configured servers |
|
|
15
|
+
| `/unipi:mcp-reload` | Remind you to restart Pi so tool schemas reload as a clean cache epoch |
|
|
15
16
|
|
|
16
17
|
### Setup Flow
|
|
17
18
|
|
|
@@ -30,6 +31,14 @@ MCP registers with the info-screen dashboard, showing server count, active serve
|
|
|
30
31
|
|
|
31
32
|
MCP tools are registered dynamically based on configured servers. Once a server is added and Pi restarts, its tools become available to the agent.
|
|
32
33
|
|
|
34
|
+
### Deterministic Definitions and Cache Behavior
|
|
35
|
+
|
|
36
|
+
At session startup, enabled servers connect and discover tools in parallel. Registration waits for all discoveries to settle, then registers the successful combined tool set in canonical `{serverName}__{toolName}` order. Duplicate final names are rejected explicitly instead of allowing one definition to overwrite another.
|
|
37
|
+
|
|
38
|
+
MCP input properties are cloned and recursively canonicalized before registration: schema object keys use locale-independent UTF-16 code-unit order, valid schema `required` string arrays are sorted and deduplicated, a missing top-level `required` becomes `[]`, and literal-value arrays keep their source order. Each tool also receives a stable label matching its final Pi name. These stable definitions and registration order prevent equivalent MCP configurations from changing the serialized tool list between runs, improving provider prompt-cache reuse. A server that fails discovery is excluded from the combined set; a registration error fails startup for that prepared set and is not reported as successful.
|
|
39
|
+
|
|
40
|
+
Pi 0.80 cannot remove dynamically registered tools. Enabling, disabling, deleting, or changing MCP servers is therefore applied on the next Pi restart rather than mutating the tool list mid-session. This prevents stale schemas and makes the restart an explicit cache-epoch boundary.
|
|
41
|
+
|
|
33
42
|
Example tool calls:
|
|
34
43
|
```
|
|
35
44
|
github__search_code({ query: "authentication middleware" })
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-unipi/mcp",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "MCP server management extension for Pi coding agent — browse, add, configure, and use MCP servers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.ts",
|
|
@@ -26,8 +26,11 @@
|
|
|
26
26
|
"skills/**/*",
|
|
27
27
|
"README.md"
|
|
28
28
|
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"test": "npx tsx --test tests/**/*.test.ts"
|
|
31
|
+
},
|
|
29
32
|
"dependencies": {
|
|
30
|
-
"@pi-unipi/core": "2.
|
|
33
|
+
"@pi-unipi/core": "2.5.0"
|
|
31
34
|
},
|
|
32
35
|
"peerDependencies": {
|
|
33
36
|
"@earendil-works/pi-coding-agent": "^0.80.0",
|