# 블록 (/ko/docs/flows/blocks)

각 블록은 한 가지 일을 합니다. 블록을 선택하면 인스펙터에 설정이 나타나고, 캔버스에서는 입력이 왼쪽에, 출력이 오른쪽에 포트로 표시됩니다.
이 페이지는 블록 선택기가 사용하는 그룹별로 모든 종류를 나열한 다음, 블록 사이를 오가는 값, `{{body.id}}` 같은 템플릿, 조건을 설명합니다.

## 실행이 진행되는 방식 [#how-a-run-moves]

- 블록은 자신으로 들어오는 연결이 있는 입력에 모두 값이 들어온 뒤에 실행됩니다. 그런 다음 출력 중 일부로 값을 내보내며, 그 출력에 연결된 블록만
  다음에 실행됩니다.
- 시작 블록이 가장 먼저 실행됩니다. 아무것도 연결되지 않은 값과 변수 가져오기 블록도 시작 시점에 함께 실행됩니다.
- 블록은 가능하면 동시에 실행됩니다. 표시 후 대기 블록이 사용자를 기다리는 동안 폴링 블록은 계속 진행할 수 있습니다.
- 여러 블록이 실패할 수 있습니다. 요청, 폴링, 도구, 플로, 평가, 파일 쓰기에는 `fail` 출력이 있습니다. 이 출력이 연결되어 있으면 실패가 그곳으로
  나가고 실행이 계속됩니다. 연결되어 있지 않으면 그 블록에서 실행 전체가 실패합니다.
- 실행 중인 것이 더 이상 없으면 실행이 끝납니다.

모든 블록의 인스펙터에는 <strong>제목</strong>(블록에 표시되며, 비어 있으면 블록 종류의 이름)과 <strong>일시 정지됨(값이 그대로 통과함)</strong>도 있습니다. 일시 정지된
블록은 흐리게 표시되고 건너뜁니다. 들어온 값은 첫 번째 출력으로 그대로 나갑니다.

## 트리거 [#triggers]

### 시작 [#start]

실행이 시작되는 곳입니다. **실행** 버튼, 에이전트(플로가 도구일 때), 일정, 웹훅, `echolot flow run`으로 시작합니다. 인스펙터에는 플로의
**트리거**가 있습니다. [실행과 트리거](/docs/flows/running-and-triggers)를 참조하세요.

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 출력 | 플로의 모든 입력을 하나의 객체로 묶은 값. |
| 입력마다 하나 | 출력 | 그 입력의 값. |

플로에는 시작 블록이 정확히 하나 있습니다. 블록 선택기에는 나타나지 않습니다.

### 출력 [#output]

실행이 돌려주는 값입니다. 플로를 호출한 에이전트, 명령줄, 웹훅을 호출한 쪽, 또는 상위 플로로 전달됩니다. 플로에는 최대 하나 있습니다.

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `value` | 입력 | 결과. |

## 동작 [#actions]

### 요청 [#request]

작업 공간에 저장된 요청(HTTP, GraphQL 또는 MCP 요청)을 인증, 스크립트, 검사, 실행의 환경과 함께 보냅니다.

