@nklisch/pi-enhanced 0.2.7 → 0.3.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 (70) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/node_modules/@nklisch/pi-clearance/native/clearance-core.linux-x64-gnu.node +0 -0
  3. package/node_modules/@nklisch/pi-clearance/native/clearance-core.win32-x64-msvc.node +0 -0
  4. package/node_modules/@nklisch/pi-plugins/README.md +4 -2
  5. package/node_modules/@nklisch/pi-plugins/dist/hooks.js +81 -8
  6. package/node_modules/@nklisch/pi-plugins/dist/hooks.js.map +1 -1
  7. package/node_modules/@nklisch/pi-plugins/dist/mcp.js +32 -1
  8. package/node_modules/@nklisch/pi-plugins/dist/mcp.js.map +1 -1
  9. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager.d.ts +10 -4
  10. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager.js +144 -10
  11. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager.js.map +1 -1
  12. package/node_modules/@nklisch/pi-plugins/dist/runtime-discovery.js +40 -14
  13. package/node_modules/@nklisch/pi-plugins/dist/runtime-discovery.js.map +1 -1
  14. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/CHANGELOG.md +19 -0
  15. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/README.md +75 -47
  16. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/dist/public.d.ts +171 -140
  17. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/dist/settings.d.ts +2 -2
  18. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/FORK-MAINTENANCE.md +8 -7
  19. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/VISION.md +12 -10
  20. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/architecture/architecture.md +111 -104
  21. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/comparison-with-upstream.md +3 -3
  22. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/decisions/0004-reconsider-ui-direction.md +5 -0
  23. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/package.json +1 -1
  24. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/config/custom-agents.ts +31 -4
  25. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/config/default-agents.ts +1 -1
  26. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/config/invocation-config.ts +7 -4
  27. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/index.ts +18 -9
  28. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/layered-settings.ts +2 -2
  29. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/child-lifecycle.ts +10 -63
  30. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/concurrency-limiter.ts +122 -76
  31. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/create-subagent-session.ts +3 -5
  32. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/lifecycle-interceptor.ts +4 -3
  33. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/run-listeners.ts +2 -23
  34. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent-manager.ts +177 -252
  35. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent-session.ts +90 -280
  36. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent-state.ts +153 -239
  37. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent.ts +569 -700
  38. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/workspace.ts +1 -1
  39. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/observation/notification.ts +78 -122
  40. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/observation/renderer.ts +15 -42
  41. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/observation/subagent-events-observer.ts +44 -95
  42. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/service/service-adapter.ts +157 -90
  43. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/service/service.ts +60 -68
  44. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/session/conversation.ts +3 -3
  45. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/session/query-source.ts +28 -0
  46. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/session/query.ts +327 -0
  47. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/settings.ts +1 -1
  48. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/agent-tool.ts +171 -249
  49. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/get-result-tool.ts +51 -94
  50. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/helpers.ts +9 -6
  51. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/list-tool.ts +46 -0
  52. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/parent-tool-registry.ts +17 -0
  53. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/query-session-tool.ts +330 -0
  54. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/result-renderer.ts +27 -111
  55. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/resume-tool.ts +105 -0
  56. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/spawn-config.ts +26 -8
  57. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/steer-tool.ts +27 -111
  58. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/stop-tool.ts +53 -0
  59. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/types.ts +11 -5
  60. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/agent-widget.ts +33 -27
  61. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/display.ts +6 -3
  62. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/session-navigation.ts +121 -10
  63. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/session-navigator.ts +430 -112
  64. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/subagents-settings.ts +1 -1
  65. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/widget-renderer.ts +8 -9
  66. package/node_modules/@nklisch/pi-plugins/package.json +2 -2
  67. package/package.json +1 -1
  68. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/background-spawner.ts +0 -81
  69. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/foreground-runner.ts +0 -149
  70. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/get-result-report.ts +0 -77
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.3.0
4
+
5
+ ### Changed
6
+
7
+ - Rebundle `@nklisch/pi-plugins` 0.8.0 and `@nklisch/pi-subagents` 18.2.0-nklisch.0 with joined/detached execution, truthful stop controls, bounded session inspection, and searchable live transcripts.
8
+
9
+ ### Breaking changes
10
+
11
+ - Bundled subagent callers and custom-agent files must migrate `run_in_background: true` to `mode: detached` and `run_in_background: false` to `mode: joined`; indefinite result waiting is removed.
12
+
3
13
  ## v0.2.7
