doer-agent 0.1.0 → 0.1.1

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.
Files changed (3) hide show
  1. package/README.md +92 -97
  2. package/dist/agent.js +6 -2
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,67 +1,38 @@
1
1
  # doer-agent
2
2
 
3
- `agent/`는 doer 리버스 폴링 에이전트를 위한 독립 실행 디렉토리입니다.
3
+ `doer-agent`는 doer 서버에 연결되는 리버스 폴링 에이전트 런타임입니다.
4
+ 로컬 머신이나 원격 워크스페이스에서 작업을 실행하고, 결과를 doer로 다시 전달합니다.
4
5
 
5
- ## 준비
6
+ ## 현재 구조
6
7
 
7
- - doer 서버가 실행 중이어야 합니다. (기본: `http://localhost:2020`)
8
- - 아래 명령은 `agent/` 디렉토리 기준입니다.
8
+ 저장소 루트 자체가 `doer-agent` 프로젝트입니다.
9
+ 예전 문서의 `agent/` 하위 디렉토리 기준 설명은 더 이상 맞지 않습니다.
9
10
 
10
- ```bash
11
- npm install
12
- ```
11
+ 주요 엔트리 포인트:
13
12
 
14
- ## 에이전트 실행 (고정 시크릿 + 리버스 폴링)
13
+ - `doer-agent`: 에이전트 본체 CLI
14
+ - `playwright-mcp-call`: Playwright MCP 호출용 CLI
15
+ - `codex`: Codex 래퍼 CLI
15
16
 
16
- 1. 로그인 세션에서 고정 시크릿 발급:
17
+ ## 요구 사항
17
18
 
18
- ```bash
19
- curl -X POST 'http://localhost:2020/api/users/<userId>/agent/secret' \
20
- -H 'Content-Type: application/json' \
21
- --cookie 'doer_session=<session-cookie>' \
22
- -d '{"name":"my-laptop"}'
23
- ```
19
+ - Node.js 20+
20
+ - doer 서버 접근 가능
21
+ - 발급된 `user-id`
22
+ - 발급된 `agent-secret`
24
23
 
25
- 응답 예시:
24
+ 기본 서버는 `https://doer.cranix.net`입니다.
25
+ 다른 서버를 쓸 때만 `--server` 또는 `DOER_AGENT_SERVER`를 지정하면 됩니다.
26
26
 
27
- ```json
28
- {
29
- "agent": { "id": "agent_...", "name": "my-laptop" },
30
- "agentSecret": "<SECRET>"
31
- }
32
- ```
33
-
34
- 2. 에이전트 실행:
35
-
36
- ```bash
37
- npm run start -- --server http://localhost:2020 --user-id <userId> --agent-secret <SECRET>
38
- ```
39
-
40
- 환경변수 fallback도 지원합니다. CLI 인자가 있으면 그 값이 우선합니다.
41
-
42
- ```bash
43
- DOER_AGENT_SERVER=http://localhost:2020 DOER_AGENT_USER_ID=<userId> DOER_AGENT_SECRET=<SECRET> WORKSPACE=/absolute/path/to/workspace npm run start
44
- ```
45
-
46
-
47
- 3. 원격 Codex 실행 전송:
48
-
49
- ```bash
50
- curl -X POST 'http://localhost:2020/api/users/<userId>/agent/codex-tasks' \
51
- -H 'Content-Type: application/json' \
52
- --cookie 'doer_session=<session-cookie>' \
53
- -d '{"agentId":"agent_...","prompt":"현재 작업 디렉토리와 파일 목록을 요약해줘"}'
54
- ```
27
+ ## 빠른 실행
55
28
 
56
- ## Docker로 기본 실행
29
+ 패키지 설치 없이 바로 실행하려면 `npx`를 사용합니다.
30
+ CLI는 `run start --` 없이 직접 옵션을 받습니다.
57
31
 
58
- 기본 실행은 퍼블릭 이미지 `cranix/doer-agent:latest`를 직접 사용합니다.
32
+ macOS / Linux:
59
33
 
