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,243 @@
1
+ import { unstatedChartValues } from '../deck/numbers.js';
2
+ import { DeckValidationError } from '../deck/validate.js';
3
+ import { TEXT_SIZES } from '../template/manifest.js';
4
+ import { buildCatalog, describeCatalog, itemsProperty, outlineSchema, planPattern, readItems } from './catalog.js';
5
+ import { cleanText, suppliesText, systemPrompt, writeSlides } from './write.js';
6
+ export class PlanError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'PlanError';
10
+ }
11
+ }
12
+ const RTL_LANGUAGES = new Set(['ar', 'dv', 'fa', 'he', 'ps', 'sd', 'ug', 'ur', 'yi']);
13
+ export function directionOf(language) {
14
+ return RTL_LANGUAGES.has(language.toLowerCase().split('-')[0] ?? '') ? 'rtl' : 'ltr';
15
+ }
16
+ /** Whether a text contains any digit, in any script. */
17
+ export function hasFigures(text) {
18
+ return /\p{Nd}/u.test(text);
19
+ }
20
+ /** Binds a provider to a system prompt and an optional abort signal. */
21
+ export function asker(llm, system, signal) {
22
+ return (prompt, schema) => llm.generateJson(signal ? { system, prompt, schema, signal } : { system, prompt, schema });
23
+ }
24
+ const DENSITY_GUIDANCE = {
25
+ none: 'Do not plan any photos.',
26
+ low: 'Use a pattern with a photo on at most a quarter of the slides.',
27
+ medium: 'Use a pattern with a photo on about half of the slides.',
28
+ high: 'Prefer patterns with a photo wherever they suit the content.',
29
+ };
30
+ function briefText(brief) {
31
+ return [`Brief:\n${brief.prompt.trim()}`, brief.instructions?.trim() ? `Also respect:\n${brief.instructions.trim()}` : '']
32
+ .filter(Boolean)
33
+ .join('\n\n');
34
+ }
35
+ function outlinePrompt(brief, catalog, count, density, textScale = 1) {
36
+ const size = count.min === count.max ? `exactly ${count.min}` : `${count.min} to ${count.max}`;
37
+ return [
38
+ briefText(brief),
39
+ `Plan a deck of ${size} slides. Choose one pattern for each slide from this list ("?" marks an optional slot):`,
40
+ describeCatalog(catalog, textScale),
41
+ [
42
+ '- Open with an opening pattern and end with a closing pattern when the list has them.',
43
+ '- For a pattern with a row of items, set "items" to the number the content really has. Do not pad a list to fill a row.',
44
+ '- Choose a pattern only when the content can fill every required slot within its limits.',
45
+ '- Vary the patterns across the deck.',
46
+ `- ${DENSITY_GUIDANCE[density]}`,
47
+ ].join('\n'),
48
+ ].join('\n\n');
49
+ }
50
+ function writePrompt(brief, items, context) {
51
+ const slides = items.map(({ number, pattern, purpose }) => `s${number}: ${pattern.def.id}. ${purpose}`).join('\n');
52
+ return [
53
+ briefText(brief),
54
+ `Write the content of each slide of this deck:\n${slides}`,
55
+ ...suppliesText(items, context),
56
+ 'Fill every required property. Leave an optional property out when the slide is better without it.',
57
+ ].join('\n\n');
58
+ }
59
+ /** Everything the planning stages derive from a brief and the caller's options, so they cannot disagree. */
60
+ function planning(template, brief, options) {
61
+ const { manifest } = template;
62
+ const layout = options.layout ?? 'strict';
63
+ const language = brief.language ?? manifest.language ?? 'en';
64
+ const direction = brief.direction ?? directionOf(language);
65
+ const density = brief.imageDensity ?? 'medium';
66
+ const fields = brief.fields ?? {};
67
+ const numbers = options.numberPatterns ?? 'from-brief';
68
+ const figures = numbers === 'always' || (numbers === 'from-brief' && hasFigures(`${brief.prompt} ${brief.instructions ?? ''}`));
69
+ const textScale = TEXT_SIZES[brief.textSize ?? 'normal'] ?? 1;
70
+ const context = { layout, fields, icons: options.icons ?? [], assets: options.assets ?? [], imageDensity: density, figures, textScale };
71
+ if (options.patterns)
72
+ context.allow = options.patterns;
73
+ const catalog = buildCatalog(manifest, context);
74
+ if (catalog.patterns.length === 0) {
75
+ const reasons = catalog.excluded.map((entry) => `${entry.id} ${entry.reason}`).join('; ');
76
+ throw new PlanError(`No pattern of template "${manifest.name}" can be used${reasons ? `: ${reasons}` : ''}`);
77
+ }
78
+ return { layout, language, direction, density, fields, context, catalog, byId: new Map(catalog.patterns.map((pattern) => [pattern.def.id, pattern])) };
79
+ }
80
+ function readOutline(answer, byId) {
81
+ const raw = answer;
82
+ const list = Array.isArray(raw?.slides) ? raw.slides : [];
83
+ const problems = [];
84
+ const entries = list.map((item, index) => {
85
+ const raw = item;
86
+ const entry = { pattern: cleanText(raw?.pattern), purpose: cleanText(raw?.purpose) };
87
+ const pattern = byId.get(entry.pattern);
88
+ if (pattern) {
89
+ const count = readItems(pattern.def, raw?.items);
90
+ if (count.problem)
91
+ problems.push(`slide ${index + 1}: ${count.problem}`);
92
+ if (count.items !== undefined)
93
+ entry.items = count.items;
94
+ }
95
+ return entry;
96
+ });
97
+ const unknown = entries.filter((entry) => !byId.has(entry.pattern)).map((entry) => entry.pattern || '(empty)');
98
+ const outline = { title: cleanText(raw?.title), entries };
99
+ if (entries.length === 0)
100
+ return { ...outline, problem: 'the answer contained no slides' };
101
+ if (unknown.length > 0)
102
+ return { ...outline, problem: `these patterns are not in the list: ${[...new Set(unknown)].join(', ')}` };
103
+ if (problems.length > 0)
104
+ return { ...outline, problem: problems.join('; ') };
105
+ return outline;
106
+ }
107
+ /**
108
+ * First stage: decides which pattern each slide uses and the point it makes. One model call.
109
+ * The result is small and quick to produce, so it is the thing to show a person and let them change.
110
+ */
111
+ export async function planOutline(template, brief, options) {
112
+ const { language, density, catalog, byId, context } = planning(template, brief, options);
113
+ const count = typeof brief.slideCount === 'number'
114
+ ? { min: brief.slideCount, max: brief.slideCount }
115
+ : (brief.slideCount ?? { min: 6, max: 10 });
116
+ const ask = asker(options.llm, systemPrompt(language, 'brief'), options.signal);
117
+ options.onProgress?.({ stage: 'outline' });
118
+ const request = outlinePrompt(brief, catalog, count, density, context.textScale);
119
+ let outline = readOutline(await ask(request, outlineSchema(catalog, count)), byId);
120
+ if (outline.problem) {
121
+ const retry = `${request}\n\nYour previous answer could not be used: ${outline.problem}. Answer again using only the listed patterns.`;
122
+ outline = readOutline(await ask(retry, outlineSchema(catalog, count)), byId);
123
+ if (outline.problem)
124
+ throw new PlanError(`The model did not produce a usable outline: ${outline.problem}`);
125
+ }
126
+ return { version: 1, title: outline.title, brief, slides: outline.entries };
127
+ }
128
+ /**
129
+ * Changes a plan by instruction ("add a slide about pricing", "make it shorter", "in English").
130
+ * One model call. The instruction is kept with the brief, so facts it adds reach the writing stage.
131
+ */
132
+ export async function editPlan(template, plan, instruction, options) {
133
+ const request = instruction.trim();
134
+ const brief = { ...plan.brief, instructions: [plan.brief.instructions?.trim(), request].filter(Boolean).join('\n') };
135
+ const { language, density, catalog, byId, context } = planning(template, brief, options);
136
+ options.onProgress?.({ stage: 'outline' });
137
+ const prompt = [
138
+ briefText(plan.brief),
139
+ `The plan as it is now${plan.title ? ` ("${plan.title}")` : ''}, in the language with BCP 47 tag "${language}":\n${plan.slides
140
+ .map((slide, index) => `${index + 1}. ${slide.pattern}${slide.items !== undefined ? ` (${slide.items} items)` : ''}: ${slide.purpose}`)
141
+ .join('\n')}`,
142
+ `Requested change:\n${request}`,
143
+ `Return the whole plan after the change. Choose patterns from this list ("?" marks an optional slot):`,
144
+ describeCatalog(catalog, context.textScale),
145
+ [
146
+ '- Change only what the request asks for. Keep every other slide, its pattern, its purpose and its place.',
147
+ '- Choose a pattern only when the content can fill every required slot within its limits.',
148
+ `- ${DENSITY_GUIDANCE[density]}`,
149
+ ].join('\n'),
150
+ ].join('\n\n');
151
+ const schema = {
152
+ type: 'object',
153
+ properties: {
154
+ summary: { type: 'string', description: 'One sentence saying what you changed, written for the person who asked, in their language' },
155
+ language: { type: 'string', description: 'BCP 47 tag of the deck language after the change' },
156
+ title: { type: 'string', description: 'Title of the deck after the change' },
157
+ slides: {
158
+ type: 'array',
159
+ minItems: 1,
160
+ items: {
161
+ type: 'object',
162
+ properties: {
163
+ pattern: { type: 'string', enum: catalog.patterns.map((pattern) => pattern.def.id) },
164
+ purpose: { type: 'string', description: 'The one point this slide makes, in a sentence' },
165
+ ...itemsProperty(catalog),
166
+ },
167
+ required: ['pattern', 'purpose'],
168
+ },
169
+ },
170
+ },
171
+ required: ['summary', 'language', 'title', 'slides'],
172
+ };
173
+ const ask = asker(options.llm, systemPrompt(language, 'brief'), options.signal);
174
+ let answer = (await ask(prompt, schema));
175
+ let outline = readOutline(answer, byId);
176
+ if (outline.problem) {
177
+ answer = (await ask(`${prompt}\n\nYour previous answer could not be used: ${outline.problem}. Answer again using only the listed patterns.`, schema));
178
+ outline = readOutline(answer, byId);
179
+ if (outline.problem)
180
+ throw new PlanError(`The model did not produce a usable plan: ${outline.problem}`);
181
+ }
182
+ const nextLanguage = cleanText(answer?.language) || language;
183
+ if (nextLanguage !== language) {
184
+ brief.language = nextLanguage;
185
+ delete brief.direction; // follows the new language
186
+ }
187
+ delete brief.slideCount; // the plan itself now says how many slides there are
188
+ return { plan: { version: 1, title: outline.title || plan.title, brief, slides: outline.entries }, summary: cleanText(answer?.summary) };
189
+ }
190
+ /**
191
+ * Second stage: writes the content of every slot of a plan's slides, against a schema built for
192
+ * exactly that sequence. Drafts that break the template's limits go back to the model.
193
+ */
194
+ export async function writeDeck(template, plan, options) {
195
+ const { brief } = plan;
196
+ const { layout, language, direction, fields, context, byId } = planning(template, brief, options);
197
+ const missing = plan.slides.filter((slide) => !byId.has(slide.pattern)).map((slide) => slide.pattern);
198
+ if (missing.length > 0) {
199
+ throw new PlanError(`The plan uses patterns that cannot be filled with what was supplied: ${[...new Set(missing)].join(', ')}`);
200
+ }
201
+ const items = plan.slides.map((entry, index) => {
202
+ const usable = byId.get(entry.pattern);
203
+ // A row of items gets the slots of exactly the number the plan settled on.
204
+ const sized = entry.items !== undefined ? planPattern(usable.def, context, undefined, entry.items) : undefined;
205
+ return { number: index + 1, pattern: sized && 'pattern' in sized ? sized.pattern : usable, purpose: entry.purpose };
206
+ });
207
+ options.onProgress?.({ stage: 'write', slides: items.length });
208
+ const draft = await writeSlides({
209
+ ask: asker(options.llm, systemPrompt(language, 'brief'), options.signal),
210
+ request: writePrompt(brief, items, context),
211
+ jobs: items,
212
+ context,
213
+ assemble: (written) => {
214
+ const deck = {
215
+ version: 1,
216
+ language,
217
+ direction,
218
+ brief: [brief.prompt.trim(), brief.instructions?.trim()].filter(Boolean).join('\n'),
219
+ slides: items.map((item) => written.get(item.number) ?? { pattern: item.pattern.def.id, slots: {} }),
220
+ };
221
+ if (context.textScale !== 1)
222
+ deck.textScale = context.textScale;
223
+ if (plan.title)
224
+ deck.title = plan.title;
225
+ if (Object.keys(fields).length > 0)
226
+ deck.fields = fields;
227
+ return deck;
228
+ },
229
+ manifest: template.manifest,
230
+ layout,
231
+ maxRepairs: options.maxRepairs ?? 2,
232
+ onRepair: (attempt, issues) => options.onProgress?.({ stage: 'repair', attempt, issues }),
233
+ });
234
+ const errors = draft.issues.filter((issue) => issue.severity === 'error');
235
+ if (errors.length > 0)
236
+ throw new DeckValidationError(errors);
237
+ return { deck: draft.deck, warnings: [...draft.issues, ...unstatedChartValues(template.manifest, draft.deck)], outline: plan.slides };
238
+ }
239
+ /** Brief to deck spec in one go: {@link planOutline}, then {@link writeDeck}. */
240
+ export async function planDeck(template, brief, options) {
241
+ return writeDeck(template, await planOutline(template, brief, options), options);
242
+ }
243
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/plan/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Issue, LayoutMode } from '../deck/validate.ts';
2
+ import type { DeckSpec, SlideSpec, SlotValue } from '../deck/spec.ts';
3
+ import type { JsonSchema } from '../llm/provider.ts';
4
+ import type { TemplateManifest } from '../template/manifest.ts';
5
+ import type { CatalogContext, UsablePattern, WriteItem } from './catalog.ts';
6
+ export declare function systemPrompt(language: string, source: 'brief' | 'deck'): string;
7
+ export declare function cleanText(value: unknown): string;
8
+ /** Stable short id for a generated picture, so the same description maps to the same asset across edits. */
9
+ export declare function generatedAssetId(prompt: string): string;
10
+ /** Turns the model's answer for one slide into a slide spec, tidying text on the way. */
11
+ export declare function toSlide(pattern: UsablePattern, content: unknown, context: CatalogContext): SlideSpec;
12
+ /** The icon and picture lists appended to a writing prompt, when the slides being written can use them. */
13
+ export declare function suppliesText(items: WriteItem[], context: CatalogContext): string[];
14
+ export interface WriteJob extends WriteItem {
15
+ /** Slot values taken over unchanged from an existing slide. They are not offered to the model. */
16
+ carried?: Record<string, SlotValue>;
17
+ }
18
+ export interface WriteArgs {
19
+ ask: (prompt: string, schema: JsonSchema) => Promise<unknown>;
20
+ /** The writing prompt. Repair rounds append the previous answer and its problems. */
21
+ request: string;
22
+ jobs: WriteJob[];
23
+ context: CatalogContext;
24
+ /** Builds the whole deck from the freshly written slides, keyed by slide number. */
25
+ assemble: (written: Map<number, SlideSpec>) => DeckSpec;
26
+ manifest: TemplateManifest;
27
+ layout: LayoutMode;
28
+ maxRepairs: number;
29
+ onRepair?: (attempt: number, issues: number) => void;
30
+ }
31
+ /**
32
+ * Asks for the content of the given slides and checks the resulting deck. Problems on the
33
+ * written slides go back to the model, up to `maxRepairs` times. Returns the last draft with
34
+ * every issue it still has; the caller decides what is fatal.
35
+ */
36
+ export declare function writeSlides(args: WriteArgs): Promise<{
37
+ deck: DeckSpec;
38
+ issues: Issue[];
39
+ }>;
@@ -0,0 +1,179 @@
1
+ // The part of planning that planDeck and planEdit share: asking the model for the content of
2
+ // a set of slides, turning its answer into slide specs, and sending drafts back for repair.
3
+ import { validateDeck } from '../deck/validate.js';
4
+ import { isImageRef } from '../deck/spec.js';
5
+ import { readImageInfo } from '../util/image.js';
6
+ import { contentSchema } from './catalog.js';
7
+ export function systemPrompt(language, source) {
8
+ return [
9
+ "You write presentation decks for a fixed slide template. You do not design layouts: you choose from the template's slide patterns and write the content for their slots.",
10
+ '',
11
+ 'Rules:',
12
+ `- Write all slide text in the language with BCP 47 tag "${language}".`,
13
+ '- Character limits are hard and count spaces. Stay under them. Slides carry short text: a phrase beats a sentence.',
14
+ '- Plain text only: no markdown, no bullet characters, no line breaks inside a string, no placeholder text.',
15
+ source === 'brief'
16
+ ? '- Every figure on a slide must come from the brief. Never make up statistics, quotes or names.'
17
+ : '- Every figure on a slide must come from the request or from the deck as it is. Never make up statistics, quotes or names.',
18
+ source === 'brief' ? '- Follow the brief. Do not add topics it does not call for.' : '- Do what the request asks and nothing more.',
19
+ ].join('\n');
20
+ }
21
+ export function cleanText(value) {
22
+ return String(value ?? '')
23
+ .replace(/\s+/g, ' ')
24
+ .trim();
25
+ }
26
+ /** Stable short id for a generated picture, so the same description maps to the same asset across edits. */
27
+ export function generatedAssetId(prompt) {
28
+ let a = 0x811c9dc5;
29
+ let b = 0x01000193;
30
+ for (let i = 0; i < prompt.length; i++) {
31
+ const code = prompt.charCodeAt(i);
32
+ a = Math.imul(a ^ code, 0x01000193);
33
+ b = Math.imul(b ^ code, 0x85ebca6b) + 0x9e3779b9;
34
+ }
35
+ const hex = (value) => (value >>> 0).toString(16).padStart(8, '0');
36
+ return `gen-${hex(a)}${hex(b)}`;
37
+ }
38
+ /** Turns the model's answer for one slide into a slide spec, tidying text on the way. */
39
+ export function toSlide(pattern, content, context) {
40
+ const values = (typeof content === 'object' && content !== null ? content : {});
41
+ const slots = {};
42
+ for (const planned of pattern.slots) {
43
+ const value = values[planned.slot.name];
44
+ if (value === undefined || value === null)
45
+ continue;
46
+ if (planned.mode === 'text') {
47
+ slots[planned.slot.name] = cleanText(Array.isArray(value) ? value.join(' ') : value);
48
+ }
49
+ else if (planned.mode === 'paragraphs') {
50
+ const items = Array.isArray(value) ? value : String(value).split(/\r?\n/);
51
+ slots[planned.slot.name] = items.map((item) => cleanText(item).replace(/^[•\-–]\s+/, '')).filter(Boolean);
52
+ }
53
+ else if (planned.mode === 'table') {
54
+ const table = (typeof value === 'object' ? value : {});
55
+ const header = (Array.isArray(table.header) ? table.header : []).map(cleanText);
56
+ if (header.length === 0)
57
+ continue;
58
+ // A row the model made too short or too long is squared up rather than rejected.
59
+ const rows = (Array.isArray(table.rows) ? table.rows : [])
60
+ .filter((row) => Array.isArray(row))
61
+ .map((row) => header.map((_, index) => cleanText(row[index])));
62
+ slots[planned.slot.name] = { header, rows };
63
+ }
64
+ else if (planned.mode === 'chart') {
65
+ const chart = (typeof value === 'object' ? value : {});
66
+ const type = chart.type === 'bar' || chart.type === 'line' || chart.type === 'pie' ? chart.type : 'column';
67
+ const categories = (Array.isArray(chart.categories) ? chart.categories : []).map(cleanText);
68
+ const series = (Array.isArray(chart.series) ? chart.series : []).map((entry) => {
69
+ const item = (entry ?? {});
70
+ // Lengths are left as the model gave them: a short series is a problem to send back, not to pad.
71
+ return { name: cleanText(item.name), values: (Array.isArray(item.values) ? item.values : []).map(Number).filter(Number.isFinite) };
72
+ });
73
+ if (categories.length === 0 || series.length === 0)
74
+ continue;
75
+ slots[planned.slot.name] = chart.format === 'percent' ? { type, categories, series, format: 'percent' } : { type, categories, series };
76
+ }
77
+ else if (planned.mode === 'photo') {
78
+ if (typeof value !== 'object')
79
+ continue;
80
+ const photo = value;
81
+ const alt = cleanText(photo.alt);
82
+ const supplied = context.assets.find((asset) => asset.kind === 'photo' && asset.id === photo.asset);
83
+ const prompt = cleanText(photo.prompt);
84
+ let ref;
85
+ if (supplied)
86
+ ref = { asset: supplied.id };
87
+ else if (prompt)
88
+ ref = { asset: generatedAssetId(prompt), prompt };
89
+ if (!ref)
90
+ continue;
91
+ if (alt)
92
+ ref.alt = alt;
93
+ slots[planned.slot.name] = ref;
94
+ }
95
+ else {
96
+ slots[planned.slot.name] = { asset: cleanText(value) };
97
+ }
98
+ }
99
+ return { pattern: pattern.def.id, slots };
100
+ }
101
+ /** The icon and picture lists appended to a writing prompt, when the slides being written can use them. */
102
+ export function suppliesText(items, context) {
103
+ const usesIcons = items.some(({ pattern }) => pattern.slots.some((planned) => planned.mode === 'icon'));
104
+ const usesPictures = items.some(({ pattern }) => pattern.slots.some((planned) => planned.mode === 'photo' || planned.mode === 'graphic'));
105
+ return [
106
+ usesIcons ? `Icons to choose from:\n${context.icons.map((icon) => `- ${icon.id}: ${icon.description}`).join('\n')}` : '',
107
+ usesPictures && context.assets.length > 0
108
+ ? `Supplied pictures. Match a picture's proportions to the slide: a wide picture for a wide area.\n${context.assets
109
+ .map((asset) => `- ${asset.id} (${asset.kind}, ${proportions(asset.data)}): ${asset.description}`)
110
+ .join('\n')}`
111
+ : '',
112
+ ].filter(Boolean);
113
+ }
114
+ /** A picture's shape in words the model can match to a slide, e.g. "wide, 3.2:1". */
115
+ function proportions(data) {
116
+ try {
117
+ const { width, height } = readImageInfo(data);
118
+ const ratio = width / height;
119
+ const shape = ratio >= 2 ? 'wide' : ratio > 1.15 ? 'landscape' : ratio >= 0.87 ? 'square' : 'portrait';
120
+ return `${shape}, ${ratio >= 1 ? `${Math.round(ratio * 10) / 10}:1` : `1:${Math.round((1 / ratio) * 10) / 10}`}`;
121
+ }
122
+ catch {
123
+ return 'unknown size';
124
+ }
125
+ }
126
+ /** Ids the renderer will be able to resolve: supplied icons and assets, plus pictures that carry a description. */
127
+ function knownAssets(deck, context) {
128
+ const known = new Set([...context.icons.map((icon) => icon.id), ...context.assets.map((asset) => asset.id)]);
129
+ for (const slide of deck.slides) {
130
+ for (const value of Object.values(slide.slots)) {
131
+ if (isImageRef(value) && value.prompt)
132
+ known.add(value.asset);
133
+ }
134
+ }
135
+ return known;
136
+ }
137
+ /**
138
+ * Asks for the content of the given slides and checks the resulting deck. Problems on the
139
+ * written slides go back to the model, up to `maxRepairs` times. Returns the last draft with
140
+ * every issue it still has; the caller decides what is fatal.
141
+ */
142
+ export async function writeSlides(args) {
143
+ const { jobs, context } = args;
144
+ const schema = contentSchema(jobs, context);
145
+ const numbers = new Set(jobs.map((job) => job.number));
146
+ const build = (answer) => {
147
+ const content = (typeof answer === 'object' && answer !== null ? answer : {});
148
+ const written = new Map();
149
+ for (const job of jobs) {
150
+ const slide = toSlide(job.pattern, content[`s${job.number}`], context);
151
+ const next = { pattern: slide.pattern, slots: { ...job.carried, ...slide.slots } };
152
+ if (job.pattern.items !== undefined)
153
+ next.items = job.pattern.items;
154
+ written.set(job.number, next);
155
+ }
156
+ const deck = args.assemble(written);
157
+ return { deck, issues: validateDeck(args.manifest, deck, { layout: args.layout, assets: knownAssets(deck, context) }) };
158
+ };
159
+ // Only slides that were just written can be fixed by asking again.
160
+ const repairable = (issues) => issues.filter((issue) => issue.slide !== undefined && numbers.has(issue.slide));
161
+ let answer = await args.ask(args.request, schema);
162
+ let draft = build(answer);
163
+ for (let attempt = 1; attempt <= args.maxRepairs; attempt++) {
164
+ const problems = repairable(draft.issues);
165
+ if (problems.length === 0)
166
+ break;
167
+ args.onRepair?.(attempt, problems.length);
168
+ const repair = [
169
+ args.request,
170
+ `Your previous answer:\n${JSON.stringify(answer)}`,
171
+ `It has these problems:\n${problems.map((issue) => `- s${issue.slide}${issue.slot ? `.${issue.slot}` : ''}: ${issue.message}`).join('\n')}`,
172
+ 'Return the full content again with these problems fixed. Change nothing else.',
173
+ ].join('\n\n');
174
+ answer = await args.ask(repair, schema);
175
+ draft = build(answer);
176
+ }
177
+ return draft;
178
+ }
179
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/plan/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /** An Office Open XML package: a flat map of part path to bytes. */
2
+ export declare class PptxPackage {
3
+ private readonly files;
4
+ private constructor();
5
+ static load(bytes: Uint8Array): PptxPackage;
6
+ /** Cheap copy: the byte arrays are shared and must be treated as immutable. */
7
+ clone(): PptxPackage;
8
+ has(partPath: string): boolean;
9
+ paths(): string[];
10
+ read(partPath: string): Uint8Array;
11
+ readText(partPath: string): string;
12
+ write(partPath: string, data: Uint8Array | string): void;
13
+ delete(partPath: string): void;
14
+ save(): Uint8Array;
15
+ }
16
+ export interface Relationship {
17
+ id: string;
18
+ type: string;
19
+ target: string;
20
+ external: boolean;
21
+ }
22
+ /** `ppt/slides/slide1.xml` -> `ppt/slides/_rels/slide1.xml.rels`; the package root is `''`. */
23
+ export declare function relsPath(partPath: string): string;
24
+ /** Inverse of {@link relsPath}, or `undefined` when the path is not a relationships part. */
25
+ export declare function relsOwner(path: string): string | undefined;
26
+ export declare function readRels(pkg: PptxPackage, partPath: string): Relationship[];
27
+ export declare function writeRels(pkg: PptxPackage, partPath: string, rels: Relationship[]): void;
28
+ /** True when the relationship type ends with the given name, e.g. `isRelType(rel, 'slide')`. */
29
+ export declare function isRelType(rel: Relationship, name: string): boolean;
30
+ export declare function nextRelId(rels: Relationship[]): string;
31
+ /** Resolves a relationship target against the part that owns it. */
32
+ export declare function resolveTarget(partPath: string, target: string): string;
33
+ /** The relative target that points from one part to another. */
34
+ export declare function relativeTarget(fromPart: string, toPart: string): string;
35
+ export declare class ContentTypes {
36
+ private readonly defaults;
37
+ private readonly overrides;
38
+ static read(pkg: PptxPackage): ContentTypes;
39
+ ensureDefault(extension: string, contentType: string): void;
40
+ /** `partPath` is the package path without a leading slash. */
41
+ setOverride(partPath: string, contentType: string): void;
42
+ removeOverride(partPath: string): void;
43
+ save(pkg: PptxPackage): void;
44
+ }
45
+ /** Every part that can be reached from the package root by following relationships. */
46
+ export declare function reachableParts(pkg: PptxPackage): Set<string>;
47
+ /** Deletes parts nothing points to any more (old slides, their notes, unused media). */
48
+ export declare function pruneUnreachable(pkg: PptxPackage, types: ContentTypes): void;