@nklisch/pi-enhanced 0.2.6 → 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.
- package/CHANGELOG.md +16 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.linux-x64-gnu.node +0 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.win32-x64-msvc.node +0 -0
- package/node_modules/@nklisch/pi-plugins/README.md +4 -2
- package/node_modules/@nklisch/pi-plugins/dist/hooks.js +81 -8
- package/node_modules/@nklisch/pi-plugins/dist/hooks.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/mcp.js +32 -1
- package/node_modules/@nklisch/pi-plugins/dist/mcp.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager.d.ts +10 -4
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager.js +144 -10
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime-discovery.js +40 -14
- package/node_modules/@nklisch/pi-plugins/dist/runtime-discovery.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/CHANGELOG.md +25 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/README.md +75 -47
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/dist/public.d.ts +171 -140
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/dist/settings.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/FORK-MAINTENANCE.md +8 -7
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/VISION.md +12 -10
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/architecture/architecture.md +112 -105
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/comparison-with-upstream.md +3 -3
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/docs/decisions/0004-reconsider-ui-direction.md +5 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/package.json +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/config/custom-agents.ts +31 -4
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/config/default-agents.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/config/invocation-config.ts +7 -4
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/index.ts +18 -9
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/layered-settings.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/child-lifecycle.ts +10 -63
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/concurrency-limiter.ts +122 -76
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/create-subagent-session.ts +3 -5
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/lifecycle-interceptor.ts +4 -3
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/run-listeners.ts +2 -23
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent-manager.ts +177 -252
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent-session.ts +90 -280
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent-state.ts +153 -223
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/subagent.ts +569 -683
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/lifecycle/workspace.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/observation/notification.ts +78 -119
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/observation/renderer.ts +15 -42
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/observation/subagent-events-observer.ts +44 -95
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/service/service-adapter.ts +157 -90
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/service/service.ts +60 -68
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/session/conversation.ts +3 -3
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/session/query-source.ts +28 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/session/query.ts +327 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/settings.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/agent-tool.ts +171 -249
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/get-result-tool.ts +51 -92
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/helpers.ts +9 -6
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/list-tool.ts +46 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/parent-tool-registry.ts +17 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/query-session-tool.ts +330 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/result-renderer.ts +27 -111
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/resume-tool.ts +105 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/spawn-config.ts +26 -8
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/steer-tool.ts +27 -111
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/stop-tool.ts +53 -0
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/types.ts +11 -5
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/agent-widget.ts +33 -27
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/display.ts +6 -3
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/session-navigation.ts +121 -10
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/session-navigator.ts +430 -112
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/subagents-settings.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/ui/widget-renderer.ts +8 -9
- package/node_modules/@nklisch/pi-plugins/package.json +2 -2
- package/package.json +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/background-spawner.ts +0 -81
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/src/tools/foreground-runner.ts +0 -149
- 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,21 @@
|
|
|
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
|
+
|
|
13
|
+
## v0.2.7
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- Rebundle `@nklisch/pi-plugins` 0.6.2 and `@nklisch/pi-subagents` 18.1.0-nklisch.4 so a blocking subagent result request cannot duplicate its completion notification in context.
|
|
18
|
+
|
|
3
19
|
## v0.2.6
|
|
4
20
|
|
|
5
21
|
### Fixed
|
|
Binary file
|
|
Binary file
|
|
@@ -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.
|
|
103
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGhD,MAAM,cAAc,GAAG;IACrB,aAAa;IACb,oBAAoB;IACpB,aAAa;IACb,oBAAoB;IACpB,oBAAoB;CACZ,CAAC;AAEX,SAAS,UAAU,CAAC,KAAc,EAAE,SAA2C;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,4FAA4F,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;IAC1K,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAClF,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,MAA0C,EAAE,MAAc;IAC3E,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AACrG,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAAC,UAAmB,EAAE,UAAkB;IACpE,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1G,MAAM,MAAM,GAAG,UAAqC,CAAC;IACrD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IACzF,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnG,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7G,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;QACrG,CAAC,CAAC,MAAM,CAAC,GAA8B;QACvC,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,GAAG,MAAM;QACT,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE;YACH,GAAG,WAAW;YACd,aAAa,EAAE,2BAA2B;YAC1C,iBAAiB,EAAE,2BAA2B;SAC/C;KACF,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAyB;IAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAI,CAAC,EAAE,CAAC;YAClD,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YAC7B,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACpC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YAC7B,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACpC,kBAAkB,EAAE,UAAU;SAC/B,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAI,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC5F,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc,EAAE,SAA2C;IACnG,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAA2B,CAAC;IACrI,OAAO,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
}
|