@pinepaper.studio/mcp-server 1.6.16 → 1.6.18

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 (90) hide show
  1. package/README.de.md +1 -1
  2. package/README.es.md +1 -1
  3. package/README.fr.md +1 -1
  4. package/README.hi.md +1 -1
  5. package/README.ja.md +1 -1
  6. package/README.ko.md +1 -1
  7. package/README.md +142 -4
  8. package/README.pt-BR.md +1 -1
  9. package/README.zh-CN.md +1 -1
  10. package/dist/browser/puppeteer-controller.d.ts +61 -1
  11. package/dist/browser/puppeteer-controller.d.ts.map +1 -1
  12. package/dist/browser/puppeteer-controller.js +168 -6
  13. package/dist/browser/puppeteer-controller.js.map +1 -1
  14. package/dist/build-info.json +2 -2
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +75 -10
  18. package/dist/index.js.map +1 -1
  19. package/dist/ontology/ontology-validator.d.ts.map +1 -1
  20. package/dist/ontology/ontology-validator.js +9 -5
  21. package/dist/ontology/ontology-validator.js.map +1 -1
  22. package/dist/ontology/upstream-vocabulary.d.ts +2 -2
  23. package/dist/ontology/upstream-vocabulary.js +2 -2
  24. package/dist/tools/definitions.d.ts.map +1 -1
  25. package/dist/tools/definitions.js +198 -47
  26. package/dist/tools/definitions.js.map +1 -1
  27. package/dist/tools/engine-lists.d.ts +20 -0
  28. package/dist/tools/engine-lists.d.ts.map +1 -0
  29. package/dist/tools/engine-lists.js +86 -0
  30. package/dist/tools/engine-lists.js.map +1 -0
  31. package/dist/tools/engine-methods.d.ts.map +1 -1
  32. package/dist/tools/engine-methods.js +8 -0
  33. package/dist/tools/engine-methods.js.map +1 -1
  34. package/dist/tools/engine-surface.d.ts +1 -1
  35. package/dist/tools/engine-surface.d.ts.map +1 -1
  36. package/dist/tools/engine-surface.js +20 -4
  37. package/dist/tools/engine-surface.js.map +1 -1
  38. package/dist/tools/handlers/beats.d.ts +64 -0
  39. package/dist/tools/handlers/beats.d.ts.map +1 -0
  40. package/dist/tools/handlers/beats.js +83 -0
  41. package/dist/tools/handlers/beats.js.map +1 -0
  42. package/dist/tools/handlers/brand-intake.d.ts +95 -0
  43. package/dist/tools/handlers/brand-intake.d.ts.map +1 -0
  44. package/dist/tools/handlers/brand-intake.js +242 -0
  45. package/dist/tools/handlers/brand-intake.js.map +1 -0
  46. package/dist/tools/handlers.d.ts +23 -11
  47. package/dist/tools/handlers.d.ts.map +1 -1
  48. package/dist/tools/handlers.js +265 -14
  49. package/dist/tools/handlers.js.map +1 -1
  50. package/dist/tools/minimal-descriptions.d.ts.map +1 -1
  51. package/dist/tools/minimal-descriptions.js +5 -3
  52. package/dist/tools/minimal-descriptions.js.map +1 -1
  53. package/dist/tools/shape-params.d.ts +2 -2
  54. package/dist/tools/shape-params.js +2 -2
  55. package/dist/tools/stick-vocabulary.d.ts +1 -1
  56. package/dist/tools/stick-vocabulary.js +1 -1
  57. package/dist/tools/toolkits.d.ts.map +1 -1
  58. package/dist/tools/toolkits.js +2 -0
  59. package/dist/tools/toolkits.js.map +1 -1
  60. package/dist/types/code-generator.d.ts +63 -2
  61. package/dist/types/code-generator.d.ts.map +1 -1
  62. package/dist/types/code-generator.js +533 -49
  63. package/dist/types/code-generator.js.map +1 -1
  64. package/dist/types/schemas.d.ts +2199 -640
  65. package/dist/types/schemas.d.ts.map +1 -1
  66. package/dist/types/schemas.js +186 -50
  67. package/dist/types/schemas.js.map +1 -1
  68. package/dist/utils/a11y.d.ts +2 -0
  69. package/dist/utils/a11y.d.ts.map +1 -1
  70. package/dist/utils/a11y.js +1 -1
  71. package/dist/utils/a11y.js.map +1 -1
  72. package/dist/utils/beats.d.ts +58 -0
  73. package/dist/utils/beats.d.ts.map +1 -0
  74. package/dist/utils/beats.js +110 -0
  75. package/dist/utils/beats.js.map +1 -0
  76. package/dist/utils/mcp-log.d.ts +16 -0
  77. package/dist/utils/mcp-log.d.ts.map +1 -0
  78. package/dist/utils/mcp-log.js +10 -0
  79. package/dist/utils/mcp-log.js.map +1 -0
  80. package/dist/utils/progress.d.ts +28 -0
  81. package/dist/utils/progress.d.ts.map +1 -0
  82. package/dist/utils/progress.js +24 -0
  83. package/dist/utils/progress.js.map +1 -0
  84. package/dist/utils/svg-size.d.ts +22 -0
  85. package/dist/utils/svg-size.d.ts.map +1 -0
  86. package/dist/utils/svg-size.js +43 -0
  87. package/dist/utils/svg-size.js.map +1 -0
  88. package/dist/vendor/design/design-style.js +1 -1
  89. package/manifest.json +9 -1
  90. package/package.json +7 -4