60
34
  ```bash
61
- docker run --rm -it \
62
- -v "${PWD}:/workspace" \
63
- cranix/doer-agent:latest \
64
- --server http://<doer-host>:2020 \
35
+ WORKSPACE="${WORKSPACE:-$PWD}" npx -y doer-agent \
65
36
  --user-id <userId> \
66
37
  --agent-secret <SECRET>
67
38
  ```
@@ -69,85 +40,109 @@ docker run --rm -it \
69
40
  PowerShell:
70
41
 
71
42
  ```powershell
72
- docker run --rm -it `
73
- -v "${PWD}:/workspace" `
74
- cranix/doer-agent:latest `
75
- --server http://<doer-host>:2020 `
43
+ $env:WORKSPACE = if ($env:WORKSPACE) { $env:WORKSPACE } else { (Get-Location).Path }
44
+ npx -y doer-agent `
76
45
  --user-id <userId> `
77
46
  --agent-secret <SECRET>
78
47
  ```
79
48
 
80
- - 다른 이미지를 쓰려면 `cranix/doer-agent:latest` 부분만 원하는 태그로 바꾸면 됩니다.
81
- - 기본 실행은 Docker socket을 마운트하지 않습니다.
82
- - 따라서 컨테이너 내부의 중첩 `docker` 사용은 기본 실행 범위에 포함되지 않습니다.
49
+ 다른 서버를 붙일 때:
83
50
 
84
- ## Agent 이미지 빌드/퍼블리시
51
+ ```bash
52
+ WORKSPACE="${WORKSPACE:-$PWD}" npx -y doer-agent \
53
+ --server http://localhost:2020 \
54
+ --user-id <userId> \
55
+ --agent-secret <SECRET>
56
+ ```
85
57
 
86
- 배포용 agent 이미지는 `agent/` 디렉토리에서 `build`와 `publish` 스크립트로 분리해 사용합니다. 두 스크립트 모두 `.` 컨텍스트와 `./Dockerfile`을 기본값으로 사용하며, 기본 이미지 리포지토리는 `cranix/doer-agent`입니다.
58
+ ## 로컬 개발
87
59
 
88
- 로컬 빌드(load):
60
+ 저장소를 직접 수정하거나 빌드하려면 루트에서 실행합니다.
61
+
62
+ 설치:
89
63
 
90
64
  ```bash
91
- ./scripts/build.sh
92
- ./scripts/build.sh --tag v1.2.3 --also-latest
93
- ./scripts/build.sh --image docker.io/example/doer-agent --platform linux/amd64
65
+ npm install
94
66
  ```
95
67
 
96
- 레지스트리 퍼블리시(push):
68
+ 개발 모드 실행:
97
69
 
98
70
  ```bash
99
- ./scripts/publish.sh
100
- ./scripts/publish.sh --tag v1.2.3
101
- ./scripts/publish.sh --image docker.io/example/doer-agent --tag v1.2.3
71
+ npm run start -- --user-id <userId> --agent-secret <SECRET>
102
72
  ```
103
73
 
104
- `publish.sh`는 태그 기반 퍼블리시 시 `:<tag>`와 `:latest`를 함께 push합니다.
74
+ 배포 산출물 빌드:
105
75
 
106
- 퍼블리시한 이미지는 직접 `docker run`으로 지정해 사용합니다.
76
+ ```bash
77
+ npm run build
78
+ ```
79
+
80
+ 빌드 산출물 실행:
107
81
 
108
82
  ```bash
