@pinepaper.studio/mcp-server 1.6.15 → 1.6.17

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 (69) 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 +110 -4
  8. package/README.pt-BR.md +1 -1
  9. package/README.zh-CN.md +1 -1
  10. package/dist/build-info.json +2 -2
  11. package/dist/ontology/upstream-vocabulary.d.ts +2 -2
  12. package/dist/ontology/upstream-vocabulary.js +2 -2
  13. package/dist/tools/definitions.d.ts.map +1 -1
  14. package/dist/tools/definitions.js +164 -19
  15. package/dist/tools/definitions.js.map +1 -1
  16. package/dist/tools/engine-methods.d.ts.map +1 -1
  17. package/dist/tools/engine-methods.js +4 -0
  18. package/dist/tools/engine-methods.js.map +1 -1
  19. package/dist/tools/engine-surface.d.ts +1 -1
  20. package/dist/tools/engine-surface.d.ts.map +1 -1
  21. package/dist/tools/engine-surface.js +30 -9
  22. package/dist/tools/engine-surface.js.map +1 -1
  23. package/dist/tools/handlers/beats.d.ts +64 -0
  24. package/dist/tools/handlers/beats.d.ts.map +1 -0
  25. package/dist/tools/handlers/beats.js +83 -0
  26. package/dist/tools/handlers/beats.js.map +1 -0
  27. package/dist/tools/handlers/camera.d.ts.map +1 -1
  28. package/dist/tools/handlers/camera.js +11 -0
  29. package/dist/tools/handlers/camera.js.map +1 -1
  30. package/dist/tools/handlers/generate.d.ts +324 -0
  31. package/dist/tools/handlers/generate.d.ts.map +1 -0
  32. package/dist/tools/handlers/generate.js +264 -0
  33. package/dist/tools/handlers/generate.js.map +1 -0
  34. package/dist/tools/handlers.d.ts.map +1 -1
  35. package/dist/tools/handlers.js +79 -9
  36. package/dist/tools/handlers.js.map +1 -1
  37. package/dist/tools/minimal-descriptions.d.ts.map +1 -1
  38. package/dist/tools/minimal-descriptions.js +5 -0
  39. package/dist/tools/minimal-descriptions.js.map +1 -1
  40. package/dist/tools/shape-params.d.ts +2 -2
  41. package/dist/tools/shape-params.js +2 -2
  42. package/dist/tools/stick-vocabulary.d.ts +1 -1
  43. package/dist/tools/stick-vocabulary.js +1 -1
  44. package/dist/tools/toolkits.d.ts.map +1 -1
  45. package/dist/tools/toolkits.js +5 -0
  46. package/dist/tools/toolkits.js.map +1 -1
  47. package/dist/types/code-generator.d.ts +38 -0
  48. package/dist/types/code-generator.d.ts.map +1 -1
  49. package/dist/types/code-generator.js +552 -44
  50. package/dist/types/code-generator.js.map +1 -1
  51. package/dist/types/schemas.d.ts +614 -82
  52. package/dist/types/schemas.d.ts.map +1 -1
  53. package/dist/types/schemas.js +53 -21
  54. package/dist/types/schemas.js.map +1 -1
  55. package/dist/utils/a11y.d.ts +2 -0
  56. package/dist/utils/a11y.d.ts.map +1 -1
  57. package/dist/utils/a11y.js +1 -1
  58. package/dist/utils/a11y.js.map +1 -1
  59. package/dist/utils/beats.d.ts +58 -0
  60. package/dist/utils/beats.d.ts.map +1 -0
  61. package/dist/utils/beats.js +110 -0
  62. package/dist/utils/beats.js.map +1 -0
  63. package/dist/utils/svg-size.d.ts +22 -0
  64. package/dist/utils/svg-size.d.ts.map +1 -0
  65. package/dist/utils/svg-size.js +43 -0
  66. package/dist/utils/svg-size.js.map +1 -0
  67. package/dist/vendor/design/design-style.js +1 -1
  68. package/manifest.json +21 -1
  69. package/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ /**
2
+ * pinepaper_beat_cuts (plan B2): music → audio_beats analysis → a beat grid →
3
+ * cut points on beats or bars, and optionally a clip split at each one.
4
+ *
5
+ * Orchestrated here through the real tools (audio_beats analyze, media
6
+ * split), so their checks apply: large sources are staged, ids resolve,
7
+ * a refused split is named.
8
+ */
9
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
10
+ import { z } from 'zod';
11
+ import { type HandlerOptions } from '../handlers.js';
12
+ export declare const BeatCutsArgsSchema: z.ZodEffects<z.ZodObject<{
13
+ source: z.ZodOptional<z.ZodString>;
14
+ beats: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
15
+ bpm: z.ZodOptional<z.ZodNumber>;
16
+ bpmHint: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
17
+ every: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["beat", "bar"]>, z.ZodNumber]>>;
18
+ beatsPerBar: z.ZodOptional<z.ZodNumber>;
19
+ range: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
20
+ clipId: z.ZodOptional<z.ZodString>;
21
+ includeOnsets: z.ZodOptional<z.ZodBoolean>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ every?: number | "bar" | "beat" | undefined;
24
+ source?: string | undefined;
25
+ beats?: number[] | undefined;
26
+ range?: [number, number] | undefined;
27
+ bpm?: number | undefined;
28
+ bpmHint?: [number, number] | undefined;
29
+ includeOnsets?: boolean | undefined;
30
+ beatsPerBar?: number | undefined;
31
+ clipId?: string | undefined;
32
+ }, {
33
+ every?: number | "bar" | "beat" | undefined;
34
+ source?: string | undefined;
35
+ beats?: number[] | undefined;
36
+ range?: [number, number] | undefined;
37
+ bpm?: number | undefined;
38
+ bpmHint?: [number, number] | undefined;
39
+ includeOnsets?: boolean | undefined;
40
+ beatsPerBar?: number | undefined;
41
+ clipId?: string | undefined;
42
+ }>, {
43
+ every?: number | "bar" | "beat" | undefined;
44
+ source?: string | undefined;
45
+ beats?: number[] | undefined;
46
+ range?: [number, number] | undefined;
47
+ bpm?: number | undefined;
48
+ bpmHint?: [number, number] | undefined;
49
+ includeOnsets?: boolean | undefined;
50
+ beatsPerBar?: number | undefined;
51
+ clipId?: string | undefined;
52
+ }, {
53
+ every?: number | "bar" | "beat" | undefined;
54
+ source?: string | undefined;
55
+ beats?: number[] | undefined;
56
+ range?: [number, number] | undefined;
57
+ bpm?: number | undefined;
58
+ bpmHint?: [number, number] | undefined;
59
+ includeOnsets?: boolean | undefined;
60
+ beatsPerBar?: number | undefined;
61
+ clipId?: string | undefined;
62
+ }>;
63
+ export declare const beatHandlers: Record<string, (args: Record<string, unknown>, options: HandlerOptions) => Promise<CallToolResult>>;
64
+ //# sourceMappingURL=beats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beats.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/beats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIpG,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU2F,CAAC;AAO3H,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CA2D5H,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, getExecutionMode, handleToolCall } from '../handlers.js';
3
+ import { ErrorCodes } from '../../types/schemas.js';
4
+ import { beatGrid, cutPoints, tempoCandidates } from '../../utils/beats.js';
5
+ export const BeatCutsArgsSchema = z.object({
6
+ source: z.string().min(1).optional(),
7
+ beats: z.array(z.number().min(0)).optional(),
8
+ bpm: z.number().positive().max(400).optional(),
9
+ bpmHint: z.tuple([z.number().positive(), z.number().positive()]).optional(),
10
+ every: z.union([z.enum(['beat', 'bar']), z.number().int().min(1).max(64)]).optional(),
11
+ beatsPerBar: z.number().int().min(1).max(16).optional(),
12
+ range: z.tuple([z.number().min(0), z.number().min(0)]).optional(),
13
+ clipId: z.string().min(1).optional(),
14
+ includeOnsets: z.boolean().optional(),
15
+ }).refine((v) => !!(v.source || v.beats), { message: 'give source (music to analyse) or beats (times you already have)' });
16
+ const firstJson = (r) => {
17
+ const c = r.content?.[0];
18
+ try {
19
+ return c && 'text' in c ? JSON.parse(c.text) : null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ };
25
+ export const beatHandlers = {
26
+ 'pinepaper_beat_cuts': async (args, options) => {
27
+ const a = BeatCutsArgsSchema.parse(args);
28
+ let beats = a.beats ? [...a.beats].sort((x, y) => x - y) : null;
29
+ let bpm = a.bpm ?? null;
30
+ let grid = null;
31
+ if (!beats) {
32
+ if ((options.executionMode ?? getExecutionMode()) === 'code' || !options.executeInBrowser) {
33
+ return errorResult(ErrorCodes.VALIDATION_ERROR, 'beat_cuts analyses the music in the studio, so it needs a live studio — or pass beats (times in seconds) you already have.');
34
+ }
35
+ const analysed = await handleToolCall('pinepaper_audio_beats', { action: 'analyze', source: a.source }, options);
36
+ const body = firstJson(analysed);
37
+ const r = body?.result ?? body;
38
+ if (analysed.isError || !r || r.success === false || !Array.isArray(r.onsets) || !(r.bpm > 0)) {
39
+ return errorResult(ErrorCodes.EXECUTION_ERROR, `the music could not be analysed: ${(r && r.error) || JSON.stringify(body).slice(0, 300)}`);
40
+ }
41
+ const duration = Number(r.duration) || Math.max(...r.onsets, 0);
42
+ // The studio's tempo can lock onto a related one (a 120 track read as
43
+ // 162 = 4:3). Its usual confusions are scored against the onsets and
44
+ // the best is used — or the caller's bpm, or the best inside bpmHint.
45
+ const candidates = tempoCandidates(r.onsets, r.bpm, duration, a.bpmHint);
46
+ const chosen = a.bpm ?? candidates[0]?.bpm ?? r.bpm;
47
+ const g = beatGrid(r.onsets, chosen, duration);
48
+ beats = g.beats;
49
+ bpm = g.bpm;
50
+ const conf = candidates.find((c) => c.bpm === Math.round(chosen * 10) / 10)?.confidence ?? null;
51
+ grid = { bpm: g.bpm, phase: g.phase, period: Math.round(g.period * 1000) / 1000, confidence: conf, detected: { bpm: r.bpm, confidence: r.confidence }, duration: r.duration,
52
+ candidates: candidates.slice(0, 4), ...(a.includeOnsets ? { onsets: r.onsets } : {}), ...(a.bpm ? { bpmFrom: 'caller' } : a.bpmHint ? { bpmFrom: 'bpmHint' } : { bpmFrom: 'best candidate' }) };
53
+ if (!a.bpm && (conf === null || conf < 0.4)) {
54
+ grid.lowConfidence = true;
55
+ grid.warning = `the tempo is uncertain (confidence ${conf ?? 'unknown'} at ${g.bpm} bpm; the studio detected ${r.bpm} at ${r.confidence}). If you know it, pass bpm (or bpmHint: [min, max]); the candidates above are the likely alternatives.`;
56
+ }
57
+ }
58
+ const cuts = cutPoints(beats, a.every ?? 'beat', a.beatsPerBar ?? 4, a.range);
59
+ const out = { success: true, every: a.every ?? 'beat', ...(bpm ? { bpm } : {}), ...(grid ? { grid } : {}), cuts, count: cuts.length };
60
+ // Split a clip at each cut, in order: each split leaves the rest of the clip
61
+ // on the right-hand piece, which is where the next cut falls.
62
+ if (a.clipId && cuts.length) {
63
+ const pieces = [a.clipId];
64
+ let current = a.clipId;
65
+ const refused = [];
66
+ for (const at of cuts) {
67
+ const r = await handleToolCall('pinepaper_media', { action: 'split', id: current, at }, options);
68
+ const body = firstJson(r);
69
+ const res = body?.result ?? body;
70
+ if (r.isError || !res || res.success === false) {
71
+ const e = res?.error;
72
+ refused.push({ at, reason: typeof e === 'string' ? e : (e?.message ?? JSON.stringify(e ?? 'refused')) });
73
+ continue;
74
+ }
75
+ current = res.rightId ?? current;
76
+ pieces.push(current);
77
+ }
78
+ out.split = { clipId: a.clipId, pieces, made: pieces.length - 1, ...(refused.length ? { skipped: refused, note: 'cuts outside the clip (before its start or after its end) are skipped.' } : {}) };
79
+ }
80
+ return { content: [{ type: 'text', text: JSON.stringify(out, null, 2) }] };
81
+ },
82
+ };
83
+ //# sourceMappingURL=beats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beats.js","sourceRoot":"","sources":["../../../src/tools/handlers/beats.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAuB,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC9C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3E,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvD,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,kEAAkE,EAAE,CAAC,CAAC;AAE3H,MAAM,SAAS,GAAG,CAAC,CAAiB,EAAO,EAAE;IAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAwG;IAC/H,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC7C,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;QACxB,IAAI,IAAI,GAAmC,IAAI,CAAC;QAEhD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,gBAAgB,EAAE,CAAC,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC1F,OAAO,WAAW,CAAC,UAAU,CAAC,gBAAgB,EAAE,4HAA4H,CAAC,CAAC;YAChL,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;YACjH,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;YAC/B,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC9F,OAAO,WAAW,CAAC,UAAU,CAAC,eAAe,EAAE,oCAAoC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7I,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAChE,sEAAsE;YACtE,qEAAqE;YACrE,sEAAsE;YACtE,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAuC,CAAC,CAAC;YACzG,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;YACpD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;YAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC;YAChG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACzK,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;YAClM,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,OAAO,GAAG,sCAAsC,IAAI,IAAI,SAAS,OAAO,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,UAAU,yGAAyG,CAAC;YACnP,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC,KAAqC,CAAC,CAAC;QAC9G,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAE/J,6EAA6E;QAC7E,8DAA8D;QAC9D,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;YACvB,MAAM,OAAO,GAA0C,EAAE,CAAC;YAC1D,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;gBACjG,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;gBACjC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC/C,MAAM,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC;oBACrB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzG,SAAS;gBACX,CAAC;gBACD,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,GAAG,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wEAAwE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACrM,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACtF,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/camera.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAkC,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrF,MAAM,MAAM,aAAa,GAAG,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,cAAc,CAAC,CAAC;AAoF7B,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAsCxD,CAAC"}
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/camera.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAkC,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrF,MAAM,MAAM,aAAa,GAAG,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,cAAc,CAAC,CAAC;AAoF7B,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAuDxD,CAAC"}
@@ -85,6 +85,17 @@ async function dispatchCameraAction(args, options) {
85
85
  export const cameraHandlers = {
86
86
  pinepaper_camera_animate: async (args, options) => {
87
87
  const keyframes = args.keyframes;
88
+ // The handler takes its args unparsed, so a missing keyframes array
89
+ // reached JSON.parse(JSON.stringify(undefined)) and came back as a raw
90
+ // SyntaxError (external review, 1.6.15). Checked here and named.
91
+ if (!Array.isArray(keyframes) || keyframes.length === 0) {
92
+ return errorResult(ErrorCodes.INVALID_INPUT, 'keyframes is required: a non-empty array of { time (seconds), zoom?, center?: [x, y], pitch?, yaw?, easing? }. '
93
+ + 'For a single move without keyframes use pinepaper_camera (zoom / pan / move_to), or pinepaper_camera_director for a shot list.');
94
+ }
95
+ const badKey = keyframes.findIndex((k) => !k || typeof k !== 'object' || typeof k.time !== 'number' || !Number.isFinite(k.time) || k.time < 0);
96
+ if (badKey >= 0) {
97
+ return errorResult(ErrorCodes.INVALID_INPUT, `keyframes[${badKey}] needs a numeric time (seconds, >= 0); got ${JSON.stringify(keyframes[badKey])}.`);
98
+ }
88
99
  // Optional (retest): omitted, the camera runs to its last keyframe. The
89
100
  // last key's time is passed rather than nothing, so every studio does the
90
101
  // same — a newer engine infers it, an older one clamped at 2 s.
@@ -1 +1 @@
1
- {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../src/tools/handlers/camera.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../src/tools/handlers/camera.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Generated media through the PinePaper cloud (fal models behind one door):
3
+ * pinepaper_generate_estimate (free) and pinepaper_generate (charged).
4
+ *
5
+ * This is the one place the local server calls the hosted API. It needs a
6
+ * service-account key (PINEPAPER_API_KEY, `pp_sa_…`) with the render:create
7
+ * scope, and the org must have the ai-media feature — an internal beta, so a
8
+ * 403 is the ordinary answer for most keys and is said as such.
9
+ *
10
+ * The job shape is the cloud's (/v1/generate → 202 {job}, poll
11
+ * /v1/generate/{id}), shared by stills now and video next; video only needs a
12
+ * longer poll, so the timeout is a parameter, not a per-model constant.
13
+ */
14
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
15
+ import { z } from 'zod';
16
+ import { type HandlerOptions } from '../handlers.js';
17
+ export declare const GenerateEstimateArgsSchema: z.ZodEffects<z.ZodObject<{
18
+ model: z.ZodOptional<z.ZodString>;
19
+ useCase: z.ZodOptional<z.ZodString>;
20
+ input: z.ZodOptional<z.ZodObject<{
21
+ prompt: z.ZodString;
22
+ aspect: z.ZodOptional<z.ZodEnum<["16:9", "9:16", "1:1", "4:5"]>>;
23
+ n: z.ZodOptional<z.ZodNumber>;
24
+ seed: z.ZodOptional<z.ZodNumber>;
25
+ negativePrompt: z.ZodOptional<z.ZodString>;
26
+ imageUrls: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
27
+ seconds: z.ZodOptional<z.ZodNumber>;
28
+ text: z.ZodOptional<z.ZodArray<z.ZodObject<{
29
+ content: z.ZodString;
30
+ role: z.ZodOptional<z.ZodEnum<["headline", "subhead", "caption", "cta", "label"]>>;
31
+ font: z.ZodOptional<z.ZodString>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ content: string;
34
+ font?: string | undefined;
35
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
36
+ }, {
37
+ content: string;
38
+ font?: string | undefined;
39
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
40
+ }>, "many">>;
41
+ allowText: z.ZodOptional<z.ZodBoolean>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ prompt: string;
44
+ text?: {
45
+ content: string;
46
+ font?: string | undefined;
47
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
48
+ }[] | undefined;
49
+ seconds?: number | undefined;
50
+ seed?: number | undefined;
51
+ n?: number | undefined;
52
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
53
+ negativePrompt?: string | undefined;
54
+ imageUrls?: string[] | undefined;
55
+ allowText?: boolean | undefined;
56
+ }, {
57
+ prompt: string;
58
+ text?: {
59
+ content: string;
60
+ font?: string | undefined;
61
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
62
+ }[] | undefined;
63
+ seconds?: number | undefined;
64
+ seed?: number | undefined;
65
+ n?: number | undefined;
66
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
67
+ negativePrompt?: string | undefined;
68
+ imageUrls?: string[] | undefined;
69
+ allowText?: boolean | undefined;
70
+ }>>;
71
+ listModels: z.ZodOptional<z.ZodBoolean>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ input?: {
74
+ prompt: string;
75
+ text?: {
76
+ content: string;
77
+ font?: string | undefined;
78
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
79
+ }[] | undefined;
80
+ seconds?: number | undefined;
81
+ seed?: number | undefined;
82
+ n?: number | undefined;
83
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
84
+ negativePrompt?: string | undefined;
85
+ imageUrls?: string[] | undefined;
86
+ allowText?: boolean | undefined;
87
+ } | undefined;
88
+ model?: string | undefined;
89
+ useCase?: string | undefined;
90
+ listModels?: boolean | undefined;
91
+ }, {
92
+ input?: {
93
+ prompt: string;
94
+ text?: {
95
+ content: string;
96
+ font?: string | undefined;
97
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
98
+ }[] | undefined;
99
+ seconds?: number | undefined;
100
+ seed?: number | undefined;
101
+ n?: number | undefined;
102
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
103
+ negativePrompt?: string | undefined;
104
+ imageUrls?: string[] | undefined;
105
+ allowText?: boolean | undefined;
106
+ } | undefined;
107
+ model?: string | undefined;
108
+ useCase?: string | undefined;
109
+ listModels?: boolean | undefined;
110
+ }>, {
111
+ input?: {
112
+ prompt: string;
113
+ text?: {
114
+ content: string;
115
+ font?: string | undefined;
116
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
117
+ }[] | undefined;
118
+ seconds?: number | undefined;
119
+ seed?: number | undefined;
120
+ n?: number | undefined;
121
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
122
+ negativePrompt?: string | undefined;
123
+ imageUrls?: string[] | undefined;
124
+ allowText?: boolean | undefined;
125
+ } | undefined;
126
+ model?: string | undefined;
127
+ useCase?: string | undefined;
128
+ listModels?: boolean | undefined;
129
+ }, {
130
+ input?: {
131
+ prompt: string;
132
+ text?: {
133
+ content: string;
134
+ font?: string | undefined;
135
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
136
+ }[] | undefined;
137
+ seconds?: number | undefined;
138
+ seed?: number | undefined;
139
+ n?: number | undefined;
140
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
141
+ negativePrompt?: string | undefined;
142
+ imageUrls?: string[] | undefined;
143
+ allowText?: boolean | undefined;
144
+ } | undefined;
145
+ model?: string | undefined;
146
+ useCase?: string | undefined;
147
+ listModels?: boolean | undefined;
148
+ }>;
149
+ export declare const GenerateArgsSchema: z.ZodEffects<z.ZodObject<{
150
+ model: z.ZodOptional<z.ZodString>;
151
+ useCase: z.ZodOptional<z.ZodString>;
152
+ input: z.ZodObject<{
153
+ prompt: z.ZodString;
154
+ aspect: z.ZodOptional<z.ZodEnum<["16:9", "9:16", "1:1", "4:5"]>>;
155
+ n: z.ZodOptional<z.ZodNumber>;
156
+ seed: z.ZodOptional<z.ZodNumber>;
157
+ negativePrompt: z.ZodOptional<z.ZodString>;
158
+ imageUrls: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
159
+ seconds: z.ZodOptional<z.ZodNumber>;
160
+ text: z.ZodOptional<z.ZodArray<z.ZodObject<{
161
+ content: z.ZodString;
162
+ role: z.ZodOptional<z.ZodEnum<["headline", "subhead", "caption", "cta", "label"]>>;
163
+ font: z.ZodOptional<z.ZodString>;
164
+ }, "strip", z.ZodTypeAny, {
165
+ content: string;
166
+ font?: string | undefined;
167
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
168
+ }, {
169
+ content: string;
170
+ font?: string | undefined;
171
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
172
+ }>, "many">>;
173
+ allowText: z.ZodOptional<z.ZodBoolean>;
174
+ }, "strip", z.ZodTypeAny, {
175
+ prompt: string;
176
+ text?: {
177
+ content: string;
178
+ font?: string | undefined;
179
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
180
+ }[] | undefined;
181
+ seconds?: number | undefined;
182
+ seed?: number | undefined;
183
+ n?: number | undefined;
184
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
185
+ negativePrompt?: string | undefined;
186
+ imageUrls?: string[] | undefined;
187
+ allowText?: boolean | undefined;
188
+ }, {
189
+ prompt: string;
190
+ text?: {
191
+ content: string;
192
+ font?: string | undefined;
193
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
194
+ }[] | undefined;
195
+ seconds?: number | undefined;
196
+ seed?: number | undefined;
197
+ n?: number | undefined;
198
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
199
+ negativePrompt?: string | undefined;
200
+ imageUrls?: string[] | undefined;
201
+ allowText?: boolean | undefined;
202
+ }>;
203
+ brief: z.ZodOptional<z.ZodString>;
204
+ designRef: z.ZodOptional<z.ZodObject<{
205
+ kind: z.ZodString;
206
+ id: z.ZodString;
207
+ }, "strip", z.ZodTypeAny, {
208
+ id: string;
209
+ kind: string;
210
+ }, {
211
+ id: string;
212
+ kind: string;
213
+ }>>;
214
+ place: z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.ZodEnum<["cover", "contain"]>]>>;
215
+ timeoutSec: z.ZodOptional<z.ZodNumber>;
216
+ }, "strip", z.ZodTypeAny, {
217
+ input: {
218
+ prompt: string;
219
+ text?: {
220
+ content: string;
221
+ font?: string | undefined;
222
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
223
+ }[] | undefined;
224
+ seconds?: number | undefined;
225
+ seed?: number | undefined;
226
+ n?: number | undefined;
227
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
228
+ negativePrompt?: string | undefined;
229
+ imageUrls?: string[] | undefined;
230
+ allowText?: boolean | undefined;
231
+ };
232
+ place?: boolean | "contain" | "cover" | undefined;
233
+ model?: string | undefined;
234
+ useCase?: string | undefined;
235
+ brief?: string | undefined;
236
+ designRef?: {
237
+ id: string;
238
+ kind: string;
239
+ } | undefined;
240
+ timeoutSec?: number | undefined;
241
+ }, {
242
+ input: {
243
+ prompt: string;
244
+ text?: {
245
+ content: string;
246
+ font?: string | undefined;
247
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
248
+ }[] | undefined;
249
+ seconds?: number | undefined;
250
+ seed?: number | undefined;
251
+ n?: number | undefined;
252
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
253
+ negativePrompt?: string | undefined;
254
+ imageUrls?: string[] | undefined;
255
+ allowText?: boolean | undefined;
256
+ };
257
+ place?: boolean | "contain" | "cover" | undefined;
258
+ model?: string | undefined;
259
+ useCase?: string | undefined;
260
+ brief?: string | undefined;
261
+ designRef?: {
262
+ id: string;
263
+ kind: string;
264
+ } | undefined;
265
+ timeoutSec?: number | undefined;
266
+ }>, {
267
+ input: {
268
+ prompt: string;
269
+ text?: {
270
+ content: string;
271
+ font?: string | undefined;
272
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
273
+ }[] | undefined;
274
+ seconds?: number | undefined;
275
+ seed?: number | undefined;
276
+ n?: number | undefined;
277
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
278
+ negativePrompt?: string | undefined;
279
+ imageUrls?: string[] | undefined;
280
+ allowText?: boolean | undefined;
281
+ };
282
+ place?: boolean | "contain" | "cover" | undefined;
283
+ model?: string | undefined;
284
+ useCase?: string | undefined;
285
+ brief?: string | undefined;
286
+ designRef?: {
287
+ id: string;
288
+ kind: string;
289
+ } | undefined;
290
+ timeoutSec?: number | undefined;
291
+ }, {
292
+ input: {
293
+ prompt: string;
294
+ text?: {
295
+ content: string;
296
+ font?: string | undefined;
297
+ role?: "label" | "headline" | "subhead" | "caption" | "cta" | undefined;
298
+ }[] | undefined;
299
+ seconds?: number | undefined;
300
+ seed?: number | undefined;
301
+ n?: number | undefined;
302
+ aspect?: "1:1" | "16:9" | "9:16" | "4:5" | undefined;
303
+ negativePrompt?: string | undefined;
304
+ imageUrls?: string[] | undefined;
305
+ allowText?: boolean | undefined;
306
+ };
307
+ place?: boolean | "contain" | "cover" | undefined;
308
+ model?: string | undefined;
309
+ useCase?: string | undefined;
310
+ brief?: string | undefined;
311
+ designRef?: {
312
+ id: string;
313
+ kind: string;
314
+ } | undefined;
315
+ timeoutSec?: number | undefined;
316
+ }>;
317
+ /** Injectable for tests: the network and the clock. */
318
+ export declare const generateDeps: {
319
+ fetch: (url: string, init?: RequestInit) => Promise<Response>;
320
+ sleep: (ms: number) => Promise<void>;
321
+ now: () => number;
322
+ };
323
+ export declare const generateHandlers: Record<string, (args: Record<string, unknown>, options: HandlerOptions) => Promise<CallToolResult>>;
324
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA6BlF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKyI,CAAC;AAEjL,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQkG,CAAC;AAElI,uDAAuD;AACvD,eAAO,MAAM,YAAY;iBACV,MAAM,SAAS,WAAW;gBAC3B,MAAM;;CAEnB,CAAC;AAoGF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAqGhI,CAAC"}