@geohar/pi-svg-mcp 0.7.0 → 0.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAER,YAAY,EAIf,MAAM,SAAS,CAAA;AAuHhB,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA6FrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAER,YAAY,EAIf,MAAM,SAAS,CAAA;AAmIhB,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAqGrD"}
package/dist/index.js CHANGED
@@ -26,7 +26,8 @@
26
26
  // entry — see mcp.json.example and the README; static, and unnecessary when
27
27
  // combiner-served. The sharedserver resolution is ported from plugins/opencode.
28
28
  import { spawnSync } from "node:child_process";
29
- import { existsSync, readFileSync } from "node:fs";
29
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
30
+ import { homedir } from "node:os";
30
31
  import { dirname, join } from "node:path";
31
32
  import { fileURLToPath } from "node:url";
32
33
  import { resolveSharedserver } from "./sharedserver-resolve.js";
@@ -114,17 +115,28 @@ function resolveServeArgv(port) {
114
115
  return { argv: ["uvx", spec, "--transport", "streamable-http", "--port", port] };
115
116
  }
116
117
  let attachment = null;
117
- let cleanupInstalled = false;
118
+ /** Process-global guard — jiti loads extensions with moduleCache:false, so every
119
+ * session bind (parent + each subagent child) re-instantiates this module with
120
+ * fresh state; a module-level flag resets and stacks another handler per bind.
121
+ * Symbol.for survives the isolation, installing the handlers once per process. */
122
+ const CLEANUP_GUARD = Symbol.for("pi-svg-mcp:cleanup-installed");
118
123
  function installProcessCleanup() {
119
- if (cleanupInstalled)
124
+ const g = globalThis;
125
+ if (g[CLEANUP_GUARD])
120
126
  return;
121
- cleanupInstalled = true;
127
+ g[CLEANUP_GUARD] = true;
122
128
  process.on("exit", () => detach());
123
129
  for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"]) {
124
- process.on(sig, () => {
130
+ const handler = () => {
125
131
  detach();
132
+ // Remove our listener before re-raising: re-killing with the handler
133
+ // still installed re-delivers the signal to it forever (loop verified —
134
+ // ctrl+c wedged pi instead of exiting). Gone, the re-raise falls
135
+ // through to the default disposition and terminates.
136
+ process.removeListener(sig, handler);
126
137
  process.kill(process.pid, sig);
127
- });
138
+ };
139
+ process.on(sig, handler);
128
140
  }
129
141
  }
130
142
  function detach() {
@@ -151,15 +163,19 @@ export default function svgMcp(pi) {
151
163
  });
152
164
  // ── /svg-mcp command: inspect the extension (verb: system-prompt) ──
153
165
  pi.registerCommand("svg-mcp", {
154
- description: "svg-mcp extension — verb: system-prompt (show the injected directive)",
166
+ description: "svg-mcp extension — verbs: system-prompt (show the injected directive), install-config [path] (write mcp.json)",
155
167
  getArgumentCompletions: (prefix) => completeVerbs(prefix),
156
168
  handler: (args, ctx) => {
157
- const verb = args.trim();
169
+ const [verb, ...rest] = args.trim().split(/\s+/);
158
170
  if (verb === "" || verb === "system-prompt") {
159
171
  showDirective(ctx, "svg-mcp", SVG_DIAGRAM_DIRECTIVE, wantInstructions);
160
172
  return;
161
173
  }
162
- ctx.ui?.notify?.(`svg-mcp: unknown verb "${verb}". Try: system-prompt`, "warn");
174
+ if (verb === "install-config") {
175
+ installConfig(ctx, rest.join(" ") || undefined);
176
+ return;
177
+ }
178
+ ctx.ui?.notify?.(`svg-mcp: unknown verb "${verb}". Try: system-prompt, install-config`, "warn");
163
179
  },
164
180
  });
165
181
  // Combiner-served or manage=false: nothing to launch. The directive still applies.
