pmx-canvas 0.9.3 → 0.10.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/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/.github/extensions/pmx-canvas/tools.json +9278 -2014
- package/CHANGELOG.md +22 -1
- package/dist/canvas/index.js +1 -1
- package/dist/canvas/mcp-app.html +1 -1
- package/dist/types/mcp/canvas-access.d.ts +1 -12
- package/dist/types/mcp/resource-subscriptions.d.ts +7 -0
- package/dist/types/mcp/server.d.ts +2 -0
- package/dist/types/server/ax-wait.d.ts +1 -0
- package/dist/types/server/canvas-operations.d.ts +1 -0
- package/dist/types/server/index.d.ts +3 -3
- package/dist/types/server/operations/http.d.ts +10 -0
- package/dist/types/server/operations/index.d.ts +2 -2
- package/dist/types/server/operations/invoker.d.ts +4 -3
- package/dist/types/server/operations/mcp-contracts.d.ts +20 -0
- package/dist/types/server/operations/mcp.d.ts +2 -0
- package/dist/types/server/operations/ops/batch.d.ts +1 -0
- package/dist/types/server/operations/registry.d.ts +2 -2
- package/dist/types/server/operations/types.d.ts +12 -2
- package/dist/types/server/server.d.ts +2 -0
- package/dist/types/server/webpage-node.d.ts +1 -0
- package/docs/api-reference.md +2 -2
- package/docs/cli.md +1 -1
- package/docs/http-api.md +31 -0
- package/docs/mcp.md +93 -21
- package/docs/plans/plan-019-post-0.9-roadmap.md +123 -6
- package/docs/sdk.md +5 -2
- package/package.json +1 -1
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/plugin.json +1 -1
- package/plugins/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/tools.json +9278 -2014
- package/skills/pmx-canvas/SKILL.md +9 -4
- package/skills/pmx-canvas/references/full-reference.md +35 -2
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +7 -7
- package/src/client/canvas/ToolRail.tsx +2 -0
- package/src/mcp/canvas-access.ts +6 -47
- package/src/mcp/resource-subscriptions.ts +181 -0
- package/src/mcp/server.ts +185 -219
- package/src/server/ax-wait.ts +21 -6
- package/src/server/canvas-operations.ts +6 -2
- package/src/server/index.ts +12 -4
- package/src/server/operations/http.ts +69 -21
- package/src/server/operations/index.ts +8 -1
- package/src/server/operations/invoker.ts +53 -5
- package/src/server/operations/mcp-contracts.ts +339 -0
- package/src/server/operations/mcp.ts +153 -18
- package/src/server/operations/ops/ax-await.ts +18 -10
- package/src/server/operations/ops/ax-read.ts +2 -0
- package/src/server/operations/ops/ax-timeline.ts +2 -2
- package/src/server/operations/ops/batch.ts +27 -8
- package/src/server/operations/ops/nodes.ts +18 -3
- package/src/server/operations/registry.ts +24 -4
- package/src/server/operations/types.ts +16 -2
- package/src/server/server.ts +10 -0
- package/src/server/webpage-node.ts +9 -4
|
@@ -386,34 +386,37 @@ export function checkWebpageHop(originScope: AddressScope, hopScope: AddressScop
|
|
|
386
386
|
|
|
387
387
|
export async function fetchWebpageSnapshot(
|
|
388
388
|
inputUrl: string,
|
|
389
|
-
options: { resolveHost?: ResolveHost; timeoutMs?: number } = {},
|
|
389
|
+
options: { resolveHost?: ResolveHost; timeoutMs?: number; signal?: AbortSignal } = {},
|
|
390
390
|
): Promise<WebpageSnapshot> {
|
|
391
|
+
options.signal?.throwIfAborted();
|
|
391
392
|
const url = normalizeWebpageUrl(inputUrl);
|
|
392
393
|
const controller = new AbortController();
|
|
394
|
+
const signal = options.signal ? AbortSignal.any([options.signal, controller.signal]) : controller.signal;
|
|
393
395
|
const timeoutMs = options.timeoutMs ?? FETCH_TIMEOUT_MS;
|
|
394
396
|
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
395
397
|
const resolveHost = options.resolveHost ?? ((host) => lookup(host, { all: true }));
|
|
396
398
|
|
|
397
399
|
try {
|
|
398
400
|
// Redirects are followed by hand so every hop's host is checked before it is fetched.
|
|
399
|
-
let resolved = await abortable(resolveHop(new URL(url), resolveHost),
|
|
401
|
+
let resolved = await abortable(resolveHop(new URL(url), resolveHost), signal);
|
|
400
402
|
const originScope = resolved.scope;
|
|
401
403
|
let hopUrl = url;
|
|
402
404
|
let response: Response;
|
|
403
405
|
for (let hop = 0; ; hop++) {
|
|
404
406
|
checkWebpageHop(originScope, resolved.scope, hopUrl);
|
|
405
|
-
response = await requestHop(new URL(hopUrl), resolved,
|
|
407
|
+
response = await requestHop(new URL(hopUrl), resolved, signal);
|
|
406
408
|
const location = response.headers.get('location');
|
|
407
409
|
if (response.status < 300 || response.status >= 400 || !location) break;
|
|
408
410
|
await response.body?.cancel();
|
|
409
411
|
if (hop === MAX_REDIRECTS) throw new WebpageFetchError(`Too many redirects while fetching ${url}.`);
|
|
410
412
|
hopUrl = normalizeWebpageUrl(new URL(location, hopUrl).toString());
|
|
411
|
-
resolved = await abortable(resolveHop(new URL(hopUrl), resolveHost),
|
|
413
|
+
resolved = await abortable(resolveHop(new URL(hopUrl), resolveHost), signal);
|
|
412
414
|
}
|
|
413
415
|
|
|
414
416
|
const contentType = response.headers.get('content-type');
|
|
415
417
|
const responseUrl = hopUrl;
|
|
416
418
|
const body = await readBoundedBody(response);
|
|
419
|
+
signal.throwIfAborted();
|
|
417
420
|
|
|
418
421
|
if (!response.ok) {
|
|
419
422
|
throw new WebpageFetchError(`Request failed with ${response.status} ${response.statusText}`.trim(), {
|
|
@@ -450,6 +453,8 @@ export async function fetchWebpageSnapshot(
|
|
|
450
453
|
frameBlockedReason,
|
|
451
454
|
};
|
|
452
455
|
} catch (error) {
|
|
456
|
+
// Caller cancellation is not a fetch failure or our internal timeout.
|
|
457
|
+
options.signal?.throwIfAborted();
|
|
453
458
|
if (error instanceof WebpageFetchError) throw error;
|
|
454
459
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
455
460
|
throw new WebpageFetchError(`Timed out after ${timeoutMs}ms while fetching ${url}.`);
|