4
14
 
5
15
  ### Fixed
@@ -99,8 +99,10 @@ Supported Claude hook events include `SessionStart`, `SessionEnd`,
99
99
  `PreCompact`, `PostCompact`, and `Stop`. Hook processes receive JSON on stdin,
100
100
  the plugin root/data variables, `CLAUDE_PROJECT_DIR`, a bounded timeout, and
101
101
  cancellation. Hook failures are reported for that plugin and do not disable
102
- unrelated bundles. SessionStart `hookSpecificOutput.additionalContext` is
103
- injected into the next Pi system prompt.
102
+ unrelated bundles. `hookSpecificOutput.additionalContext` is delivered on the
103
+ same turn as a model-visible, transcript-backed context message; this preserves
104
+ per-turn `UserPromptSubmit` digests instead of treating them as lasting system
105
+ instructions.
104
106
 
105
107
  MCP declarations are recursively expanded for the plugin root, persistent data
106
108
  root, and project root, then passed as an in-memory `{ mcpServers }` overlay to
@@ -1,5 +1,6 @@
1
1
  import { spawn } from "node:child_process";
2
2
  const MAX_OUTPUT_BYTES = 1_000_000;
3
+ const PLUGIN_SESSION_ENV = "PI_PLUGIN_SESSION_ID";
3
4
  function record(value) {
4
5
  return value !== null && typeof value === "object" && !Array.isArray(value);
5
6
  }
@@ -117,7 +118,10 @@ function matcherValue(event, input) {
117
118
  return "";
118
119
  }
