@portel/photon 1.14.0 → 1.16.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 (90) hide show
  1. package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -1
  2. package/dist/auto-ui/beam/routes/api-config.js +29 -8
  3. package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
  4. package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -1
  5. package/dist/auto-ui/beam/routes/api-marketplace.js +3 -0
  6. package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -1
  7. package/dist/auto-ui/beam.d.ts.map +1 -1
  8. package/dist/auto-ui/beam.js +167 -48
  9. package/dist/auto-ui/beam.js.map +1 -1
  10. package/dist/auto-ui/bridge/index.d.ts.map +1 -1
  11. package/dist/auto-ui/bridge/index.js +578 -0
  12. package/dist/auto-ui/bridge/index.js.map +1 -1
  13. package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
  14. package/dist/auto-ui/bridge/renderers.js +7 -3
  15. package/dist/auto-ui/bridge/renderers.js.map +1 -1
  16. package/dist/auto-ui/bridge/types.d.ts +6 -0
  17. package/dist/auto-ui/bridge/types.d.ts.map +1 -1
  18. package/dist/auto-ui/frontend/pure-view.html +289 -0
  19. package/dist/auto-ui/photon-bridge.d.ts +11 -0
  20. package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
  21. package/dist/auto-ui/photon-bridge.js +75 -1
  22. package/dist/auto-ui/photon-bridge.js.map +1 -1
  23. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  24. package/dist/auto-ui/streamable-http-transport.js +29 -3
  25. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  26. package/dist/beam-form.bundle.js +5707 -0
  27. package/dist/beam-form.bundle.js.map +7 -0
  28. package/dist/beam.bundle.js +1947 -523
  29. package/dist/beam.bundle.js.map +4 -4
  30. package/dist/cli/commands/info.d.ts.map +1 -1
  31. package/dist/cli/commands/info.js +15 -2
  32. package/dist/cli/commands/info.js.map +1 -1
  33. package/dist/daemon/client.d.ts +5 -0
  34. package/dist/daemon/client.d.ts.map +1 -1
  35. package/dist/daemon/client.js +50 -0
  36. package/dist/daemon/client.js.map +1 -1
  37. package/dist/daemon/manager.d.ts +15 -0
  38. package/dist/daemon/manager.d.ts.map +1 -1
  39. package/dist/daemon/manager.js +142 -11
  40. package/dist/daemon/manager.js.map +1 -1
  41. package/dist/deploy/cloudflare.d.ts.map +1 -1
  42. package/dist/deploy/cloudflare.js +10 -2
  43. package/dist/deploy/cloudflare.js.map +1 -1
  44. package/dist/loader.d.ts.map +1 -1
  45. package/dist/loader.js +50 -3
  46. package/dist/loader.js.map +1 -1
  47. package/dist/marketplace-manager.d.ts +9 -0
  48. package/dist/marketplace-manager.d.ts.map +1 -1
  49. package/dist/marketplace-manager.js +115 -42
  50. package/dist/marketplace-manager.js.map +1 -1
  51. package/dist/meta.d.ts +51 -0
  52. package/dist/meta.d.ts.map +1 -0
  53. package/dist/meta.js +320 -0
  54. package/dist/meta.js.map +1 -0
  55. package/dist/photon-cli-runner.d.ts.map +1 -1
  56. package/dist/photon-cli-runner.js +30 -5
  57. package/dist/photon-cli-runner.js.map +1 -1
  58. package/dist/photon-doc-extractor.d.ts +1 -0
  59. package/dist/photon-doc-extractor.d.ts.map +1 -1
  60. package/dist/photon-doc-extractor.js +33 -21
  61. package/dist/photon-doc-extractor.js.map +1 -1
  62. package/dist/photons/docs/ui/docs.html +441 -0
  63. package/dist/photons/docs.photon.d.ts +237 -0
  64. package/dist/photons/docs.photon.d.ts.map +1 -0
  65. package/dist/photons/docs.photon.js +483 -0
  66. package/dist/photons/docs.photon.js.map +1 -0
  67. package/dist/photons/docs.photon.ts +536 -0
  68. package/dist/photons/slides.photon.d.ts +212 -0
  69. package/dist/photons/slides.photon.d.ts.map +1 -0
  70. package/dist/photons/slides.photon.js +355 -0
  71. package/dist/photons/slides.photon.js.map +1 -0
  72. package/dist/photons/slides.photon.ts +370 -0
  73. package/dist/photons/spreadsheet/ui/spreadsheet.html +779 -0
  74. package/dist/photons/spreadsheet.photon.d.ts +554 -0
  75. package/dist/photons/spreadsheet.photon.d.ts.map +1 -0
  76. package/dist/photons/spreadsheet.photon.js +1050 -0
  77. package/dist/photons/spreadsheet.photon.js.map +1 -0
  78. package/dist/photons/spreadsheet.photon.ts +1239 -0
  79. package/dist/server.d.ts.map +1 -1
  80. package/dist/server.js +17 -57
  81. package/dist/server.js.map +1 -1
  82. package/dist/shared/error-handler.d.ts +8 -0
  83. package/dist/shared/error-handler.d.ts.map +1 -1
  84. package/dist/shared/error-handler.js +50 -0
  85. package/dist/shared/error-handler.js.map +1 -1
  86. package/dist/shared-utils.d.ts +3 -2
  87. package/dist/shared-utils.d.ts.map +1 -1
  88. package/dist/shared-utils.js +4 -3
  89. package/dist/shared-utils.js.map +1 -1
  90. package/package.json +7 -2
