@blockrun/franklin 3.21.4 → 3.21.6
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/dist/tools/voice.js +16 -0
- package/dist/ui/app.js +12 -1
- package/package.json +1 -1
package/dist/tools/voice.js
CHANGED
|
@@ -240,6 +240,18 @@ export const voiceCallCapability = {
|
|
|
240
240
|
type: 'boolean',
|
|
241
241
|
description: 'If true, AI waits for the recipient to speak first before talking.',
|
|
242
242
|
},
|
|
243
|
+
voicemail_action: {
|
|
244
|
+
type: 'string',
|
|
245
|
+
enum: ['hangup', 'leave_message', 'ignore'],
|
|
246
|
+
description: 'What to do if voicemail is detected. Default (omitted): hang up without a message. ' +
|
|
247
|
+
'"leave_message" speaks voicemail_message once then hangs up (voicemail_message required). ' +
|
|
248
|
+
'"ignore" skips detection and treats the call as live — only use when sure a human answers.',
|
|
249
|
+
},
|
|
250
|
+
voicemail_message: {
|
|
251
|
+
type: 'string',
|
|
252
|
+
description: 'The message to leave when voicemail_action is "leave_message" (≤1000 chars). ' +
|
|
253
|
+
'Voicemail is one-way — this is spoken once as a monologue, there is no back-and-forth.',
|
|
254
|
+
},
|
|
243
255
|
},
|
|
244
256
|
required: ['to', 'from', 'task'],
|
|
245
257
|
},
|
|
@@ -269,6 +281,10 @@ export const voiceCallCapability = {
|
|
|
269
281
|
body.first_sentence = input.first_sentence;
|
|
270
282
|
if (typeof input.wait_for_greeting === 'boolean')
|
|
271
283
|
body.wait_for_greeting = input.wait_for_greeting;
|
|
284
|
+
if (typeof input.voicemail_action === 'string')
|
|
285
|
+
body.voicemail_action = input.voicemail_action;
|
|
286
|
+
if (typeof input.voicemail_message === 'string')
|
|
287
|
+
body.voicemail_message = input.voicemail_message;
|
|
272
288
|
try {
|
|
273
289
|
const res = await postWithPayment('/v1/voice/call', body, ctx, { tool: 'VoiceCall', priceUsd: 0.54 });
|
|
274
290
|
const callId = (res.call_id || res.id);
|
package/dist/ui/app.js
CHANGED
|
@@ -23,6 +23,13 @@ const DISABLE_BRACKETED_PASTE = '\x1b[?2004l';
|
|
|
23
23
|
const USER_PROMPT_COLOR = '#FFD700';
|
|
24
24
|
const PASTE_BLOCK_START = '\uE000PASTE:';
|
|
25
25
|
const PASTE_BLOCK_END = ':PASTE\uE001';
|
|
26
|
+
// Only collapse pastes of >= this many lines into a [Pasted ~N lines] block.
|
|
27
|
+
// Short pastes (one-liners, 2-4 line snippets) inline as plain text so the
|
|
28
|
+
// model sees them verbatim and the user can read what they pasted in the
|
|
29
|
+
// input box. 5 lines is a sweet spot — long enough to skip multi-line code
|
|
30
|
+
// dumps and log tails, short enough that ordinary prose pastes still show
|
|
31
|
+
// inline.
|
|
32
|
+
const PASTE_COLLAPSE_LINE_THRESHOLD = 5;
|
|
26
33
|
const DISABLE_AUTO_WRAP = '\x1b[?7l';
|
|
27
34
|
const ENABLE_AUTO_WRAP = '\x1b[?7h';
|
|
28
35
|
function stripPasteMarkers(input) {
|
|
@@ -193,7 +200,11 @@ function PromptTextInput({ value, onChange, onSubmit, placeholder = '', focus =
|
|
|
193
200
|
pasteBufferRef.current += text;
|
|
194
201
|
if (!hasPasteEnd)
|
|
195
202
|
return;
|
|
196
|
-
|
|
203
|
+
const buffered = pasteBufferRef.current;
|
|
204
|
+
const lineCount = buffered.length === 0 ? 0 : buffered.split('\n').length;
|
|
205
|
+
text = lineCount >= PASTE_COLLAPSE_LINE_THRESHOLD
|
|
206
|
+
? encodePasteBlock(buffered)
|
|
207
|
+
: buffered;
|
|
197
208
|
pasteBufferRef.current = '';
|
|
198
209
|
pasteActiveRef.current = false;
|
|
199
210
|
}
|
package/package.json
CHANGED