@pi-unipi/unipi 2.4.1 → 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.
Files changed (108) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/package.json +28 -23
  3. package/packages/ask-user/package.json +2 -2
  4. package/packages/autocomplete/package.json +4 -2
  5. package/packages/btw/package.json +2 -2
  6. package/packages/cocoindex/package.json +2 -2
  7. package/packages/cocoindex/tools.ts +0 -8
  8. package/packages/compactor/README.md +18 -22
  9. package/packages/compactor/package.json +3 -3
  10. package/packages/compactor/src/compaction/build-sections.ts +2 -2
  11. package/packages/compactor/src/compaction/format.ts +1 -1
  12. package/packages/compactor/src/config/presets.ts +19 -30
  13. package/packages/compactor/src/index.ts +39 -56
  14. package/packages/compactor/src/session/resume-inject.ts +27 -0
  15. package/packages/compactor/src/tools/ctx-batch-execute.ts +4 -2
  16. package/packages/compactor/src/tools/ctx-execute-file.ts +4 -2
  17. package/packages/compactor/src/tools/ctx-execute.ts +4 -2
  18. package/packages/compactor/src/tools/register.ts +22 -4
  19. package/packages/compactor/src/tui/settings-overlay.ts +9 -22
  20. package/packages/compactor/src/types.ts +24 -2
  21. package/packages/core/events.ts +13 -13
  22. package/packages/core/package.json +3 -2
  23. package/packages/core/sandbox.ts +7 -6
  24. package/packages/footer/README.md +2 -2
  25. package/packages/footer/package.json +3 -3
  26. package/packages/footer/src/events.ts +0 -10
  27. package/packages/footer/src/segments/core.ts +0 -9
  28. package/packages/image/package.json +2 -2
  29. package/packages/info-screen/core-groups.ts +0 -14
  30. package/packages/info-screen/package.json +2 -2
  31. package/packages/input-shortcuts/package.json +2 -2
  32. package/packages/kanboard/commands.ts +0 -1
  33. package/packages/kanboard/package.json +2 -2
  34. package/packages/mcp/README.md +9 -0
  35. package/packages/mcp/package.json +5 -2
  36. package/packages/mcp/src/bridge/registry.ts +244 -137
  37. package/packages/mcp/src/bridge/translator.ts +77 -9
  38. package/packages/mcp/src/index.ts +43 -67
  39. package/packages/mcp/src/tui/settings-overlay.ts +3 -9
  40. package/packages/memory/README.md +15 -11
  41. package/packages/memory/bridge/mempalace_bridge.py +636 -0
  42. package/packages/memory/mempalace.ts +169 -18
  43. package/packages/memory/package.json +3 -3
  44. package/packages/memory/storage.ts +27 -28
  45. package/packages/memory/tools.ts +0 -1
  46. package/packages/milestone/README.md +11 -3
  47. package/packages/milestone/hooks.ts +112 -44
  48. package/packages/milestone/index.ts +1 -1
  49. package/packages/milestone/package.json +5 -2
  50. package/packages/notify/README.md +2 -0
  51. package/packages/notify/events.ts +23 -13
  52. package/packages/notify/package.json +2 -2
  53. package/packages/notify/tools.ts +17 -8
  54. package/packages/notify/types.ts +5 -1
  55. package/packages/ralph/package.json +3 -3
  56. package/packages/ralph/ralph-loop.ts +10 -0
  57. package/packages/subagents/README.md +3 -1
  58. package/packages/subagents/package.json +10 -6
  59. package/packages/subagents/src/agent-manager.ts +46 -11
  60. package/packages/subagents/src/core-compat.ts +38 -0
  61. package/packages/subagents/src/global.d.ts +7 -0
  62. package/packages/subagents/src/index.ts +6 -3
  63. package/packages/subagents/src/widget.ts +0 -7
  64. package/packages/unipi/bundled.js +1052 -837
  65. package/packages/updater/package.json +4 -3
  66. package/packages/utility/README.md +1 -1
  67. package/packages/utility/package.json +7 -4
  68. package/packages/utility/src/commands.ts +2 -10
  69. package/packages/utility/src/diff/theme.ts +0 -3
  70. package/packages/utility/src/tui/name-badge.ts +0 -9
  71. package/packages/web-api/package.json +2 -2
  72. package/packages/web-api/src/engine/extract.ts +0 -26
  73. package/packages/web-api/src/tools.ts +0 -13
  74. package/packages/workflow/README.md +8 -0
  75. package/packages/workflow/commands.ts +25 -23
  76. package/packages/workflow/index.ts +172 -81
  77. package/packages/workflow/lifecycle.ts +43 -0
  78. package/packages/workflow/package.json +6 -2
  79. package/packages/autocomplete/index.ts +0 -7
  80. package/packages/autocomplete/src/__tests__/command-registry.audit.test.ts +0 -120
  81. package/packages/autocomplete/src/__tests__/provider.sorting.test.ts +0 -423
  82. package/packages/compactor/src/compaction/recall-scope.ts +0 -32
  83. package/packages/compactor/src/compaction/sections.ts +0 -15
  84. package/packages/compactor/src/display/bash-display.ts +0 -28
  85. package/packages/compactor/src/display/diff-presentation.ts +0 -25
  86. package/packages/compactor/src/display/pending-diff-preview.ts +0 -51
  87. package/packages/compactor/src/display/user-message-box.ts +0 -16
  88. package/packages/compactor/src/session/analytics.ts +0 -205
  89. package/packages/image/index.ts +0 -1
  90. package/packages/input-shortcuts/index.ts +0 -5
  91. package/packages/input-shortcuts/src/status.ts +0 -35
  92. package/packages/kanboard/tui/kanboard-overlay.ts +0 -300
  93. package/packages/mcp/index.ts +0 -1
  94. package/packages/memory/search.ts +0 -134
  95. package/packages/milestone/coexist.ts +0 -114
  96. package/packages/notify/src/__tests__/ask-user-prompt-message.test.ts +0 -159
  97. package/packages/notify/src/__tests__/event-bus.test.ts +0 -119
  98. package/packages/notify/src/__tests__/permission-prompt-message.test.ts +0 -172
  99. package/packages/subagents/src/__tests__/badge-generation.test.ts +0 -315
  100. package/packages/subagents/src/__tests__/config.test.ts +0 -240
  101. package/packages/subagents/src/__tests__/esc-propagation.test.ts +0 -162
  102. package/packages/subagents/src/__tests__/file-lock.test.ts +0 -244
  103. package/packages/subagents/src/__tests__/shutdown-stale-ctx.test.ts +0 -185
  104. package/packages/subagents/src/__tests__/workflow-integration.test.ts +0 -334
  105. package/packages/subagents/src/prompts.ts +0 -39
  106. package/packages/utility/index.ts +0 -1
  107. package/packages/web-api/src/tui/progress.ts +0 -168
  108. package/packages/web-api/src/tui/result.ts +0 -173
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@pi-unipi/footer",
3
- "version": "2.4.0",
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
- "main": "src/index.ts",
6
+ "main": "index.ts",
7
7
  "license": "MIT",