@@ -29,6 +29,7 @@ export interface TextSample {
29
29
  bold: boolean;
30
30
  behind: Rgba | null;
31
31
  behindId?: string;
32
+ t?: number;
32
33
  }
33
34
  export interface ContrastFinding {
34
35
  id: string;
@@ -37,6 +38,7 @@ export interface ContrastFinding {
37
38
  required: number;
38
39
  large: boolean;
39
40
  against: string;
41
+ atSeconds?: number;
40
42
  }
41
43
  /**
42
44
  * WCAG AA: 4.5:1, or 3:1 for large text (>= 18 pt = 24 px, or >= 14 pt = 18.66 px bold).
@@ -1 +1 @@
1
- {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/utils/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,IAAI;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AAQrE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEjD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAGtD;AAED,8CAA8C;AAC9C,wBAAgB,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,CAG7C;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAWvE;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAElI;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAiB3L;AAED,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAE7F;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,mBAAmB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAkCtH"}
1
+ {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/utils/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,IAAI;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AAQrE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEjD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAGtD;AAED,8CAA8C;AAC9C,wBAAgB,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,CAG7C;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAWvE;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAe;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AAEtJ;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAiB3L;AAED,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAE7F;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,mBAAmB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAkCtH"}
@@ -60,7 +60,7 @@ export function checkContrast(texts, page) {
60
60
  const required = large ? 3 : 4.5;
61
61
  checked++;
62
62
  if (ratio < required) {
63
- failing.push({ id: t.id, content: t.content.slice(0, 40), ratio: Math.round(ratio * 100) / 100, required, large, against: t.behindId ? `item ${t.behindId}` : 'the page background' });
63
+ failing.push({ id: t.id, content: t.content.slice(0, 40), ratio: Math.round(ratio * 100) / 100, required, large, against: t.behindId ? `item ${t.behindId}` : 'the page background', ...(t.t !== undefined ? { atSeconds: t.t } : {}) });
64
64
  }
65
65
  }
66
66
  return { failing, checked, skipped, pageAssumed: !page || (page.a ?? 1) === 0 };
@@ -1 +1 @@
1
- {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../src/utils/a11y.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../src/utils/a11y.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * A beat grid from detected onsets and a tempo, and cut points on it — the
3
+ * server half of beat-snapped cuts (plan B2). The studio's analysis gives
4
+ * onsets and a bpm, not a grid; the grid's phase is fitted to the onsets.
5
+ */
6
+ export interface BeatGrid {
7
+ bpm: number;
8
+ period: number;
9
+ phase: number;
10
+ beats: number[];
11
+ }
12
+ /**
13
+ * The beat period is 60 / bpm; the phase is the circular mean of every
14
+ * onset's offset within a period (circular, so offsets either side of the
15
+ * beat — 0.49 and 0.01 of a 0.5 s beat — average to the beat, not to its
16
+ * middle).
17
+ */
18
+ export declare function beatGrid(onsets: number[], bpm: number, duration: number): BeatGrid;
19
+ /**
20
+ * Cut points: every beat, every bar (beatsPerBar beats), or every N beats,
21
+ * inside an optional range. Bars are counted on the WHOLE grid and then
22
+ * filtered: counting from the range's start moved the downbeats (range [1, 6]
23
+ * cut at 1, 3, 5 instead of 2, 4, 6).
24
+ */
25
+ export declare function cutPoints(beats: number[], every: 'beat' | 'bar' | number, beatsPerBar?: number, range?: [number, number]): number[];
26
+ export interface TempoCandidate {
27
+ bpm: number;
28
+ confidence: number;
29
+ phase: number;
30
+ weighted?: number;
31
+ }
32
+ /**
33
+ * A tempo prior (Ellis-style): log-Gaussian around 120 bpm, one octave wide.
34
+ * The fit score cannot choose between a tempo and its double — a real 120
35
+ * track scored 0.24 at 240 and 0.18 at 120 — and people tap near 120, so the
36
+ * ranking weights the score by this; 240 then ranks 0.15, 120 0.18.
37
+ */
38
+ export declare function tempoPrior(bpm: number, centre?: number, octaves?: number): number;
39
+ /** Candidates ranked by fit x prior; the reported confidence stays the fit. */
40
+ export declare function rankCandidates(cs: TempoCandidate[]): TempoCandidate[];
41
+ /**
42
+ * How well a tempo explains the onsets, 0-1: precision x recall — the share of
43
+ * onsets that land on a grid beat, times the share of grid beats that have an
44
+ * onset. Either alone picks the wrong tempo: every onset of a 120 track sits
45
+ * on a 240 grid (precision 1) but half of 240's beats are empty (recall 0.5);
46
+ * every beat of a 60 grid has an onset (recall 1) but half the onsets miss it.
47
+ * Phase coherence was tried and failed on off-beat hi-hats, which sit on the
48
+ * double-time grid and pull the true tempo's coherence down.
49
+ */
50
+ export declare function scoreTempo(onsets: number[], bpm: number, duration: number): TempoCandidate;
51
+ /**
52
+ * The detected tempo and its usual confusions (double, half, 3:4, 4:3, 2:3,
53
+ * 3:2), each scored against the onsets, best first. With a hint range, only
54
+ * tempos inside it are kept (the detected one is folded into it by
55
+ * doubling / halving when it lies outside).
56
+ */
57
+ export declare function tempoCandidates(onsets: number[], detected: number, duration: number, hint?: [number, number]): TempoCandidate[];
58
+ //# sourceMappingURL=beats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beats.d.ts","sourceRoot":"","sources":["../../src/utils/beats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;AAEzF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAalF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,EAAE,WAAW,SAAI,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAG9H;AAED,MAAM,WAAW,cAAc;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAErG;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAM,EAAE,OAAO,SAAI,GAAG,MAAM,CAGzE;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAGrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAa1F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,EAAE,CAuB/H"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * A beat grid from detected onsets and a tempo, and cut points on it — the
3
+ * server half of beat-snapped cuts (plan B2). The studio's analysis gives
4
+ * onsets and a bpm, not a grid; the grid's phase is fitted to the onsets.
5
+ */
6
+ /**
7
+ * The beat period is 60 / bpm; the phase is the circular mean of every
8
+ * onset's offset within a period (circular, so offsets either side of the
9
+ * beat — 0.49 and 0.01 of a 0.5 s beat — average to the beat, not to its
10
+ * middle).
11
+ */
12
+ export function beatGrid(onsets, bpm, duration) {
13
+ const period = 60 / bpm;
14
+ const offs = onsets.filter((t) => Number.isFinite(t) && t >= 0).map((t) => ((t % period) + period) % period);
15
+ let phase = 0;
16
+ if (offs.length) {
17
+ // Circular mean of the offsets, as angles on the beat circle.
18
+ const ang = offs.map((o) => (o / period) * 2 * Math.PI);
19
+ const mean = Math.atan2(ang.reduce((s, a) => s + Math.sin(a), 0), ang.reduce((s, a) => s + Math.cos(a), 0));
20
+ phase = ((((mean / (2 * Math.PI)) * period) % period) + period) % period;
21
+ }
22
+ const beats = [];
23
+ for (let t = phase; t <= duration + 1e-9; t += period)
24
+ beats.push(Math.round(t * 1000) / 1000);
25
+ return { bpm, period, phase: Math.round(phase * 1000) / 1000, beats };
26
+ }
27
+ /**
28
+ * Cut points: every beat, every bar (beatsPerBar beats), or every N beats,
29
+ * inside an optional range. Bars are counted on the WHOLE grid and then
30
+ * filtered: counting from the range's start moved the downbeats (range [1, 6]
31
+ * cut at 1, 3, 5 instead of 2, 4, 6).
32
+ */
33
+ export function cutPoints(beats, every, beatsPerBar = 4, range) {
34
+ const step = every === 'beat' ? 1 : every === 'bar' ? beatsPerBar : Math.max(1, Math.round(every));
35
+ return beats.filter((t, i) => i % step === 0 && (!range || (t >= range[0] - 1e-9 && t <= range[1] + 1e-9)));
36
+ }
37
+ /**
38
+ * A tempo prior (Ellis-style): log-Gaussian around 120 bpm, one octave wide.
39
+ * The fit score cannot choose between a tempo and its double — a real 120
40
+ * track scored 0.24 at 240 and 0.18 at 120 — and people tap near 120, so the
41
+ * ranking weights the score by this; 240 then ranks 0.15, 120 0.18.
42
+ */
43
+ export function tempoPrior(bpm, centre = 120, octaves = 1) {
44
+ const x = Math.log2(bpm / centre) / octaves;
45
+ return Math.exp(-0.5 * x * x);
46
+ }
47
+ /** Candidates ranked by fit x prior; the reported confidence stays the fit. */
48
+ export function rankCandidates(cs) {
49
+ return cs.map((c) => ({ ...c, weighted: Math.round(c.confidence * tempoPrior(c.bpm) * 100) / 100 }))
50
+ .sort((a, b) => (b.weighted - a.weighted) || Math.abs(a.bpm - 120) - Math.abs(b.bpm - 120));
51
+ }
52
+ /**
53
+ * How well a tempo explains the onsets, 0-1: precision x recall — the share of
54
+ * onsets that land on a grid beat, times the share of grid beats that have an
55
+ * onset. Either alone picks the wrong tempo: every onset of a 120 track sits
56
+ * on a 240 grid (precision 1) but half of 240's beats are empty (recall 0.5);
57
+ * every beat of a 60 grid has an onset (recall 1) but half the onsets miss it.
58
+ * Phase coherence was tried and failed on off-beat hi-hats, which sit on the
59
+ * double-time grid and pull the true tempo's coherence down.
60
+ */
61
+ export function scoreTempo(onsets, bpm, duration) {
62
+ const g = beatGrid(onsets, bpm, duration);
63
+ const ok = onsets.filter((t) => Number.isFinite(t) && t >= 0);
64
+ if (!ok.length || !g.beats.length)
65
+ return { bpm, confidence: 0, phase: g.phase };
66
+ const tol = Math.min(0.05, g.period * 0.12);
67
+ const onGrid = ok.filter((t) => { const d = ((((t - g.phase) % g.period) + g.period) % g.period); return Math.min(d, g.period - d) <= tol; }).length / ok.length;
68
+ // Recall over the span the onsets cover: a grid beat after the music's last
69
+ // onset (or before its first) is not a miss, and counting it favoured a
70
+ // slightly wrong tempo whose grid happened to end sooner.
71
+ const lo = Math.min(...ok) - tol, hi = Math.max(...ok) + tol;
72
+ const span = g.beats.filter((b) => b >= lo && b <= hi);
73
+ const covered = span.length ? span.filter((b) => ok.some((t) => Math.abs(t - b) <= tol)).length / span.length : 0;
74
+ return { bpm: Math.round(bpm * 10) / 10, confidence: Math.round(onGrid * covered * 100) / 100, phase: g.phase };
75
+ }
76
+ /**
77
+ * The detected tempo and its usual confusions (double, half, 3:4, 4:3, 2:3,
78
+ * 3:2), each scored against the onsets, best first. With a hint range, only
79
+ * tempos inside it are kept (the detected one is folded into it by
80
+ * doubling / halving when it lies outside).
81
+ */
82
+ export function tempoCandidates(onsets, detected, duration, hint) {
83
+ const ratios = [1, 2, 0.5, 0.75, 4 / 3, 2 / 3, 1.5];
84
+ let pool = ratios.map((r) => detected * r).filter((b) => b >= 40 && b <= 300);
85
+ if (hint) {
86
+ let f = detected;
87
+ while (f > hint[1] && f / 2 >= 20)
88
+ f /= 2;
89
+ while (f < hint[0] && f * 2 <= 400)
90
+ f *= 2;
91
+ pool = [...pool, f].filter((b) => b >= hint[0] - 1e-9 && b <= hint[1] + 1e-9);
92
+ }
93
+ // A ratio of a mis-detected tempo is only near the true one (162.2 x 3/4
94
+ // is 121.7, not 120 — a quarter-second drift over 20 s), so each is refined
95
+ // by a fine search within +-3%.
96
+ const refine = (b) => {
97
+ let best = scoreTempo(onsets, b, duration);
98
+ for (let x = b * 0.97; x <= b * 1.03; x += 0.1) {
99
+ if (hint && (x < hint[0] || x > hint[1]))
100
+ continue;
101
+ const c = scoreTempo(onsets, x, duration);
102
+ if (c.confidence > best.confidence)
103
+ best = c;
104
+ }
105
+ return best;
106
+ };
107
+ const seen = new Set();
108
+ return rankCandidates(pool.map(refine).filter((c) => (seen.has(c.bpm) ? false : (seen.add(c.bpm), true))));
109
+ }
110
+ //# sourceMappingURL=beats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beats.js","sourceRoot":"","sources":["../../src/utils/beats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP logging (notifications/message): events the agent's HOST should see
3
+ * but that belong in no single tool result, such as a browser session lost
4
+ * and relaunched between calls.
5
+ *
6
+ * Before this, the server declared no logging capability and every such event
7
+ * went to console.error, which an MCP client never shows. The server registers
8
+ * itself here at start; the SDK applies the client's logging/setLevel filter.
9
+ * With no server registered (tests, CLI), this is a no-op.
10
+ */
11
+ import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
12
+ type Level = 'debug' | 'info' | 'notice' | 'warning' | 'error';
13
+ export declare function setLogServer(s: Server | null): void;
14
+ export declare function mcpLog(level: Level, data: string | Record<string, unknown>): void;
15
+ export {};
16
+ //# sourceMappingURL=mcp-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-log.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAI/D,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEnD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGjF"}
@@ -0,0 +1,10 @@
1
+ let server = null;
2
+ export function setLogServer(s) {
3
+ server = s;
4
+ }
5
+ export function mcpLog(level, data) {
6
+ if (!server)
7
+ return;
8
+ server.sendLoggingMessage({ level, logger: 'pinepaper', data }).catch(() => { });
9
+ }
10
+ //# sourceMappingURL=mcp-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-log.js","sourceRoot":"","sources":["../../src/utils/mcp-log.ts"],"names":[],"mappings":"AAcA,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,CAAgB;IAC3C,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAY,EAAE,IAAsC;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAwC,CAAC,CAAC,CAAC;AACxH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * MCP progress for a running tool call (notifications/progress).
3
+ *
4
+ * `progress` is elapsed seconds: it must increase with every notification,
5
+ * and a time base is the one quantity that always does. What the work is
6
+ * actually doing goes in `message`. For a video export that is the studio's
7
+ * own percentage, read through `status`.
8
+ */
9
+ export interface ProgressNotifier {
10
+ progressToken: string | number;
11
+ send: (n: {
12
+ method: 'notifications/progress';
13
+ params: {
14
+ progressToken: string | number;
15
+ progress: number;
16
+ message: string;
17
+ };
18
+ }) => Promise<void>;
19
+ intervalMs: number;
20
+ label: string;
21
+ status?: () => Promise<{
22
+ percent: number;
23
+ } | null>;
24
+ now?: () => number;
25
+ }
26
+ /** Start reporting; returns stop(). */
27
+ export declare function startProgress(p: ProgressNotifier): () => void;
28
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,wBAAwB,CAAC;QAAC,MAAM,EAAE;YAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChJ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAkB7D"}
@@ -0,0 +1,24 @@
1
+ /** Start reporting; returns stop(). */
2
+ export function startProgress(p) {
3
+ const now = p.now ?? Date.now;
4
+ const started = now();
5
+ let last = 0;
6
+ let stopped = false;
7
+ const tick = async () => {
8
+ const progress = Math.max(last + 1, Math.round((now() - started) / 1000));
9
+ last = progress;
10
+ let message = `${p.label}: working (${progress} s)`;
11
+ try {
12
+ const s = p.status ? await p.status() : null;
13
+ if (s)
14
+ message = `exporting: ${Math.round(s.percent)}%`;
15
+ }
16
+ catch { /* keep the elapsed message */ }
17
+ if (stopped)
18
+ return;
19
+ await p.send({ method: 'notifications/progress', params: { progressToken: p.progressToken, progress, message } }).catch(() => { });
20
+ };
21
+ const timer = setInterval(() => { void tick(); }, p.intervalMs);
22
+ return () => { stopped = true; clearInterval(timer); };
23
+ }
24
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAiBA,uCAAuC;AACvC,MAAM,UAAU,aAAa,CAAC,CAAmB;IAC/C,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC1E,IAAI,GAAG,QAAQ,CAAC;QAChB,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC,KAAK,cAAc,QAAQ,KAAK,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7C,IAAI,CAAC;gBAAE,OAAO,GAAG,cAAc,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;QAC1C,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpI,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * An SVG sized in relative units renders as a speck.
3
+ *
4
+ * Icon sets (Iconify, and most "copy SVG" buttons) write the root as
5
+ * width="1em" height="1em" viewBox="0 0 24 24": sized to the surrounding
6
+ * font. There is no surrounding font on a canvas, and Paper.js reads "1em" as
7
+ * the number 1, so the icon came in about 5 px across while import reported
8
+ * success. When the root's size is relative (em / ex / rem / %) or missing,
9
+ * it is taken from the viewBox — and an icon-scale viewBox (under 64 px) is
10
+ * brought up to a usable size, since nobody places a 24 px glyph on a 1080 px
11
+ * canvas on purpose.
12
+ */
13
+ export interface SvgSizeFix {
14
+ from: string;
15
+ to: string;
16
+ reason: string;
17
+ }
18
+ export declare function normalizeSvgSize(svg: string): {
19
+ svg: string;
20
+ fix: SvgSizeFix | null;
21
+ };
22
+ //# sourceMappingURL=svg-size.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-size.d.ts","sourceRoot":"","sources":["../../src/utils/svg-size.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAKxE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CAoBrF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * An SVG sized in relative units renders as a speck.
3
+ *
4
+ * Icon sets (Iconify, and most "copy SVG" buttons) write the root as
5
+ * width="1em" height="1em" viewBox="0 0 24 24": sized to the surrounding
6
+ * font. There is no surrounding font on a canvas, and Paper.js reads "1em" as
7
+ * the number 1, so the icon came in about 5 px across while import reported
8
+ * success. When the root's size is relative (em / ex / rem / %) or missing,
9
+ * it is taken from the viewBox — and an icon-scale viewBox (under 64 px) is
10
+ * brought up to a usable size, since nobody places a 24 px glyph on a 1080 px
11
+ * canvas on purpose.
12
+ */
13
+ const ICON_TARGET = 200;
14
+ const ICON_MAX = 64;
15
+ export function normalizeSvgSize(svg) {
16
+ const m = /<svg\b[^>]*>/i.exec(svg);
17
+ if (!m)
18
+ return { svg, fix: null };
19
+ const tag = m[0];
20
+ const attr = (name) => new RegExp(`\\s${name}\\s*=\\s*["']([^"']*)["']`, 'i').exec(tag)?.[1];
21
+ const w = attr('width'), h = attr('height'), vb = attr('viewBox');
22
+ const relative = (v) => v === undefined || v.trim() === '' || /(em|ex|rem|%)\s*$/i.test(v.trim());
23
+ if (!relative(w) && !relative(h))
24
+ return { svg, fix: null };
25
+ const nums = vb?.trim().split(/[\s,]+/).map(Number);
26
+ if (!nums || nums.length !== 4 || !nums.every(Number.isFinite) || !(nums[2] > 0) || !(nums[3] > 0))
27
+ return { svg, fix: null };
28
+ let [vw, vh] = [nums[2], nums[3]];
29
+ const long = Math.max(vw, vh);
30
+ if (long < ICON_MAX) {
31
+ const k = ICON_TARGET / long;
32
+ vw *= k;
33
+ vh *= k;
34
+ }
35
+ const W = Math.round(vw * 100) / 100, H = Math.round(vh * 100) / 100;
36
+ let out = tag.replace(/\s(width|height)\s*=\s*["'][^"']*["']/gi, '');
37
+ out = out.replace(/^<svg\b/i, `<svg width="${W}" height="${H}"`);
38
+ return {
39
+ svg: svg.replace(tag, out),
40
+ fix: { from: `${w ?? '(none)'} x ${h ?? '(none)'}`, to: `${W} x ${H}`, reason: long < ICON_MAX ? `relative size; icon viewBox ${nums[2]}x${nums[3]} scaled to ${ICON_TARGET} px` : 'relative size; taken from the viewBox' },
41
+ };
42
+ }
43
+ //# sourceMappingURL=svg-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-size.js","sourceRoot":"","sources":["../../src/utils/svg-size.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /* GENERATED — DO NOT EDIT.
2
2
  *
3
3
  * Source: mcp-cloud/src/services/content-recipes.ts (DesignStyle union only)
4
- * sha256: 325b0a9d87717f8747cbad1b97b825b394ed7338207b0e1a6d9bafe369d429ae
4
+ * sha256: 5f36f68c0278045a212382ac43db12ef892556fe99df30728e1bdbbfe446f397
5
5
  * Generator: scripts/sync-design-systems.mjs
6
6
  *
7
7
  * Edit the TypeScript upstream and re-run the generator. A hand edit here is
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": "0.3",
3
3
  "name": "pinepaper-mcp",
4
- "version": "1.6.16",
4
+ "version": "1.6.18",
5
5
  "display_name": "PinePaper",
6
6
  "icon": "icon.png",
7
7
  "description": "Create animated graphics with AI using PinePaper Studio",
@@ -192,6 +192,14 @@
192
192
  "name": "pinepaper_group",
193
193
  "description": "Group a composite object's parts into ONE entity, ungroup, or break_apart an imported SVG into movable parts. {action: group|ungroup|break_apart, itemIds?, itemId?, groupName?, groupId?}"
194
194
  },
