- type: js
  args: gpt
  code: |-
    function isGptTooShort(args) {
      // Get gpt out of the arguments
      const gpt = args.gpt;
      
      // Check on undefined or null
      if (gpt === undefined || gpt === null) {
        return true;
      }
      
      // Convert to string and remove Whitespace
      const trimmedGpt = String(gpt).trim();
      
      // Check whether length less than 15
      return trimmedGpt.length < 15;
    }
    // Test the argument
    return isGptTooShort(args);
  param: boolean
  timeout: 15000
  onFailure: MESSAGE GPT PARAMETER IS EMPTY
  silent: true
  label: CHECK IF GPT STEP HAS LESS THAN 15 CHARACTERS
- type: jump
  to: MESSAGE GPT PARAMETER IS EMPTY
  condition: '{{boolean}} = true'
- steps:
    - message: ⏳ Give me a minute to search through the web for you...
      type: say
    - type: js
      args: gpt
      code: |-
        function extractAllLinksToArray(args) {
          const text = args.gpt;
          
          if (!text) return [];
          
          // Kombiniertes Regex Pattern für:
          // 1. Markdown Links: [text](url)
          // 2. Normale URLs: http(s)://example.com
          const urlPattern = /\[[^\]]+\]\(([^)]+)\)|https?:\/\/[^\s<>)"]+/g;
          
          // Array to store all URLs
          const links = [];
          
          // Find all matches
          let match;
          while ((match = urlPattern.exec(text)) !== null) {
            // If it's a markdown link (has capture group), use the URL from group
            // Otherwise use the full match (for plain URLs)
            const url = match[1] || match[0];
            
            // Avoid duplicates
            if (!links.includes(url)) {
              links.push(url);
            }
          }
          
          return links;
        }
        return extractAllLinksToArray(args);
      param: extractAllLinksToArray
      timeout: 15000
      onFailure: CREATING RELEVANT URLS
      silent: true
      label: EXTRACT ALL URLS INTO ARRAY
    - param: total
      format: number
      value: '{{extractAllLinksToArray.length}}'
      type: calc
      func: set
      label: SET LINKS LENGTH
    - steps:
        - label: TRYING TO FETCH
          param: content
          value: '{{page {{item}}}}'
          type: calc
          func: set
          format: ''
        - onFailure: SET PAGE URL
          type: js
          code: |-
            const content = args['content']; 
            return { 
             chars: content.length, 
             estimatedTokens: Math.ceil(content.length / 4), 
             estimatedWords: Math.ceil(content.length / 4 * 0.75) 
            };
          param: count
          timeout: 15000
          label: COUNT
          silent: true
          args: content
        - param: pageUrl
          value: '{{item}}'
          type: calc
          func: set
          format: text
          label: SET PAGE URL
        - code: |-
            const regex = /^(?:https?:\/\/)?(?:www\.)?([^\/]+)/;
            const testString = pageUrl;
            const matches = testString.match(regex);
            if (matches) {
              const hostname = matches[1];
              return hostname; 
            }
          param: hostname
          label: HOSTNAME
          type: js
          args: pageUrl
          timeout: 15000
          silent: true
        - func: increment
          param: index
          delta: 1
          type: calc
        - args: index, total
          code: |-
            function calculatePercentage(index, total) {
                index = Number(index);
                total = Number(total);
                if (isNaN(index) || isNaN(total)) {
                    return "Error";
                }
                return (index / total * 100).toFixed(1) + "%";
            }
            let result = calculatePercentage(index, total);
            return result;
          param: percentage
          label: PERCENTAGE INDEX TOTAL
          type: js
          timeout: 15000
          silent: true
        - steps:
            - type: js
              args: content
              code: |-
                function formatTextToInfoJson(args) {
                  const text = args.content;
                  
                  if (!text) return {};
                  
                  const cleanText = text
                    .replace(/"/g, '\\"')
                    .replace(/\r\n/g, '\\n')
                    .replace(/\n/g, '\\n')
                    .replace(/\t/g, '\\t');
                    
                  const jsonObject = {
                    info: cleanText
                  };
                  
                  return jsonObject;
                }
                // Speichere das Ergebnis in 'data'
                args.data = formatTextToInfoJson(args);
                return args.data;
              param: data
              timeout: 15000
              onFailure: ''
              silent: true
              label: CONVERT PAGE CONTENT TO JSON
            - func: extract-json
              index: first
              type: calc
              to: data
              param: data
            - param: data.url
              format: auto
              type: calc
              func: set
              value: '{{item}}'
            - func: list-add
              index: last
              list: array
              type: calc
              item: data
            - type: jump
              to: SAY STATUS
          condition: '{{content}} =~ ^[\s\S]{1000,}$'
          type: group
          label: FETCHED
        - steps:
            - args: item
              code: |-
                // Get URL from args parameter
                const url = args['item'];
                if (!url) {
                  return false;
                }
                const fullUrl = url.startsWith('http') ? url : 'https://' + url;
                window.location.href = fullUrl;
                return true;
              param: navigate.boolean
              onFailure: WAIT UNTIL PAGE LOADED
              label: NAVIGATE
              type: js
              timeout: 15000
              silent: true
            - type: wait
              for: custom-delay
              delay: '1500'
              silent: true
              label: WAIT UNTIL PAGE LOADED
            - type: js
              args: page
              code: |-
                function formatTextToInfoJson(args) {
                  const text = args.page;
                  
                  if (!text) return {};
                  
                  const cleanText = text
                    .replace(/"/g, '\\"')
                    .replace(/\r\n/g, '\\n')
                    .replace(/\n/g, '\\n')
                    .replace(/\t/g, '\\t');
                    
                  const jsonObject = {
                    info: cleanText
                  };
                  
                  return jsonObject;
                }
                // Speichere das Ergebnis in 'data'
                args.data = formatTextToInfoJson(args);
                return args.data;
              param: data
              timeout: 15000
              onFailure: ABORT NAVIGATE
              label: CONVERT PAGE CONTENT TO JSON
              silent: true
            - type: calc
              func: extract-json
              to: data
              param: data
              index: first
            - type: calc
              func: set
              param: data.url
              format: auto
              value: '{{item}}'
            - type: calc
              func: list-add
              index: last
              list: array
              item: data
          label: NOT FETCHED
          type: group
        - message: |-
            🔍 Analyzed **{{index}} / {{total}}**,  [{{hostname}}]({{pageUrl}})
            - Chars: {{count.chars}}
            - Estimated Tokens: {{count.estimatedTokens}}
            - Estimated Words: {{count.estimatedWords}}
          label: ⛔️SAY STATUS
          condition: '{{index}} = {{total1}}'
          type: say
        - message: |-
            🔍 Analyzed **{{percentage}}**,  [{{hostname}}]({{pageUrl}})
            - Chars: {{count.chars}}
            - Estimated Tokens: {{count.estimatedTokens}}
            - Estimated Words: {{count.estimatedWords}}
          condition: '{{index}} != {{total}}'
          type: say
          label: SAY STATUS
        - code: |-
            const content = args['array'];
            const stringContent = JSON.stringify(content);
            return {
              chars: stringContent.length,
              estimatedTokens: Math.ceil(stringContent.length / 4),
              estimatedWords: Math.ceil(stringContent.length / 4 * 0.75)
            };
          param: arrayLength
          label: ARRAY LENGTH
          type: js
          args: array
          timeout: 15000
          onFailure: SAY STATUS
          silent: true
        - message: |-
            ✅ **{{percentage}}** pages scanned. 
            Last checked page: [{{hostname}}]({{pageUrl}})
            - Chars: {{count.chars}}
            - Estimated Tokens: {{count.estimatedTokens}}
            - Estimated Words: {{count.estimatedWords}}
            - Array Token length: **{{arrayLength.estimatedTokens}}**
          condition: '{{index}} = {{total}}'
          type: say
          label: SAY STATUS
      type: loop
      list: extractAllLinksToArray
  label: DEPTH = 1
  type: group
- type: say
  message: '{{array}}'
  label: DISPLAY ALL PARSED URL PAGE CONTENT
- type: say
  message: |-
    Note: Use the following to parse only specific links:
    `{{array.0.info}}`
    `{{array.1.info}}`
    `{{array.2.info}}`
    Use `{{array}}` to display the entire result.
  interpolate: false
- type: say
  message: The {{gpt}} parameter is empty.
  label: MESSAGE GPT PARAMETER IS EMPTY
  interpolate: false
  condition: '{{boolean}} = true'
This automation command is created by a community member. HARPA AI team does not audit community commands.
Please review the command carefully and only install if you trust the creator.
All rights reserved © HARPA AI TECHNOLOGIES LLC, 2021 — 2025
Designed and engineered in Finland 🇫🇮