slotdeck 0.0.0-stage → 0.1.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +486 -2
  3. package/dist/deck/numbers.d.ts +14 -0
  4. package/dist/deck/numbers.js +48 -0
  5. package/dist/deck/numbers.js.map +1 -0
  6. package/dist/deck/spec.d.ts +73 -0
  7. package/dist/deck/spec.js +21 -0
  8. package/dist/deck/spec.js.map +1 -0
  9. package/dist/deck/validate.d.ts +49 -0
  10. package/dist/deck/validate.js +189 -0
  11. package/dist/deck/validate.js.map +1 -0
  12. package/dist/generate.d.ts +53 -0
  13. package/dist/generate.js +44 -0
  14. package/dist/generate.js.map +1 -0
  15. package/dist/index.d.ts +42 -0
  16. package/dist/index.js +27 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/llm/gemini.d.ts +39 -0
  19. package/dist/llm/gemini.js +147 -0
  20. package/dist/llm/gemini.js.map +1 -0
  21. package/dist/llm/provider.d.ts +38 -0
  22. package/dist/llm/provider.js +2 -0
  23. package/dist/llm/provider.js.map +1 -0
  24. package/dist/node.d.ts +3 -0
  25. package/dist/node.js +31 -0
  26. package/dist/node.js.map +1 -0
  27. package/dist/plan/assets.d.ts +28 -0
  28. package/dist/plan/assets.js +80 -0
  29. package/dist/plan/assets.js.map +1 -0
  30. package/dist/plan/catalog.d.ts +106 -0
  31. package/dist/plan/catalog.js +302 -0
  32. package/dist/plan/catalog.js.map +1 -0
  33. package/dist/plan/edit.d.ts +31 -0
  34. package/dist/plan/edit.js +364 -0
  35. package/dist/plan/edit.js.map +1 -0
  36. package/dist/plan/plan.d.ts +106 -0
  37. package/dist/plan/plan.js +243 -0
  38. package/dist/plan/plan.js.map +1 -0
  39. package/dist/plan/write.d.ts +39 -0
  40. package/dist/plan/write.js +179 -0
  41. package/dist/plan/write.js.map +1 -0
  42. package/dist/pptx/package.d.ts +48 -0
  43. package/dist/pptx/package.js +202 -0
  44. package/dist/pptx/package.js.map +1 -0
  45. package/dist/pptx/presentation.d.ts +20 -0
  46. package/dist/pptx/presentation.js +31 -0
  47. package/dist/pptx/presentation.js.map +1 -0
  48. package/dist/pptx/xml.d.ts +23 -0
  49. package/dist/pptx/xml.js +67 -0
  50. package/dist/pptx/xml.js.map +1 -0
  51. package/dist/render/chart.d.ts +18 -0
  52. package/dist/render/chart.js +158 -0
  53. package/dist/render/chart.js.map +1 -0
  54. package/dist/render/extract.d.ts +11 -0
  55. package/dist/render/extract.js +65 -0
  56. package/dist/render/extract.js.map +1 -0
  57. package/dist/render/picture.d.ts +20 -0
  58. package/dist/render/picture.js +114 -0
  59. package/dist/render/picture.js.map +1 -0
  60. package/dist/render/render.d.ts +32 -0
  61. package/dist/render/render.js +247 -0
  62. package/dist/render/render.js.map +1 -0
  63. package/dist/render/repeat.d.ts +15 -0
  64. package/dist/render/repeat.js +118 -0
  65. package/dist/render/repeat.js.map +1 -0
  66. package/dist/render/table.d.ts +12 -0
  67. package/dist/render/table.js +84 -0
  68. package/dist/render/table.js.map +1 -0
  69. package/dist/render/text.d.ts +31 -0
  70. package/dist/render/text.js +210 -0
  71. package/dist/render/text.js.map +1 -0
  72. package/dist/store.d.ts +18 -0
  73. package/dist/store.js +23 -0
  74. package/dist/store.js.map +1 -0
  75. package/dist/template/change.d.ts +138 -0
  76. package/dist/template/change.js +406 -0
  77. package/dist/template/change.js.map +1 -0
  78. package/dist/template/check.d.ts +15 -0
  79. package/dist/template/check.js +97 -0
  80. package/dist/template/check.js.map +1 -0
  81. package/dist/template/draft.d.ts +47 -0
  82. package/dist/template/draft.js +276 -0
  83. package/dist/template/draft.js.map +1 -0
  84. package/dist/template/inspect.d.ts +53 -0
  85. package/dist/template/inspect.js +157 -0
  86. package/dist/template/inspect.js.map +1 -0
  87. package/dist/template/instruct.d.ts +26 -0
  88. package/dist/template/instruct.js +278 -0
  89. package/dist/template/instruct.js.map +1 -0
  90. package/dist/template/manifest.d.ts +226 -0
  91. package/dist/template/manifest.js +116 -0
  92. package/dist/template/manifest.js.map +1 -0
  93. package/dist/template/measure.d.ts +80 -0
  94. package/dist/template/measure.js +212 -0
  95. package/dist/template/measure.js.map +1 -0
  96. package/dist/template/sample.d.ts +17 -0
  97. package/dist/template/sample.js +96 -0
  98. package/dist/template/sample.js.map +1 -0
  99. package/dist/template/view.d.ts +46 -0
  100. package/dist/template/view.js +38 -0
  101. package/dist/template/view.js.map +1 -0
  102. package/dist/tools.d.ts +68 -0
  103. package/dist/tools.js +266 -0
  104. package/dist/tools.js.map +1 -0
  105. package/dist/util/image.d.ts +11 -0
  106. package/dist/util/image.js +58 -0
  107. package/dist/util/image.js.map +1 -0
  108. package/dist/util/png.d.ts +2 -0
  109. package/dist/util/png.js +50 -0
  110. package/dist/util/png.js.map +1 -0
  111. package/package.json +63 -4
