pi-mcp-adapter 5.3.1 → 5.3.2
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 +19 -0
- package/commands.ts +5 -3
- package/config.ts +107 -9
- package/dist/config.js +94 -10
- package/dist/config.js.map +1 -1
- package/dist/metadata-cache.d.ts +5 -0
- package/dist/metadata-cache.js +19 -0
- package/dist/metadata-cache.js.map +1 -1
- package/dist/project-server-trust.d.ts +8 -0
- package/dist/project-server-trust.js +45 -12
- package/dist/project-server-trust.js.map +1 -1
- package/dist/sampling-handler.d.ts +3 -2
- package/dist/sampling-handler.js +12 -3
- package/dist/sampling-handler.js.map +1 -1
- package/docs/configuration.md +3 -1
- package/index.ts +2 -17
- package/init.ts +1 -0
- package/metadata-cache.ts +21 -0
- package/package.json +1 -1
- package/project-server-trust.ts +49 -12
- package/sampling-handler.ts +21 -15
|
@@ -51,7 +51,8 @@ export function hashProjectServerDefinition(definition) {
|
|
|
51
51
|
}
|
|
52
52
|
export function canonicalProjectRoot(cwd) {
|
|
53
53
|
try {
|
|
54
|
-
|
|
54
|
+
// The native realpath returns the on-disk casing, so `C:\Users\Me` and `c:\users\me` share approvals.
|
|
55
|
+
return realpathSync.native(cwd);
|
|
55
56
|
}
|
|
56
57
|
catch {
|
|
57
58
|
return resolve(cwd);
|
|
@@ -87,9 +88,9 @@ function linkedWorktreeRepoScope(dotGit) {
|
|
|
87
88
|
const pointer = /^gitdir: (.+)$/m.exec(readFileSync(dotGit, "utf8"))?.[1]?.trim();
|
|
88
89
|
if (!pointer)
|
|
89
90
|
return undefined;
|
|
90
|
-
const adminDir = realpathSync(resolve(dirname(dotGit), pointer));
|
|
91
|
+
const adminDir = realpathSync.native(resolve(dirname(dotGit), pointer));
|
|
91
92
|
const backLink = readFileSync(join(adminDir, "gitdir"), "utf8").trim();
|
|
92
|
-
if (realpathSync(resolve(adminDir, backLink)) !== realpathSync(dotGit))
|
|
93
|
+
if (realpathSync.native(resolve(adminDir, backLink)) !== realpathSync.native(dotGit))
|
|
93
94
|
return undefined;
|
|
94
95
|
const commonDir = dirname(dirname(adminDir));
|
|
95
96
|
const bare = /^\s*bare\s*=\s*(true|yes|on|1)\s*$/im.test(readFileSync(join(commonDir, "config"), "utf8"));
|
|
@@ -142,6 +143,45 @@ export function approveProjectServer(cwd, serverName, definition) {
|
|
|
142
143
|
approvedAt: new Date().toISOString(),
|
|
143
144
|
});
|
|
144
145
|
}
|
|
146
|
+
function isApproved(approvals, projectRoot, serverName, definition) {
|
|
147
|
+
const definitionHash = hashProjectServerDefinition(definition);
|
|
148
|
+
return approvals.approvals.some(entry => entry.projectRoot === projectRoot && entry.serverName === serverName && entry.definitionHash === definitionHash);
|
|
149
|
+
}
|
|
150
|
+
function isProjectTrusted(ctx) {
|
|
151
|
+
try {
|
|
152
|
+
return ctx.isProjectTrusted();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* After the adapter edits config on the user's behalf (a panel save), re-approve each named project
|
|
160
|
+
* server whose pre-edit definition was approved, so the edit does not revoke the approval. Only a
|
|
161
|
+
* `directTools` change carries the approval over; any other difference, such as a concurrent edit to
|
|
162
|
+
* the file, still needs a new approval. A server without a matching approval stays unapproved: an
|
|
163
|
+
* adapter edit never creates one.
|
|
164
|
+
*/
|
|
165
|
+
export function keepProjectServerApprovals(ctx, before, after, serverNames) {
|
|
166
|
+
if (!isProjectTrusted(ctx))
|
|
167
|
+
return;
|
|
168
|
+
const projectServers = asLoadedConfig(after).projectServers;
|
|
169
|
+
const projectRoot = projectApprovalScope(ctx.cwd);
|
|
170
|
+
const approvals = loadApprovals();
|
|
171
|
+
for (const name of serverNames) {
|
|
172
|
+
const previous = before.mcpServers[name];
|
|
173
|
+
const next = after.mcpServers[name];
|
|
174
|
+
if (!previous || !next || !projectServers.has(name))
|
|
175
|
+
continue;
|
|
176
|
+
if (!isApproved(approvals, projectRoot, name, previous))
|
|
177
|
+
continue;
|
|
178
|
+
const { directTools: _previousDirectTools, ...previousRest } = previous;
|
|
179
|
+
const { directTools: _nextDirectTools, ...nextRest } = next;
|
|
180
|
+
if (hashProjectServerDefinition(previousRest) !== hashProjectServerDefinition(nextRest))
|
|
181
|
+
continue;
|
|
182
|
+
approveProjectServer(ctx.cwd, name, next);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
145
185
|
function describeServer(definition) {
|
|
146
186
|
if (definition.command) {
|
|
147
187
|
return [definition.command, ...(definition.args ?? [])].map(value => JSON.stringify(value)).join(" ");
|
|
@@ -157,13 +197,7 @@ export async function applyProjectServerTrust(loaded, ctx) {
|
|
|
157
197
|
const blockedServers = new Map();
|
|
158
198
|
if (loaded.projectServers.size === 0)
|
|
159
199
|
return { config, blockedServers };
|
|
160
|
-
|
|
161
|
-
try {
|
|
162
|
-
projectTrusted = ctx.isProjectTrusted();
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
projectTrusted = false;
|
|
166
|
-
}
|
|
200
|
+
const projectTrusted = isProjectTrusted(ctx);
|
|
167
201
|
// RPC sessions also have a UI, but Pi reads RPC input only after session_start, so a dialog here never resolves.
|
|
168
202
|
const interactive = ctx.hasUI && ctx.mode === "tui";
|
|
169
203
|
const projectRoot = projectApprovalScope(ctx.cwd);
|
|
@@ -172,8 +206,7 @@ export async function applyProjectServerTrust(loaded, ctx) {
|
|
|
172
206
|
const definition = config.mcpServers[name];
|
|
173
207
|
if (!definition || isServerDisabled(definition))
|
|
174
208
|
continue;
|
|
175
|
-
const
|
|
176
|
-
const approved = approvals.approvals.some(entry => entry.projectRoot === projectRoot && entry.serverName === name && entry.definitionHash === definitionHash);
|
|
209
|
+
const approved = isApproved(approvals, projectRoot, name, definition);
|
|
177
210
|
if (projectTrusted && (approved || (!interactive && loaded.projectServerPolicy === "allow")))
|
|
178
211
|
continue;
|
|
179
212
|
let reason;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-server-trust.js","sourceRoot":"","sources":["../project-server-trust.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project-server-trust.js","sourceRoot":"","sources":["../project-server-trust.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
1
|
+
import type { Api, Model, ModelThinkingLevel } from "@earendil-works/pi-ai";
|
|
2
2
|
import type { ExtensionUIContext, ModelRegistry } from "@earendil-works/pi-coding-agent";
|
|
3
3
|
import type { Client } from "@modelcontextprotocol/client";
|
|
4
4
|
import { type CreateMessageRequest, type CreateMessageResult } from "@modelcontextprotocol/client";
|
|
5
5
|
export type SamplingUIContext = Pick<ExtensionUIContext, "confirm">;
|
|
6
|
-
export type SamplingModelRegistry = Pick<ModelRegistry, "getAvailable" | "complete"
|
|
6
|
+
export type SamplingModelRegistry = Pick<ModelRegistry, "getAvailable" | "complete"> & Partial<Pick<ModelRegistry, "streamSimple">>;
|
|
7
7
|
export interface SamplingHandlerOptions {
|
|
8
8
|
serverName: string;
|
|
9
9
|
autoApprove: boolean;
|
|
10
10
|
ui?: SamplingUIContext;
|
|
11
11
|
modelRegistry: SamplingModelRegistry;
|
|
12
12
|
getCurrentModel: () => Model<Api> | undefined;
|
|
13
|
+
getThinkingLevel: () => ModelThinkingLevel;
|
|
13
14
|
getSignal: () => AbortSignal | undefined;
|
|
14
15
|
}
|
|
15
16
|
export type ServerSamplingConfig = Omit<SamplingHandlerOptions, "serverName">;
|
package/dist/sampling-handler.js
CHANGED
|
@@ -29,15 +29,24 @@ export async function handleSamplingRequest(options, request) {
|
|
|
29
29
|
throwIfAborted(signal);
|
|
30
30
|
await confirmSampling(options, "Approve MCP sampling request", formatRequestApproval(options.serverName, `${model.provider}/${model.id}`, params.systemPrompt, messages));
|
|
31
31
|
throwIfAborted(signal);
|
|
32
|
-
const
|
|
32
|
+
const context = {
|
|
33
33
|
...(params.systemPrompt !== undefined ? { systemPrompt: params.systemPrompt } : {}),
|
|
34
34
|
messages,
|
|
35
|
-
}
|
|
35
|
+
};
|
|
36
|
+
const requestOptions = {
|
|
36
37
|
maxTokens: params.maxTokens,
|
|
37
38
|
...(params.temperature !== undefined ? { temperature: params.temperature } : {}),
|
|
38
39
|
...(params.metadata !== undefined ? { metadata: params.metadata } : {}),
|
|
39
40
|
...(signal ? { signal } : {}),
|
|
40
|
-
}
|
|
41
|
+
};
|
|
42
|
+
const thinkingLevel = options.getThinkingLevel();
|
|
43
|
+
// Only streamSimple applies the thinking level; Pi before 0.86 has no streamSimple, so sampling runs with thinking off there.
|
|
44
|
+
const result = options.modelRegistry.streamSimple
|
|
45
|
+
? await options.modelRegistry.streamSimple(model, context, {
|
|
46
|
+
...requestOptions,
|
|
47
|
+
...(thinkingLevel !== "off" ? { reasoning: thinkingLevel } : {}),
|
|
48
|
+
}).result()
|
|
49
|
+
: await options.modelRegistry.complete(model, context, requestOptions);
|
|
41
50
|
const converted = convertAssistantResult(result);
|
|
42
51
|
throwIfAborted(signal);
|
|
43
52
|
await confirmSampling(options, "Return MCP sampling response", formatResponseApproval(options.serverName, converted));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampling-handler.js","sourceRoot":"","sources":["../sampling-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"sampling-handler.js","sourceRoot":"","sources":["../sampling-handler.ts"],"names":[],"mappings":"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"}
|
package/docs/configuration.md
CHANGED
|
@@ -8,7 +8,7 @@ Where the adapter reads MCP servers from, which file wins, how project servers a
|
|
|
8
8
|
|
|
9
9
|
**Open the panel from a key:** To open the panel without clearing a prompt you are typing, bind `mcp.panel.open` in Pi's [`keybindings.json`](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/keybindings.md), for example `{ "mcp.panel.open": "alt+m" }`, then run `/reload`. You can bind one key or a list of keys. There is no default key.
|
|
10
10
|
|
|
11
|
-
**Guided first-run setup:** Run `/mcp-adapter setup` to choose the normal write target for new shared servers — project `.mcp.json` or global `~/.config/mcp/mcp.json` — inspect detected shared MCP files, adopt compatibility imports from other hosts, open discovered config paths, preview exact before/after file diffs for writes, scaffold a minimal selected config, add a curated known server (DeepWiki, Context7, Parallel Search, Tavily Search, Notion, GitHub, Chrome DevTools, or Figma (desktop) when the Figma app is installed), or quick-add RepoPrompt into a standard/shared MCP file.
|
|
11
|
+
**Guided first-run setup:** Run `/mcp-adapter setup` to choose the normal write target for new shared servers — project `.mcp.json` or global `~/.config/mcp/mcp.json` — inspect detected shared MCP files, adopt compatibility imports from other hosts, open discovered config paths, preview exact before/after file diffs for writes, scaffold a minimal selected config, add a curated known server (DeepWiki, Context7, Parallel Search, Tavily Search, Notion, GitHub (signs in with the GitHub CLI token from `gh auth token`), Chrome DevTools, or Figma (desktop) when the Figma app is installed), or quick-add RepoPrompt into a standard/shared MCP file.
|
|
12
12
|
|
|
13
13
|
**Figma:** Figma's remote server, `https://mcp.figma.com/mcp`, only accepts approved clients, and Pi isn't approved yet. Use the Figma desktop app's local server instead: run `/mcp-adapter setup` and add Figma (desktop). It needs a Dev or Full seat on a paid Figma plan; to turn it on, open a Design file, switch to Dev Mode (Shift+D), and click "Enable desktop MCP server" in the inspect panel.
|
|
14
14
|
|
|
@@ -94,6 +94,8 @@ Within the selected root, `.mcp.json` and `<configDir>/mcp-adapter.json` load fr
|
|
|
94
94
|
|
|
95
95
|
Prefer `.mcp.json` for project-local shared MCP config and `~/.config/mcp/mcp.json` for user-global shared MCP config. Use `.pi/mcp-adapter.json` for adapter-specific project overrides. Project files override user-global sources.
|
|
96
96
|
|
|
97
|
+
Entries for the same server merge field by field, but credentials (`headers`, bearer tokens, `oauth`, and the other auth fields) stay with the `url` they were written for: when a higher-precedence file sets a different `url`, the lower file's credentials are not sent, and the adapter says so at startup, naming both files. The notice covers config files and their imports; a url change between two files of the same host (such as global and project `opencode.json`), or for a server from a package or plugin, drops credentials the same way without a notice.
|
|
98
|
+
|
|
97
99
|
## Import Existing Configs
|
|
98
100
|
|
|
99
101
|
Shared MCP files are loaded automatically. Use `imports` only for host-specific config formats that are not already covered by `.mcp.json` or `~/.config/mcp/mcp.json`.
|
package/index.ts
CHANGED
|
@@ -13,7 +13,7 @@ import { cloneMcpConfig, discoverConfiguredClaudePluginSkills, getLegacyMcpMigra
|
|
|
13
13
|
import { approveProjectServer, excludeProjectServersAtLoadTime, hasProjectServerDefinitions } from "./project-server-trust.ts";
|
|
14
14
|
import { buildProxyDescription, getLargeDirectToolsAdvisory, getMissingConfiguredDirectToolServers, prepareDirectToolArguments, resolveDirectTools } from "./direct-tool-surface.ts";
|
|
15
15
|
import { isServerInActiveFailureBackoff } from "./failure-backoff.ts";
|
|
16
|
-
import {
|
|
16
|
+
import { isServerCacheValid, loadMetadataCache, parseDirectToolSelectors, withSessionMetadata, type MetadataCache } from "./metadata-cache.ts";
|
|
17
17
|
import { createPromptCommand, resolveCachedPrompts } from "./prompts.ts";
|
|
18
18
|
import { logger } from "./logger.ts";
|
|
19
19
|
import { formatMcpFooterStatus, formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.ts";
|
|
@@ -687,26 +687,11 @@ function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
|
687
687
|
}
|
|
688
688
|
}
|
|
689
689
|
|
|
690
|
-
function loadToolSurfaceCache(config: McpConfig): MetadataCache | null {
|
|
691
|
-
const cache = loadMetadataCache();
|
|
692
|
-
const currentState = state;
|
|
693
|
-
if (!currentState?.sessionMetadata?.size) return cache;
|
|
694
|
-
const servers = { ...cache?.servers };
|
|
695
|
-
for (const [serverName, entry] of currentState.sessionMetadata) {
|
|
696
|
-
const definition = config.mcpServers[serverName];
|
|
697
|
-
if (!definition || isServerDisabled(definition)) continue;
|
|
698
|
-
if (entry.configHash !== computeServerHash(definition)) continue;
|
|
699
|
-
const { ttlMs: _sessionTtl, cacheScope: _sessionScope, ...sessionEntry } = entry;
|
|
700
|
-
servers[serverName] = { ...sessionEntry, cachedAt: Date.now() };
|
|
701
|
-
}
|
|
702
|
-
return { version: 1, servers };
|
|
703
|
-
}
|
|
704
|
-
|
|
705
690
|
function syncToolSurface(ctx?: ExtensionContext): void {
|
|
706
691
|
const notificationGeneration = lifecycleGeneration;
|
|
707
692
|
const notificationOwner = currentOwner;
|
|
708
693
|
const config = state?.config ?? earlyConfig;
|
|
709
|
-
const cache =
|
|
694
|
+
const cache = withSessionMetadata(loadMetadataCache(), config, state?.sessionMetadata);
|
|
710
695
|
const result = syncDirectTools(config, cache);
|
|
711
696
|
if (state) {
|
|
712
697
|
const directToolCounts = state.directToolCounts ?? new Map<string, number>();
|
package/init.ts
CHANGED
|
@@ -171,6 +171,7 @@ export async function initializeMcp(
|
|
|
171
171
|
...(ui !== undefined ? { ui } : {}),
|
|
172
172
|
modelRegistry,
|
|
173
173
|
getCurrentModel: () => owner.isActive() ? ctx.model : undefined,
|
|
174
|
+
getThinkingLevel: () => owner.isActive() ? pi.getThinkingLevel() : "off",
|
|
174
175
|
getSignal: () => owner.isActive()
|
|
175
176
|
? combineAbortSignals(owner.signal, ctx.signal)
|
|
176
177
|
: owner.signal,
|
package/metadata-cache.ts
CHANGED
|
@@ -56,6 +56,27 @@ export function loadMetadataCache(): MetadataCache | null {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* The cache plus what this session already listed. Private or zero-TTL listings are never
|
|
61
|
+
* persisted as valid, but this session's own listing still counts for this session.
|
|
62
|
+
*/
|
|
63
|
+
export function withSessionMetadata(
|
|
64
|
+
cache: MetadataCache | null,
|
|
65
|
+
config: McpConfig,
|
|
66
|
+
sessionMetadata: ReadonlyMap<string, ServerCacheEntry> | undefined,
|
|
67
|
+
): MetadataCache | null {
|
|
68
|
+
if (!sessionMetadata?.size) return cache;
|
|
69
|
+
const servers = { ...cache?.servers };
|
|
70
|
+
for (const [serverName, entry] of sessionMetadata) {
|
|
71
|
+
const definition = config.mcpServers[serverName];
|
|
72
|
+
if (!definition || isServerDisabled(definition)) continue;
|
|
73
|
+
if (entry.configHash !== computeServerHash(definition)) continue;
|
|
74
|
+
const { ttlMs: _sessionTtl, cacheScope: _sessionScope, ...sessionEntry } = entry;
|
|
75
|
+
servers[serverName] = { ...sessionEntry, cachedAt: Date.now() };
|
|
76
|
+
}
|
|
77
|
+
return { version: CACHE_VERSION, servers };
|
|
78
|
+
}
|
|
79
|
+
|
|
59
80
|
export function saveMetadataCache(cache: MetadataCache, options: { startupSnapshot?: MetadataCache["servers"] } = {}): void {
|
|
60
81
|
updateMetadataCacheFile(servers => {
|
|
61
82
|
const next = { ...servers };
|
package/package.json
CHANGED
package/project-server-trust.ts
CHANGED
|
@@ -80,7 +80,8 @@ export function hashProjectServerDefinition(definition: ServerDefinition): strin
|
|
|
80
80
|
|
|
81
81
|
export function canonicalProjectRoot(cwd: string): string {
|
|
82
82
|
try {
|
|
83
|
-
|
|
83
|
+
// The native realpath returns the on-disk casing, so `C:\Users\Me` and `c:\users\me` share approvals.
|
|
84
|
+
return realpathSync.native(cwd);
|
|
84
85
|
} catch {
|
|
85
86
|
return resolve(cwd);
|
|
86
87
|
}
|
|
@@ -114,9 +115,9 @@ function linkedWorktreeRepoScope(dotGit: string): string | undefined {
|
|
|
114
115
|
if (!lstatSync(dotGit).isFile()) return undefined;
|
|
115
116
|
const pointer = /^gitdir: (.+)$/m.exec(readFileSync(dotGit, "utf8"))?.[1]?.trim();
|
|
116
117
|
if (!pointer) return undefined;
|
|
117
|
-
const adminDir = realpathSync(resolve(dirname(dotGit), pointer));
|
|
118
|
+
const adminDir = realpathSync.native(resolve(dirname(dotGit), pointer));
|
|
118
119
|
const backLink = readFileSync(join(adminDir, "gitdir"), "utf8").trim();
|
|
119
|
-
if (realpathSync(resolve(adminDir, backLink)) !== realpathSync(dotGit)) return undefined;
|
|
120
|
+
if (realpathSync.native(resolve(adminDir, backLink)) !== realpathSync.native(dotGit)) return undefined;
|
|
120
121
|
const commonDir = dirname(dirname(adminDir));
|
|
121
122
|
const bare = /^\s*bare\s*=\s*(true|yes|on|1)\s*$/im.test(readFileSync(join(commonDir, "config"), "utf8"));
|
|
122
123
|
return basename(commonDir) === ".git" && !bare ? dirname(commonDir) : `git-dir:${commonDir}`;
|
|
@@ -169,6 +170,49 @@ export function approveProjectServer(cwd: string, serverName: string, definition
|
|
|
169
170
|
});
|
|
170
171
|
}
|
|
171
172
|
|
|
173
|
+
function isApproved(approvals: ApprovalStore, projectRoot: string, serverName: string, definition: ServerDefinition): boolean {
|
|
174
|
+
const definitionHash = hashProjectServerDefinition(definition);
|
|
175
|
+
return approvals.approvals.some(entry =>
|
|
176
|
+
entry.projectRoot === projectRoot && entry.serverName === serverName && entry.definitionHash === definitionHash);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function isProjectTrusted(ctx: Pick<ExtensionContext, "isProjectTrusted">): boolean {
|
|
180
|
+
try {
|
|
181
|
+
return ctx.isProjectTrusted();
|
|
182
|
+
} catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* After the adapter edits config on the user's behalf (a panel save), re-approve each named project
|
|
189
|
+
* server whose pre-edit definition was approved, so the edit does not revoke the approval. Only a
|
|
190
|
+
* `directTools` change carries the approval over; any other difference, such as a concurrent edit to
|
|
191
|
+
* the file, still needs a new approval. A server without a matching approval stays unapproved: an
|
|
192
|
+
* adapter edit never creates one.
|
|
193
|
+
*/
|
|
194
|
+
export function keepProjectServerApprovals(
|
|
195
|
+
ctx: Pick<ExtensionContext, "cwd" | "isProjectTrusted">,
|
|
196
|
+
before: McpConfig,
|
|
197
|
+
after: McpConfig,
|
|
198
|
+
serverNames: Iterable<string>,
|
|
199
|
+
): void {
|
|
200
|
+
if (!isProjectTrusted(ctx)) return;
|
|
201
|
+
const projectServers = asLoadedConfig(after).projectServers;
|
|
202
|
+
const projectRoot = projectApprovalScope(ctx.cwd);
|
|
203
|
+
const approvals = loadApprovals();
|
|
204
|
+
for (const name of serverNames) {
|
|
205
|
+
const previous = before.mcpServers[name];
|
|
206
|
+
const next = after.mcpServers[name];
|
|
207
|
+
if (!previous || !next || !projectServers.has(name)) continue;
|
|
208
|
+
if (!isApproved(approvals, projectRoot, name, previous)) continue;
|
|
209
|
+
const { directTools: _previousDirectTools, ...previousRest } = previous;
|
|
210
|
+
const { directTools: _nextDirectTools, ...nextRest } = next;
|
|
211
|
+
if (hashProjectServerDefinition(previousRest) !== hashProjectServerDefinition(nextRest)) continue;
|
|
212
|
+
approveProjectServer(ctx.cwd, name, next);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
172
216
|
function describeServer(definition: ServerDefinition): string {
|
|
173
217
|
if (definition.command) {
|
|
174
218
|
return [definition.command, ...(definition.args ?? [])].map(value => JSON.stringify(value)).join(" ");
|
|
@@ -186,12 +230,7 @@ export async function applyProjectServerTrust(
|
|
|
186
230
|
const blockedServers = new Map<string, ProjectServerBlock>();
|
|
187
231
|
if (loaded.projectServers.size === 0) return { config, blockedServers };
|
|
188
232
|
|
|
189
|
-
|
|
190
|
-
try {
|
|
191
|
-
projectTrusted = ctx.isProjectTrusted();
|
|
192
|
-
} catch {
|
|
193
|
-
projectTrusted = false;
|
|
194
|
-
}
|
|
233
|
+
const projectTrusted = isProjectTrusted(ctx);
|
|
195
234
|
// RPC sessions also have a UI, but Pi reads RPC input only after session_start, so a dialog here never resolves.
|
|
196
235
|
const interactive = ctx.hasUI && ctx.mode === "tui";
|
|
197
236
|
const projectRoot = projectApprovalScope(ctx.cwd);
|
|
@@ -200,9 +239,7 @@ export async function applyProjectServerTrust(
|
|
|
200
239
|
for (const [name, source] of loaded.projectServers) {
|
|
201
240
|
const definition = config.mcpServers[name];
|
|
202
241
|
if (!definition || isServerDisabled(definition)) continue;
|
|
203
|
-
const
|
|
204
|
-
const approved = approvals.approvals.some(entry =>
|
|
205
|
-
entry.projectRoot === projectRoot && entry.serverName === name && entry.definitionHash === definitionHash);
|
|
242
|
+
const approved = isApproved(approvals, projectRoot, name, definition);
|
|
206
243
|
if (projectTrusted && (approved || (!interactive && loaded.projectServerPolicy === "allow"))) continue;
|
|
207
244
|
|
|
208
245
|
let reason: ProjectServerBlockReason;
|
package/sampling-handler.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Api, AssistantMessage, Message, Model, TextContent } from "@earendil-works/pi-ai";
|
|
1
|
+
import type { Api, AssistantMessage, Message, Model, ModelThinkingLevel, TextContent } from "@earendil-works/pi-ai";
|
|
2
2
|
import { truncateAtWord } from "./utils.ts";
|
|
3
3
|
import { throwIfAborted } from "./abort.ts";
|
|
4
4
|
import type { ExtensionUIContext, ModelRegistry } from "@earendil-works/pi-coding-agent";
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from "@modelcontextprotocol/client";
|
|
13
13
|
|
|
14
14
|
export type SamplingUIContext = Pick<ExtensionUIContext, "confirm">;
|
|
15
|
-
export type SamplingModelRegistry = Pick<ModelRegistry, "getAvailable" | "complete"
|
|
15
|
+
export type SamplingModelRegistry = Pick<ModelRegistry, "getAvailable" | "complete"> & Partial<Pick<ModelRegistry, "streamSimple">>;
|
|
16
16
|
|
|
17
17
|
export interface SamplingHandlerOptions {
|
|
18
18
|
serverName: string;
|
|
@@ -20,6 +20,7 @@ export interface SamplingHandlerOptions {
|
|
|
20
20
|
ui?: SamplingUIContext;
|
|
21
21
|
modelRegistry: SamplingModelRegistry;
|
|
22
22
|
getCurrentModel: () => Model<Api> | undefined;
|
|
23
|
+
getThinkingLevel: () => ModelThinkingLevel;
|
|
23
24
|
getSignal: () => AbortSignal | undefined;
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -65,19 +66,24 @@ export async function handleSamplingRequest(
|
|
|
65
66
|
);
|
|
66
67
|
throwIfAborted(signal);
|
|
67
68
|
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
69
|
+
const context = {
|
|
70
|
+
...(params.systemPrompt !== undefined ? { systemPrompt: params.systemPrompt } : {}),
|
|
71
|
+
messages,
|
|
72
|
+
};
|
|
73
|
+
const requestOptions = {
|
|
74
|
+
maxTokens: params.maxTokens,
|
|
75
|
+
...(params.temperature !== undefined ? { temperature: params.temperature } : {}),
|
|
76
|
+
...(params.metadata !== undefined ? { metadata: params.metadata as Record<string, unknown> } : {}),
|
|
77
|
+
...(signal ? { signal } : {}),
|
|
78
|
+
};
|
|
79
|
+
const thinkingLevel = options.getThinkingLevel();
|
|
80
|
+
// Only streamSimple applies the thinking level; Pi before 0.86 has no streamSimple, so sampling runs with thinking off there.
|
|
81
|
+
const result = options.modelRegistry.streamSimple
|
|
82
|
+
? await options.modelRegistry.streamSimple(model, context, {
|
|
83
|
+
...requestOptions,
|
|
84
|
+
...(thinkingLevel !== "off" ? { reasoning: thinkingLevel } : {}),
|
|
85
|
+
}).result()
|
|
86
|
+
: await options.modelRegistry.complete(model, context, requestOptions);
|
|
81
87
|
|
|
82
88
|
const converted = convertAssistantResult(result);
|
|
83
89
|
throwIfAborted(signal);
|