@@ -0,0 +1,212 @@
1
+ export default class Slides {
2
+ protected settings: {
3
+ /** @property Directory where slide markdown files are stored */
4
+ folder: string;
5
+ };
6
+ memory: {
7
+ get<T>(key: string): Promise<T | null>;
8
+ set(key: string, value: unknown): Promise<void>;
9
+ };
10
+ emit: (payload: {
11
+ event: string;
12
+ data: unknown;
13
+ }) => void;
14
+ instanceName: string;
15
+ private marp;
16
+ private get defaultFolder();
17
+ private get deckPath();
18
+ onInitialize(): Promise<void>;
19
+ /**
20
+ * Open the presentation UI
21
+ * @ui dashboard
22
+ * @autorun
23
+ */
24
+ main(): Promise<{
25
+ type: string;
26
+ html: any;
27
+ css: any;
28
+ total: any;
29
+ current: number;
30
+ markdown: string;
31
+ }>;
32
+ /**
33
+ * Move to the next slide
34
+ * @ui dashboard
35
+ */
36
+ next(): Promise<{
37
+ type: string;
38
+ index: any;
39
+ isEnd: boolean;
40
+ }>;
41
+ /**
42
+ * Move to the previous slide
43
+ * @ui dashboard
44
+ */
45
+ previous(): Promise<{
46
+ type: string;
47
+ index: any;
48
+ isStart: boolean;
49
+ }>;
50
+ /**
51
+ * Jump to a specific slide
52
+ * @param index 0-based slide index
53
+ * @ui dashboard
54
+ */
55
+ go({ index }: {
56
+ index: number;
57
+ }): Promise<{
58
+ type: string;
59
+ index: any;
60
+ }>;
61
+ /**
62
+ * List saved decks in the slides folder
63
+ * @readOnly
64
+ */
65
+ list(): Promise<{
66
+ folder: string;
67
+ decks: {
68
+ file: string;
69
+ title: string;
70
+ updatedAt: string;
71
+ }[];
72
+ }>;
73
+ /**
74
+ * Read the current deck's markdown
75
+ * @readOnly
76
+ */
77
+ read(): Promise<{
78
+ file: string;
79
+ markdown: string;
80
+ }>;
81
+ /**
82
+ * Save markdown to the current deck
83
+ * @param markdown Full Marp markdown content
84
+ * @ui dashboard
85
+ */
86
+ save({ markdown }: {
87
+ markdown: string;
88
+ }): Promise<{
89
+ type: string;
90
+ html: any;
91
+ css: any;
92
+ total: any;
93
+ current: number;
94
+ markdown: string;
95
+ }>;
96
+ /**
97
+ * Update the full markdown and re-render
98
+ * @param markdown New Marp markdown content
99
+ * @ui dashboard
100
+ */
101
+ update({ markdown }: {
102
+ markdown: string;
103
+ }): Promise<{
104
+ type: string;
105
+ html: any;
106
+ css: any;
107
+ total: any;
108
+ current: number;
109
+ markdown: string;
110
+ }>;
111
+ /**
112
+ * Insert a new slide at a position
113
+ * @param markdown Slide content
114
+ * @param index Position to insert (appends if omitted)
115
+ * @ui dashboard
116
+ */
117
+ add(params?: {
118
+ markdown?: string;
119
+ index?: number;
120
+ }): Promise<{
121
+ type: string;
122
+ html: any;
123
+ css: any;
124
+ total: any;
125
+ current: number;
126
+ markdown: string;
127
+ }>;
128
+ /**
129
+ * Replace a slide's content
130
+ * @param index Slide index
131
+ * @param markdown New content
132
+ * @ui dashboard
133
+ */
134
+ edit({ index, markdown }: {
135
+ index: number;
136
+ markdown: string;
137
+ }): Promise<{
138
+ type: string;
139
+ html: any;
140
+ css: any;
141
+ total: any;
142
+ current: number;
143
+ markdown: string;
144
+ }>;
145
+ /**
146
+ * Reorder a slide
147
+ * @param from Source index
148
+ * @param to Target index
149
+ * @ui dashboard
150
+ */
151
+ move({ from, to }: {
152
+ from: number;
153
+ to: number;
154
+ }): Promise<{
155
+ type: string;
156
+ html: any;
157
+ css: any;
158
+ total: any;
159
+ current: number;
160
+ markdown: string;
161
+ }>;
162
+ /**
163
+ * Delete a slide
164
+ * @param index Slide index
165
+ * @destructive
166
+ * @ui dashboard
167
+ */
168
+ remove({ index }: {
169
+ index: number;
170
+ }): Promise<{
171
+ type: string;
172
+ html: any;
173
+ css: any;
174
+ total: any;
175
+ current: number;
176
+ markdown: string;
177
+ } | {
178
+ error: string;
179
+ }>;
180
+ /**
181
+ * Duplicate a slide
182
+ * @param index Slide index to copy
183
+ * @ui dashboard
184
+ */
185
+ duplicate({ index }: {
186
+ index: number;
187
+ }): Promise<{
188
+ type: string;
189
+ html: any;
190
+ css: any;
191
+ total: any;
192
+ current: number;
193
+ markdown: string;
194
+ }>;
195
+ /**
196
+ * Current presentation state for AI context
197
+ * @readOnly
198
+ */
199
+ status(): Promise<{
200
+ file: string;
201
+ currentSlide: any;
202
+ totalSlides: number;
203
+ currentContent: string;
204
+ nextSlidePreview: string | null;
205
+ markdown: string;
206
+ }>;
207
+ private readDeck;
208
+ private getState;
209
+ private renderResult;
210
+ private countSlides;
211
+ }
212
+ //# sourceMappingURL=slides.photon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides.photon.d.ts","sourceRoot":"","sources":["../../src/photons/slides.photon.ts"],"names":[],"mappings":"AAyCA,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,SAAS,CAAC,QAAQ;QAChB,gEAAgE;;MAEhE;IAEM,MAAM,EAAE;QACd,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACjD,CAAC;IACM,IAAI,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1D,YAAY,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,IAAI,CAAM;IAIlB,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,QAAQ,GAUnB;IAEK,YAAY;IAwBlB;;;;OAIG;IACG,IAAI;;;;;;;;IAMV;;;OAGG;IACG,IAAI;;;;;IAYV;;;OAGG;IACG,QAAQ;;;;;IAUd;;;;OAIG;IACG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;IAYrC;;;OAGG;IACG,IAAI;;;;;;;;IAoBV;;;OAGG;IACG,IAAI;;;;IAIV;;;;OAIG;IACG,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAQ7C;;;;OAIG;IACG,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAM/C;;;;;OAKG;IACG,GAAG,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAexD;;;;;OAKG;IACG,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAYnE;;;;;OAKG;IACG,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAgBrD;;;;;OAKG;IACG,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;IAezC;;;;OAIG;IACG,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAe5C;;;OAGG;IACG,MAAM;;;;;;;;YAgBE,QAAQ;YAQR,QAAQ;IAItB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,WAAW;CAIpB"}
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Slides — AI-Native Presentation Tool
3
+ *
4
+ * Each instance is a deck: `_use('quarterly-review')` → `quarterly-review.md`.
5
+ * Pass a full path to open any markdown file: `_use('/path/to/deck.md')`.
6
+ *
7
+ * @version 1.0.0
8
+ * @runtime ^1.14.0
9
+ * @dependencies @marp-team/marp-core@^4.3.0
10
+ * @tags presentation, slides, markdown, marp, ai-control
11
+ * @icon 📽️
12
+ * @stateful
13
+ * @ui dashboard ./ui/slides.html
14
+ */
15
+ import * as fs from 'fs/promises';
16
+ import { existsSync, mkdirSync } from 'fs';
17
+ import * as path from 'path';
18
+ import * as os from 'os';
19
+ const DEFAULT_DECK = `---
20
+ marp: true
21
+ theme: default
22
+ paginate: true
23
+ ---
24
+ # AI-Native Slides
25
+ ### Powered by Marp & Photon
26
+ ---
27
+ # How it works
28
+ 1. **AI Generates Marp Markdown**
29
+ 2. **Photon Renders High-Fidelity CSS/HTML**
30
+ 3. **UI Bridge Syncs the View**
31
+ ---
32
+ # Try it!
33
+ Ask me to:
34
+ - "Add a slide about the benefits of AI"
35
+ - "Change the theme to 'gaia'"
36
+ - "Go to the next slide"
37
+ `;
38
+ let Marp;
39
+ export default class Slides {
40
+ settings = {
41
+ /** @property Directory where slide markdown files are stored */
42
+ folder: path.join(os.homedir(), 'Documents', 'slides'),
43
+ };
44
+ marp;
45
+ // ── File Resolution (same pattern as Spreadsheet) ───────────────────────
46
+ get defaultFolder() {
47
+ return this.settings?.folder || path.join(os.homedir(), 'Documents', 'slides');
48
+ }
49
+ get deckPath() {
50
+ const name = this.instanceName || 'slides';
51
+ if (path.isAbsolute(name))
52
+ return name.endsWith('.md') ? name : name + '.md';
53
+ if (name.includes('/') || name.includes('\\')) {
54
+ const resolved = path.resolve(name);
55
+ return resolved.endsWith('.md') ? resolved : resolved + '.md';
56
+ }
57
+ const dir = this.defaultFolder;
58
+ if (!existsSync(dir))
59
+ mkdirSync(dir, { recursive: true });
60
+ return path.join(dir, name.endsWith('.md') ? name : name + '.md');
61
+ }
62
+ async onInitialize() {
63
+ const marpId = '@marp-team/marp-core';
64
+ const marpModule = await import(/* webpackIgnore: true */ marpId);
65
+ Marp = marpModule.Marp || marpModule.default;
66
+ this.marp = new Marp({ container: false, inlineSVG: true, html: true });
67
+ // Ensure folder exists
68
+ const dir = this.defaultFolder;
69
+ if (!existsSync(dir))
70
+ mkdirSync(dir, { recursive: true });
71
+ // Create default deck if this is the default instance and file doesn't exist
72
+ if (!existsSync(this.deckPath)) {
73
+ await fs.writeFile(this.deckPath, DEFAULT_DECK, 'utf8');
74
+ }
75
+ // Initialize slide position if not stored
76
+ const state = await this.memory.get('state');
77
+ if (!state) {
78
+ await this.memory.set('state', { currentSlide: 0 });
79
+ }
80
+ }
81
+ // ── Presentation ────────────────────────────────────────────────────────
82
+ /**
83
+ * Open the presentation UI
84
+ * @ui dashboard
85
+ * @autorun
86
+ */
87
+ async main() {
88
+ const markdown = await this.readDeck();
89
+ const state = await this.getState();
90
+ return this.renderResult(markdown, state.currentSlide);
91
+ }
92
+ /**
93
+ * Move to the next slide
94
+ * @ui dashboard
95
+ */
96
+ async next() {
97
+ const markdown = await this.readDeck();
98
+ const total = this.countSlides(markdown);
99
+ const state = await this.getState();
100
+ if (state.currentSlide < total - 1) {
101
+ state.currentSlide++;
102
+ await this.memory.set('state', state);
103
+ }
104
+ this.emit({ event: 'slideChanged', data: { type: 'nav', index: state.currentSlide } });
105
+ return { type: 'nav', index: state.currentSlide, isEnd: state.currentSlide === total - 1 };
106
+ }
107
+ /**
108
+ * Move to the previous slide
109
+ * @ui dashboard
110
+ */
111
+ async previous() {
112
+ const state = await this.getState();
113
+ if (state.currentSlide > 0) {
114
+ state.currentSlide--;
115
+ await this.memory.set('state', state);
116
+ }
117
+ this.emit({ event: 'slideChanged', data: { type: 'nav', index: state.currentSlide } });
118
+ return { type: 'nav', index: state.currentSlide, isStart: state.currentSlide === 0 };
119
+ }
120
+ /**
121
+ * Jump to a specific slide
122
+ * @param index 0-based slide index
123
+ * @ui dashboard
124
+ */
125
+ async go({ index }) {
126
+ const markdown = await this.readDeck();
127
+ const total = this.countSlides(markdown);
128
+ const state = await this.getState();
129
+ state.currentSlide = clamp(Math.trunc(index), 0, Math.max(total - 1, 0));
130
+ await this.memory.set('state', state);
131
+ this.emit({ event: 'slideChanged', data: { type: 'nav', index: state.currentSlide } });
132
+ return { type: 'nav', index: state.currentSlide };
133
+ }
134
+ // ── Deck Management ─────────────────────────────────────────────────────
135
+ /**
136
+ * List saved decks in the slides folder
137
+ * @readOnly
138
+ */
139
+ async list() {
140
+ const dir = this.defaultFolder;
141
+ if (!existsSync(dir))
142
+ return { folder: dir, decks: [] };
143
+ const entries = await fs.readdir(dir, { withFileTypes: true });
144
+ const decks = await Promise.all(entries
145
+ .filter((e) => e.isFile() && e.name.toLowerCase().endsWith('.md'))
146
+ .map(async (e) => {
147
+ const stat = await fs.stat(path.join(dir, e.name));
148
+ const md = await fs.readFile(path.join(dir, e.name), 'utf8');
149
+ return {
150
+ file: e.name,
151
+ title: firstHeading(md) || e.name.replace(/\.md$/i, ''),
152
+ updatedAt: stat.mtime.toISOString(),
153
+ };
154
+ }));
155
+ return { folder: dir, decks: decks.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)) };
156
+ }
157
+ /**
158
+ * Read the current deck's markdown
159
+ * @readOnly
160
+ */
161
+ async read() {
162
+ return { file: path.basename(this.deckPath), markdown: await this.readDeck() };
163
+ }
164
+ /**
165
+ * Save markdown to the current deck
166
+ * @param markdown Full Marp markdown content
167
+ * @ui dashboard
168
+ */
169
+ async save({ markdown }) {
170
+ await fs.writeFile(this.deckPath, markdown, 'utf8');
171
+ const state = await this.getState();
172
+ const result = this.renderResult(markdown, state.currentSlide);
173
+ this.emit({ event: 'deckChanged', data: result });
174
+ return result;
175
+ }
176
+ /**
177
+ * Update the full markdown and re-render
178
+ * @param markdown New Marp markdown content
179
+ * @ui dashboard
180
+ */
181
+ async update({ markdown }) {
182
+ return this.save({ markdown });
183
+ }
184
+ // ── Slide-Level Operations ──────────────────────────────────────────────
185
+ /**
186
+ * Insert a new slide at a position
187
+ * @param markdown Slide content
188
+ * @param index Position to insert (appends if omitted)
189
+ * @ui dashboard
190
+ */
191
+ async add(params) {
192
+ const md = await this.readDeck();
193
+ const { frontmatter, slides } = splitMarpMarkdown(md);
194
+ const content = params?.markdown ?? '';
195
+ const index = params?.index != null ? clamp(Math.trunc(params.index), 0, slides.length) : slides.length;
196
+ slides.splice(index, 0, content);
197
+ const newMd = joinMarpMarkdown(frontmatter, slides);
198
+ await fs.writeFile(this.deckPath, newMd, 'utf8');
199
+ await this.memory.set('state', { currentSlide: index });
200
+ const result = this.renderResult(newMd, index);
201
+ this.emit({ event: 'deckChanged', data: result });
202
+ return result;
203
+ }
204
+ /**
205
+ * Replace a slide's content
206
+ * @param index Slide index
207
+ * @param markdown New content
208
+ * @ui dashboard
209
+ */
210
+ async edit({ index, markdown }) {
211
+ const md = await this.readDeck();
212
+ const { frontmatter, slides } = splitMarpMarkdown(md);
213
+ const i = clamp(Math.trunc(index), 0, Math.max(slides.length - 1, 0));
214
+ slides[i] = markdown;
215
+ const newMd = joinMarpMarkdown(frontmatter, slides);
216
+ await fs.writeFile(this.deckPath, newMd, 'utf8');
217
+ const result = this.renderResult(newMd, i);
218
+ this.emit({ event: 'deckChanged', data: result });
219
+ return result;
220
+ }
221
+ /**
222
+ * Reorder a slide
223
+ * @param from Source index
224
+ * @param to Target index
225
+ * @ui dashboard
226
+ */
227
+ async move({ from, to }) {
228
+ const md = await this.readDeck();
229
+ const { frontmatter, slides } = splitMarpMarkdown(md);
230
+ const f = clamp(Math.trunc(from), 0, Math.max(slides.length - 1, 0));
231
+ const t = clamp(Math.trunc(to), 0, Math.max(slides.length - 1, 0));
232
+ if (f === t)
233
+ return this.renderResult(md, f);
234
+ const [slide] = slides.splice(f, 1);
235
+ slides.splice(t, 0, slide);
236
+ const newMd = joinMarpMarkdown(frontmatter, slides);
237
+ await fs.writeFile(this.deckPath, newMd, 'utf8');
238
+ await this.memory.set('state', { currentSlide: t });
239
+ const result = this.renderResult(newMd, t);
240
+ this.emit({ event: 'deckChanged', data: result });
241
+ return result;
242
+ }
243
+ /**
244
+ * Delete a slide
245
+ * @param index Slide index
246
+ * @destructive
247
+ * @ui dashboard
248
+ */
249
+ async remove({ index }) {
250
+ const md = await this.readDeck();
251
+ const { frontmatter, slides } = splitMarpMarkdown(md);
252
+ if (slides.length <= 1)
253
+ return { error: 'Cannot remove the last slide' };
254
+ const i = clamp(Math.trunc(index), 0, Math.max(slides.length - 1, 0));
255
+ slides.splice(i, 1);
256
+ const newMd = joinMarpMarkdown(frontmatter, slides);
257
+ await fs.writeFile(this.deckPath, newMd, 'utf8');
258
+ const cur = clamp(i, 0, Math.max(slides.length - 1, 0));
259
+ await this.memory.set('state', { currentSlide: cur });
260
+ const result = this.renderResult(newMd, cur);
261
+ this.emit({ event: 'deckChanged', data: result });
262
+ return result;
263
+ }
264
+ /**
265
+ * Duplicate a slide
266
+ * @param index Slide index to copy
267
+ * @ui dashboard
268
+ */
269
+ async duplicate({ index }) {
270
+ const md = await this.readDeck();
271
+ const { frontmatter, slides } = splitMarpMarkdown(md);
272
+ const i = clamp(Math.trunc(index), 0, Math.max(slides.length - 1, 0));
273
+ slides.splice(i + 1, 0, slides[i]);
274
+ const newMd = joinMarpMarkdown(frontmatter, slides);
275
+ await fs.writeFile(this.deckPath, newMd, 'utf8');
276
+ await this.memory.set('state', { currentSlide: i + 1 });
277
+ const result = this.renderResult(newMd, i + 1);
278
+ this.emit({ event: 'deckChanged', data: result });
279
+ return result;
280
+ }
281
+ // ── Context ─────────────────────────────────────────────────────────────
282
+ /**
283
+ * Current presentation state for AI context
284
+ * @readOnly
285
+ */
286
+ async status() {
287
+ const md = await this.readDeck();
288
+ const { slides } = splitMarpMarkdown(md);
289
+ const state = await this.getState();
290
+ return {
291
+ file: path.basename(this.deckPath),
292
+ currentSlide: state.currentSlide,
293
+ totalSlides: slides.length,
294
+ currentContent: slides[state.currentSlide],
295
+ nextSlidePreview: slides[state.currentSlide + 1] || null,
296
+ markdown: md,
297
+ };
298
+ }
299
+ // ── Private ─────────────────────────────────────────────────────────────
300
+ async readDeck() {
301
+ try {
302
+ return await fs.readFile(this.deckPath, 'utf8');
303
+ }
304
+ catch {
305
+ return DEFAULT_DECK;
306
+ }
307
+ }
308
+ async getState() {
309
+ return (await this.memory.get('state')) || { currentSlide: 0 };
310
+ }
311
+ renderResult(markdown, currentSlide) {
312
+ const { html, css } = this.marp.render(markdown);
313
+ const total = (html.match(/<section/g) || []).length;
314
+ return {
315
+ type: 'render',
316
+ html,
317
+ css,
318
+ total,
319
+ current: clamp(currentSlide, 0, Math.max(total - 1, 0)),
320
+ markdown,
321
+ };
322
+ }
323
+ countSlides(markdown) {
324
+ const { html } = this.marp.render(markdown);
325
+ return (html.match(/<section/g) || []).length;
326
+ }
327
+ }
328
+ // ── Helpers ───────────────────────────────────────────────────────────────
329
+ function clamp(v, min, max) {
330
+ return Math.min(Math.max(Number.isFinite(v) ? v : min, min), max);
331
+ }
332
+ function firstHeading(md) {
333
+ return md.match(/^#\s+(.+)$/m)?.[1]?.trim() || '';
334
+ }
335
+ function splitMarpMarkdown(markdown) {
336
+ const fm = markdown.match(/^---\n[\s\S]*?\n---\n*/);
337
+ const frontmatter = fm ? fm[0].trimEnd() : '---\nmarp: true\n---';
338
+ const body = fm ? markdown.slice(fm[0].length) : markdown;
339
+ const slides = [];
340
+ let cur = [];
341
+ for (const line of body.split('\n')) {
342
+ if (line.trim() === '---') {
343
+ slides.push(cur.join('\n').trim());
344
+ cur = [];
345
+ continue;
346
+ }
347
+ cur.push(line);
348
+ }
349
+ slides.push(cur.join('\n').trim());
350
+ return { frontmatter, slides: slides.filter((s) => s.length > 0) };
351
+ }
352
+ function joinMarpMarkdown(frontmatter, slides) {
353
+ return `${frontmatter}\n\n${slides.join('\n\n---\n\n')}\n`;
354
+ }
355
+ //# sourceMappingURL=slides.photon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides.photon.js","sourceRoot":"","sources":["../../src/photons/slides.photon.ts"],"names":[],"mappings":"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"}