119
120
  function matches(command, input) {
120
- if (command.matcher === undefined || command.matcher.length === 0)
121
+ // Claude hook manifests use "*" as the all-events wildcard. It is not a
122
+ // valid standalone JavaScript regular expression, so handle that manifest
123
+ // sentinel before compiling ordinary matcher expressions.
124
+ if (command.matcher === undefined || command.matcher.length === 0 || command.matcher === "*")
121
125
  return true;
122
126
  try {
123
127
  return new RegExp(command.matcher, "u").test(matcherValue(command.event, input));
@@ -126,17 +130,32 @@ function matches(command, input) {
126
130
  return false;
127
131
  }
128
132
  }
129
- function baseEnvironment(plugin, cwd) {
133
+ function baseEnvironment(plugin, cwd, sessionId) {
130
134
  return Object.freeze({
131
135
  PLUGIN_ROOT: plugin.info.root,
132
136
  CLAUDE_PLUGIN_ROOT: plugin.info.root,
133
137
  PLUGIN_DATA: plugin.info.data,
134
138
  CLAUDE_PLUGIN_DATA: plugin.info.data,
135
139
  CLAUDE_PROJECT_DIR: cwd,
140
+ // Identity passthrough: hook subprocesses receive the same opaque instance
141
+ // id the stdin payload carries under `session_id`. PI_SESSION_ID is the
142
+ // native pi name; CLAUDE_SESSION_ID is the CC/Codex compatibility name
143
+ // that session-bound tools (e.g. jamsesh) resolve. Omitted when the
144
+ // session id is unavailable rather than shadowing an inherited value
145
+ // with an empty string.
146
+ ...(sessionId.length === 0 ? {} : { PI_SESSION_ID: sessionId, CLAUDE_SESSION_ID: sessionId }),
136
147
  });
137
148
  }
138
149
  function hookInput(event, ctx, values = {}) {
139
- return { hook_event_name: event, cwd: ctx.cwd, ...values };
150
+ const sessionId = ctx.sessionManager.getSessionId();
151
+ const transcriptPath = ctx.sessionManager.getSessionFile();
152
+ return {
153
+ hook_event_name: event,
154
+ cwd: ctx.cwd,
155
+ ...(sessionId.length === 0 ? {} : { session_id: sessionId }),
156
+ ...(transcriptPath === undefined ? {} : { transcript_path: transcriptPath }),
157
+ ...values,
158
+ };
140
159
  }
141
160
  function sessionStartReason(reason) {
142
161
  if (reason === "new")
@@ -153,16 +172,38 @@ function mergeAggregate(left, output) {
153
172
  ...(output?.reason === undefined ? (left.reason === undefined ? {} : { reason: left.reason }) : { reason: output.reason }),
154
173
  };
155
174
  }
175
+ /**
176
+ * CC-shaped tool_response for shell tools, built from the most accurate Pi
177
+ * event data available. Pi merges command output into one text stream and
178
+ * signals failure by throwing (isError plus a trailing "Command exited with
179
+ * code N" status line), so exit_code is 0 on success, parsed from that status
180
+ * line on failure, else 1, and the combined output is reported as stdout.
181
+ * This restores information for CC-format hooks that consult result fields;
182
+ * correctness consumers (e.g. jamsesh) must not depend on it.
183
+ */
184
+ function ccShellToolResponse(event) {
185
+ if (event.toolName !== "bash")
186
+ return undefined;
187
+ // Text-only join: image content blocks contribute nothing to a shell result.
188
+ const stdout = event.content
189
+ .map((item) => (item.type === "text" ? item.text : ""))
190
+ .filter((text) => text.length > 0)
191
+ .join("\n");
192
+ const parsed = /Command exited with code (\d+)\s*$/.exec(stdout);
193
+ const exitCode = parsed ? Number(parsed[1]) : (event.isError ? 1 : 0);
194
+ return { exit_code: exitCode, stdout, stderr: "" };
195
+ }
156
196
  export function registerPluginHooks(pi, snapshot) {
157
197
  let pendingContext = [];
158
198
  const invoke = async (event, input, ctx) => {
159
199
  let aggregate = emptyAggregate();
200
+ const sessionId = ctx.sessionManager.getSessionId();
160
201
  for (const plugin of snapshot.plugins.filter((item) => item.info.enabled)) {
161
202
  for (const command of plugin.hooks.filter((item) => item.event === event && matches(item, input))) {
162
203
  const result = await executeHookCommand({
163
204
  command: command.command,
164
205
  cwd: ctx.cwd,
165
- environment: baseEnvironment(plugin, ctx.cwd),
206
+ environment: baseEnvironment(plugin, ctx.cwd, sessionId),
166
207
  timeoutMs: command.timeoutMs,
167
208
  ...(ctx.signal === undefined ? {} : { signal: ctx.signal }),
168
209
  stdin: input,
@@ -179,10 +220,25 @@ export function registerPluginHooks(pi, snapshot) {
179
220
  return aggregate;
180
221
  };
181
222
  pi.on("session_start", async (event, ctx) => {
223
+ // MCP config is assembled before a session context exists. Publish the
224
+ // current opaque session id into this Pi process before later-registered
225
+ // MCP lifecycle handlers start stdio children; plugin declarations can
226
+ // opt in with `$env:PI_PLUGIN_SESSION_ID` without exposing it globally to
227
+ // every child process.
228
+ const sessionId = ctx.sessionManager.getSessionId();
229
+ if (sessionId.length === 0)
230
+ delete process.env[PLUGIN_SESSION_ENV];
231
+ else
232
+ process.env[PLUGIN_SESSION_ENV] = sessionId;
182
233
  await invoke("SessionStart", hookInput("SessionStart", ctx, { reason: sessionStartReason(event.reason), pi_reason: event.reason }), ctx);
183
234
  });
184
235
  pi.on("session_shutdown", async (event, ctx) => {
185
- await invoke("SessionEnd", hookInput("SessionEnd", ctx, { reason: event.reason }), ctx);
236
+ try {
237
+ await invoke("SessionEnd", hookInput("SessionEnd", ctx, { reason: event.reason }), ctx);
238
+ }
239
+ finally {
240
+ delete process.env[PLUGIN_SESSION_ENV];
241
+ }
186
242
  });
187
243
  pi.on("input", async (event, ctx) => {
188
244
  const result = await invoke("UserPromptSubmit", hookInput("UserPromptSubmit", ctx, { prompt: event.text }), ctx);
@@ -198,7 +254,14 @@ export function registerPluginHooks(pi, snapshot) {
198
254
  });
199
255
  pi.on("tool_result", async (event, ctx) => {
200
256
  const hookEvent = event.isError ? "PostToolUseFailure" : "PostToolUse";
201
- await invoke(hookEvent, hookInput(hookEvent, ctx, { tool_name: event.toolName, tool_input: event.input, tool_output: event.content, is_error: event.isError }), ctx);
257
+ const toolResponse = ccShellToolResponse(event);
258
+ await invoke(hookEvent, hookInput(hookEvent, ctx, {
259
+ tool_name: event.toolName,
260
+ tool_input: event.input,
261
+ tool_output: event.content,
262
+ is_error: event.isError,
263
+ ...(toolResponse === undefined ? {} : { tool_response: toolResponse }),
264
+ }), ctx);
202
265
  });
203
266
  pi.on("session_before_compact", async (event, ctx) => {
204
267
  const result = await invoke("PreCompact", hookInput("PreCompact", ctx, { reason: event.reason }), ctx);
@@ -210,12 +273,22 @@ export function registerPluginHooks(pi, snapshot) {
210
273
  pi.on("agent_end", async (_event, ctx) => {
211
274
  await invoke("Stop", hookInput("Stop", ctx), ctx);
212
275
  });
213
- pi.on("before_agent_start", async (event, _ctx) => {
276
+ pi.on("before_agent_start", async (_event, _ctx) => {
214
277
  if (pendingContext.length === 0)
215
278
  return undefined;
216
279
  const context = pendingContext.join("\n\n");
217
280
  pendingContext = [];
218
- return { systemPrompt: `${event.systemPrompt}\n\n${context}` };
281
+ // Hook additionalContext is turn data, not a lasting system instruction.
282
+ // Deliver it as a model-visible message so UserPromptSubmit digests are
283
+ // unambiguous in every host mode, including RPC, and remain auditable in
284
+ // the session transcript.
285
+ return {
286
+ message: {
287
+ customType: "plugin-hook-context",
288
+ content: context,
289
+ display: false,
290
+ },
291
+ };
219
292
  });
220
293
  }
221
294
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { isAbsolute, resolve } from "node:path";
1
2
  const VARIABLE_NAMES = [
2
3
  "PLUGIN_ROOT",
3
4
  "CLAUDE_PLUGIN_ROOT",
@@ -19,6 +20,36 @@ function substitute(value, variables) {
19
20
  function namespace(plugin, server) {
20
21
  return `${plugin.info.name}_${plugin.info.marketplace}_${server}`.replace(/[^A-Za-z0-9_-]/gu, "_");
21
22
  }
23
+ /**
24
+ * Anchor stdio servers to the plugin root and give their child process the
25
+ * same opaque Pi session identity used by hooks. Codex-style declarations
26
+ * commonly use cwd-relative commands (`sh bin/launcher`), and pi launches MCP
27
+ * children from the project directory. The `$env:` values are resolved by
28
+ * pi-mcp-adapter when the child starts, after SessionStart has published the
29
+ * current identity. A declaration's own relative `cwd` and env are preserved;
30
+ * absolute paths and non-stdio servers are left untouched.
31
+ */
32
+ function resolvePluginStdioCwd(definition, pluginRoot) {
33
+ if (definition === null || typeof definition !== "object" || Array.isArray(definition))
34
+ return definition;
35
+ const server = definition;
36
+ if (typeof server.command !== "string" || server.command.length === 0)
37
+ return definition;
38
+ const declared = typeof server.cwd === "string" && server.cwd.trim().length > 0 ? server.cwd : ".";
39
+ const resolved = isAbsolute(declared) || declared.startsWith("~") ? declared : resolve(pluginRoot, declared);
40
+ const declaredEnv = server.env !== null && typeof server.env === "object" && !Array.isArray(server.env)
41
+ ? server.env
42
+ : {};
43
+ return {
44
+ ...server,
45
+ cwd: resolved,
46
+ env: {
47
+ ...declaredEnv,
48
+ PI_SESSION_ID: "$env:PI_PLUGIN_SESSION_ID",
49
+ CLAUDE_SESSION_ID: "$env:PI_PLUGIN_SESSION_ID",
50
+ },
51
+ };
52
+ }
22
53
  /** Build the only MCP input this package gives to pi-mcp-adapter. */
23
54
  export async function buildMcpConfig(snapshot) {
24
55
  const plugins = snapshot.plugins.filter((item) => item.info.enabled && item.mcp !== undefined);
@@ -40,7 +71,7 @@ export async function buildMcpConfig(snapshot) {
40
71
  });
41
72
  for (const [serverName, definition] of Object.entries(plugin.mcp)) {
42
73
  const name = occurrences.get(serverName) === 1 ? serverName : namespace(plugin, serverName);
43
- values.set(name, substitute(definition, variables));
74
+ values.set(name, resolvePluginStdioCwd(substitute(definition, variables), plugin.info.root));
44
75
  }
45
76
  }
46
77
  return Object.freeze({ mcpServers: Object.freeze(Object.fromEntries(values)) });
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,6 @@ export interface PluginManagerOptions {
10
10
  readonly theme: Theme;
11
11
  readonly keybindings: KeybindingsManager;
12
12
  readonly done: (result: PluginManagerResult) => void;
13
- readonly confirm: (title: string, message: string) => Promise<boolean>;
14
- readonly input: (title: string, placeholder?: string) => Promise<string | undefined>;
15
13
  readonly notify: (message: string, type?: "info" | "warning" | "error") => void;
16
14
  }
17
15
  export declare class PluginManager implements Component, Focusable {
@@ -20,10 +18,11 @@ export declare class PluginManager implements Component, Focusable {
20
18
  private readonly theme;
21
19
  private readonly keybindings;
22
20
  private readonly done;
23
- private readonly confirm;
24
- private readonly input;
25
21
  private readonly notify;
26
22
  private readonly searchInput;
23
+ private readonly dialogInput;
24
+ private dialog;
25
+ private dialogCursor;
27
26
  private _focused;
28
27
  private tab;
29
28
  private view;
@@ -77,6 +76,13 @@ export declare class PluginManager implements Component, Focusable {
77
76
  private renderMarketplaces;
78
77
  private renderIssues;
79
78
  private renderDetail;
79
+ private renderDialog;
80
+ private handleDialogInput;
81
+ private submitDialogInput;
82
+ private closeDialogInput;
83
+ private closeDialogConfirm;
84
+ private promptInput;
85
+ private promptConfirm;
80
86
  private renderConfirmation;
81
87
  private renderBatch;
82
88
  private renderRows;
@@ -6,6 +6,24 @@ const BATCH_ACTIONS = ["install", "update", "enable", "disable", "remove"];
6
6
  function errorMessage(error) {
7
7
  return error instanceof Error ? error.message : String(error);
8
8
  }
9
+ /** Naive greedy word wrap for dialog message text; long messages stay readable at narrow widths. */
10
+ function wrapText(text, width) {
11
+ const lines = [];
12
+ for (const paragraph of text.split("\n")) {
13
+ let current = "";
14
+ for (const word of paragraph.split(/\s+/u).filter((word) => word.length > 0)) {
15
+ const candidate = current.length === 0 ? word : `${current} ${word}`;
16
+ if (candidate.length > width && current.length > 0) {
17
+ lines.push(current);
18
+ current = word;
19
+ }
20
+ else
21
+ current = candidate;
22
+ }
23
+ lines.push(current);
24
+ }
25
+ return lines;
26
+ }
9
27
  function catalogEntry(catalog, name) {
10
28
  return catalog?.plugins.find((item) => item.name === name);
11
29
  }
@@ -30,10 +48,11 @@ export class PluginManager {
30
48
  theme;
31
49
  keybindings;
32
50
  done;
33
- confirm;
34
- input;
35
51
  notify;
36
52
  searchInput = new Input();
53
+ dialogInput = new Input();
54
+ dialog;
55
+ dialogCursor = 0;
37
56
  _focused = false;
38
57
  tab = "installed";
39
58
  view = "list";
@@ -79,10 +98,9 @@ export class PluginManager {
79
98
  this.theme = options.theme;
80
99
  this.keybindings = options.keybindings;
81
100
  this.done = options.done;
82
- this.confirm = options.confirm;
83
- this.input = options.input;
84
101
  this.notify = options.notify;
85
102
  this.searchInput.onSubmit = () => this.leaveSearch();
103
+ this.dialogInput.onSubmit = () => this.submitDialogInput();
86
104
  // Opening is local-first: the first render does not wait for either a
87
105
  // catalog read or a network request. Both tasks update this view in place.
88
106
  void this.loadLocal().catch((error) => this.showToast(`Could not load plugin data: ${errorMessage(error)}`, "warning"));
@@ -94,13 +112,16 @@ export class PluginManager {
94
112
  set focused(value) {
95
113
  this._focused = value;
96
114
  this.searchInput.focused = value && this.searchFocused;
115
+ this.dialogInput.focused = value && this.dialog?.kind === "input";
97
116
  }
98
117
  render(width) {
99
118
  const renderWidth = Math.max(1, width);
100
119
  const lines = [];
101
120
  lines.push(this.renderTabs(renderWidth));
102
121
  lines.push(this.theme.fg("border", "─".repeat(renderWidth)));
103
- if (this.view === "detail")
122
+ if (this.dialog !== undefined)
123
+ lines.push(...this.renderDialog(renderWidth));
124
+ else if (this.view === "detail")
104
125
  lines.push(...this.renderDetail(renderWidth));
105
126
  else if (this.view === "confirm")
106
127
  lines.push(...this.renderConfirmation(renderWidth));
@@ -123,6 +144,10 @@ export class PluginManager {
123
144
  handleInput(data) {
124
145
  if (this.destroyed)
125
146
  return;
147
+ if (this.dialog !== undefined) {
148
+ this.handleDialogInput(data);
149
+ return;
150
+ }
126
151
  if (this.searchFocused) {
127
152
  if (matchesKey(data, Key.escape) || matchesKey(data, Key.enter)) {
128
153
  this.leaveSearch();
@@ -181,6 +206,15 @@ export class PluginManager {
181
206
  }
182
207
  dispose() {
183
208
  this.destroyed = true;
209
+ // A dialog resolver that never fires would wedge the awaiting mutation
210
+ // forever; settling it on dispose keeps promises from leaking if the host
211
+ // tears the component down mid-dialog.
212
+ const dialog = this.dialog;
213
+ this.dialog = undefined;
214
+ if (dialog?.kind === "input")
215
+ dialog.resolver(undefined);
216
+ else
217
+ dialog?.resolver(false);
184
218
  this.checkRun++;
185
219
  this.checkController?.abort("manager closed");
186
220
  this.batchController?.abort("manager closed");
@@ -326,6 +360,108 @@ export class PluginManager {
326
360
  }
327
361
  return lines;
328
362
  }
363
+ renderDialog(width) {
364
+ const dialog = this.dialog;
365
+ const lines = [this.heading(dialog.title)];
366
+ if (dialog.kind === "confirm") {
367
+ lines.push("");
368
+ for (const line of wrapText(dialog.message, Math.max(8, width - 4)))
369
+ lines.push(this.indent(line, width));
370
+ lines.push("");
371
+ lines.push(this.renderCursorLine(this.dialogCursor === 0, dialog.destructive
372
+ ? this.theme.fg("error", dialog.actionLabel)
373
+ : this.theme.fg("accent", dialog.actionLabel)));
374
+ lines.push(this.renderCursorLine(this.dialogCursor === 1, this.theme.fg("text", "Cancel")));
375
+ }
376
+ else {
377
+ lines.push("");
378
+ this.dialogInput.focused = this._focused;
379
+ const text = this.dialogInput.getValue().length === 0
380
+ ? this.theme.fg("muted", `› ${dialog.placeholder}`)
381
+ : `› ${this.dialogInput.render(Math.max(1, width - 4))[0] ?? ""}`;
382
+ lines.push(this.indent(this.theme.fg("border", "[") + text + this.theme.fg("border", "]"), width));
383
+ }
384
+ lines.push("");
385
+ lines.push(this.theme.fg("dim", dialog.kind === "input" ? "enter submit · esc cancel" : "↑↓ or y/n · enter run · esc cancel"));
386
+ return lines.map((line) => truncateToWidth(line, width, ""));
387
+ }
388
+ handleDialogInput(data) {
389
+ const dialog = this.dialog;
390
+ if (dialog.kind === "input") {
391
+ if (matchesKey(data, Key.escape)) {
392
+ this.dialogInput.setValue("");
393
+ this.closeDialogInput(undefined);
394
+ return;
395
+ }
396
+ this.dialogInput.handleInput(data);
397
+ this.requestRender();
398
+ return;
399
+ }
400
+ if (matchesKey(data, Key.escape)) {
401
+ this.closeDialogConfirm(false);
402
+ return;
403
+ }
404
+ if (matchesKey(data, Key.up) || matchesKey(data, Key.down) || matchesKey(data, Key.left) || matchesKey(data, Key.right) || matchesKey(data, Key.tab)) {
405
+ this.dialogCursor = this.dialogCursor === 0 ? 1 : 0;
406
+ this.requestRender();
407
+ return;
408
+ }
409
+ if (matchesKey(data, Key.enter)) {
410
+ this.closeDialogConfirm(this.dialogCursor === 0);
411
+ return;
412
+ }
413
+ // y/n shortcuts keep destructive dialogs reachable without navigation.
414
+ const lower = data.toLocaleLowerCase();
415
+ if (lower === "y")
416
+ this.closeDialogConfirm(true);
417
+ else if (lower === "n")
418
+ this.closeDialogConfirm(false);
419
+ }
420
+ submitDialogInput() {
421
+ const value = this.dialogInput.getValue();
422
+ this.closeDialogInput(value);
423
+ }
424
+ closeDialogInput(value) {
425
+ const dialog = this.dialog;
426
+ if (dialog === undefined || dialog.kind !== "input")
427
+ return;
428
+ this.dialog = undefined;
429
+ this.dialogCursor = 0;
430
+ dialog.resolver(value);
431
+ this.requestRender();
432
+ }
433
+ closeDialogConfirm(approved) {
434
+ const dialog = this.dialog;
435
+ if (dialog === undefined || dialog.kind !== "confirm")
436
+ return;
437
+ this.dialog = undefined;
438
+ this.dialogCursor = 0;
439
+ dialog.resolver(approved);
440
+ this.requestRender();
441
+ }
442
+ promptInput(title, placeholder) {
443
+ return new Promise((resolve) => {
444
+ this.dialogInput.setValue("");
445
+ this.dialogCursor = 0;
446
+ this.dialog = Object.freeze({ kind: "input", title, placeholder, resolver: resolve });
447
+ this.dialogInput.focused = this._focused;
448
+ this.requestRender();
449
+ });
450
+ }
451
+ promptConfirm(title, message, options = {}) {
452
+ return new Promise((resolve) => {
453
+ this.dialogCursor = 0;
454
+ this.dialog = Object.freeze({
455
+ kind: "confirm",
456
+ title,
457
+ message,
458
+ actionLabel: options.actionLabel ?? "Confirm",
459
+ destructive: options.destructive === true,
460
+ resolver: resolve,
461
+ });
462
+ this.requestRender();
463
+ });
464
+ }
329
465
  renderConfirmation(width) {
330
466
  const batch = this.batch;
331
467
  if (batch === undefined)
@@ -648,7 +784,7 @@ export class PluginManager {
648
784
  }
649
785
  if (action === "toggle-auto" && installed !== undefined) {
650
786
  if (!installed.autoUpdate) {
651
- const approved = await this.confirm("Enable automatic plugin updates", "This grants standing authorization to replace executable hooks and MCP servers when Pi startup sees a declared catalog version change. Enable it?");
787
+ const approved = await this.promptConfirm("Enable automatic plugin updates", "This grants standing authorization to replace executable hooks and MCP servers when Pi startup sees a declared catalog version change. Enable it?", { actionLabel: "Enable" });
652
788
  if (!approved)
653
789
  return;
654
790
  }
@@ -1010,7 +1146,7 @@ export class PluginManager {
1010
1146
  }
1011
1147
  async addMarketplace() {
1012
1148
  try {
1013
- const source = await this.input("Add marketplace", "owner/repository, Git URL, or local path");
1149
+ const source = await this.promptInput("Add marketplace", "owner/repository, Git URL, or local path");
1014
1150
  if (source === undefined || source.trim().length === 0)
1015
1151
  return;
1016
1152
  const added = await this.host.addMarketplace(source.trim());
@@ -1189,7 +1325,7 @@ export class PluginManager {
1189
1325
  return issues;
1190
1326
  }
1191
1327
  async removeMarketplace(name) {
1192
- const approved = await this.confirm("Remove marketplace", `Remove ${name}'s source checkout? Installed plugin bundles are left in place.`);
1328
+ const approved = await this.promptConfirm("Remove marketplace", `Remove ${name}'s source checkout? Installed plugin bundles are left in place.`, { actionLabel: "Remove", destructive: true });
1193
1329
  if (!approved)
1194
1330
  return;
1195
1331
  try {
@@ -1243,8 +1379,6 @@ export async function openPluginManager(host, ctx) {
1243
1379
  theme,
1244
1380
  keybindings,
1245
1381
  done,
1246
- confirm: (title, message) => ctx.ui.confirm(title, message),
1247
- input: (title, placeholder) => ctx.ui.input(title, placeholder),
1248
1382
  notify: (message, type) => ctx.ui.notify(message, type),
1249
1383
  }));
1250
1384
  }