@@ -25,16 +25,12 @@ import type { TwilioRequester } from "../twilio/types.js";
2525import { defaultRuntime , type RuntimeEnv } from "../runtime.js" ;
2626import { logError } from "../logger.js" ;
2727import { ensureMediaHosted } from "../media/host.js" ;
28+ import { normalizeMediaSource , splitMediaFromOutput } from "../media/parse.js" ;
2829
2930type GetReplyOptions = {
3031 onReplyStart ?: ( ) => Promise < void > | void ;
3132} ;
3233
33- function normalizeMediaSource ( src : string ) {
34- if ( src . startsWith ( "file://" ) ) return src . replace ( "file://" , "" ) ;
35- return src ;
36- }
37-
3834function summarizeClaudeMetadata ( payload : unknown ) : string | undefined {
3935 if ( ! payload || typeof payload !== "object" ) return undefined ;
4036 const obj = payload as Record < string , unknown > ;
@@ -293,43 +289,9 @@ const mediaNote =
293289 } ,
294290 ) ;
295291 const rawStdout = stdout . trim ( ) ;
296- let trimmed = rawStdout ;
297- let mediaFromCommand : string | undefined ;
298- const mediaLine = rawStdout
299- . split ( "\n" )
300- . find ( ( line ) => / \b M E D I A : / i. test ( line ) ) ;
301- if ( mediaLine ) {
302- let isValidMedia = false ;
303- const mediaMatch = mediaLine . match ( / \b M E D I A : \s * ( [ ^ \s ] + ) / i) ;
304- if ( mediaMatch ?. [ 1 ] ) {
305- const candidate = normalizeMediaSource ( mediaMatch [ 1 ] ) ;
306- const looksLikeUrl = / ^ h t t p s ? : \/ \/ / i. test ( candidate ) ;
307- const looksLikePath =
308- candidate . startsWith ( "/" ) || candidate . startsWith ( "./" ) ;
309- const hasWhitespace = / \s / . test ( candidate ) ;
310- isValidMedia =
311- ! hasWhitespace &&
312- candidate . length <= 1024 &&
313- ( looksLikeUrl || looksLikePath ) ;
314- if ( isValidMedia ) mediaFromCommand = candidate ;
315- }
316- if ( isValidMedia && mediaMatch ?. [ 0 ] ) {
317- trimmed = rawStdout
318- . replace ( mediaMatch [ 0 ] , "" )
319- . replace ( / \s { 2 , } / g, " " )
320- . replace ( / \s + \n / g, "\n" )
321- . replace ( / \n { 3 , } / g, "\n\n" )
322- . trim ( ) ;
323- } else {
324- trimmed = rawStdout
325- . split ( "\n" )
326- . filter ( ( line ) => line !== mediaLine )
327- . join ( "\n" )
328- . replace ( / \n \s + / g, "\n" )
329- . replace ( / \n { 3 , } / g, "\n\n" )
330- . trim ( ) ;
331- }
332- }
292+ const { text : trimmedText , mediaUrl : mediaFromCommand } =
293+ splitMediaFromOutput ( rawStdout ) ;
294+ let trimmed = trimmedText ;
333295 if ( stderr ?. trim ( ) ) {
334296 logVerbose ( `Command auto-reply stderr: ${ stderr . trim ( ) } ` ) ;
335297 }
0 commit comments