@@ -0,0 +1,157 @@
1
+ import { isRelType, readRels, resolveTarget } from '../pptx/package.js';
2
+ import { readPresentation } from '../pptx/presentation.js';
3
+ import { NS, childElement, childElements, descendants, parseXml, path, rootElement } from '../pptx/xml.js';
4
+ import { readImageInfo } from '../util/image.js';
5
+ const IDENTITY = { sx: 1, sy: 1, tx: 0, ty: 0 };
6
+ /** Lists every shape on every slide: the raw material for writing a template manifest. */
7
+ export function inspectTemplate(pkg) {
8
+ const pres = readPresentation(pkg);
9
+ const slides = pres.slides.map((ref, index) => {
10
+ const rels = readRels(pkg, ref.part);
11
+ const targets = new Map(rels.map((rel) => [rel.id, resolveTarget(ref.part, rel.target)]));
12
+ const layoutRel = rels.find((rel) => isRelType(rel, 'slideLayout'));
13
+ const root = rootElement(parseXml(pkg.readText(ref.part)));
14
+ const tree = path(root, [NS.p, 'cSld'], [NS.p, 'spTree']);
15
+ const shapes = [];
16
+ if (tree)
17
+ walk(tree, IDENTITY, undefined);
18
+ function walk(container, transform, groupId) {
19
+ for (const el of childElements(container, NS.p)) {
20
+ const local = el.localName;
21
+ if (local !== 'sp' && local !== 'pic' && local !== 'grpSp' && local !== 'cxnSp' && local !== 'graphicFrame') {
22
+ continue;
23
+ }
24
+ const props = descendants(el, NS.p, 'cNvPr')[0];
25
+ const id = props?.getAttribute('id') ?? '';
26
+ const xfrm = local === 'grpSp'
27
+ ? path(el, [NS.p, 'grpSpPr'], [NS.a, 'xfrm'])
28
+ : local === 'graphicFrame'
29
+ ? childElement(el, NS.p, 'xfrm')
30
+ : path(el, [NS.p, 'spPr'], [NS.a, 'xfrm']);
31
+ const info = {
32
+ id,
33
+ name: props?.getAttribute('name') ?? '',
34
+ kind: 'other',
35
+ box: toBox(xfrm, transform, pres.slideWidth, pres.slideHeight),
36
+ };
37
+ if (groupId !== undefined)
38
+ info.groupId = groupId;
39
+ const placeholder = descendants(el, NS.p, 'ph')[0];
40
+ if (placeholder && local !== 'grpSp')
41
+ info.placeholder = placeholder.getAttribute('type') ?? 'body';
42
+ if (local === 'grpSp') {
43
+ info.kind = 'group';
44
+ shapes.push(info);
45
+ walk(el, compose(transform, xfrm), id);
46
+ continue;
47
+ }
48
+ if (local === 'pic') {
49
+ info.kind = 'picture';
50
+ const blipFill = childElement(el, NS.p, 'blipFill');
51
+ const blip = blipFill && childElement(blipFill, NS.a, 'blip');
52
+ const part = targets.get(blip?.getAttributeNS(NS.r, 'embed') ?? '');
53
+ const spPr = childElement(el, NS.p, 'spPr');
54
+ const preset = spPr && childElement(spPr, NS.a, 'prstGeom');
55
+ if (part) {
56
+ info.image = {
57
+ part,
58
+ cropped: !!(blipFill && hasCrop(childElement(blipFill, NS.a, 'srcRect'))),
59
+ geometry: preset?.getAttribute('prst') ?? 'custom',
60
+ };
61
+ if (pkg.has(part)) {
62
+ try {
63
+ const size = readImageInfo(pkg.read(part));
64
+ info.image.width = size.width;
65
+ info.image.height = size.height;
66
+ }
67
+ catch {
68
+ // Unknown image format: leave the size out.
69
+ }
70
+ }
71
+ }
72
+ }
73
+ else if (local === 'cxnSp') {
74
+ info.kind = 'line';
75
+ }
76
+ else if (local === 'graphicFrame') {
77
+ const table = descendants(el, NS.a, 'tbl')[0];
78
+ info.kind = table ? 'table' : 'other';
79
+ if (table) {
80
+ info.table = { columns: descendants(table, NS.a, 'gridCol').length, rows: descendants(table, NS.a, 'tr').length };
81
+ const sizes = new Set(descendants(table, NS.a, 'rPr').map((run) => Number(run.getAttribute('sz') ?? 0) / 100).filter((size) => size > 0));
82
+ if (sizes.size > 0)
83
+ info.fontSizes = [...sizes].sort((a, b) => b - a);
84
+ }
85
+ }
86
+ else {
87
+ info.kind = 'shape';
88
+ }
89
+ if (local === 'sp') {
90
+ const body = childElement(el, NS.p, 'txBody');
91
+ const paragraphs = body
92
+ ? childElements(body, NS.a, 'p').map((p) => descendants(p, NS.a, 't')
93
+ .map((t) => t.textContent ?? '')
94
+ .join(''))
95
+ : [];
96
+ if (paragraphs.some((text) => text.trim() !== '')) {
97
+ info.kind = 'text';
98
+ info.paragraphs = paragraphs;
99
+ const sizes = new Set();
100
+ for (const run of descendants(el, NS.a, 'rPr')) {
101
+ const size = run.getAttribute('sz');
102
+ if (size)
103
+ sizes.add(Number(size) / 100);
104
+ }
105
+ info.fontSizes = [...sizes].sort((a, b) => b - a);
106
+ }
107
+ }
108
+ shapes.push(info);
109
+ }
110
+ }
111
+ return {
112
+ number: index + 1,
113
+ part: ref.part,
114
+ layout: layoutRel ? resolveTarget(ref.part, layoutRel.target) : '',
115
+ shapes,
116
+ };
117
+ });
118
+ // 18 pt is what PowerPoint uses when a presentation states no default.
119
+ return { slideWidth: pres.slideWidth, slideHeight: pres.slideHeight, defaultFontSize: pres.defaultFontSize ?? 18, slides };
120
+ }
121
+ function hasCrop(srcRect) {
122
+ if (!srcRect)
123
+ return false;
124
+ return ['l', 't', 'r', 'b'].some((side) => Number(srcRect.getAttribute(side) ?? 0) !== 0);
125
+ }
126
+ function point(el, xName, yName) {
127
+ return { x: Number(el?.getAttribute(xName) ?? 0), y: Number(el?.getAttribute(yName) ?? 0) };
128
+ }
129
+ /** Maps a group's child coordinate space into its parent's space. */
130
+ function compose(parent, groupXfrm) {
131
+ if (!groupXfrm)
132
+ return parent;
133
+ const off = point(childElement(groupXfrm, NS.a, 'off'), 'x', 'y');
134
+ const ext = point(childElement(groupXfrm, NS.a, 'ext'), 'cx', 'cy');
135
+ const chOff = point(childElement(groupXfrm, NS.a, 'chOff'), 'x', 'y');
136
+ const chExt = point(childElement(groupXfrm, NS.a, 'chExt'), 'cx', 'cy');
137
+ const sx = chExt.x ? ext.x / chExt.x : 1;
138
+ const sy = chExt.y ? ext.y / chExt.y : 1;
139
+ return {
140
+ sx: parent.sx * sx,
141
+ sy: parent.sy * sy,
142
+ tx: parent.tx + parent.sx * (off.x - chOff.x * sx),
143
+ ty: parent.ty + parent.sy * (off.y - chOff.y * sy),
144
+ };
145
+ }
146
+ function toBox(xfrm, transform, slideWidth, slideHeight) {
147
+ const off = point(xfrm && childElement(xfrm, NS.a, 'off'), 'x', 'y');
148
+ const ext = point(xfrm && childElement(xfrm, NS.a, 'ext'), 'cx', 'cy');
149
+ const round = (value) => Math.round(value * 10000) / 10000;
150
+ return {
151
+ x: round((transform.tx + transform.sx * off.x) / slideWidth),
152
+ y: round((transform.ty + transform.sy * off.y) / slideHeight),
153
+ w: round((transform.sx * ext.x) / slideWidth),
154
+ h: round((transform.sy * ext.y) / slideHeight),
155
+ };
156
+ }
157
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/template/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { LlmProvider } from '../llm/provider.ts';
2
+ import type { Template } from '../render/render.ts';
3
+ import type { ChangeResult } from './change.ts';
4
+ export interface ManifestEditOptions {
5
+ llm: LlmProvider;
6
+ signal?: AbortSignal;
7
+ }
8
+ export interface ManifestEditResult extends ChangeResult {
9
+ /** What the model has to say to the person: what it could not do, or what it needs to know. Often empty. */
10
+ note: string;
11
+ }
12
+ /**
13
+ * The manifest as text: every pattern with its slots and their limits, next to the measured
14
+ * shapes of its slide that are not slots. This is what the model reads; an app can show it to
15
+ * its own chat model too.
16
+ */
17
+ export declare function describeManifest(template: Template): string;
18
+ /**
19
+ * Changes a template's manifest as an instruction asks: "drop the second page number on slide
20
+ * 13", "let the cards take up to six", "set the table text to 9 pt". Returns the new manifest
21
+ * with what was changed and what was refused; the template itself is not touched.
22
+ *
23
+ * One model call, and a second when the software refused some of the first answer, so the model
24
+ * can correct it (six cards do not fit; the most is five).
25
+ */
26
+ export declare function editManifest(template: Template, instruction: string, options: ManifestEditOptions): Promise<ManifestEditResult>;
@@ -0,0 +1,278 @@
1
+ import { changeManifest, describeSlot } from './change.js';
2
+ import { inspectTemplate } from './inspect.js';
3
+ import { ROLES, describeShape, frameFacts } from './measure.js';
4
+ const OPS = ['setSlot', 'addSlot', 'removeSlot', 'setRepeat', 'removeRepeat', 'setPattern', 'copyPattern', 'removePattern', 'addPattern', 'setManifest'];
5
+ /** What an operation's values may set. A table's text styles are spelled out so that every value is one word or number. */
6
+ const PROPERTIES = [
7
+ 'name',
8
+ 'id',
9
+ 'description',
10
+ 'figures',
11
+ 'role',
12
+ 'optional',
13
+ 'empty',
14
+ 'maxChars',
15
+ 'maxParagraphs',
16
+ 'deckField',
17
+ 'fontSize',
18
+ 'imageKind',
19
+ 'maxColumns',
20
+ 'maxRows',
21
+ 'maxCellChars',
22
+ 'headerSize',
23
+ 'headerBold',
24
+ 'headerColor',
25
+ 'headerFont',
26
+ 'bodySize',
27
+ 'bodyBold',
28
+ 'bodyColor',
29
+ 'bodyFont',
30
+ 'maxCategories',
31
+ 'maxSeries',
32
+ 'min',
33
+ 'max',
34
+ 'slide',
35
+ 'language',
36
+ 'direction',
37
+ 'alignOnDirectionChange',
38
+ ];
39
+ const SYSTEM = [
40
+ 'You maintain the manifest of a presentation template. The manifest says which slides of a pptx are reusable layouts ("patterns") and which shapes on them are slots that new content replaces.',
41
+ 'A person asks for a change in their own words. You answer with the smallest list of operations that does what they asked, and nothing they did not ask for.',
42
+ 'You never write positions, sizes or budgets the person did not state: the software measures the shapes and works those out.',
43
+ ].join(' ');
44
+ const GUIDE = [
45
+ 'Every operation has "op", "pattern", "shape", "slot" and "values". Give "" for a pattern, shape or slot the operation does not use. List in "values" only the properties that change, each as { property, value } with the value written as text ("6", "true", "drop").',
46
+ 'Operations:',
47
+ '- setSlot (pattern, slot): change a slot. Values: empty ("error" makes it required, "remove" optional, "keep" always leaves the template\'s own content, "drop" always removes the shape); maxChars, maxParagraphs (limits of a text); fontSize (a text size in points); deckField (ties a text to one value for the whole deck); name (renames the slot); imageKind ("photo", "icon" or "graphic"). For a table: maxColumns, maxRows, maxCellChars, headerSize, headerBold, headerColor (hex), headerFont, bodySize, bodyBold, bodyColor, bodyFont. For a chart: maxCategories, maxSeries.',
48
+ '- addSlot (pattern, shape): make a shape of the slide a slot, or give the shape of an existing slot another role. Values: role, and optionally name and optional ("true"). Roles: title, subtitle, text, list (one paragraph per item), number (a large figure), caption, photo, icon, graphic (a supplied chart or diagram picture), chart (a native editable chart in place of a picture), table, decoration (removed from every slide made with the pattern), fixed (stays exactly as designed).',
49
+ '- removeSlot (pattern, slot): the shape stays as the template shows it.',
50
+ '- setRepeat (pattern): how many items the row or grid of a pattern takes. Values: min, max.',
51
+ '- removeRepeat (pattern): the items stop being a row whose number can change.',
52
+ '- setPattern (pattern): Values: id (renames the pattern), description, figures ("true" offers it only when a brief has numbers).',
53
+ '- copyPattern (pattern): a second pattern from the same slide, to turn into a variant with further operations. Values: id of the new pattern, and optionally description.',
54
+ '- removePattern (pattern).',
55
+ '- addPattern: make a slide without a pattern into one. Values: slide, id, and optionally description.',
56
+ '- setManifest: settings of the whole template. Values: name, language, direction ("rtl" or "ltr"), alignOnDirectionChange ("flip" or "keep").',
57
+ 'A change to one item of a row (card1Icon) is made to that slot of every item, so give it once.',
58
+ "When a size, a table's columns or a row count changes, do not also set a character budget: the software measures the new one.",
59
+ 'Operations run in order, so a pattern made by copyPattern can be named by the operations after it.',
60
+ 'A person may speak of a slide by its number. The list shows which pattern each slide is.',
61
+ 'If something asked for cannot be done with these operations, leave it out and say so in "note", in the language the person wrote in. Otherwise "note" is "".',
62
+ ].join('\n');
63
+ // Models that fill a schema write its properties in alphabetical order. The names are chosen so
64
+ // that this order is also the order of thought: the operation, what it is about, then its values.
65
+ // Every property is required, so the model never has to decide whether to skip one.
66
+ // The arrays carry no length limits: Gemini refuses a schema whose nested limits multiply into too many states.
67
+ const SCHEMA = {
68
+ type: 'object',
69
+ properties: {
70
+ changes: {
71
+ type: 'array',
72
+ items: {
73
+ type: 'object',
74
+ properties: {
75
+ op: { type: 'string', enum: [...OPS] },
76
+ pattern: { type: 'string', description: 'id of the pattern, or ""' },
77
+ shape: { type: 'string', description: 'shape id without the #, or ""' },
78
+ slot: { type: 'string', description: 'name of the slot, or ""' },
79
+ values: {
80
+ type: 'array',
81
+ items: {
82
+ type: 'object',
83
+ properties: { property: { type: 'string', enum: [...PROPERTIES] }, value: { type: 'string' } },
84
+ required: ['property', 'value'],
85
+ },
86
+ },
87
+ },
88
+ required: ['op', 'pattern', 'shape', 'slot', 'values'],
89
+ },
90
+ },
91
+ note: { type: 'string' },
92
+ },
93
+ required: ['changes', 'note'],
94
+ };
95
+ /**
96
+ * The manifest as text: every pattern with its slots and their limits, next to the measured
97
+ * shapes of its slide that are not slots. This is what the model reads; an app can show it to
98
+ * its own chat model too.
99
+ */
100
+ export function describeManifest(template) {
101
+ const { manifest } = template;
102
+ const info = inspectTemplate(template.pkg);
103
+ const frame = frameFacts(info);
104
+ const used = new Set(manifest.patterns.map((pattern) => pattern.sourceSlide));
105
+ const unused = info.slides.map((slide) => slide.number).filter((number) => !used.has(number));
106
+ const blocks = manifest.patterns.map((pattern) => {
107
+ const slide = info.slides[pattern.sourceSlide - 1];
108
+ const shapes = new Map((slide?.shapes ?? []).map((shape) => [shape.id, shape]));
109
+ const slotted = new Set(pattern.slots.map((slot) => slot.shapeId));
110
+ const lines = [`Pattern "${pattern.id}", slide ${pattern.sourceSlide}${pattern.figures ? ', offered only for briefs with figures' : ''}. ${pattern.description}`];
111
+ const repeat = pattern.repeat;
112
+ if (repeat) {
113
+ const drawn = repeat.shapes.length;
114
+ lines.push(` ${repeat.columns ? `grid of ${drawn} ${repeat.item}s, ${repeat.columns} to a line` : `row of ${drawn} ${repeat.item}s`} (${repeat.slots.join(', ')}); takes ${repeat.min ?? drawn} to ${repeat.max ?? drawn}`);
115
+ }
116
+ lines.push(' slots:');
117
+ for (const slot of pattern.slots) {
118
+ const shape = shapes.get(slot.shapeId);
119
+ lines.push(` ${slot.name}: ${describeSlot(slot)} | ${shape ? describeShape(shape, info) : `#${slot.shapeId}, not on the slide`}`);
120
+ }
121
+ const others = (slide?.shapes ?? []).filter((shape) => !slotted.has(shape.id) && shape.kind !== 'group');
122
+ if (others.length > 0) {
123
+ lines.push(' other shapes on the slide, which stay as designed:');
124
+ for (const shape of others)
125
+ lines.push(` ${describeShape(shape, info)}${frame.isFrame(shape) ? ' (repeats across slides)' : ''}`);
126
+ }
127
+ return lines.join('\n');
128
+ });
129
+ return [
130
+ `Template "${manifest.name}"${manifest.language ? `, written in ${manifest.language}` : ''}, reads ${manifest.direction === 'rtl' ? 'right to left' : 'left to right'}; ${(manifest.alignOnDirectionChange ?? 'flip') === 'flip' ? 'mirrors' : 'keeps'} alignment in decks that read the other way. Positions and sizes are percentages of the slide.`,
131
+ ...blocks,
132
+ unused.length > 0 ? `Slides without a pattern: ${unused.join(', ')}.` : '',
133
+ ]
134
+ .filter(Boolean)
135
+ .join('\n\n');
136
+ }
137
+ const text = (value) => (typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined);
138
+ const oneOf = (value, options) => options.find((option) => option === value);
139
+ /** Turns one answered operation into a change, reading only the values that operation uses. */
140
+ function toChange(raw) {
141
+ const op = oneOf(raw.op, OPS);
142
+ const pattern = text(raw.pattern) ?? '';
143
+ const slot = text(raw.slot) ?? '';
144
+ const shape = (text(raw.shape) ?? '').replace(/^#/, '');
145
+ const values = new Map();
146
+ for (const entry of Array.isArray(raw.values) ? raw.values : []) {
147
+ const property = text(entry?.property);
148
+ const value = entry?.value;
149
+ if (property && (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'))
150
+ values.set(property, String(value).trim());
151
+ }
152
+ const str = (property) => text(values.get(property));
153
+ const num = (property) => {
154
+ const value = Number(values.get(property));
155
+ return values.has(property) && Number.isFinite(value) && value > 0 ? value : undefined;
156
+ };
157
+ const count = (property) => {
158
+ const value = num(property);
159
+ return value === undefined ? undefined : Math.round(value);
160
+ };
161
+ const bool = (property) => {
162
+ const value = values.get(property)?.toLowerCase();
163
+ return value === 'true' ? true : value === 'false' ? false : undefined;
164
+ };
165
+ const choice = (property, options) => oneOf(values.get(property), options);
166
+ const style = (prefix) => {
167
+ const result = {};
168
+ const size = num(`${prefix}Size`);
169
+ if (size !== undefined)
170
+ result.size = size;
171
+ const bold = bool(`${prefix}Bold`);
172
+ if (bold !== undefined)
173
+ result.bold = bold;
174
+ const color = str(`${prefix}Color`)?.replace(/^#/, '').toUpperCase();
175
+ if (color && /^[0-9A-F]{6}$/.test(color))
176
+ result.color = color;
177
+ const font = str(`${prefix}Font`);
178
+ if (font)
179
+ result.font = font;
180
+ return Object.keys(result).length > 0 ? result : undefined;
181
+ };
182
+ const put = (target, entries) => {
183
+ for (const [key, value] of Object.entries(entries))
184
+ if (value !== undefined)
185
+ target[key] = value;
186
+ return target;
187
+ };
188
+ switch (op) {
189
+ case 'setSlot':
190
+ return put({ op, pattern, slot }, {
191
+ name: str('name'),
192
+ description: str('description'),
193
+ empty: choice('empty', ['error', 'remove', 'keep', 'drop']),
194
+ maxChars: count('maxChars'),
195
+ maxParagraphs: count('maxParagraphs'),
196
+ deckField: str('deckField'),
197
+ fontSize: num('fontSize'),
198
+ imageKind: choice('imageKind', ['photo', 'icon', 'graphic']),
199
+ maxColumns: count('maxColumns'),
200
+ maxRows: count('maxRows'),
201
+ maxCellChars: count('maxCellChars'),
202
+ headerText: style('header'),
203
+ bodyText: style('body'),
204
+ maxCategories: count('maxCategories'),
205
+ maxSeries: count('maxSeries'),
206
+ });
207
+ case 'addSlot':
208
+ return put({ op, pattern, shape, role: (choice('role', ROLES) ?? values.get('role') ?? '') }, {
209
+ name: str('name'),
210
+ optional: bool('optional') === true ? true : undefined,
211
+ });
212
+ case 'removeSlot':
213
+ return { op, pattern, slot };
214
+ case 'setRepeat':
215
+ return put({ op, pattern }, { min: count('min'), max: count('max') });
216
+ case 'removeRepeat':
217
+ case 'removePattern':
218
+ return { op, pattern };
219
+ case 'setPattern':
220
+ return put({ op, pattern }, { id: str('id'), description: str('description'), figures: bool('figures') });
221
+ case 'copyPattern':
222
+ return put({ op, pattern, id: str('id') ?? '' }, { description: str('description') });
223
+ case 'addPattern':
224
+ return put({ op, slide: count('slide') ?? 0, id: str('id') ?? '' }, { description: str('description') });
225
+ case 'setManifest':
226
+ return put({ op }, {
227
+ name: str('name'),
228
+ language: str('language'),
229
+ direction: choice('direction', ['rtl', 'ltr']),
230
+ alignOnDirectionChange: choice('alignOnDirectionChange', ['flip', 'keep']),
231
+ });
232
+ default:
233
+ return undefined;
234
+ }
235
+ }
236
+ /**
237
+ * Changes a template's manifest as an instruction asks: "drop the second page number on slide
238
+ * 13", "let the cards take up to six", "set the table text to 9 pt". Returns the new manifest
239
+ * with what was changed and what was refused; the template itself is not touched.
240
+ *
241
+ * One model call, and a second when the software refused some of the first answer, so the model
242
+ * can correct it (six cards do not fit; the most is five).
243
+ */
244
+ export async function editManifest(template, instruction, options) {
245
+ const ask = async (prompt) => {
246
+ const answer = (await options.llm.generateJson({ system: SYSTEM, prompt, schema: SCHEMA, ...(options.signal ? { signal: options.signal } : {}) }));
247
+ const changes = (Array.isArray(answer?.changes) ? answer.changes : [])
248
+ .map((raw) => (raw && typeof raw === 'object' ? toChange(raw) : undefined))
249
+ .filter((change) => change !== undefined);
250
+ return { note: typeof answer?.note === 'string' ? answer.note.trim() : '', changes };
251
+ };
252
+ const prompt = [describeManifest(template), GUIDE, `The person asks:\n${instruction.trim()}`].join('\n\n');
253
+ const first = await ask(prompt);
254
+ let result = changeManifest(template, first.changes);
255
+ let note = first.note;
256
+ if (result.rejected.length > 0) {
257
+ const second = await ask([
258
+ prompt,
259
+ `You answered with these operations:\n${first.changes.map((change, index) => `${index + 1}. ${JSON.stringify(change)}`).join('\n')}`,
260
+ `The software made these:\n${result.applied.map((entry) => `${entry.index + 1}. ${entry.message}`).join('\n') || '(none)'}`,
261
+ `It refused these, and nothing of them was done:\n${result.rejected.map((entry) => `${entry.index + 1}. ${entry.reason}`).join('\n')}`,
262
+ 'Answer with operations that replace the refused ones only, so that what the person asked is done as far as it can be. Do not repeat operations that were made. Where the reason shows it cannot be done, give no operation and tell the person in "note" what the limit is.',
263
+ ].join('\n\n'));
264
+ if (second.changes.length > 0) {
265
+ const again = changeManifest({ pkg: template.pkg, manifest: result.manifest }, second.changes);
266
+ const offset = first.changes.length;
267
+ result = {
268
+ manifest: again.manifest,
269
+ applied: [...result.applied, ...again.applied.map((entry) => ({ ...entry, index: entry.index + offset }))],
270
+ rejected: again.rejected.map((entry) => ({ ...entry, index: entry.index + offset })),
271
+ issues: again.issues,
272
+ };
273
+ }
274
+ note = second.note || note;
275
+ }
276
+ return { ...result, note };
277
+ }
278
+ //# sourceMappingURL=instruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruct.js","sourceRoot":"","sources":["../../src/template/instruct.ts"],"names":[],"mappings":"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"}