r1-create 1.2.0 → 1.3.1

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.
package/README.md CHANGED
@@ -109,6 +109,53 @@ r1.messaging.onMessage((response) => {
109
109
  console.log('Parsed response:', response.parsedData);
110
110
  }
111
111
  });
112
+
113
+ // Push-to-talk using hardware long press + STT transcript forwarding
114
+ const disablePTT = r1.messaging.enablePushToTalk({
115
+ onTranscript: (transcript) => {
116
+ console.log('User said:', transcript);
117
+ }
118
+ });
119
+
120
+ // Programmatic STT control
121
+ r1.messaging.startSTTListening();
122
+ // ...later
123
+ r1.messaging.stopSTTListening();
124
+
125
+ // Later, if needed:
126
+ // disablePTT();
127
+
128
+ // Wait for a matching response with timeout
129
+ const llmResponse = await r1.messaging.askLLMWithTimeout(
130
+ 'Summarize this in one sentence',
131
+ { wantsR1Response: false },
132
+ { timeoutMs: 15000 }
133
+ );
134
+ console.log('LLM response:', llmResponse.message);
135
+
136
+ // Advanced SERP search options
137
+ await r1.messaging.searchWeb('weather in Tokyo', {
138
+ tag: 'weather',
139
+ useLocation: true
140
+ });
141
+
142
+ // Ask R1 to email content to the user
143
+ await r1.messaging.emailUser('Your itinerary for today...');
144
+
145
+ // Analyze an image with LLM
146
+ await r1.llm.analyzeImageBase64('Describe this image', myBase64Image);
147
+
148
+ // Ask about an image (image + prompt)
149
+ await r1.llm.askImage(myBase64Image, 'What do you see in this image?');
150
+
151
+ // Transform an image (sends: "take a photo and make it <prompt>")
152
+ await r1.llm.transformPhoto(myBase64Image, 'a watercolor painting');
153
+
154
+ // Send image with no prompt
155
+ await r1.llm.imageToAI(myBase64Image, '');
156
+
157
+ // Runtime bridge checks (useful during development)
158
+ console.log(r1.messaging.getRuntimeCapabilities());
112
159
  ```
113
160
 
114
161
  ### Media APIs
package/dist/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export type { HardwareEventType } from './types';
16
16
  export { AccelerometerAPI, TouchAPI, HardwareEvents, accelerometer, touch, hardwareEvents, DeviceControls, deviceControls, type DeviceControlsOptions, type ScrollWheelData, type SideButtonHandler, type ScrollWheelHandler } from './hardware';
17
17
  export { Base64Utils, R1Storage, storage } from './storage';
18
18
  export { R1Messaging, LLMHelpers, messaging, llmHelpers } from './llm';
19
+ export type { PushToTalkOptions, SearchWebOptions, SerpSearchTag, WaitForMessageOptions, EmailOptions, ImageMessageOptions } from './llm';
19
20
  export { CSSUtils, DOMUtils, LayoutUtils, PerformanceUtils, R1Component, R1_DIMENSIONS, R1UI, ui, type UIDimensions, type UIFontSizes, type UISpacing, type UIButtonSizes, type UIColorPalette, type UIContainerOptions, type UIButtonOptions, type UITextOptions, type UIGridOptions } from './ui';
20
21
  export { CameraAPI, MicrophoneAPI, SpeakerAPI, MediaUtils, camera, microphone, speaker } from './media';
21
22
  import { R1Storage } from './storage';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * LLM and messaging module for R1 AI integration
3
3
  * Provides structured messaging and LLM interaction capabilities
4
4
  */
5
- import type { PluginMessageResponse } from '../types';
5
+ import type { PluginMessageResponse, SpeechSynthesisOptions } from '../types';
6
6
  export interface LLMOptions {
7
7
  wantsR1Response?: boolean;
8
8
  wantsJournalEntry?: boolean;
@@ -13,18 +13,45 @@ export interface MessageOptions extends LLMOptions {
13
13
  pluginId?: string;
14
14
  imageBase64?: string;
15
15
  }
16
+ export type SerpSearchTag = 'search' | 'image' | 'finance' | 'jobs' | 'weather' | 'hotels';
17
+ export interface SearchWebOptions extends Omit<MessageOptions, 'useSerpAPI'> {
18
+ useLocation?: boolean;
19
+ tag?: SerpSearchTag;
20
+ }
21
+ export interface WaitForMessageOptions {
22
+ timeoutMs?: number;
23
+ predicate?: (response: PluginMessageResponse & {
24
+ parsedData?: any;
25
+ }) => boolean;
26
+ }
27
+ export interface EmailOptions extends Omit<MessageOptions, 'useLLM'> {
28
+ instructionPrefix?: string;
29
+ }
30
+ export interface ImageMessageOptions extends Omit<MessageOptions, 'imageBase64' | 'useLLM'> {
31
+ }
16
32
  /**
17
33
  * Type-safe LLM response handler
18
34
  */
19
35
  export type MessageHandler<T = any> = (response: PluginMessageResponse & {
20
36
  parsedData?: T;
21
37
  }) => void;
38
+ export interface PushToTalkOptions {
39
+ startEvent?: string;
40
+ endEvent?: string;
41
+ processMessage?: string;
42
+ autoForwardTranscript?: boolean;
43
+ onTranscript?: (transcript: string, response: PluginMessageResponse & {
44
+ parsedData?: any;
45
+ }) => void;
46
+ }
22
47
  /**
23
48
  * LLM and messaging API for R1 interactions
24
49
  */
25
50
  export declare class R1Messaging {
26
51
  private messageHandlers;
27
52
  private isInitialized;
53
+ private pushToTalkCleanup;
54
+ private sttListening;
28
55
  constructor();
29
56
  /**
30
57
  * Send a simple message to the server
@@ -43,7 +70,7 @@ export declare class R1Messaging {
43
70
  * @param query Search query
44
71
  * @param options Additional options
45
72
  */
46
- searchWeb(query: string, options?: Omit<MessageOptions, 'useSerpAPI'>): Promise<void>;
73
+ searchWeb(query: string, options?: SearchWebOptions): Promise<void>;
47
74
  /**
48
75
  * Send text for text-to-speech output (without LLM processing)
49
76
  * @param text Text to speak
@@ -76,11 +103,95 @@ export declare class R1Messaging {
76
103
  * Remove all message handlers
77
104
  */
78
105
  removeAllHandlers(): void;
106
+ /**
107
+ * Wait for the next incoming plugin message.
108
+ * Useful for request/response flows with timeout handling.
109
+ */
110
+ waitForNextMessage(options?: WaitForMessageOptions): Promise<PluginMessageResponse & {
111
+ parsedData?: any;
112
+ }>;
113
+ /**
114
+ * Send a message to LLM and await the next matching response.
115
+ */
116
+ askLLMWithTimeout(message: string, options?: LLMOptions, waitOptions?: WaitForMessageOptions): Promise<PluginMessageResponse & {
117
+ parsedData?: any;
118
+ }>;
119
+ /**
120
+ * Ask the LLM to email content to the user.
121
+ */
122
+ emailUser(content: string, options?: EmailOptions): Promise<void>;
123
+ /**
124
+ * Send an image to AI with an optional prompt.
125
+ *
126
+ * Common patterns:
127
+ * - Ask about image: provide a question prompt.
128
+ * - Transform image: use a prompt like "take a photo and make it ...".
129
+ * - No-prompt processing: pass empty prompt.
130
+ */
131
+ sendImageToAI(imageBase64: string, prompt?: string, options?: ImageMessageOptions): Promise<void>;
132
+ /**
133
+ * Ask AI about an image by sending image + prompt.
134
+ */
135
+ askAboutImage(imageBase64: string, prompt: string, options?: ImageMessageOptions): Promise<void>;
136
+ /**
137
+ * Transform an image using the common R1 phrasing.
138
+ * Sends: "take a photo and make it <prompt>" + image.
139
+ */
140
+ transformImage(imageBase64: string, transformPrompt: string, options?: ImageMessageOptions): Promise<void>;
141
+ /**
142
+ * Runtime availability checks for messaging-related R1 bridges.
143
+ */
144
+ getRuntimeCapabilities(): {
145
+ pluginMessageHandler: boolean;
146
+ creationVoiceHandler: boolean;
147
+ closeWebView: boolean;
148
+ };
149
+ /**
150
+ * Start STT listening programmatically.
151
+ * Equivalent to: `CreationVoiceHandler.postMessage('start')`
152
+ */
153
+ startSTTListening(): void;
154
+ /**
155
+ * Stop STT listening programmatically.
156
+ * Equivalent to: `CreationVoiceHandler.postMessage('stop')`
157
+ */
158
+ stopSTTListening(): void;
159
+ /**
160
+ * Returns whether STT is currently listening based on SDK-triggered state.
161
+ */
162
+ isSTTListening(): boolean;
163
+ /**
164
+ * Enable push-to-talk using hardware long press events and STT messages.
165
+ *
166
+ * Default behavior:
167
+ * - `longPressStart` => `CreationVoiceHandler.postMessage('start')`
168
+ * - `longPressEnd` => `CreationVoiceHandler.postMessage('stop')`
169
+ * - On `sttEnded` with transcript, forwards:
170
+ * `{ message: 'process_voice_input', transcript }` via PluginMessageHandler
171
+ */
172
+ enablePushToTalk(options?: PushToTalkOptions): () => void;
173
+ /**
174
+ * Disable push-to-talk listeners previously configured via enablePushToTalk.
175
+ */
176
+ disablePushToTalk(): void;
79
177
  /**
80
178
  * Close the current plugin/webview
81
179
  */
82
180
  closePlugin(): void;
83
181
  private initializeMessageHandler;
182
+ /**
183
+ * Normalize image payload for R1 bridge compatibility.
184
+ * Accepts either full data URL or raw base64 and returns a data URL string.
185
+ */
186
+ private normalizeImagePayload;
187
+ /**
188
+ * Generate audio file from text-to-speech (browser only)
189
+ * Uses Web Speech API to synthesize speech and capture as audio blob
190
+ * @param text Text to convert to audio
191
+ * @param options Speech synthesis options
192
+ * @returns Promise resolving to audio blob or null if not supported
193
+ */
194
+ textToSpeechAudio(text: string, options?: SpeechSynthesisOptions): Promise<Blob | null>;
84
195
  }
85
196
  /**
86
197
  * Convenient helper functions for common LLM interactions
@@ -98,6 +209,27 @@ export declare class LLMHelpers {
98
209
  * @param data Optional data to analyze
99
210
  */
100
211
  analyzeData(prompt: string, data?: any): Promise<void>;
212
+ /**
213
+ * Analyze a base64-encoded image with the LLM.
214
+ * @param prompt Analysis prompt
215
+ * @param imageBase64 Base64 image string (without data URL prefix)
216
+ * @param options Additional message options
217
+ */
218
+ analyzeImageBase64(prompt: string, imageBase64: string, options?: Omit<MessageOptions, 'imageBase64' | 'useLLM'>): Promise<void>;
219
+ /**
220
+ * Send an image to AI with optional prompt.
221
+ * Empty prompt triggers no-prompt image processing.
222
+ */
223
+ imageToAI(imageBase64: string, prompt?: string, options?: ImageMessageOptions): Promise<void>;
224
+ /**
225
+ * Ask AI about an image (image + prompt).
226
+ */
227
+ askImage(imageBase64: string, prompt: string, options?: ImageMessageOptions): Promise<void>;
228
+ /**
229
+ * Transform an image with phrasing:
230
+ * "take a photo and make it <prompt>".
231
+ */
232
+ transformPhoto(imageBase64: string, prompt: string, options?: ImageMessageOptions): Promise<void>;
101
233
  /**
102
234
  * Ask LLM to perform a task and speak the result
103
235
  * @param task Task description
@@ -115,6 +247,12 @@ export declare class LLMHelpers {
115
247
  * @param context Current UI context
116
248
  */
117
249
  getUISuggestions(context: string): Promise<void>;
250
+ /**
251
+ * Generate audio file from text-to-speech (browser only)
252
+ * @param text Text to convert to audio
253
+ * @param options Speech synthesis options
254
+ */
255
+ textToSpeechAudio(text: string, options?: SpeechSynthesisOptions): Promise<Blob | null>;
118
256
  }
119
257
  export declare const messaging: R1Messaging;
120
258
  export declare const llmHelpers: LLMHelpers;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAiB,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,qBAAqB,GAAG;IAAE,UAAU,CAAC,EAAE,CAAC,CAAA;CAAE,KAAK,IAAI,CAAC;AAErG;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,aAAa,CAAS;;IAM9B;;;;OAIG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/E;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtE;;;;OAIG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/F;;;;OAIG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,iBAAiB,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9G;;;;OAIG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjF;;;;OAIG;IACG,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnF;;;OAGG;IACH,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAIpD;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIzC;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAIzB;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB,OAAO,CAAC,wBAAwB;CAiCjC;AAED;;GAEG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,WAAW;IAE1C;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7E;;;;OAIG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/E;;;OAGG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMvD;AAGD,eAAO,MAAM,SAAS,aAAoB,CAAC;AAC3C,eAAO,MAAM,UAAU,YAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"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"}
package/dist/llm/index.js CHANGED
@@ -12,6 +12,8 @@ class R1Messaging {
12
12
  constructor() {
13
13
  this.messageHandlers = new Set();
14
14
  this.isInitialized = false;
15
+ this.pushToTalkCleanup = null;
16
+ this.sttListening = false;
15
17
  this.initializeMessageHandler();
16
18
  }
17
19
  /**
@@ -48,14 +50,15 @@ class R1Messaging {
48
50
  * @param options Additional options
49
51
  */
50
52
  async searchWeb(query, options = {}) {
53
+ const { useLocation = false, tag = 'search', ...messageOptions } = options;
51
54
  const payload = {
52
55
  message: JSON.stringify({
53
56
  query: query,
54
- useLocation: false,
55
- tag: 'search'
57
+ useLocation,
58
+ tag
56
59
  }),
57
60
  useSerpAPI: true,
58
- ...options
61
+ ...messageOptions
59
62
  };
60
63
  if (typeof PluginMessageHandler !== 'undefined') {
61
64
  PluginMessageHandler.postMessage(JSON.stringify(payload));
@@ -117,6 +120,174 @@ class R1Messaging {
117
120
  removeAllHandlers() {
118
121
  this.messageHandlers.clear();
119
122
  }
123
+ /**
124
+ * Wait for the next incoming plugin message.
125
+ * Useful for request/response flows with timeout handling.
126
+ */
127
+ waitForNextMessage(options = {}) {
128
+ const { timeoutMs = 30000, predicate } = options;
129
+ return new Promise((resolve, reject) => {
130
+ let timeoutId = null;
131
+ const handler = (response) => {
132
+ if (predicate && !predicate(response))
133
+ return;
134
+ if (timeoutId) {
135
+ clearTimeout(timeoutId);
136
+ }
137
+ this.offMessage(handler);
138
+ resolve(response);
139
+ };
140
+ this.onMessage(handler);
141
+ timeoutId = setTimeout(() => {
142
+ this.offMessage(handler);
143
+ reject(new Error(`Timed out waiting for plugin message after ${timeoutMs}ms`));
144
+ }, timeoutMs);
145
+ });
146
+ }
147
+ /**
148
+ * Send a message to LLM and await the next matching response.
149
+ */
150
+ async askLLMWithTimeout(message, options = {}, waitOptions = {}) {
151
+ const responsePromise = this.waitForNextMessage(waitOptions);
152
+ await this.askLLM(message, options);
153
+ return responsePromise;
154
+ }
155
+ /**
156
+ * Ask the LLM to email content to the user.
157
+ */
158
+ async emailUser(content, options = {}) {
159
+ const { instructionPrefix = 'Please email this to the user:', ...messageOptions } = options;
160
+ await this.sendMessage(`${instructionPrefix} ${content}`, {
161
+ useLLM: true,
162
+ wantsJournalEntry: false,
163
+ ...messageOptions
164
+ });
165
+ }
166
+ /**
167
+ * Send an image to AI with an optional prompt.
168
+ *
169
+ * Common patterns:
170
+ * - Ask about image: provide a question prompt.
171
+ * - Transform image: use a prompt like "take a photo and make it ...".
172
+ * - No-prompt processing: pass empty prompt.
173
+ */
174
+ async sendImageToAI(imageBase64, prompt = '', options = {}) {
175
+ const message = prompt.trim();
176
+ const normalizedImage = this.normalizeImagePayload(imageBase64);
177
+ await this.sendMessage(message, {
178
+ useLLM: true,
179
+ imageBase64: normalizedImage,
180
+ ...options
181
+ });
182
+ }
183
+ /**
184
+ * Ask AI about an image by sending image + prompt.
185
+ */
186
+ async askAboutImage(imageBase64, prompt, options = {}) {
187
+ await this.sendImageToAI(imageBase64, prompt, options);
188
+ }
189
+ /**
190
+ * Transform an image using the common R1 phrasing.
191
+ * Sends: "take a photo and make it <prompt>" + image.
192
+ */
193
+ async transformImage(imageBase64, transformPrompt, options = {}) {
194
+ const prompt = transformPrompt.trim().length > 0
195
+ ? `take a photo and make it ${transformPrompt}`
196
+ : 'take a photo and make it better';
197
+ await this.sendImageToAI(imageBase64, prompt, options);
198
+ }
199
+ /**
200
+ * Runtime availability checks for messaging-related R1 bridges.
201
+ */
202
+ getRuntimeCapabilities() {
203
+ return {
204
+ pluginMessageHandler: typeof PluginMessageHandler !== 'undefined',
205
+ creationVoiceHandler: typeof CreationVoiceHandler !== 'undefined',
206
+ closeWebView: typeof closeWebView !== 'undefined'
207
+ };
208
+ }
209
+ /**
210
+ * Start STT listening programmatically.
211
+ * Equivalent to: `CreationVoiceHandler.postMessage('start')`
212
+ */
213
+ startSTTListening() {
214
+ if (typeof CreationVoiceHandler === 'undefined') {
215
+ throw new Error('CreationVoiceHandler not available. Make sure you are running in R1 environment.');
216
+ }
217
+ CreationVoiceHandler.postMessage('start');
218
+ this.sttListening = true;
219
+ }
220
+ /**
221
+ * Stop STT listening programmatically.
222
+ * Equivalent to: `CreationVoiceHandler.postMessage('stop')`
223
+ */
224
+ stopSTTListening() {
225
+ if (typeof CreationVoiceHandler === 'undefined') {
226
+ throw new Error('CreationVoiceHandler not available. Make sure you are running in R1 environment.');
227
+ }
228
+ CreationVoiceHandler.postMessage('stop');
229
+ this.sttListening = false;
230
+ }
231
+ /**
232
+ * Returns whether STT is currently listening based on SDK-triggered state.
233
+ */
234
+ isSTTListening() {
235
+ return this.sttListening;
236
+ }
237
+ /**
238
+ * Enable push-to-talk using hardware long press events and STT messages.
239
+ *
240
+ * Default behavior:
241
+ * - `longPressStart` => `CreationVoiceHandler.postMessage('start')`
242
+ * - `longPressEnd` => `CreationVoiceHandler.postMessage('stop')`
243
+ * - On `sttEnded` with transcript, forwards:
244
+ * `{ message: 'process_voice_input', transcript }` via PluginMessageHandler
245
+ */
246
+ enablePushToTalk(options = {}) {
247
+ if (typeof window === 'undefined') {
248
+ throw new Error('Push-to-talk is only available in browser environments.');
249
+ }
250
+ if (typeof CreationVoiceHandler === 'undefined') {
251
+ throw new Error('CreationVoiceHandler not available. Make sure you are running in R1 environment.');
252
+ }
253
+ this.disablePushToTalk();
254
+ const { startEvent = 'longPressStart', endEvent = 'longPressEnd', processMessage = 'process_voice_input', autoForwardTranscript = true, onTranscript } = options;
255
+ const handleStart = () => {
256
+ this.startSTTListening();
257
+ };
258
+ const handleEnd = () => {
259
+ this.stopSTTListening();
260
+ };
261
+ const transcriptHandler = (data) => {
262
+ const type = data.type;
263
+ const transcript = data.transcript;
264
+ if (type !== 'sttEnded' || !transcript)
265
+ return;
266
+ onTranscript?.(transcript, data);
267
+ if (autoForwardTranscript && typeof PluginMessageHandler !== 'undefined') {
268
+ PluginMessageHandler.postMessage(JSON.stringify({
269
+ message: processMessage,
270
+ transcript
271
+ }));
272
+ }
273
+ };
274
+ window.addEventListener(startEvent, handleStart);
275
+ window.addEventListener(endEvent, handleEnd);
276
+ this.onMessage(transcriptHandler);
277
+ this.pushToTalkCleanup = () => {
278
+ window.removeEventListener(startEvent, handleStart);
279
+ window.removeEventListener(endEvent, handleEnd);
280
+ this.offMessage(transcriptHandler);
281
+ this.pushToTalkCleanup = null;
282
+ };
283
+ return () => this.disablePushToTalk();
284
+ }
285
+ /**
286
+ * Disable push-to-talk listeners previously configured via enablePushToTalk.
287
+ */
288
+ disablePushToTalk() {
289
+ this.pushToTalkCleanup?.();
290
+ }
120
291
  /**
121
292
  * Close the current plugin/webview
122
293
  */
@@ -128,6 +299,7 @@ class R1Messaging {
128
299
  initializeMessageHandler() {
129
300
  if (this.isInitialized || typeof window === 'undefined')
130
301
  return;
302
+ const previousOnPluginMessage = window.onPluginMessage;
131
303
  // Set up global message handler
132
304
  window.onPluginMessage = (data) => {
133
305
  try {
@@ -142,8 +314,16 @@ class R1Messaging {
142
314
  parsedData = data.data;
143
315
  }
144
316
  }
317
+ const objectData = parsedData && typeof parsedData === 'object' ? parsedData : null;
318
+ const typeFromParsed = typeof objectData?.type === 'string' ? objectData.type : undefined;
319
+ const transcriptFromParsed = typeof objectData?.transcript === 'string' ? objectData.transcript : undefined;
145
320
  // Call all registered handlers
146
- const enhancedData = { ...data, parsedData };
321
+ const enhancedData = {
322
+ ...data,
323
+ type: data.type ?? typeFromParsed,
324
+ transcript: data.transcript ?? transcriptFromParsed,
325
+ parsedData
326
+ };
147
327
  this.messageHandlers.forEach(handler => {
148
328
  try {
149
329
  handler(enhancedData);
@@ -152,6 +332,14 @@ class R1Messaging {
152
332
  console.error('Error in message handler:', error);
153
333
  }
154
334
  });
335
+ if (previousOnPluginMessage) {
336
+ try {
337
+ previousOnPluginMessage(data);
338
+ }
339
+ catch (error) {
340
+ console.error('Error in pre-existing onPluginMessage handler:', error);
341
+ }
342
+ }
155
343
  }
156
344
  catch (error) {
157
345
  console.error('Error processing plugin message:', error);
@@ -159,6 +347,61 @@ class R1Messaging {
159
347
  };
160
348
  this.isInitialized = true;
161
349
  }
350
+ /**
351
+ * Normalize image payload for R1 bridge compatibility.
352
+ * Accepts either full data URL or raw base64 and returns a data URL string.
353
+ */
354
+ normalizeImagePayload(image) {
355
+ const value = image.trim();
356
+ if (value.startsWith('data:image/')) {
357
+ return value;
358
+ }
359
+ // Default to jpeg wrapper when only raw base64 is provided.
360
+ return `data:image/jpeg;base64,${value}`;
361
+ }
362
+ /**
363
+ * Generate audio file from text-to-speech (browser only)
364
+ * Uses Web Speech API to synthesize speech and capture as audio blob
365
+ * @param text Text to convert to audio
366
+ * @param options Speech synthesis options
367
+ * @returns Promise resolving to audio blob or null if not supported
368
+ */
369
+ async textToSpeechAudio(text, options = {}) {
370
+ // Only works in browser environment
371
+ if (typeof window === 'undefined' || !window.speechSynthesis) {
372
+ throw new Error('Text-to-speech audio generation only available in browser with Web Speech API support');
373
+ }
374
+ return new Promise((resolve, reject) => {
375
+ try {
376
+ // Create speech utterance
377
+ const utterance = new SpeechSynthesisUtterance(text);
378
+ // Apply options
379
+ if (options.voice)
380
+ utterance.voice = options.voice;
381
+ if (options.rate !== undefined)
382
+ utterance.rate = options.rate;
383
+ if (options.pitch !== undefined)
384
+ utterance.pitch = options.pitch;
385
+ if (options.volume !== undefined)
386
+ utterance.volume = options.volume;
387
+ // Listen for speech end
388
+ utterance.onend = () => {
389
+ // Currently, we can't capture the audio output from speech synthesis
390
+ // This would require advanced techniques like AudioWorklet or WebRTC
391
+ // For now, we just speak and return null
392
+ resolve(null);
393
+ };
394
+ utterance.onerror = (error) => {
395
+ reject(new Error(`Speech synthesis failed: ${error.error}`));
396
+ };
397
+ // Speak the text
398
+ window.speechSynthesis.speak(utterance);
399
+ }
400
+ catch (error) {
401
+ reject(error);
402
+ }
403
+ });
404
+ }
162
405
  }
163
406
  exports.R1Messaging = R1Messaging;
164
407
  /**
@@ -187,6 +430,39 @@ class LLMHelpers {
187
430
  message += ' Please respond with a JSON analysis.';
188
431
  await this.messaging.askLLMJSON(message);
189
432
  }
433
+ /**
434
+ * Analyze a base64-encoded image with the LLM.
435
+ * @param prompt Analysis prompt
436
+ * @param imageBase64 Base64 image string (without data URL prefix)
437
+ * @param options Additional message options
438
+ */
439
+ async analyzeImageBase64(prompt, imageBase64, options = {}) {
440
+ await this.messaging.sendMessage(prompt, {
441
+ useLLM: true,
442
+ imageBase64,
443
+ ...options
444
+ });
445
+ }
446
+ /**
447
+ * Send an image to AI with optional prompt.
448
+ * Empty prompt triggers no-prompt image processing.
449
+ */
450
+ async imageToAI(imageBase64, prompt = '', options = {}) {
451
+ await this.messaging.sendImageToAI(imageBase64, prompt, options);
452
+ }
453
+ /**
454
+ * Ask AI about an image (image + prompt).
455
+ */
456
+ async askImage(imageBase64, prompt, options = {}) {
457
+ await this.messaging.askAboutImage(imageBase64, prompt, options);
458
+ }
459
+ /**
460
+ * Transform an image with phrasing:
461
+ * "take a photo and make it <prompt>".
462
+ */
463
+ async transformPhoto(imageBase64, prompt, options = {}) {
464
+ await this.messaging.transformImage(imageBase64, prompt, options);
465
+ }
190
466
  /**
191
467
  * Ask LLM to perform a task and speak the result
192
468
  * @param task Task description
@@ -211,6 +487,14 @@ class LLMHelpers {
211
487
  await this.messaging.askLLMJSON(`Given this UI context: "${context}", provide suggestions for user actions. ` +
212
488
  `Respond with JSON format: {"suggestions": [{"action": "action_name", "description": "description"}]}`);
213
489
  }
490
+ /**
491
+ * Generate audio file from text-to-speech (browser only)
492
+ * @param text Text to convert to audio
493
+ * @param options Speech synthesis options
494
+ */
495
+ async textToSpeechAudio(text, options = {}) {
496
+ return this.messaging.textToSpeechAudio(text, options);
497
+ }
214
498
  }
215
499
  exports.LLMHelpers = LLMHelpers;
216
500
  // Export singleton instances