109
- docker run --rm -it \
110
- -v "${PWD}:/workspace" \
111
- ghcr.io/example/doer-agent:v1.2.3 \
112
- --server http://<doer-host>:2020 \
113
- --user-id <userId> \
114
- --agent-secret <SECRET>
83
+ npm run start:dist -- --user-id <userId> --agent-secret <SECRET>
115
84
  ```
116
85
 
117
- ## Docker Compose로 개발 실행
86
+ 기본 서버가 아닌 경우에는 위 명령들에 `--server <url>`을 추가하면 됩니다.
118
87
 
119
- 개발 실행은 `agent/docker-compose.dev.yml` 기준으로 합니다. 이 파일은 로컬 이미지 `doer-agent:latest`를 빌드하고, `/workspace`와 `/var/run/docker.sock`를 함께 마운트합니다.
88
+ ## 환경변수
120
89
 
121
- ```bash
122
- export DOER_AGENT_SERVER=http://<doer-host>:2020
123
- export DOER_AGENT_USER_ID=<userId>
124
- export DOER_AGENT_SECRET=<SECRET>
125
- # 선택: 다른 작업 디렉토리를 마운트하려면 지정
126
- # export DOER_AGENT_WORKSPACE=/absolute/path/to/workspace
90
+ CLI 인자가 우선이고, 없으면 아래 환경변수를 사용합니다.
127
91
 
128
- docker compose -f docker-compose.dev.yml up --build agent-dev
92
+ - `DOER_AGENT_SERVER`: 선택. 기본값은 `https://doer.cranix.net`
93
+ - `DOER_AGENT_USER_ID`: 필수
94
+ - `DOER_AGENT_SECRET`: 필수
95
+ - `WORKSPACE`: 선택. 작업 디렉터리
96
+ - `DOER_AGENT_MAX_CONCURRENCY`: 선택. 동시 작업 수
97
+
98
+ 예시:
99
+
100
+ ```bash
101
+ DOER_AGENT_USER_ID=<userId> \
102
+ DOER_AGENT_SECRET=<SECRET> \
103
+ WORKSPACE=/absolute/path/to/workspace \
104
+ npm run start
129
105
  ```
130
106
 
131
- 백그라운드 실행:
107
+ 로컬 서버 예시:
132
108
 
133
109
  ```bash
134
- docker compose -f docker-compose.dev.yml up --build -d agent-dev
135
- docker compose -f docker-compose.dev.yml logs -f agent-dev
110
+ DOER_AGENT_SERVER=http://localhost:2020 \
111
+ DOER_AGENT_USER_ID=<userId> \
112
+ DOER_AGENT_SECRET=<SECRET> \
113
+ WORKSPACE=/absolute/path/to/workspace \
114
+ npm run start
136
115
  ```
137
116
 
138
- 정리:
117
+ ## 자주 쓰는 옵션
118
+
119
+ - `--server`: doer 서버 베이스 URL
120
+ - `--user-id`: doer 사용자 ID
121
+ - `--agent-secret`: doer가 발급한 에이전트 시크릿
122
+ - `--workspace-dir`: 실행 전에 이동할 작업 디렉터리
123
+
124
+ ## 시크릿 발급 예시
125
+
126
+ 서버가 로컬에서 돌고 있을 때 예시입니다.
139
127
 
140
128
  ```bash
141
- docker compose -f docker-compose.dev.yml down
129
+ curl -X POST 'http://localhost:2020/api/users/<userId>/agent/secret' \
130
+ -H 'Content-Type: application/json' \
131
+ --cookie 'doer_session=<session-cookie>' \
132
+ -d '{"name":"my-laptop"}'
142
133
  ```
143
134
 
144
- - compose 파일은 `agent/` 디렉토리에서 실행하는 기준입니다.
145
- - `DOER_AGENT_SERVER`, `DOER_AGENT_USER_ID`, `DOER_AGENT_SECRET`는 필수입니다.
146
- - `DOER_AGENT_WORKSPACE`를 지정하지 않으면 기본값으로 저장소 루트(`..`)가 `/workspace`에 마운트됩니다.
135
+ 응답 예시:
136
+
137
+ ```json
138
+ {
139
+ "agent": { "id": "agent_...", "name": "my-laptop" },
140
+ "agentSecret": "<SECRET>"
141
+ }
142
+ ```
147
143
 
148
- ## Windows 권장 사항
144
+ ## 참고
149
145
 
