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.
Files changed (56) hide show
  1. package/.github/extensions/pmx-canvas/runtime.json +1 -1
  2. package/.github/extensions/pmx-canvas/tools.json +9278 -2014
  3. package/CHANGELOG.md +22 -1
  4. package/dist/canvas/index.js +1 -1
  5. package/dist/canvas/mcp-app.html +1 -1
  6. package/dist/types/mcp/canvas-access.d.ts +1 -12
  7. package/dist/types/mcp/resource-subscriptions.d.ts +7 -0
  8. package/dist/types/mcp/server.d.ts +2 -0
  9. package/dist/types/server/ax-wait.d.ts +1 -0
  10. package/dist/types/server/canvas-operations.d.ts +1 -0
  11. package/dist/types/server/index.d.ts +3 -3
  12. package/dist/types/server/operations/http.d.ts +10 -0
  13. package/dist/types/server/operations/index.d.ts +2 -2
  14. package/dist/types/server/operations/invoker.d.ts +4 -3
  15. package/dist/types/server/operations/mcp-contracts.d.ts +20 -0
  16. package/dist/types/server/operations/mcp.d.ts +2 -0
  17. package/dist/types/server/operations/ops/batch.d.ts +1 -0
  18. package/dist/types/server/operations/registry.d.ts +2 -2
  19. package/dist/types/server/operations/types.d.ts +12 -2
  20. package/dist/types/server/server.d.ts +2 -0
  21. package/dist/types/server/webpage-node.d.ts +1 -0
  22. package/docs/api-reference.md +2 -2
  23. package/docs/cli.md +1 -1
  24. package/docs/http-api.md +31 -0
  25. package/docs/mcp.md +93 -21
  26. package/docs/plans/plan-019-post-0.9-roadmap.md +123 -6
  27. package/docs/sdk.md +5 -2
  28. package/package.json +1 -1
  29. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
  30. package/plugins/pmx-canvas/plugin.json +1 -1
  31. package/plugins/pmx-canvas/runtime.json +1 -1
  32. package/plugins/pmx-canvas/tools.json +9278 -2014
  33. package/skills/pmx-canvas/SKILL.md +9 -4
  34. package/skills/pmx-canvas/references/full-reference.md +35 -2
  35. package/skills/pmx-canvas/references/installing-pmx-canvas.md +7 -7
  36. package/src/client/canvas/ToolRail.tsx +2 -0
  37. package/src/mcp/canvas-access.ts +6 -47
  38. package/src/mcp/resource-subscriptions.ts +181 -0
  39. package/src/mcp/server.ts +185 -219
  40. package/src/server/ax-wait.ts +21 -6
  41. package/src/server/canvas-operations.ts +6 -2
  42. package/src/server/index.ts +12 -4
  43. package/src/server/operations/http.ts +69 -21
  44. package/src/server/operations/index.ts +8 -1
  45. package/src/server/operations/invoker.ts +53 -5
  46. package/src/server/operations/mcp-contracts.ts +339 -0
  47. package/src/server/operations/mcp.ts +153 -18
  48. package/src/server/operations/ops/ax-await.ts +18 -10
  49. package/src/server/operations/ops/ax-read.ts +2 -0
  50. package/src/server/operations/ops/ax-timeline.ts +2 -2
  51. package/src/server/operations/ops/batch.ts +27 -8
  52. package/src/server/operations/ops/nodes.ts +18 -3
  53. package/src/server/operations/registry.ts +24 -4
  54. package/src/server/operations/types.ts +16 -2
  55. package/src/server/server.ts +10 -0
  56. 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), controller.signal);
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, controller.signal);
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), controller.signal);
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}.`);