@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.
@@ -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
- text = encodePasteBlock(pasteBufferRef.current);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blockrun/franklin",
3
- "version": "3.21.4",
3
+ "version": "3.21.6",
4
4
  "description": "Franklin Agent — The AI agent with a wallet. Spends USDC autonomously to get real work done. Pay per action, no subscriptions.",
5
5
  "type": "module",
6
6
  "exports": {