@@ -224,12 +240,91 @@ export default function svgMcp(pi) {
224
240
  // directive this extension injects — the show-command pattern from pi-custom-system-prompt,
225
241
  // since `before_agent_start` injections are per-turn and never appear in Pi's own
226
242
  // `/system-prompt` (which reports the base prompt only).
227
- const COMMAND_VERBS = ["system-prompt"];
243
+ const COMMAND_VERBS = ["system-prompt", "install-config"];
228
244
  function completeVerbs(prefix) {
229
245
  const p = prefix.trim();
230
246
  const matches = COMMAND_VERBS.filter((v) => v.startsWith(p));
231
247
  return matches.length ? matches.map((v) => ({ value: v, label: v })) : null;
232
248
  }
249
+ // ── /svg-mcp install-config: write the pi-mcp-adapter mcp.json entry ──
250
+ // A USER-INVOKED write — on request, merge the svg-mcp entry into pi-mcp-adapter's
251
+ // mcp.json, wired for svg-mcp's optional inbound bearer auth:
252
+ //
253
+ // { "url": "…/mcp", "auth": "bearer", "bearerTokenEnv": "SVG_MCP_AUTH_TOKEN" }
254
+ //
255
+ // - auth:"bearer" → the adapter attaches `Authorization: Bearer <token>` (it gates the
256
+ // header on `auth === "bearer"`, NOT on bearerTokenEnv alone), AND makes
257
+ // supportsOAuth() false so a wrong/missing token surfaces as an honest 401 rather
258
+ // than a Dynamic-Client-Registration 404.
259
+ // - bearerTokenEnv → names the env var the token is read from at connect (nothing
260
+ // written to disk). The backend enforces only when SVG_MCP_AUTH_TOKEN is set on ITS
261
+ // side; unset ⇒ open, the env var is unset here too so no header is sent. The one
262
+ // shape is correct whether or not auth is enabled. Ported from mcp-companion's
263
+ // /mcp-combiner install-config.
264
+ function expandHome(p) {
265
+ if (p === "~")
266
+ return homedir();
267
+ if (p.startsWith("~/"))
268
+ return join(homedir(), p.slice(2));
269
+ return p;
270
+ }
271
+ /** The URL the adapter should reach svg-mcp at — 127.0.0.1:<port>/mcp with the same
272
+ * port defaults the backend serves on ($SVG_MCP_PORT, else 7731). */
273
+ function defaultSvgUrl() {
274
+ let port = DEFAULT_PORT;
275
+ const raw = env("SVG_MCP_PORT");
276
+ if (raw !== undefined) {
277
+ const n = Number(raw);
278
+ if (Number.isInteger(n) && n > 0)
279
+ port = n;
280
+ }
281
+ return `http://127.0.0.1:${port}/mcp`;
282
+ }
283
+ function installConfig(ctx, pathArg) {
284
+ const target = pathArg ? expandHome(pathArg) : join(homedir(), ".config", "mcp", "mcp.json");
285
+ const key = DEFAULT_NAME;
286
+ // Read + parse existing (tolerate absence; refuse to clobber non-JSON).
287
+ let doc = {};
288
+ if (existsSync(target)) {
289
+ try {
290
+ const parsed = JSON.parse(readFileSync(target, "utf8"));
291
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
292
+ ctx.ui?.notify?.(`svg-mcp: ${target} is not a JSON object; not overwriting`, "error");
293
+ return;
294
+ }
295
+ doc = parsed;
296
+ }
297
+ catch (e) {
298
+ ctx.ui?.notify?.(`svg-mcp: ${target} is not valid JSON; not overwriting (${e})`, "error");
299
+ return;
300
+ }
301
+ }
302
+ const servers = (doc.mcpServers ??= {});
303
+ const prev = (servers[key] ?? {});
304
+ const before = JSON.stringify(prev);
305
+ // Preserve any existing url and other fields; only ensure the auth-wiring keys.
306
+ servers[key] = {
307
+ ...prev,
308
+ url: typeof prev.url === "string" && prev.url ? prev.url : defaultSvgUrl(),
309
+ auth: "bearer",
310
+ bearerTokenEnv: "SVG_MCP_AUTH_TOKEN",
311
+ };
312
+ const existed = before !== "{}" && Object.keys(prev).length > 0;
313
+ const changed = before !== JSON.stringify(servers[key]);
314
+ try {
315
+ mkdirSync(dirname(target), { recursive: true });
316
+ writeFileSync(target, `${JSON.stringify(doc, null, 2)}\n`, "utf8");
317
+ }
318
+ catch (e) {
319
+ ctx.ui?.notify?.(`svg-mcp: failed to write ${target} (${e})`, "error");
320
+ return;
321
+ }
322
+ const what = !existed ? "added" : changed ? "updated" : "already configured";
323
+ ctx.ui?.notify?.(`svg-mcp: ${what} "${key}" in ${target}\n` +
324
+ `Sends "Authorization: Bearer $SVG_MCP_AUTH_TOKEN" when that env var is set ` +
325
+ `(auth:"bearer" both sends the token and suppresses OAuth probing). ` +
326
+ `Run /reload so pi-mcp-adapter re-reads mcp.json.`, "info");
327
+ }
233
328
  const SHOW_LIMIT = 1600;