8
8
  "author": "Neuron Mr White",
9
9
  "repository": {
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "2.4.0"
35
+ "@pi-unipi/core": "2.5.0"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -26,16 +26,6 @@ export function subscribeToEvents(
26
26
 
27
27
  // ─── Compactor events ───────────────────────────────────────────────────
28
28
 
29
- unsubscribers.push(
30
- pi.events.on(UNIPI_EVENTS.COMPACTOR_STATS_UPDATED, (event: unknown) => {
31
- try {
32
- registry.updateData("compactor", event);
33
- } catch {
34
- // Silently ignore — event handler errors are non-blocking.
35
- }
36
- })
37
- );
38
-
39
29
  unsubscribers.push(
40
30
  pi.events.on(UNIPI_EVENTS.COMPACTOR_COMPACTED, (event: unknown) => {
41
31
  try {
@@ -219,15 +219,6 @@ function renderHostnameSegment(_ctx: FooterSegmentContext): RenderedSegment {
219
219
  return { content, visible: true };
220
220
  }
221
221
 
222
- function renderTimeSegment(ctx: FooterSegmentContext): RenderedSegment {
223
- const now = new Date();
224
- const hours = now.getHours();
225
- const mins = now.getMinutes().toString().padStart(2, "0");
226
- const timeStr = `${hours}:${mins}`;
227
- const content = withIcon("time", timeStr);
228
- return { content, visible: true };
229
- }
230
-
231
222
  // ─── TPS tier color function ────────────────────────────────────────────────
232
223
 
233
224
  function getTpsSemanticColor(tps: number): SemanticColor {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/image",
3
- "version": "2.4.0",
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.4.0"
37
+ "@pi-unipi/core": "2.5.0"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@earendil-works/pi-ai": "^0.80.0",
@@ -14,20 +14,6 @@ import { infoRegistry } from "./registry.js";
14
14
  import { parseUsageStatsAsync, formatTokens, formatCost } from "./usage-parser.js";
15
15
  import type { InfoGroup } from "./types.js";
16
16
 
17
- /**
18
- * Get package version from package.json.
19
- */
20
- function getPackageVersion(packageDir: string): string {
21
- try {
22
- const pkgPath = join(packageDir, "package.json");
23
- if (!existsSync(pkgPath)) return "0.0.0";
24
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
25
- return pkg?.version ?? "0.0.0";
26
- } catch {
27
- return "0.0.0";
28
- }
29
- }
30
-
31
17
  /**
32
18
  * Discover loaded extensions by scanning filesystem.
33
19
  */
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/info-screen",
3
- "version": "2.4.0",
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.4.0"
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.4.0",
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.4.0"
36
+ "@pi-unipi/core": "2.5.0"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -9,7 +9,6 @@ import * as path from "node:path";
9
9
  import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
10
10
  import { UNIPI_PREFIX, KANBOARD_COMMANDS, KANBOARD_DIRS, UNIPI_EVENTS, emitEvent } from "@pi-unipi/core";
11
11
  import { startServer, KanboardServer } from "./server/index.js";
12
- import { renderKanboardOverlay } from "./tui/kanboard-overlay.js";
13
12
 
14
13
  /** Module-level reference to running server */
15
14
  let runningServer: KanboardServer | null = null;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/kanboard",
3
- "version": "2.4.0",
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.4.0"
42
+ "@pi-unipi/core": "2.5.0"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -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.4.0",
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.4.0"
33
+ "@pi-unipi/core": "2.5.0"
31
34
  },
32
35
  "peerDependencies": {
33
36
  "@earendil-works/pi-coding-agent": "^0.80.0",