| 설정 | 하는 일 |
| --- | --- |
| **요청** | 목록에서 고른 저장된 요청(필수). |
| **변수** | 쉼표로 구분한 이름. 각 이름이 요청의 해당 `{{variable}}`을 채우는 입력이 됩니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `send` | 입력 | 요청을 보냅니다. 객체가 들어오면 그 객체의 각 키가 이번 전송의 변수가 됩니다. |
| **변수**의 이름마다 하나 | 입력 | 해당 변수의 값. |
| `success` | 출력 | 요청이 성공했을 때의 [응답](#the-response-object). |
| `fail` | 출력 | 2xx 이외로 응답했거나 검사가 실패했을 때의 응답, 또는 아무것도 돌아오지 않았을 때의 오류. |

요청이 2xx로 응답하고 검사, 스크립트 테스트, 스크립트가 모두 통과하면 성공입니다. [실행](/docs/requests/runner)과 같습니다. 플로가 전달하는 변수는
이번 전송에서만 환경의 변수보다 우선합니다.

**Place a test order** 플로에서는 **Sign in**의 `success` 출력이 **Create order**의 `send`에 연결되어 있습니다. 로그인이 성공한 뒤에만
주문이 이루어지며, Sign in이 캡처한 토큰은 이미 `{{token}}`에 들어 있습니다.

### 도구 [#tool]

모의 서버 시작, 폴더 실행, 명세 린트, MCP 서버의 도구 호출 등 Echolot 자체의 도구 하나를 에이전트와 같은 규칙으로 실행합니다.

| 설정 | 하는 일 |
| --- | --- |
| **도구** | 목록에서 고른 도구(필수). |
| **인수** | 도구의 인수를 JSON으로 입력합니다(예: `{ "name": "{{value}}" }`). 텍스트 값에는 템플릿을 쓸 수 있습니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 입력 | 도구를 실행합니다. 객체가 들어오면 그 키가 인수에 추가됩니다. |
| `result` | 출력 | 도구가 돌려준 값. |
| `fail` | 출력 | 실패한 이유. |

도구 블록은 다른 플로를 실행할 수 없습니다. 그럴 때는 플로 블록을 사용하세요.

<Edition only="direct">
  로컬 프로그램(stdio)으로 실행되는 MCP 서버를 호출하는 도구 블록은 직접 다운로드 버전에서 작동합니다. App Store 에디션에서는 Echolot이 그
  프로그램을 시작할 수 없으므로, 블록에 경고가 표시되고 실행하면 실패합니다.
</Edition>

### 플로 [#flow]

작업 공간의 다른 플로를 실행하고, 그 출력 블록이 받은 값을 내보냅니다.

| 설정 | 하는 일 |
| --- | --- |
| **플로** | 다른 플로(필수). 플로는 자기 자신을 실행할 수 없으며, 플로끼리 순환하며 서로를 실행할 수도 없습니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `input` | 입력 | 다른 플로의 입력을 담은 객체. |
| `output` | 출력 | 다른 플로가 돌려준 값. |
| `fail` | 출력 | 다른 플로가 실패한 이유. |

플로는 최대 8단계까지 서로를 실행할 수 있습니다. 비밀 값은 플로 사이에서 값으로 전달되지 않습니다. 대신 변수로 저장하세요.

## 사람 [#people]

사람 블록은 실행을 멈추고 사용자에게 무언가를 묻습니다. 앱에서는 시트가 열리고, 에이전트가 시작한 경우에는 질문이 에이전트의 클라이언트로
전달되며, 명령줄에서는 터미널에서 묻습니다. 일정과 웹훅이 시작한 실행에는 물어볼 사람이 없으므로 그 경우 사람 블록은 실패하고,
`echolot flow run --no-input`도 마찬가지입니다.

### 묻기 [#ask]

작은 양식으로 값을 묻습니다.

| 설정 | 하는 일 |
| --- | --- |
| **메시지** | 묻는 내용. 템플릿을 쓸 수 있습니다. |
| **필드** | 양식의 필드(필수). 각 필드에는 `name`(포트와 키), 옆에 표시되는 `label`, `type`(`text`, `number`, `bool`, `secret`, `choice`), 선택 항목용으로 쉼표로 구분한 `choices`, `default`가 있습니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 입력 | 묻습니다. 객체가 들어오면 메시지의 템플릿을 채웁니다. |
| `answers` | 출력 | 모든 답변을 하나의 객체로 묶은 값. |
| 필드마다 하나 | 출력 | 그 필드의 답변. |
| `cancelled` | 출력 | 사용자가 **취소**를 클릭했을 때 `true`. |

시트에는 **취소**와 **계속**이 있습니다. `secret` 필드의 답변은 실행 로그에서 숨겨집니다.

### 표시 후 대기 [#show-and-wait]

메시지, 복사할 코드, 열 링크를 보여 준 다음 **계속**을 누를 때까지, 또는 `until`로 값이 들어올 때까지 기다립니다. 기기 로그인에 사용하세요.
폴링 블록이 승인을 기다리는 동안 코드를 표시합니다.

| 설정 | 하는 일 |
| --- | --- |
| **제목** | 시트의 제목. |
| **메시지** | 표시할 내용(필수). |
| **코드** | 크게 표시되며 **코드 복사** 버튼이 함께 나옵니다(기기 코드). |
| **링크** | **브라우저에서 열기**와 함께 표시됩니다. |
| **QR** | **링크를 QR 코드로도 표시합니다.** 기본값은 꺼짐입니다. |

다섯 설정 모두 템플릿을 쓸 수 있습니다.

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 입력 | 시트를 표시합니다. 객체가 들어오면 템플릿을 채웁니다. |
| `until` | 입력 | 폴링 블록의 `success`처럼 값이 들어오면 저절로 계속됩니다. |
| `done` | 출력 | `run`으로 들어온 값. |

`until`이 연결되어 있으면 시트에 <strong>완료되면 자동으로 계속됩니다.</strong>라고 표시됩니다. <strong>대기 중단</strong>은 시트를 닫고 블록을 실패시킵니다.

### 승인 [#approve]

되돌릴 수 없는 일을 하기 전에, 플로가 계속되기 전에 사용자의 승인을 요청합니다.

| 설정 | 하는 일 |
| --- | --- |
| **메시지** | 질문(필수). 템플릿을 쓸 수 있습니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 입력 | 묻습니다. 객체가 들어오면 메시지의 템플릿을 채웁니다. |
| `approved` | 출력 | **승인**을 누른 뒤, `run`으로 들어온 값. |
| `declined` | 출력 | **거절**을 누른 뒤, `run`으로 들어온 값. |

승인은 항상 사람이 해야 합니다. 에이전트가 플로를 실행하다 승인 블록에 답하려고 하면 Echolot이 먼저 사용자에게 질문을 전달합니다.
<strong>Place a test order</strong>에서 승인 블록 <strong>Keep the order?</strong>는 상점이 방금 만든 주문으로
`Keep order {{body.id}} for CHF {{body.total.amount}}?`라고 묻고, **거절**하면 값이 **Cancel order**로 넘어갑니다.

<Shot id="flows-approve-sheet" alt="Place a test order의 승인 시트: Keep the order? 질문과 주문 ID, 스위스 프랑으로 표시된 합계, 거절과 승인 버튼" />

## 논리 [#logic]

### 조건 분기 [#if]

들어온 값을 [조건](#conditions)에 따라 `true` 또는 `false`로 보냅니다.

| 설정 | 하는 일 |
| --- | --- |
| **조건** | JavaScript 표현식(필수). 예: `value.status == 200`. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `value` | 입력 | 검사할 값. |
| `true`, `false` | 출력 | 같은 값이 두 출력 중 하나로 나갑니다. |

<strong>Morning stock check</strong>는 상점이 돌려준 상품 목록에 `value.body.items.some(p => p.stock.bern < 5)`를 적용한 조건 분기 <strong>Running low?</strong>를
사용합니다.

### 다중 분기 [#switch]

들어온 값을 조건이 성립하는 첫 번째 경우로 보내고, 없으면 `default`로 보냅니다.

| 설정 | 하는 일 |
| --- | --- |
| **경우** | 목록(필수). 각 경우에는 `name`(출력 포트)과 `condition`이 있습니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `value` | 입력 | 검사할 값. |
| 경우마다 하나 | 출력 | 그 경우가 성립하는 첫 번째 경우일 때의 값. |
| `default` | 출력 | 성립하는 경우가 없을 때의 값. |

### 평가 [#evaluate]

들어온 값에 JavaScript를 실행합니다. 마지막 표현식이 결과입니다. 예: `({ id: value.body.id })` 또는 `a + b`. 자체 `return`이 있는 코드는
함수의 본문으로 실행되며 `return`이 돌려주는 값이 결과입니다. 프라미스는 완료될 때까지 기다립니다. `pm.test`와
`pm.expect`는 [스크립트](/docs/requests/scripts-and-tests)에서처럼 작동하며, 그 결과는 실행의 테스트로 집계됩니다. `console.log` 줄은 실행
로그로 갑니다.

| 설정 | 하는 일 |
| --- | --- |
| **코드** | JavaScript(필수). |
| **입력** | 쉼표로 구분한 입력 이름. 각 이름이 코드의 변수가 됩니다. 비어 있으면 `value`. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| **입력**의 이름마다 하나 | 입력 | 그 변수의 값. |
| `result` | 출력 | 결과. |
| `fail` | 출력 | 코드가 예외를 던졌을 때의 오류. |

```js
// 입력: pages. 수집 블록이 모은 목록들을 하나로 합칩니다.
return pages.flat();
```

### 지연 [#delay]

기다린 다음 값을 그대로 넘깁니다.

| 설정 | 하는 일 |
| --- | --- |
| **밀리초** | 기다릴 시간(필수). 숫자 또는 `{{wait}}` 같은 템플릿. |

포트: `value` 입력, `value` 출력.

## 반복 [#loops]

### 반복 [#repeat]

**횟수**만큼 0부터 세어 `index`를 보낸 다음 `done`을 보냅니다.

| 설정 | 하는 일 |
| --- | --- |
| **횟수** | 반복할 횟수(필수): 0에서 100,000까지. 숫자 또는 `{{pages}}` 같은 템플릿. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 입력 | 반복을 시작합니다. |
| `index` | 출력 | 회차마다 0, 1, 2… |
| `done` | 출력 | 마지막 회차 뒤에 `run`으로 들어온 값. |

### 각 항목 반복 [#for-each]

목록의 각 항목을 차례로 보낸 다음 `done`을 보냅니다. 설정은 없습니다.

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `list` | 입력 | 목록. 다른 값이 들어오면 블록이 실패합니다. |
| `item` | 출력 | 회차마다 항목 하나. |
| `index` | 출력 | 항목의 위치(0부터). |
| `done` | 출력 | 마지막 회차 뒤의 목록 전체. |

### 수집 [#collect]

반복하는 동안 도착하는 값을 하나의 목록으로 모으고, 반복이 끝나면 보냅니다. 설정은 없습니다.

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `item` | 입력 | 회차마다 값 하나. |
| `list` | 출력 | 이 블록이 속한 반복이 끝났을 때 모인 모든 값. |

반복의 각 회차는 다음 회차가 시작되기 전에 끝나며, 회차가 거치는 블록은 회차마다 다시 실행됩니다. 시작 블록의 입력처럼 반복 바깥에서 온 값은
모든 회차에서 계속 사용할 수 있습니다.

### 폴링 [#poll]

조건이 성립할 때까지(로그인이 승인되거나 작업이 끝날 때까지) 또는 기한이 지날 때까지 저장된 요청을 반복해서 보냅니다.

| 설정 | 하는 일 |
| --- | --- |
| **요청** | 저장된 요청(필수). |
| **변수** | 쉼표로 구분한 이름. 각 이름이 해당 `{{variable}}`을 채우는 입력이 됩니다. |
| **종료 조건** | 마지막 응답인 `response`에 대한 [조건](#conditions). 기본값: `response.status >= 200 && response.status < 300`. |
| **간격** | 전송 사이의 초. 기본값 5. 숫자 또는 템플릿. |
| **기한** | 포기하기까지의 초. 기본값 300. 숫자 또는 템플릿. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `send` | 입력 | 폴링을 시작합니다. 객체가 들어오면 그 키가 변수가 됩니다. |
| **변수**의 이름마다 하나 | 입력 | 해당 변수의 값. |
| `success` | 출력 | 조건을 만족한 응답. |
| `timeout` | 출력 | 기한이 지났을 때의 마지막 응답. `timeout`이 연결되어 있지 않으면 블록이 대신 실패합니다. |
| `fail` | 출력 | 전송이 실패했을 때의 오류. |

요청 블록과 달리 2xx 이외의 응답은 폴링을 실패시키지 않습니다. **종료 조건**이 성립할 때까지 다시 보냅니다.

## 데이터 [#data]

### 값 [#value]

고정된 값입니다. 텍스트, 숫자, `true` 또는 `false`, 목록, 객체를 쓸 수 있습니다.

| 설정 | 하는 일 |
| --- | --- |
| **값** | 텍스트, 숫자 또는 JSON(필수). |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 입력 | 무언가 들어올 때마다 값을 다시 보냅니다. |
| `value` | 출력 | 값. `run`에 아무것도 연결되어 있지 않으면 시작할 때 한 번 보냅니다. |

### 템플릿 [#template]

들어온 객체와 실행의 변수로 `{{name}}`을 채운 텍스트입니다.

| 설정 | 하는 일 |
| --- | --- |
| **텍스트** | [템플릿](#templates)이 들어 있는 텍스트(필수). |

포트: `values` 입력(객체), `text` 출력.

### 추출 [#select]

들어온 값에서 경로로 값을 골라 하나씩 출력으로 보냅니다.

| 설정 | 하는 일 |
| --- | --- |
| **필드** | 목록(필수). 각 필드에는 `name`(출력 포트)과 `$.body.user_code` 같은 `path`가 있습니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `value` | 입력 | 값을 고를 대상. 보통 응답입니다. |
| 필드마다 하나 | 출력 | 그 경로의 값. 아무것도 없으면 `null`. |
| `all` | 출력 | 모든 필드를 하나의 객체로 묶은 값. |

경로는 JSONPath의 공통 부분입니다.

| 경로 | 고르는 값 |
| --- | --- |
| `$.body.items[0].sku` | 키, 그다음 목록의 첫 번째 항목. |
| `$.body.items[-1]` | 마지막 항목. |
| `$.body.items[*].sku` | 모든 항목의 `sku`를 목록으로. |
| `$['content-type']` | 점으로는 쓸 수 없는 문자가 들어 있는 키. |
| `body.id` | `$`가 없으면 경로는 값에서 시작합니다. |

### 변수 설정 [#set-variable]

값을 변수로 저장하므로 이후의 블록과 요청이 `{{name}}`으로 읽을 수 있습니다.

| 설정 | 하는 일 |
| --- | --- |
| **변수** | 목록(필수). 각 항목에는 `name`, 들어온 값 안의 `path`(비어 있으면 전체), `scope`, `secret`이 있습니다. |

| 범위 | 값이 저장되는 곳 |
| --- | --- |
| `run` | 이 실행과 이 실행이 보내는 요청에서만. |
| `environment` | 활성 환경(기본값). 선택한 환경이 없으면 여기서 실행이 실패합니다. |
| `workspace` | 작업 공간 자체의 변수. |
| `global` | 플로에서는 쓸 수 없음: 실행이 실패하고 환경이나 작업 공간에 저장하라고 안내합니다. |

`secret`을 켜면 값은 파일이 아닌 키체인에 저장되고, 앞 블록에서 나오는 순간부터 실행 로그와 에이전트가 보는 내용에서 숨겨집니다. `path`가
아무것도 찾지 못하면 변수는 이전 값을 유지하므로, 새 리프레시 토큰이 없는 토큰 응답이 이미 가지고 있는 토큰을 지우지 않습니다.
[비밀 값](/docs/workspaces/secrets)을 참조하세요.

포트: `value` 입력, `value` 출력(들어온 값을 그대로 넘김).

### 변수 가져오기 [#get-variable]

요청이 보는 방식으로 변수를 읽습니다. 실행 자체의 변수, 그다음 환경, 작업 공간, 전역 변수 순입니다.

| 설정 | 하는 일 |
| --- | --- |
| **이름** | 변수(필수). |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `run` | 입력 | 무언가 들어올 때마다 다시 읽습니다. |
| `value` | 출력 | 변수의 값. 없으면 `null`. `run`에 아무것도 연결되어 있지 않으면 시작할 때 한 번 읽습니다. |

## 출력 [#output]

### 표시 [#display]

들어온 값을 그대로 넘겨서 살펴볼 수 있게 합니다. 실행이 끝난 뒤 블록을 선택하고 인스펙터의 **마지막 실행**을 읽으세요.

| 설정 | 하는 일 |
| --- | --- |
| **형식** | `auto`, `text`, `json`, `table`, `image`. 기본값 `auto`. |

포트: `value` 입력, `value` 출력.

### 로그 [#log]

실행 로그에 한 줄을 씁니다.

| 설정 | 하는 일 |
| --- | --- |
| **메시지** | 줄의 내용. 템플릿을 쓸 수 있습니다. `{{value}}`는 들어온 값이며, 메시지가 비어 있으면 값 전체입니다. |

포트: `value` 입력, `value` 출력. **Place a test order**에서 **Order failed**는 주문이 이루어지지 않을 때 `Create order answered {{status}}`를
기록합니다.

### 검증 [#assert]

들어온 값을 검사합니다. 각 검사는 실행의 테스트 결과이며, 하나라도 실패하면 `echolot flow run`이 실패합니다.

| 설정 | 하는 일 |
| --- | --- |
| **검사** | 목록(필수). 각 검사에는 `name`과 `value`에 대한 `condition`이 있습니다. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `value` | 입력 | 검사할 값. |
| `passed` | 출력 | 모든 검사가 성립할 때의 값. |
| `failed` | 출력 | 검사가 하나라도 실패할 때의 값. |

```js
value.status === 200   // Answers 200
value.time < 2000      // Within two seconds
```

### 알림 [#notify]

Echolot의 macOS 알림을 표시합니다. macOS는 처음에 권한을 요청합니다. 명령줄에서는 알림 대신 내용이 출력됩니다.

| 설정 | 하는 일 |
| --- | --- |
| **제목** | 알림의 제목(필수). 템플릿을 쓸 수 있습니다. |
| **메시지** | 알림의 텍스트. 템플릿을 쓸 수 있습니다. |

포트: `value` 입력, `value` 출력. **Morning stock check**는 제목이 `Restock Bern`인 알림 **Restock**으로 끝납니다.

### 파일 쓰기 [#write-file]

들어온 값을 작업 공간 폴더 안의 파일에 씁니다.

| 설정 | 하는 일 |
| --- | --- |
| **경로** | 작업 공간 폴더 기준 경로(예: `exports/items.json`, 필수). 템플릿을 쓸 수 있습니다. |
| **형식** | `json`(들여쓰기 적용), `text`, `csv`. 기본값 `json`. |

| 포트 | 방향 | 전달하는 값 |
| --- | --- | --- |
| `value` | 입력 | 쓸 내용. |
| `path` | 출력 | 작업 공간 기준 파일 경로. |
| `fail` | 출력 | 쓸 수 없었던 이유. |

이미 있는 파일은 교체됩니다. 작업 공간 자체의 파일은 쓸 수 없습니다. `requests`, `flows`, `environments`, `mocks`, `mcp-servers`, `specs`
폴더, `workspace.toml`, 숨김 파일이 그렇습니다. CSV에서는 객체 목록이 객체당 한 행, 키당 한 열이 되며, 그 밖의 값은 한 줄에 값 하나씩
기록됩니다.

## 블록 사이의 값 [#values-between-blocks]

값은 JSON입니다. 텍스트, 숫자, `true`와 `false`, 목록, 객체, `null`입니다.

### 응답 객체 [#the-response-object]

요청과 폴링은 응답을 객체로 보냅니다.

```json
{
  "status": 201,
  "reason": "Created",
  "headers": { "content-type": "application/json", "location": "/v1/orders/ord_9Px3Kd" },
  "body": { "id": "ord_9Px3Kd", "total": { "amount": 449, "currency": "CHF" } },
  "time": 182.4,
  "url": "https://demo.echolot.dev/v1/orders"
}
```

- `body`는 응답이 JSON이면 파싱된 JSON, 아니면 텍스트이며, 비어 있으면 `null`입니다.
- 헤더 이름은 소문자입니다. 두 번 이상 보낸 헤더는 `, `로 이어 붙입니다.
- `time`은 교환 전체의 시간(밀리초)입니다.
- 8 MB를 넘는 본문은 `null`과 `"truncated": true`로 도착합니다. 전체 응답은 [기록](/docs/workspaces/history)에 그대로 남아 있습니다.

### 템플릿 [#templates]

“템플릿을 쓸 수 있습니다”라고 표시된 설정은 블록으로 들어온 값에서 `{{name}}`을 채웁니다.

- `{{status}}`, `{{body.id}}`, `{{body.items[0].sku}}`: 들어온 객체의 키 또는 그 안으로 들어가는 [경로](#select).
- 로그, 알림, 파일 쓰기의 `{{value}}`: 들어온 값 전체.
- 변수 설정 블록이 `run` 범위로 저장한 변수.

일치하는 것이 없는 이름은 그대로 남으므로, 요청 블록 자체의 `{{variables}}`는 보낼 때 환경에서 계속 해석됩니다. 객체와 목록은 JSON 텍스트로
기록됩니다.

### 조건 [#conditions]

조건 분기, 다중 분기, 폴링, 검증은 참 또는 거짓이 되는 JavaScript 표현식을 받습니다. `value`는 들어온 값이며, 폴링의 **종료 조건**은 이를
`response`로 읽으며, 이 이름은 다른 곳에서도 작동합니다.

```js
value.status == 200
response.status === 200 && !!(response.body && response.body.access_token)
value.body.items.length > 0
```

예외를 던지는 표현식은 블록을 실패시킵니다(검증에서는 해당 검사가 실패합니다).

## 한도 [#limits]

잘못된 연결 때문에 실행이 끝없이 이어지지 않도록, 실행은 블록이 10,000번 실행되거나 한 시간이 지나면 멈춥니다. 웹훅이 시작한 실행은 2분 뒤에
멈춥니다.