234
329
  function showDirective(ctx, label, directive, enabled) {
235
330
  if (!directive) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geohar/pi-svg-mcp",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Pi extension: run the svg-mcp MCP server via sharedserver and inject the diagram-authoring directive. Pairs with pi-mcp-adapter, which makes svg-mcp's tools reachable from Pi.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/index.ts CHANGED
@@ -27,7 +27,8 @@
27
27
  // combiner-served. The sharedserver resolution is ported from plugins/opencode.
28
28
 
29
29
  import { spawnSync } from "node:child_process"
30
- import { existsSync, readFileSync } from "node:fs"
30
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
31
+ import { homedir } from "node:os"
31
32
  import { dirname, join } from "node:path"
32
33
  import { fileURLToPath } from "node:url"
33
34
  import type {
@@ -132,17 +133,29 @@ function resolveServeArgv(port: string): { argv: string[]; missing?: string } {
132
133
 
133
134
  type Attachment = { binary: string; name: string }
134
135
  let attachment: Attachment | null = null
135
- let cleanupInstalled = false
136
+
137
+ /** Process-global guard — jiti loads extensions with moduleCache:false, so every
138
+ * session bind (parent + each subagent child) re-instantiates this module with
139
+ * fresh state; a module-level flag resets and stacks another handler per bind.
140
+ * Symbol.for survives the isolation, installing the handlers once per process. */
141
+ const CLEANUP_GUARD = Symbol.for("pi-svg-mcp:cleanup-installed")
136
142
 
137
143
  function installProcessCleanup() {
138
- if (cleanupInstalled) return
139
- cleanupInstalled = true
144
+ const g = globalThis as Record<symbol, boolean | undefined>
145
+ if (g[CLEANUP_GUARD]) return
146
+ g[CLEANUP_GUARD] = true
140
147
  process.on("exit", () => detach())
141
148
  for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"] as NodeJS.Signals[]) {
142
- process.on(sig, () => {
149
+ const handler = () => {
143
150
  detach()
151
+ // Remove our listener before re-raising: re-killing with the handler
152
+ // still installed re-delivers the signal to it forever (loop verified —
153
+ // ctrl+c wedged pi instead of exiting). Gone, the re-raise falls
154
+ // through to the default disposition and terminates.
155
+ process.removeListener(sig, handler)
144
156
  process.kill(process.pid, sig)
145
- })
157
+ }
158
+ process.on(sig, handler)
146
159
  }
147
160
  }
148
161
 
@@ -171,15 +184,20 @@ export default function svgMcp(pi: ExtensionAPI): void {
171
184
 
172
185
  // ── /svg-mcp command: inspect the extension (verb: system-prompt) ──
173
186
  pi.registerCommand("svg-mcp", {
174
- description: "svg-mcp extension — verb: system-prompt (show the injected directive)",
187
+ description:
188
+ "svg-mcp extension — verbs: system-prompt (show the injected directive), install-config [path] (write mcp.json)",
175
189
  getArgumentCompletions: (prefix) => completeVerbs(prefix),
176
190
  handler: (args, ctx) => {
177
- const verb = args.trim()
191
+ const [verb, ...rest] = args.trim().split(/\s+/)
178
192
  if (verb === "" || verb === "system-prompt") {
179
193
  showDirective(ctx, "svg-mcp", SVG_DIAGRAM_DIRECTIVE, wantInstructions)
180
194
  return
181
195
  }
182
- ctx.ui?.notify?.(`svg-mcp: unknown verb "${verb}". Try: system-prompt`, "warn")
196
+ if (verb === "install-config") {
197
+ installConfig(ctx, rest.join(" ") || undefined)
198
+ return
199
+ }
200
+ ctx.ui?.notify?.(`svg-mcp: unknown verb "${verb}". Try: system-prompt, install-config`, "warn")
183
201
  },
184
202
  })
185
203
 
@@ -210,7 +228,10 @@ export default function svgMcp(pi: ExtensionAPI): void {
210
228
  const port = env("SVG_MCP_PORT") ?? String(DEFAULT_PORT)
211
229
  const { argv, missing } = resolveServeArgv(port)
212
230
  if (missing) {
213
- log("error", `\`${missing}\` not on PATH; install uv (https://docs.astral.sh/uv/), or PI_SVG_MCP_MANAGE=false`)
231
+ log(
232
+ "error",
233
+ `\`${missing}\` not on PATH; install uv (https://docs.astral.sh/uv/), or PI_SVG_MCP_MANAGE=false`,
234
+ )
214
235
  return
215
236
  }
216
237
 
@@ -256,13 +277,98 @@ export default function svgMcp(pi: ExtensionAPI): void {
256
277
  // directive this extension injects — the show-command pattern from pi-custom-system-prompt,
257
278
  // since `before_agent_start` injections are per-turn and never appear in Pi's own
258
279
  // `/system-prompt` (which reports the base prompt only).
259
- const COMMAND_VERBS = ["system-prompt"]
280
+ const COMMAND_VERBS = ["system-prompt", "install-config"]
260
281
  function completeVerbs(prefix: string): AutocompleteItem[] | null {
261
282
  const p = prefix.trim()
262
283
  const matches = COMMAND_VERBS.filter((v) => v.startsWith(p))
263
284
  return matches.length ? matches.map((v) => ({ value: v, label: v })) : null
264
285
  }
265
286
 
287
+ // ── /svg-mcp install-config: write the pi-mcp-adapter mcp.json entry ──
288
+ // A USER-INVOKED write — on request, merge the svg-mcp entry into pi-mcp-adapter's
289
+ // mcp.json, wired for svg-mcp's optional inbound bearer auth:
290
+ //
291
+ // { "url": "…/mcp", "auth": "bearer", "bearerTokenEnv": "SVG_MCP_AUTH_TOKEN" }
292
+ //
293
+ // - auth:"bearer" → the adapter attaches `Authorization: Bearer <token>` (it gates the
294
+ // header on `auth === "bearer"`, NOT on bearerTokenEnv alone), AND makes
295
+ // supportsOAuth() false so a wrong/missing token surfaces as an honest 401 rather
296
+ // than a Dynamic-Client-Registration 404.
297
+ // - bearerTokenEnv → names the env var the token is read from at connect (nothing
298
+ // written to disk). The backend enforces only when SVG_MCP_AUTH_TOKEN is set on ITS
299
+ // side; unset ⇒ open, the env var is unset here too so no header is sent. The one
300
+ // shape is correct whether or not auth is enabled. Ported from mcp-companion's
301
+ // /mcp-combiner install-config.
302
+
303
+ function expandHome(p: string): string {
304
+ if (p === "~") return homedir()
305
+ if (p.startsWith("~/")) return join(homedir(), p.slice(2))
306
+ return p
307
+ }
308
+
309
+ /** The URL the adapter should reach svg-mcp at — 127.0.0.1:<port>/mcp with the same
310
+ * port defaults the backend serves on ($SVG_MCP_PORT, else 7731). */
311
+ function defaultSvgUrl(): string {
312
+ let port = DEFAULT_PORT
313
+ const raw = env("SVG_MCP_PORT")
314
+ if (raw !== undefined) {
315
+ const n = Number(raw)
316
+ if (Number.isInteger(n) && n > 0) port = n
317
+ }
318
+ return `http://127.0.0.1:${port}/mcp`
319
+ }
320
+
321
+ function installConfig(ctx: ExtensionCommandContext, pathArg?: string): void {
322
+ const target = pathArg ? expandHome(pathArg) : join(homedir(), ".config", "mcp", "mcp.json")
323
+ const key = DEFAULT_NAME
324
+
325
+ // Read + parse existing (tolerate absence; refuse to clobber non-JSON).
326
+ let doc: Record<string, unknown> = {}
327
+ if (existsSync(target)) {
328
+ try {
329
+ const parsed = JSON.parse(readFileSync(target, "utf8"))
330
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
331
+ ctx.ui?.notify?.(`svg-mcp: ${target} is not a JSON object; not overwriting`, "error")
332
+ return
333
+ }
334
+ doc = parsed as Record<string, unknown>
335
+ } catch (e) {
336
+ ctx.ui?.notify?.(`svg-mcp: ${target} is not valid JSON; not overwriting (${e})`, "error")
337
+ return
338
+ }
339
+ }
340
+
341
+ const servers = (doc.mcpServers ??= {}) as Record<string, Record<string, unknown>>
342
+ const prev = (servers[key] ?? {}) as Record<string, unknown>
343
+ const before = JSON.stringify(prev)
344
+ // Preserve any existing url and other fields; only ensure the auth-wiring keys.
345
+ servers[key] = {
346
+ ...prev,
347
+ url: typeof prev.url === "string" && prev.url ? prev.url : defaultSvgUrl(),
348
+ auth: "bearer",
349
+ bearerTokenEnv: "SVG_MCP_AUTH_TOKEN",
350
+ }
351
+ const existed = before !== "{}" && Object.keys(prev).length > 0
352
+ const changed = before !== JSON.stringify(servers[key])
353
+
354
+ try {
355
+ mkdirSync(dirname(target), { recursive: true })
356
+ writeFileSync(target, `${JSON.stringify(doc, null, 2)}\n`, "utf8")
357
+ } catch (e) {
358
+ ctx.ui?.notify?.(`svg-mcp: failed to write ${target} (${e})`, "error")
359
+ return
360
+ }
361
+
362
+ const what = !existed ? "added" : changed ? "updated" : "already configured"
363
+ ctx.ui?.notify?.(
364
+ `svg-mcp: ${what} "${key}" in ${target}\n` +
365
+ `Sends "Authorization: Bearer $SVG_MCP_AUTH_TOKEN" when that env var is set ` +
366
+ `(auth:"bearer" both sends the token and suppresses OAuth probing). ` +
367
+ `Run /reload so pi-mcp-adapter re-reads mcp.json.`,
368
+ "info",
369
+ )
370
+ }
371
+
266
372
  const SHOW_LIMIT = 1600
267
373
  function showDirective(ctx: ExtensionCommandContext, label: string, directive: string, enabled: boolean): void {
268
374
  if (!directive) {