150
- - Windows에서는 Docker Desktop의 `Linux containers` 모드가 필요합니다.
151
- - 로컬 개발 환경은 Docker Desktop의 WSL2 백엔드를 권장합니다.
152
- - Windows 네이티브 PowerShell보다 WSL2 셸에서 직접 `docker compose`를 실행하는 쪽이 직접적일 있습니다.
153
- - PowerShell에서 `/var/run/docker.sock` 마운트 가능 여부는 Docker Desktop 설정과 실행 환경에 따라 다릅니다.
146
+ - `runtime/`에는 실행 보조 스크립트가 들어 있습니다.
147
+ - Playwright MCP 프록시는 에이전트 상태 디렉터리(`~/.doer-agent`) 아래 소켓을 사용합니다.
148
+ - 저장소에는 예전 README에 있던 `scripts/build.sh`, `scripts/publish.sh`, `docker-compose.dev.yml`이 없습니다. 현재 문서는 실제 파일 구조 기준으로 정리되어 있습니다.
package/dist/agent.js CHANGED
@@ -9,6 +9,7 @@ import { AckPolicy, connect, DeliverPolicy, JSONCodec, RetentionPolicy, StorageT
9
9
  const PLAYWRIGHT_SKIP_BROWSER_GC = "1";
10
10
  const PLAYWRIGHT_MCP_DAEMON_IDLE_TTL_SECONDS_DEFAULT = 10800;
11
11
  const PLAYWRIGHT_MCP_DAEMON_SIGNATURE_VERSION = "2026-03-15";
12
+ const DEFAULT_SERVER_BASE_URL = "https://doer.cranix.net";
12
13
  const AGENT_MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
13
14
  const AGENT_PROJECT_DIR = path.join(AGENT_MODULE_DIR, "..");
14
15
  let activeTaskLogContext = null;
@@ -1148,9 +1149,10 @@ async function main() {
1148
1149
  if (workspaceDir) {
1149
1150
  process.chdir(path.resolve(workspaceDir));
1150
1151
  }
1151
- const serverBaseUrlRaw = resolveArgOrEnv(args, ["server", "url"], ["DOER_AGENT_SERVER"], "http://localhost:2020");
1152
+ const serverBaseUrlRaw = resolveArgOrEnv(args, ["server", "url"], ["DOER_AGENT_SERVER"], DEFAULT_SERVER_BASE_URL);
1152
1153
  const requestedServerBaseUrl = serverBaseUrlRaw.replace(/\/$/, "");
1153
1154
  const serverBaseUrl = resolveContainerReachableServerBaseUrl(requestedServerBaseUrl);
1155
+ const usesDefaultServer = requestedServerBaseUrl === DEFAULT_SERVER_BASE_URL;
1154
1156
  const userId = resolveArgOrEnv(args, ["user-id", "userId"], ["DOER_AGENT_USER_ID"]);
1155
1157
  const agentSecret = resolveArgOrEnv(args, ["agent-secret", "agentSecret"], ["DOER_AGENT_SECRET"]);
1156
1158
  if (!userId || !agentSecret) {
@@ -1164,7 +1166,9 @@ async function main() {
1164
1166
  });
1165
1167
  const maxConcurrency = Math.max(1, parseEnvInteger(process.env.DOER_AGENT_MAX_CONCURRENCY, 3));
1166
1168
  process.stdout.write(`\n[doer-agent]\n`);
1167
- process.stdout.write(`- server: ${serverBaseUrl}\n`);
1169
+ if (!usesDefaultServer) {
1170
+ process.stdout.write(`- server: ${serverBaseUrl}\n`);
1171
+ }
1168
1172
  process.stdout.write(`- userId: ${userId}\n`);
1169
1173
  process.stdout.write(`- agentId: ${typeof natsBootstrap.agentId === "string" ? natsBootstrap.agentId : "unknown"}\n`);
1170
1174
  process.stdout.write(`\n- transport: nats\n`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doer-agent",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Reverse-polling agent runtime for doer",
5
5
  "type": "module",
6
6
  "main": "dist/agent.js",