195
+ {
196
+ "name": "pinepaper_beat_cuts",
197
+ "description": "Cut points on the music: beats / bars from audio analysis, optionally splitting a clip at each. {source|beats, every?: beat|bar|N, range?, clipId?}"
198
+ },
199
+ {
200
+ "name": "pinepaper_query_mutations",
201
+ "description": "A property's keyframe series over time (t, frame, value, easing). {itemId, property?, range?: [from, to]}"
202
+ },
195
203
  {
196
204
  "name": "pinepaper_accessibility_check",
197
205
  "description": "Text contrast (WCAG 1.4.3 AA) and flashing (2.3.1, >3/sec) check of the live scene; heuristic. {checks?: [contrast, flash], duration?, fps?}"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinepaper.studio/mcp-server",
3
- "version": "1.6.16",
3
+ "version": "1.6.18",
4
4
  "mcpName": "io.github.pinepaper/mcp-server",
5
5
  "description": "MCP Server for PinePaper Studio - Create animated graphics with AI",
6
6
  "type": "module",
@@ -38,7 +38,7 @@
38
38
  "typecheck": "tsc --noEmit",
39
39
  "check:manifest": "bun scripts/check-manifest-tools.mjs",
40
40
  "fix:manifest": "bun scripts/check-manifest-tools.mjs --fix",
41
- "prepublishOnly": "bun run check:manifest && bun run check:design && bun run check:character && bun run check:engine-methods && bun run check:engine-surface && bun run check:shape-params && bun run check:stick-vocabulary && bun run check:ontology-vocabulary && bun run build",
41
+ "prepublishOnly": "bun run check:manifest && bun run check:design && bun run check:character && bun run check:engine-methods && bun run check:engine-surface && bun run check:shape-params && bun run check:stick-vocabulary && bun run check:ontology-vocabulary && bun run check:engine-lists && bun run build",
42
42
  "lint:errors": "eslint src --quiet",
43
43
  "sync:design": "node scripts/sync-design-systems.mjs",
44
44
  "check:design": "node scripts/sync-design-systems.mjs --check",
@@ -57,7 +57,10 @@
57
57
  "sync:character": "node scripts/sync-character-modules.mjs",
58
58
  "check:character": "node scripts/sync-character-modules.mjs --check",
59
59
  "sync:ontology-vocabulary": "node scripts/sync-ontology-vocabulary.mjs",
60
- "check:ontology-vocabulary": "node scripts/sync-ontology-vocabulary.mjs --check"
60
+ "check:ontology-vocabulary": "node scripts/sync-ontology-vocabulary.mjs --check",
61
+ "sync:engine-lists": "node scripts/sync-engine-lists.mjs",
62
+ "fix:engine-lists": "node scripts/sync-engine-lists.mjs",
63
+ "check:engine-lists": "node scripts/sync-engine-lists.mjs --check"
61
64
  },
62
65
  "keywords": [
63
66
  "mcp",
@@ -112,7 +115,7 @@
112
115
  "basic-ftp": "^5.3.1",
113
116
  "body-parser": "^2.3.0",
114
117
  "es-define-property": "npm:@socketregistry/es-define-property@^1.0.7",
115
- "fast-uri": "^3.1.7",
118
+ "fast-uri": "^3.1.8",
116
119
  "flatted": "^3.4.2",
117
120
  "function-bind": "npm:@socketregistry/function-bind@^1.0.7",
118
121
  "gopd": "npm:@socketregistry/gopd@^1.0.7",