Spaces:
Running
Running
| import os | |
| from ..subprocess_code_interpreter import SubprocessCodeInterpreter | |
| class AppleScript(SubprocessCodeInterpreter): | |
| file_extension = 'applescript' | |
| proper_name = 'AppleScript' | |
| def __init__(self): | |
| super().__init__() | |
| self.start_cmd = os.environ.get('SHELL', '/bin/zsh') | |
| def preprocess_code(self, code): | |
| """ | |
| Inserts an end_of_execution marker and adds active line indicators. | |
| """ | |
| # Add active line indicators to the code | |
| code = self.add_active_line_indicators(code) | |
| # Escape double quotes | |
| code = code.replace('"', r"\"") | |
| # Wrap in double quotes | |
| code = '"' + code + '"' | |
| # Prepend start command for AppleScript | |
| code = 'osascript -e ' + code | |
| # Append end of execution indicator | |
| code += '; echo "##end_of_execution##"' | |
| return code | |
| def add_active_line_indicators(self, code): | |
| """ | |
| Adds log commands to indicate the active line of execution in the AppleScript. | |
| """ | |
| modified_lines = [] | |
| lines = code.split('\n') | |
| for idx, line in enumerate(lines): | |
| # Add log command to indicate the line number | |
| if line.strip(): # Only add if line is not empty | |
| modified_lines.append(f'log "##active_line{idx + 1}##"') | |
| modified_lines.append(line) | |
| return '\n'.join(modified_lines) | |
| def detect_active_line(self, line): | |
| """ | |
| Detects active line indicator in the output. | |
| """ | |
| prefix = '##active_line' | |
| if prefix in line: | |
| try: | |
| return int(line.split(prefix)[1].split()[0]) | |
| except Exception as e: | |
| print(e) | |
| pass | |
| return None | |
| def detect_end_of_execution(self, line): | |
| """ | |
| Detects end of execution marker in the output. | |
| """ | |
| return '##end_of_execution##' in line | |