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 +47 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/index.d.ts +140 -2
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +288 -4
- package/dist/llm/index.js.map +1 -1
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -1
- package/examples/README.md +36 -0
- package/examples/camera/index.html +160 -0
- package/examples/device-controls/index.html +191 -0
- package/examples/hardware-game/index.html +165 -0
- package/examples/messaging-test/index.html +359 -0
- package/examples/nextjs-test-app/README.md +72 -0
- package/examples/nextjs-test-app/app/globals.css +282 -0
- package/examples/nextjs-test-app/app/layout.jsx +14 -0
- package/examples/nextjs-test-app/app/page.jsx +1265 -0
- package/examples/nextjs-test-app/log-relay/device-console-bridge.js +91 -0
- package/examples/nextjs-test-app/log-relay/server.js +55 -0
- package/examples/nextjs-test-app/next.config.js +8 -0
- package/examples/nextjs-test-app/package-lock.json +1227 -0
- package/examples/nextjs-test-app/package.json +18 -0
- package/examples/text-to-speech/index.html +128 -0
- package/examples/ui-design/index.html +189 -0
- package/examples/voice-recorder/index.html +149 -0
- package/examples/web-search/index.html +147 -0
- package/package.json +1 -1
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;AAEH,mBAAmB;AACnB,0CAAwB;AAGxB,gBAAgB;AAChB,uCAcoB;AAblB,4GAAA,gBAAgB,OAAA;AAChB,oGAAA,QAAQ,OAAA;AACR,0GAAA,cAAc,OAAA;AACd,yGAAA,aAAa,OAAA;AACb,iGAAA,KAAK,OAAA;AACL,0GAAA,cAAc,OAAA;AACd,sBAAsB;AACtB,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AAOhB,eAAe;AACf,qCAImB;AAHjB,sGAAA,WAAW,OAAA;AACX,oGAAA,SAAS,OAAA;AACT,kGAAA,OAAO,OAAA;AAGT,yBAAyB;AACzB,6BAKe;AAJb,kGAAA,WAAW,OAAA;AACX,iGAAA,UAAU,OAAA;AACV,gGAAA,SAAS,OAAA;AACT,iGAAA,UAAU,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/index.d.ts
CHANGED
|
@@ -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?:
|
|
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;
|
package/dist/llm/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
55
|
-
tag
|
|
57
|
+
useLocation,
|
|
58
|
+
tag
|
|
56
59
|
}),
|
|
57
60
|
useSerpAPI: true,
|
|
58
|
-
...
|
|
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 = {
|
|
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
|