codex-agent-view 0.4.0 → 0.4.2
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.
- package/.codex-plugin/plugin.json +2 -2
- package/README.ko.md +29 -18
- package/README.md +28 -17
- package/package.json +1 -1
- package/public/app.js +246 -46
- package/public/index.html +16 -16
- package/public/styles.css +49 -8
- package/skills/show-agents/SKILL.md +7 -7
- package/skills/show-agents/agents/openai.yaml +1 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codex-agent-view",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Read-only Codex app task snapshots with a trusted-hook auto-prepared local live backend.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Junho Yoon",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"privacyPolicyURL": "https://github.com/JunhoYoon95/codex-agent-view/blob/main/docs/privacy.md",
|
|
28
28
|
"termsOfServiceURL": "https://github.com/JunhoYoon95/codex-agent-view/blob/main/docs/terms.md",
|
|
29
29
|
"defaultPrompt": [
|
|
30
|
-
"
|
|
30
|
+
"$show-agents"
|
|
31
31
|
]
|
|
32
32
|
}
|
|
33
33
|
}
|
package/README.ko.md
CHANGED
|
@@ -10,10 +10,10 @@ Codex Agent View는 공식 Codex 앱 안에서 여러 workspace의 active task
|
|
|
10
10
|
|
|
11
11
|
### 빠른 시작: 설치 후에는 Codex 앱 안에서만 사용
|
|
12
12
|
|
|
13
|
-
이 README는
|
|
13
|
+
이 README는 `codex-agent-view@0.4.2` release candidate를 설명한다. **최초 설치만** `0.4.2`가 registry에 나타난 뒤 일반 터미널에서 아래 exact-version 명령으로 진행한다. 그전까지 public npm `latest`는 아래 evidence에 기록한 검증된 `0.4.1`이다.
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npm install --global codex-agent-view@0.4.
|
|
16
|
+
npm install --global codex-agent-view@0.4.2
|
|
17
17
|
codex-agent-view install
|
|
18
18
|
```
|
|
19
19
|
|
|
@@ -25,18 +25,20 @@ codex-agent-view install
|
|
|
25
25
|
2. Codex 앱의 **Plugins** 화면에서 `Codex Agent View`가 설치·활성화됐는지 확인한다.
|
|
26
26
|
3. Hook 검토 화면이 표시되면 `hooks/hooks.json`과 `node "${PLUGIN_ROOT}/scripts/send-hook.mjs"` command를 확인하고 현재 definition을 직접 trust한다. 앱 버전이 hook 검토 UI를 제공하지 않을 때만 설치 과정의 일부로 interactive Codex CLI의 `/hooks`를 사용한다.
|
|
27
27
|
4. 활성화와 hook 검토를 마친 뒤 Codex 앱에서 **새 task**를 만든다. 설치 전에 시작된 task의 과거 event는 재생되지 않는다.
|
|
28
|
-
5.
|
|
29
|
-
6. Live 화면을 닫았다면
|
|
28
|
+
5. Plugin 카드의 **지금 사용해보기**를 누른다. Starter `$show-agents`가 Codex 앱 task에서 bundled **Show Agents** skill을 명시적으로 호출한다.
|
|
29
|
+
6. Live 화면을 닫았다면 Codex 앱 task에 `@codex-agent-view $show-agents`를 입력해 같은 bundled skill을 다시 호출한다.
|
|
30
|
+
|
|
31
|
+
Plugin 카드의 **지금 사용해보기**와 수동 composer 입력 `@codex-agent-view $show-agents`는 둘 다 명시적인 앱 내 skill 호출이다. 사용자에게 terminal command, 외부 browser 또는 localhost URL 관리를 요구하지 않는다.
|
|
30
32
|
|
|
31
33
|
Trust된 첫 hook이 도착하면 plugin sender가 로컬 backend를 내부적으로 준비하고 같은 event 전달을 재시도한다. 사용자는 task ID를 등록하거나 `start`, `status`, `doctor`를 실행할 필요가 없다. **Show Agents**는 healthy backend를 재사용하고 Codex 앱 안에서 live 화면 열기를 시도한다. 앱이 필요한 Browser capability를 제공하지 않거나 permission이 허용되지 않으면 private URL을 노출하는 대신 화면을 열 수 없다고 안내한다. Tokenized localhost URL은 대화에 노출하지 않으며 외부 browser도 정상 사용 흐름에 포함되지 않는다.
|
|
32
34
|
|
|
33
|
-
공개 Codex plugin API에는 prompt 없이 앱 시작과 동시에 sidebar, panel 또는 Browser tab을 생성하는 기능이 없다. 따라서 live 화면을
|
|
35
|
+
공개 Codex plugin API에는 prompt 없이 앱 시작과 동시에 sidebar, panel 또는 Browser tab을 생성하는 기능이 없다. 따라서 live 화면을 열 때 plugin 카드의 **지금 사용해보기** 또는 Codex 앱 task의 `@codex-agent-view $show-agents`를 사용한다. 이미 오른쪽에 열린 live tab은 같은 monitor 관찰 window 동안 2초마다 자동 갱신하고 일시 연결 단절 뒤에도 기존 token으로 재연결한다.
|
|
34
36
|
|
|
35
37
|
요약하면 설치는 터미널에서 한 번, 조회·상태 확인·live 화면 열기와 이후 사용은 Codex 앱 안에서 수행한다.
|
|
36
38
|
|
|
37
39
|
### 현재 상태
|
|
38
40
|
|
|
39
|
-
이 repository와 package
|
|
41
|
+
이 repository와 package는 `0.4.2` release candidate다. Public npm `latest`는 배포를 별도로 확인하기 전까지 `0.4.1`이다. Candidate에는 다음 구성이 포함되어 있다.
|
|
40
42
|
|
|
41
43
|
- 공식 Codex 앱의 내장 thread tools를 우선 사용하는 app-native active-task snapshot skill
|
|
42
44
|
- `.codex-plugin/plugin.json`, local marketplace catalog, genuine Codex skill
|
|
@@ -66,6 +68,14 @@ Maintainer npm 2FA는 `auth-and-writes` mode로 활성화됐고 `codex-agent-vie
|
|
|
66
68
|
|
|
67
69
|
공개 `0.3.2`: 배포 시 npm version/`latest` `0.3.2`, `gitHead` `4f4f92dc872d9b782efe900cc1397bdccf7d2c8a`, shasum `2851544c75a0a5fb20a2865196ab54b566b373d8`, integrity `sha512-MPwFP3CjhehkIzyV3ja0/rWzLyK4tJI7jjsczKN16aXpKEr/dvtc/aljjqW/41zatZrQG32ccKKMJjYNyW6Tww==`, registry signature, 21 files, package size `46856 B`와 unpacked size `167060 B`를 확인했다. Annotated `v0.3.2` tag와 [GitHub Release v0.3.2](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.3.2)가 공개됐고 main/tag CI가 통과했다. 이 기기의 global `0.3.2` install은 plugin `installed: true`, `enabled: true`이며 registry artifact와 mismatch가 0이다. App-native thread snapshot에서는 worker activity 3개를 확인했다. Codex 내장 Browser의 live monitor 연결은 성공했지만 재설치 전에 열려 있던 앱 process의 follow-up subagent 3개에서는 hook event가 0건이었으므로 exact `0.3.2` live hook E2E 완료를 주장하지 않는다. 이 검증에는 앱 완전 재시작과 새 task가 필요하다.
|
|
68
70
|
|
|
71
|
+
공개 `0.4.0` release 당시 evidence: npm `latest`/version, Apache-2.0 license, executable mapping, registry signature, 25 files, package size `52614 B`, unpacked size `189181 B`, shasum `cc379e593f4cafa5dd56f32e6741eab5ba3f4497`와 exact SRI를 확인했다. Registry tarball은 release tarball과 byte-identical이다. Exact tarball publish로 npm metadata에 `gitHead`가 없으므로 그 field를 통한 source 일치는 주장하지 않는다. Annotated `v0.4.0` tag는 release commit `11f7b0511a39c5f5a61cb6da7b91fb3b8e915c6b`을 가리키고 [GitHub Release v0.4.0](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.4.0), main/tag CI가 공개·성공했다. 이 기기에 public exact `0.4.0`을 다시 설치해 CLI/plugin version 일치, installed/enabled, hook wiring 9종과 실제 sessions 7개 event 수신을 확인했다. Show Agents Browser request는 재설치 중 계속 열려 있던 app process에서 `queued`였고 tab을 관찰하지 못했으므로 앱 완전 재시작/new task 전까지 exact visual-panel E2E 완료는 주장하지 않는다.
|
|
72
|
+
|
|
73
|
+
`0.4.0` known issue: manifest의 `defaultPrompt: ["Show Agents"]`는 평문 plugin-level text starter였다. 이 text는 implicit invocation이 disabled된 `show-agents` skill을 명시적으로 호출하지 않으므로 plugin 카드나 **바로 사용하기** 동작 자체를 skill 실행으로 취급한 안내는 잘못이었다. `0.4.1`은 이를 `Open @ and select the bundled Show Agents skill.`이라는 instructional starter로 교체했다. Starter는 여전히 호출이 아니라 안내이며, 일반 사용의 유일한 canonical 실행 경로는 새 task의 `@` picker에서 bundled **Show Agents** skill 자체를 직접 선택하는 것이다. `0.4.1` public registry나 exact app E2E evidence는 별도로 검증해 기록한 범위에서만 주장한다.
|
|
74
|
+
|
|
75
|
+
공개 `0.4.1`: npm `latest`/version, Apache-2.0 license, executable mapping, registry signature, 25 files, package size `53650 B`, unpacked size `193424 B`, shasum `ee2ae0b8b36016f5c57bade067027202b1508d1d`, integrity `sha512-WC4f5MPmvpkXeKM+1BVAYqW4+hoaUrB4yQFoUYgc0pnjyY7hP1CdSR5NJ3QWmvJ6Ikmmb1d+58UL4hkKoyhm1Q==`를 확인했다. Release tarball과 registry tarball은 byte-identical이다. Exact tarball publish로 npm metadata에 `gitHead`가 없으므로 그 field를 통한 source 일치는 주장하지 않는다. Annotated `v0.4.1` tag는 commit `a1de67be5413fa38b8dd1b62f74353463f6e641e`을 가리키며 [GitHub Release v0.4.1](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.4.1), main CI run `30710490358`, tag CI run `30710848474`가 공개·성공했다. 이 기기의 CLI/plugin은 `0.4.1`로 일치하고 plugin installed/enabled 및 hook wiring 9종을 확인했다. Runtime은 install 교체 중 정상 종료돼 현재 `monitor_not_running`이고 persisted hook trust는 `unknown`이다. Codex 앱 process가 설치 전부터 열려 있었으므로 앱 완전 재시작/new task 전까지 direct **Show Agents** visual E2E는 미확인이다.
|
|
76
|
+
|
|
77
|
+
`0.4.2` candidate는 plugin starter를 `$show-agents`로 바꿔 plugin 카드에서 bundled **Show Agents** skill을 명시 호출하며, `@codex-agent-view $show-agents`를 수동 앱 내 재오픈 경로로 제공한다. 아직 public npm release, tag/release, 설치 artifact 또는 visual E2E 완료로 주장하지 않는다. 기본 화면은 실행 중인 부모 task와 subagent를 먼저 배치하고, 사람이 읽을 수 있는 workspace/task/agent label과 상태 문구를 주 정보로 사용한다. Raw session/agent ID는 보조 진단 metadata로만 두고 raw hook event name은 기본 화면의 중심 정보로 노출하지 않는다. Prompt와 tool input/output은 정상 monitor 화면에서 계속 제외한다.
|
|
78
|
+
|
|
69
79
|
### 제품 경계
|
|
70
80
|
|
|
71
81
|
Codex Agent View는 historical audit이나 session replay 제품이 아니라 현재 활동을 보여주는 live companion이다. Bounded in-memory state와 monitor 재시작 시 reset은 privacy와 단순한 failure boundary를 위한 의도된 완성 설계다. SQLite/영구 history는 누락된 요구사항이 아니다. 실제 사용자 요구가 입증될 때에만 retention, migration, deletion, privacy 비용을 별도 검토하는 명시적 opt-in 기능 후보로 취급한다.
|
|
@@ -75,6 +85,7 @@ Codex Agent View는 historical audit이나 session replay 제품이 아니라
|
|
|
75
85
|
- 설치·trust·앱 재시작 뒤 첫 trusted hook이 backend를 자동 준비한다. 이는 monitor process 준비이며 Codex 화면이나 tab을 몰래 생성하는 기능이 아니다.
|
|
76
86
|
- 외부 telemetry, 원격 server, account, 필수 SQLite/영구 event store가 없다.
|
|
77
87
|
- prompt, transcript path, 전체 tool input/output, assistant message를 monitor 상태나 UI에 저장·표시하지 않는다.
|
|
88
|
+
- 기본 monitor는 실행 중인 부모 task와 subagent를 먼저 정렬하고 사람이 읽을 수 있는 label/status를 우선하며, raw ID와 event name은 주 정보로 표시하지 않는다.
|
|
78
89
|
- task/subagent 중지·재시작, message 전송, permission 자동 승인·거절 기능이 없다.
|
|
79
90
|
- 별도로 실행한 App Server는 앱 내장 thread tools와 다른 process다. 공식 앱의 live source로 간주하거나 둘을 같은 API로 설명하지 않는다.
|
|
80
91
|
|
|
@@ -82,9 +93,9 @@ Codex Agent View는 historical audit이나 session replay 제품이 아니라
|
|
|
82
93
|
|
|
83
94
|
### npm, Codex 앱 live view, Plugins Directory의 역할
|
|
84
95
|
|
|
85
|
-
-
|
|
96
|
+
- Plugin 카드의 **지금 사용해보기**가 primary UX이며, panel을 닫은 뒤에는 `@codex-agent-view $show-agents`로 같은 bundled skill을 다시 호출한다. 별도 monitor 실행이나 task ID 등록이 필요 없다.
|
|
86
97
|
- npm은 plugin bundle, 내부 hook sender/runtime과 static UI를 사용자 machine에 배포하는 최초 설치 경로다.
|
|
87
|
-
- Live view는 사용자가 앱 안에서
|
|
98
|
+
- Live view는 사용자가 앱 안에서 `$show-agents`를 명시 호출했을 때만 열린다. 외부 website나 telemetry dashboard가 아니다.
|
|
88
99
|
- 공개 plugin API는 앱 시작 시 no-prompt sidebar/panel/Browser tab 생성을 제공하지 않는다. 최초 live view 열기에는 앱 안 skill 선택이 한 번 필요하고, 열린 tab은 같은 관찰 window에서 자동 갱신·재연결한다.
|
|
89
100
|
- Universal Plugins Directory는 npm의 대체재가 아니다. 공개 directory의 in-app custom UI 경로는 public HTTPS MCP server와 domain verification이 필요해 local-only/no-external-server 원칙과 충돌한다. 현재는 별도의 listing/skills 제출 가능성만 검토하며, 심사·publish 전에는 Codex plugin 검색으로 설치할 수 있다고 안내하지 않는다.
|
|
90
101
|
|
|
@@ -94,12 +105,12 @@ Hook event가 누락·중복·역순으로 올 수 있으므로 UI의 `unknown`,
|
|
|
94
105
|
|
|
95
106
|
이 절차는 위의 빠른 시작에서 설치와 활성화를 마친 뒤 **새 task**에서 수행한다. 별도 terminal이나 외부 browser는 사용하지 않는다.
|
|
96
107
|
|
|
97
|
-
1.
|
|
108
|
+
1. Codex Agent View plugin 카드의 **지금 사용해보기**를 누른다. Starter `$show-agents`가 bundled **Show Agents** skill을 명시 호출한다.
|
|
98
109
|
2. Skill은 trusted hook이 자동 준비한 healthy backend를 재사용하고, 아직 준비되지 않았다면 내부적으로 준비한 뒤 Codex 앱에서 live 화면 열기를 시도한다.
|
|
99
|
-
3. Panel은
|
|
110
|
+
3. Panel은 실행 중인 부모 task와 subagent를 먼저 배치하고 사람이 읽을 수 있는 workspace/task/agent label과 상태 문구를 표시한다. Raw session/agent ID는 보조 진단 metadata이며 raw hook event name은 기본 화면을 주도하지 않는다. Prompt, preview, tool input/output과 full workspace path는 표시하지 않는다.
|
|
100
111
|
4. 앱의 Browser capability 또는 permission을 사용할 수 없으면 private localhost URL을 노출하거나 외부 browser를 여는 대신 실패를 안내한다.
|
|
101
112
|
|
|
102
|
-
오른쪽 live 화면을 닫았다면
|
|
113
|
+
오른쪽 live 화면을 닫았다면 Codex 앱 task에 `@codex-agent-view $show-agents`를 입력해 같은 bundled skill을 다시 호출한다. 열린 tab은 같은 관찰 window에서 자동 갱신하고 일시 단절 뒤 재연결한다.
|
|
103
114
|
|
|
104
115
|
### 요구사항과 검증 범위
|
|
105
116
|
|
|
@@ -162,7 +173,7 @@ node bin/codex-agent-view.mjs install
|
|
|
162
173
|
|
|
163
174
|
### Maintainer·고급 진단 전용 CLI
|
|
164
175
|
|
|
165
|
-
이 절은 package 개발자와 문제 보고를 위한 진단 참고 자료이며 일반 사용자 사용법이 아니다. 설치가 끝난 사용자는
|
|
176
|
+
이 절은 package 개발자와 문제 보고를 위한 진단 참고 자료이며 일반 사용자 사용법이 아니다. 설치가 끝난 사용자는 plugin 카드의 **지금 사용해보기** 또는 Codex 앱 task의 `@codex-agent-view $show-agents`로 **Show Agents**를 호출한다. 아래 명령과 localhost 주소를 정상 사용 순서에 넣거나 사용자에게 직접 관리하도록 요구하지 않는다.
|
|
166
177
|
|
|
167
178
|
Source checkout에서 local runtime을 별도로 검증해야 할 때만 다음처럼 실행할 수 있다.
|
|
168
179
|
|
|
@@ -192,18 +203,18 @@ Plugin enable/trust와 앱 재시작 뒤 생성되거나 재개되는 task는 tr
|
|
|
192
203
|
|
|
193
204
|
### npm 설치 명령 참고
|
|
194
205
|
|
|
195
|
-
아래 명령은
|
|
206
|
+
아래 명령은 `0.4.2` release candidate의 exact 설치 명령이다. Registry publish가 확인된 뒤에만 실행하며, npm이 version을 찾지 못하면 candidate가 아직 공개되지 않은 것이다.
|
|
196
207
|
|
|
197
208
|
```bash
|
|
198
|
-
npm install --global codex-agent-view@0.4.
|
|
209
|
+
npm install --global codex-agent-view@0.4.2
|
|
199
210
|
codex-agent-view install
|
|
200
211
|
```
|
|
201
212
|
|
|
202
|
-
이 두 명령 뒤에는 Codex 앱을 완전히 다시 열고 Plugins 화면에서 설치·활성화와 hook trust를 확인한 다음 새 task를 만든다. 첫 trusted hook이 backend 준비와 event 전달을 내부 처리하므로 사용자가 monitor CLI를 실행하지 않는다.
|
|
213
|
+
이 두 명령 뒤에는 Codex 앱을 완전히 다시 열고 Plugins 화면에서 설치·활성화와 hook trust를 확인한 다음 새 task를 만든다. 첫 trusted hook이 backend 준비와 event 전달을 내부 처리하므로 사용자가 monitor CLI를 실행하지 않는다. Plugin 카드의 **지금 사용해보기**로 **Show Agents**를 호출하며, panel을 닫았으면 Codex 앱 task에 `@codex-agent-view $show-agents`를 입력해 다시 연다.
|
|
203
214
|
|
|
204
|
-
`0.4.
|
|
215
|
+
`0.4.2`에서 계획한 설치 경로는 위의 global package 설치와 명시적인 `codex-agent-view install` command 조합이다. 이후 일반 사용은 Codex 앱 안에서 진행한다.
|
|
205
216
|
|
|
206
|
-
`0.2.0
|
|
217
|
+
`0.2.0`부터 public `0.4.1`까지의 release evidence는 보존한다. `0.4.2` candidate는 publish와 visual acceptance를 별도로 검증해 [docs/distribution.md](docs/distribution.md)에 기록하기 전까지 공개 완료로 취급하지 않는다.
|
|
207
218
|
|
|
208
219
|
npm install 자체는 Codex 설정을 자동 변경하지 않는다. `install` command는 사용자가 명시적으로 실행하며 hook trust도 사용자 검토로 남긴다. npm publish와 Universal Plugins Directory 제출은 서로 별도 절차다. 자세한 배포 경계는 [docs/distribution.md](docs/distribution.md), directory 제출 상태는 [docs/plugin-submission.md](docs/plugin-submission.md)를 참고한다.
|
|
209
220
|
|
|
@@ -241,7 +252,7 @@ Source checkout을 직접 실행한 경우에만 같은 명령의 `node bin/code
|
|
|
241
252
|
|
|
242
253
|
### Maintainer troubleshooting
|
|
243
254
|
|
|
244
|
-
이 절의 CLI 확인은 명시적인 문제 조사용이다. 정상 사용자는
|
|
255
|
+
이 절의 CLI 확인은 명시적인 문제 조사용이다. 정상 사용자는 plugin 카드의 **지금 사용해보기** 또는 Codex 앱 task의 `@codex-agent-view $show-agents`를 사용한다.
|
|
245
256
|
|
|
246
257
|
#### `status`가 runtime file 또는 connection error를 출력함
|
|
247
258
|
|
package/README.md
CHANGED
|
@@ -8,12 +8,12 @@ Codex Agent View is a read-only companion plugin that shows privacy-minimized ac
|
|
|
8
8
|
|
|
9
9
|
## Quick start: install once, then stay inside the Codex app
|
|
10
10
|
|
|
11
|
-
This README documents the
|
|
11
|
+
This README documents the `codex-agent-view@0.4.2` release candidate. Use the exact-version command below for the one-time terminal installation after `0.4.2` appears in the registry. Until then, public npm `latest` remains the verified `0.4.1` release described in the evidence below.
|
|
12
12
|
|
|
13
13
|
Universal Plugins Directory search installation is not available yet, so use a regular terminal for the **initial installation only**:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npm install --global codex-agent-view@0.4.
|
|
16
|
+
npm install --global codex-agent-view@0.4.2
|
|
17
17
|
codex-agent-view install
|
|
18
18
|
```
|
|
19
19
|
|
|
@@ -25,18 +25,20 @@ After installation:
|
|
|
25
25
|
2. In the Codex app's **Plugins** screen, confirm that `Codex Agent View` is installed and enabled.
|
|
26
26
|
3. If a hook-review screen is shown, inspect `hooks/hooks.json` and the `node "${PLUGIN_ROOT}/scripts/send-hook.mjs"` command, then explicitly trust the current definition. Use interactive Codex CLI `/hooks` only as part of installation when the app version does not expose hook review.
|
|
27
27
|
4. After enablement and hook review, create a **new task** in the Codex app. Events that occurred before installation are not replayed.
|
|
28
|
-
5.
|
|
29
|
-
6. If you close the live view,
|
|
28
|
+
5. On the plugin card, select **Quick start**. Its `$show-agents` starter explicitly invokes the bundled **Show Agents** skill in a Codex app task.
|
|
29
|
+
6. If you close the live view, enter `@codex-agent-view $show-agents` in a Codex app task to invoke the same bundled skill again.
|
|
30
|
+
|
|
31
|
+
The plugin card's **Quick start** action and the manual `@codex-agent-view $show-agents` composer entry are explicit in-app skill invocations. They do not require a terminal command, an external browser, or a localhost URL from the user.
|
|
30
32
|
|
|
31
33
|
When the first trusted hook arrives, the plugin sender internally prepares the local backend and retries delivery of that same event. Users do not register task IDs or run `start`, `status`, or `doctor`. **Show Agents** reuses the healthy backend and attempts to open the live view in the Codex app without exposing a tokenized localhost URL or using an external browser. If the app does not provide the required Browser capability or permission, the skill reports that it could not open the view instead of exposing a private URL.
|
|
32
34
|
|
|
33
|
-
The public Codex plugin API does not provide no-prompt app-start creation of a sidebar, panel, or Browser tab. Opening the live view therefore requires
|
|
35
|
+
The public Codex plugin API does not provide no-prompt app-start creation of a sidebar, panel, or Browser tab. Opening the live view therefore requires the plugin card's explicit **Quick start** action or `@codex-agent-view $show-agents` in a Codex app task. Once the right-side live tab is open, it refreshes every two seconds and reconnects after temporary disconnects while the same monitor observation window and token remain valid.
|
|
34
36
|
|
|
35
37
|
In short: install once in a terminal; perform snapshot queries, status checks, live-view opening, and all routine use inside the Codex app.
|
|
36
38
|
|
|
37
39
|
## Status
|
|
38
40
|
|
|
39
|
-
This repository and package are
|
|
41
|
+
This repository and package are the `0.4.2` release candidate; public npm `latest` remains `0.4.1` until publication is independently verified. The candidate includes an app-native snapshot skill that prioritizes the official Codex app's built-in thread tools, privacy-minimized hooks, a bounded in-memory reducer, a trusted-hook auto-prepared token-authenticated `127.0.0.1` live backend, and explicit install/remove plus maintainer-diagnostic CLI commands.
|
|
40
42
|
|
|
41
43
|
Plugin installation and lifecycle payloads were verified with Homebrew Codex CLI and the Codex executable embedded in the official app. However, a real-use attempt that installed and enabled `0.2.0` in an already-running official app process delivered zero events while two subagents ran. The monitor, registration, enablement, and installed bundle were healthy, while app logs showed no sender invocation. Evidence indicates that the same process retained a pre-install `hooks/list` snapshot; persisted exact-hook trust is not exposed through CLI JSON, so the precise skip boundary remains unconfirmed.
|
|
42
44
|
|
|
@@ -56,6 +58,14 @@ Public `0.3.1`: npm version/`latest` at release time `0.3.1`, `gitHead` `c515ea2
|
|
|
56
58
|
|
|
57
59
|
Public `0.3.2`: npm version/`latest` at release time `0.3.2`, `gitHead` `4f4f92dc872d9b782efe900cc1397bdccf7d2c8a`, shasum `2851544c75a0a5fb20a2865196ab54b566b373d8`, integrity `sha512-MPwFP3CjhehkIzyV3ja0/rWzLyK4tJI7jjsczKN16aXpKEr/dvtc/aljjqW/41zatZrQG32ccKKMJjYNyW6Tww==`, registry signature, 21 files, package size `46856 B`, and unpacked size `167060 B` were verified. The annotated `v0.3.2` tag and [GitHub Release v0.3.2](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.3.2) are public, and the main/tag CI runs passed. This machine's global `0.3.2` install reports plugin `installed: true` and `enabled: true`, with zero artifact mismatches against the registry package. The app-native thread snapshot showed activity for three workers. The live monitor connected successfully in the Codex built-in Browser, but three follow-up subagents in the app process that predated the reinstall delivered zero hook events. Exact `0.3.2` live-hook E2E is therefore not claimed; it requires a full app restart and a new task.
|
|
58
60
|
|
|
61
|
+
Public `0.4.0` evidence at the time of that release: npm `latest`/version, Apache-2.0 license, executable mapping, registry signature, 25 files, package size `52614 B`, unpacked size `189181 B`, shasum `cc379e593f4cafa5dd56f32e6741eab5ba3f4497`, and exact SRI were verified. The registry tarball is byte-identical to the release tarball. npm metadata has no `gitHead` because the exact tarball was published, so source identity is not claimed through that field. The annotated `v0.4.0` tag points to release commit `11f7b0511a39c5f5a61cb6da7b91fb3b8e915c6b`; [GitHub Release v0.4.0](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.4.0) and both main/tag CI runs are public and successful. This machine was reinstalled from public exact `0.4.0`; CLI/plugin versions match, the plugin is installed/enabled, all nine hooks are wired, and the monitor reports real events across seven sessions. The Show Agents Browser request was queued in the app process that remained open during reinstall, but its tab was not observable, so exact visual-panel E2E is not claimed until a full app restart and new task.
|
|
62
|
+
|
|
63
|
+
Known `0.4.0` issue: manifest `defaultPrompt: ["Show Agents"]` created a plain plugin-level text starter. That text did not explicitly invoke the `show-agents` skill, whose implicit invocation was disabled, so treating the plugin card or its Quick start action as skill execution was incorrect. Version `0.4.1` replaces it with the instructional starter `Open @ and select the bundled Show Agents skill.` The starter remains guidance rather than invocation; the only canonical routine-use execution path is direct selection of the bundled **Show Agents** skill in a new task's `@` picker. Public registry and exact app E2E evidence for `0.4.1` are claimed only where separately verified and recorded.
|
|
64
|
+
|
|
65
|
+
Public `0.4.1`: npm `latest`/version, Apache-2.0 license, executable mapping, registry signature, 25 files, package size `53650 B`, unpacked size `193424 B`, shasum `ee2ae0b8b36016f5c57bade067027202b1508d1d`, and integrity `sha512-WC4f5MPmvpkXeKM+1BVAYqW4+hoaUrB4yQFoUYgc0pnjyY7hP1CdSR5NJ3QWmvJ6Ikmmb1d+58UL4hkKoyhm1Q==` were verified. The release tarball and registry tarball are byte-identical. npm metadata has no `gitHead` because the exact tarball was published, so source identity is not claimed through that field. The annotated `v0.4.1` tag points to commit `a1de67be5413fa38b8dd1b62f74353463f6e641e`; [GitHub Release v0.4.1](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.4.1), main CI run `30710490358`, and tag CI run `30710848474` are public and successful. This machine has matching CLI/plugin `0.4.1`, the plugin is installed/enabled, and all nine hooks are wired. The runtime was cleanly stopped while installation replaced it, so it currently reports `monitor_not_running`; persisted hook trust remains `unknown`. Because the Codex app process predates installation, direct **Show Agents** visual E2E remains unverified until a full app restart and a new task.
|
|
66
|
+
|
|
67
|
+
The `0.4.2` candidate changes the plugin starter to `$show-agents`, which explicitly invokes the bundled **Show Agents** skill from the plugin card; `@codex-agent-view $show-agents` is the manual in-app reopen path. It is not yet claimed as a public npm release, tagged release, installed artifact, or completed visual E2E. Its default view is designed to put running parents and subagents first, lead with human-readable workspace/task/agent labels and status text, keep raw session/agent IDs as secondary diagnostic metadata, and avoid leading with raw hook event names. Prompt text and tool input/output remain excluded from the normal monitor view.
|
|
68
|
+
|
|
59
69
|
## Boundaries
|
|
60
70
|
|
|
61
71
|
Codex Agent View is a live companion, not a historical audit or session-replay product. Bounded in-memory state and reset-on-restart semantics are intentional: they keep privacy and failure boundaries small. SQLite or persistent history is not a missing requirement. Consider it only as a separate explicit opt-in feature if demonstrated user demand justifies retention, migration, deletion, and privacy costs.
|
|
@@ -65,6 +75,7 @@ Codex Agent View is a live companion, not a historical audit or session-replay p
|
|
|
65
75
|
- After installation, hook trust, and an app restart, the first trusted hook automatically prepares the backend. This prepares a local process; it does not create app UI without a user action.
|
|
66
76
|
- There is no external telemetry, remote server, account, required SQLite/persistent event store, or remote control.
|
|
67
77
|
- Prompt text, transcript paths, full tool input/output, and assistant messages are not retained or displayed by the monitor.
|
|
78
|
+
- The default monitor sorts running parents and subagents first, uses human-readable labels and statuses as the primary presentation, and keeps raw IDs and event names out of the primary reading path.
|
|
68
79
|
- The product cannot stop or restart tasks/subagents, send messages, or approve/deny permissions.
|
|
69
80
|
- Missing, duplicated, or out-of-order events remain visible as empty, unknown, or degraded state instead of being guessed away.
|
|
70
81
|
|
|
@@ -72,9 +83,9 @@ A separately launched Codex `0.146` App Server `thread/list` fallback was also t
|
|
|
72
83
|
|
|
73
84
|
## The roles of npm, the Codex app live view, and the Plugins Directory
|
|
74
85
|
|
|
75
|
-
-
|
|
86
|
+
- The plugin card's **Quick start** action is the primary UX; `@codex-agent-view $show-agents` manually invokes the same bundled skill again after a panel is closed. Neither path requires starting a monitor or registering task IDs.
|
|
76
87
|
- npm is the initial installation path that distributes the plugin bundle, its internal hook sender/runtime, and static UI to the user's machine.
|
|
77
|
-
- The live view opens in the Codex app only after
|
|
88
|
+
- The live view opens in the Codex app only after an explicit `$show-agents` skill invocation; it is not an external website or telemetry dashboard.
|
|
78
89
|
- The public plugin API cannot create a sidebar, panel, or Browser tab without a prompt at app startup. The first live view needs one in-app skill selection; an already-open tab refreshes and reconnects within the same observation window.
|
|
79
90
|
- The Universal Plugins Directory does not replace npm. A public in-app custom UI path requires a public HTTPS MCP server and domain verification, which conflicts with this project's local-only, no-external-server boundary. Only a separate listing/skills submission remains under consideration; do not expect Directory search installation until review and publication actually finish.
|
|
80
91
|
|
|
@@ -82,12 +93,12 @@ A separately launched Codex `0.146` App Server `thread/list` fallback was also t
|
|
|
82
93
|
|
|
83
94
|
Use this flow in a **new task** after completing installation and enablement in the quick start. It requires neither another terminal nor an external browser.
|
|
84
95
|
|
|
85
|
-
1.
|
|
96
|
+
1. Select **Quick start** on the Codex Agent View plugin card. Its `$show-agents` starter explicitly invokes the bundled **Show Agents** skill.
|
|
86
97
|
2. The skill reuses the backend prepared by trusted hooks, or prepares it internally when still absent, then attempts to open the live view in the Codex app.
|
|
87
|
-
3. The panel
|
|
98
|
+
3. The panel puts running parents and subagents first and uses human-readable workspace/task/agent labels and status text. Raw session/agent IDs are secondary diagnostic metadata, raw hook event names do not lead the default display, and prompts, previews, tool input/output, and full workspace paths remain hidden.
|
|
88
99
|
4. If the app's Browser capability or permission is unavailable, the skill reports the failure without exposing a private localhost URL or opening an external browser.
|
|
89
100
|
|
|
90
|
-
If you close the right-side live view,
|
|
101
|
+
If you close the right-side live view, enter `@codex-agent-view $show-agents` in a Codex app task to invoke the same bundled skill again. An open tab refreshes and reconnects automatically within the same observation window.
|
|
91
102
|
|
|
92
103
|
## Requirements and tested versions
|
|
93
104
|
|
|
@@ -121,7 +132,7 @@ Review the installed plugin and `hooks/hooks.json`, inspect the `node "${PLUGIN_
|
|
|
121
132
|
|
|
122
133
|
## Maintainer and advanced diagnostics CLI
|
|
123
134
|
|
|
124
|
-
This section is reference material for package maintainers and explicit troubleshooting. It is not the normal user workflow. After installation, users
|
|
135
|
+
This section is reference material for package maintainers and explicit troubleshooting. It is not the normal user workflow. After installation, users invoke **Show Agents** with the plugin card's **Quick start** action or `@codex-agent-view $show-agents` inside a Codex app task; do not make them manage these commands or localhost URLs.
|
|
125
136
|
|
|
126
137
|
Only when validating the local runtime from a source checkout, a maintainer can start it without opening an operating-system browser:
|
|
127
138
|
|
|
@@ -144,18 +155,18 @@ After plugin enablement/trust and an app restart, the first trusted hook interna
|
|
|
144
155
|
|
|
145
156
|
## Install from npm
|
|
146
157
|
|
|
147
|
-
The commands below target the
|
|
158
|
+
The commands below target the `0.4.2` release candidate's exact package version. Run them only after registry publication is confirmed; an unavailable version means the candidate has not been published yet.
|
|
148
159
|
|
|
149
160
|
```bash
|
|
150
|
-
npm install --global codex-agent-view@0.4.
|
|
161
|
+
npm install --global codex-agent-view@0.4.2
|
|
151
162
|
codex-agent-view install
|
|
152
163
|
```
|
|
153
164
|
|
|
154
|
-
After these two commands, fully reopen the Codex app, verify installation, enablement, and hook trust, then create a new task. The first trusted hook prepares the backend and delivers its event internally, so users do not run monitor CLI commands.
|
|
165
|
+
After these two commands, fully reopen the Codex app, verify installation, enablement, and hook trust, then create a new task. The first trusted hook prepares the backend and delivers its event internally, so users do not run monitor CLI commands. Use the plugin card's **Quick start** action to invoke **Show Agents**; after closing the panel, enter `@codex-agent-view $show-agents` in a Codex app task to reopen it.
|
|
155
166
|
|
|
156
|
-
The
|
|
167
|
+
The planned `0.4.2` installation path is the global package install followed by the explicit `codex-agent-view install` command above. Routine use remains inside the Codex app afterward.
|
|
157
168
|
|
|
158
|
-
The `0.2.0
|
|
169
|
+
The `0.2.0` through public `0.4.1` release evidence is preserved. The `0.4.2` candidate must not be treated as published or visually accepted until those checks are separately recorded in [Distribution](docs/distribution.md).
|
|
159
170
|
|
|
160
171
|
npm installation does not modify Codex settings automatically. The explicit `install` command performs local plugin registration and leaves hook trust to the user. npm publication and Universal Plugins Directory submission are separate. See [Distribution](docs/distribution.md) and [Plugin submission](docs/plugin-submission.md).
|
|
161
172
|
|
package/package.json
CHANGED
package/public/app.js
CHANGED
|
@@ -17,6 +17,42 @@ const STATUS_ORDER = Object.freeze({
|
|
|
17
17
|
completed: 3,
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
+
const ACTIVITY_LABELS = Object.freeze({
|
|
21
|
+
session_started: "관찰 시작",
|
|
22
|
+
session_ended: "관찰 종료",
|
|
23
|
+
turn_started: "부모 작업 시작",
|
|
24
|
+
turn_stopped: "부모 작업 응답 완료",
|
|
25
|
+
subagent_started: "작업 에이전트 시작",
|
|
26
|
+
subagent_stopped: "작업 에이전트 완료",
|
|
27
|
+
tool_started: "도구 작업",
|
|
28
|
+
tool_completed: "도구 작업",
|
|
29
|
+
permission_requested: "사용자 승인 요청",
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const TOOL_LABELS = Object.freeze({
|
|
33
|
+
apply_patch: "파일 수정",
|
|
34
|
+
bash: "터미널 작업",
|
|
35
|
+
collaborationfollowup_task: "에이전트 후속 작업 요청",
|
|
36
|
+
collaborationinterrupt_agent: "에이전트 작업 중단 요청",
|
|
37
|
+
collaborationlist_agents: "에이전트 상태 확인",
|
|
38
|
+
collaborationsend_message: "에이전트에게 메시지 전달",
|
|
39
|
+
collaborationspawn_agent: "작업 에이전트 시작",
|
|
40
|
+
collaborationwait_agent: "에이전트 응답 대기",
|
|
41
|
+
exec_command: "터미널 작업",
|
|
42
|
+
request_user_input: "사용자 입력 요청",
|
|
43
|
+
wait: "작업 완료 대기",
|
|
44
|
+
write_stdin: "터미널 입력",
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const AGENT_ROLE_LABELS = Object.freeze({
|
|
48
|
+
explorer: "조사 담당",
|
|
49
|
+
reviewer: "검토 담당",
|
|
50
|
+
worker: "작업 담당",
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const HIDDEN_AGENT_ROLES = new Set(["", "default", "unknown"]);
|
|
54
|
+
const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f-\u009f]/g;
|
|
55
|
+
|
|
20
56
|
function consumeAccessToken() {
|
|
21
57
|
const fragment = new URLSearchParams(window.location.hash.slice(1));
|
|
22
58
|
const fragmentToken = fragment.get("token")?.trim() || "";
|
|
@@ -81,6 +117,59 @@ function safeString(value, fallback) {
|
|
|
81
117
|
return typeof value === "string" && value.trim() ? value.trim() : fallback;
|
|
82
118
|
}
|
|
83
119
|
|
|
120
|
+
function sanitizedFallbackLabel(value, fallback) {
|
|
121
|
+
const normalized = safeString(value, "")
|
|
122
|
+
.replace(CONTROL_CHARACTERS, " ")
|
|
123
|
+
.replace(/([a-z\d])([A-Z])/g, "$1 $2")
|
|
124
|
+
.replace(/[_./:-]+/g, " ")
|
|
125
|
+
.replace(/\s+/g, " ")
|
|
126
|
+
.trim()
|
|
127
|
+
.slice(0, 48);
|
|
128
|
+
|
|
129
|
+
if (!normalized) {
|
|
130
|
+
return fallback;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return normalized.replace(/\b[a-z]/g, (character) => character.toUpperCase());
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function normalizedLookupKey(value) {
|
|
137
|
+
return safeString(value, "").replace(/[^a-zA-Z0-9_]/g, "").toLocaleLowerCase();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function formatAgentRole(agentType) {
|
|
141
|
+
const key = normalizedLookupKey(agentType);
|
|
142
|
+
if (HIDDEN_AGENT_ROLES.has(key)) {
|
|
143
|
+
return "";
|
|
144
|
+
}
|
|
145
|
+
return AGENT_ROLE_LABELS[key] || sanitizedFallbackLabel(agentType, "");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function formatToolLabel(toolName) {
|
|
149
|
+
const key = normalizedLookupKey(toolName);
|
|
150
|
+
return TOOL_LABELS[key] || `도구 · ${sanitizedFallbackLabel(toolName, "이름 미상")}`;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function formatActivityLabel(activity) {
|
|
154
|
+
if (activity.eventName === "subagent_started" && activity.agentOrdinal !== null) {
|
|
155
|
+
return `작업 에이전트 ${activity.agentOrdinal} 시작`;
|
|
156
|
+
}
|
|
157
|
+
if (activity.eventName === "subagent_stopped" && activity.agentOrdinal !== null) {
|
|
158
|
+
return `작업 에이전트 ${activity.agentOrdinal} 완료`;
|
|
159
|
+
}
|
|
160
|
+
if (activity.eventName === "permission_requested" && activity.toolName) {
|
|
161
|
+
return `${formatToolLabel(activity.toolName)} 승인 요청`;
|
|
162
|
+
}
|
|
163
|
+
if (
|
|
164
|
+
(activity.eventName === "tool_started" || activity.eventName === "tool_completed") &&
|
|
165
|
+
activity.toolName
|
|
166
|
+
) {
|
|
167
|
+
return formatToolLabel(activity.toolName);
|
|
168
|
+
}
|
|
169
|
+
return ACTIVITY_LABELS[activity.eventName] ||
|
|
170
|
+
`활동 · ${sanitizedFallbackLabel(activity.eventName, "알 수 없음")}`;
|
|
171
|
+
}
|
|
172
|
+
|
|
84
173
|
function safeTimestamp(value) {
|
|
85
174
|
return Number.isFinite(value) && value >= 0 && value <= 8_640_000_000_000_000
|
|
86
175
|
? value
|
|
@@ -122,16 +211,72 @@ function normalizeAgent(value, index) {
|
|
|
122
211
|
};
|
|
123
212
|
}
|
|
124
213
|
|
|
214
|
+
function agentOrderTimestamp(agent) {
|
|
215
|
+
return agent.startedAtMs ?? agent.stoppedAtMs ?? agent.lastActivityAtMs ?? Number.MAX_SAFE_INTEGER;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function assignStableAgentOrdinals(agents) {
|
|
219
|
+
const ordinalByAgentId = new Map(
|
|
220
|
+
[...agents]
|
|
221
|
+
.sort((left, right) => (
|
|
222
|
+
agentOrderTimestamp(left) - agentOrderTimestamp(right) ||
|
|
223
|
+
left.agentId.localeCompare(right.agentId)
|
|
224
|
+
))
|
|
225
|
+
.map((agent, index) => [agent.agentId, index + 1]),
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
return agents.map((agent) => ({
|
|
229
|
+
...agent,
|
|
230
|
+
ordinal: ordinalByAgentId.get(agent.agentId),
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
|
|
125
234
|
function normalizeActivity(value) {
|
|
126
235
|
const activity = isRecord(value) ? value : {};
|
|
127
236
|
return {
|
|
128
237
|
eventName: safeString(activity.type, "unknown_event"),
|
|
238
|
+
agentId: safeString(activity.agent_id, ""),
|
|
239
|
+
agentOrdinal: null,
|
|
129
240
|
toolName: safeString(activity.tool_name, ""),
|
|
241
|
+
toolUseId: safeString(activity.tool_use_id, ""),
|
|
130
242
|
status: normalizeCoreStatus(activity.status),
|
|
131
243
|
occurredAtMs: safeTimestamp(activity.received_at_ms),
|
|
132
244
|
};
|
|
133
245
|
}
|
|
134
246
|
|
|
247
|
+
function isToolLifecycle(activity) {
|
|
248
|
+
return activity.eventName === "tool_started" || activity.eventName === "tool_completed";
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function shouldReplaceToolActivity(candidate, current) {
|
|
252
|
+
const candidateTime = candidate.occurredAtMs ?? -1;
|
|
253
|
+
const currentTime = current.occurredAtMs ?? -1;
|
|
254
|
+
if (candidateTime !== currentTime) {
|
|
255
|
+
return candidateTime > currentTime;
|
|
256
|
+
}
|
|
257
|
+
return candidate.eventName === "tool_completed" && current.eventName !== "tool_completed";
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function collapseToolActivities(activities) {
|
|
261
|
+
const latestByToolUseId = new Map();
|
|
262
|
+
|
|
263
|
+
for (const activity of activities) {
|
|
264
|
+
if (!activity.toolUseId || !isToolLifecycle(activity)) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const current = latestByToolUseId.get(activity.toolUseId);
|
|
268
|
+
if (!current || shouldReplaceToolActivity(activity, current)) {
|
|
269
|
+
latestByToolUseId.set(activity.toolUseId, activity);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return activities.filter((activity) => (
|
|
274
|
+
!activity.toolUseId ||
|
|
275
|
+
!isToolLifecycle(activity) ||
|
|
276
|
+
latestByToolUseId.get(activity.toolUseId) === activity
|
|
277
|
+
));
|
|
278
|
+
}
|
|
279
|
+
|
|
135
280
|
function normalizeDiagnostic(value) {
|
|
136
281
|
const diagnostic = isRecord(value) ? value : {};
|
|
137
282
|
return {
|
|
@@ -160,10 +305,18 @@ function deriveSessionStatus(session, agents, recentActivities) {
|
|
|
160
305
|
function normalizeSession(value, index) {
|
|
161
306
|
const session = isRecord(value) ? value : {};
|
|
162
307
|
const agents = Array.isArray(session.agents)
|
|
163
|
-
? session.agents.map(normalizeAgent)
|
|
308
|
+
? assignStableAgentOrdinals(session.agents.map(normalizeAgent))
|
|
164
309
|
: [];
|
|
310
|
+
const agentOrdinalById = new Map(
|
|
311
|
+
agents.map((agent) => [agent.agentId, agent.ordinal]),
|
|
312
|
+
);
|
|
165
313
|
const recentActivities = Array.isArray(session.recent_activities)
|
|
166
|
-
? session.recent_activities.map(normalizeActivity)
|
|
314
|
+
? collapseToolActivities(session.recent_activities.map(normalizeActivity)).map(
|
|
315
|
+
(activity) => ({
|
|
316
|
+
...activity,
|
|
317
|
+
agentOrdinal: agentOrdinalById.get(activity.agentId) ?? null,
|
|
318
|
+
}),
|
|
319
|
+
)
|
|
167
320
|
: [];
|
|
168
321
|
|
|
169
322
|
return {
|
|
@@ -203,6 +356,11 @@ function compareAgents(left, right) {
|
|
|
203
356
|
return statusDifference || compareByActivity(left, right);
|
|
204
357
|
}
|
|
205
358
|
|
|
359
|
+
function compareSessions(left, right) {
|
|
360
|
+
const statusDifference = STATUS_ORDER[left.status] - STATUS_ORDER[right.status];
|
|
361
|
+
return statusDifference || compareByActivity(left, right);
|
|
362
|
+
}
|
|
363
|
+
|
|
206
364
|
function formatDateTime(timestampMs) {
|
|
207
365
|
if (timestampMs === null) {
|
|
208
366
|
return "시간 정보 없음";
|
|
@@ -293,21 +451,53 @@ function createTime(timestampMs, prefix) {
|
|
|
293
451
|
return wrapper;
|
|
294
452
|
}
|
|
295
453
|
|
|
454
|
+
function createTechnicalDetails(rows) {
|
|
455
|
+
const details = document.createElement("details");
|
|
456
|
+
details.className = "technical-details";
|
|
457
|
+
|
|
458
|
+
const summary = document.createElement("summary");
|
|
459
|
+
summary.textContent = "기술 정보";
|
|
460
|
+
const list = document.createElement("dl");
|
|
461
|
+
|
|
462
|
+
for (const [label, value] of rows) {
|
|
463
|
+
if (!value) {
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
const term = document.createElement("dt");
|
|
467
|
+
term.textContent = label;
|
|
468
|
+
const description = document.createElement("dd");
|
|
469
|
+
const code = document.createElement("code");
|
|
470
|
+
code.textContent = value;
|
|
471
|
+
description.append(code);
|
|
472
|
+
list.append(term, description);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
details.append(summary, list);
|
|
476
|
+
return details;
|
|
477
|
+
}
|
|
478
|
+
|
|
296
479
|
function createAgentItem(agent) {
|
|
297
480
|
const item = document.createElement("li");
|
|
298
481
|
item.className = "agent-item";
|
|
482
|
+
item.dataset.status = agent.status;
|
|
299
483
|
|
|
300
484
|
const heading = document.createElement("div");
|
|
301
485
|
heading.className = "agent-heading";
|
|
302
486
|
|
|
303
487
|
const identity = document.createElement("div");
|
|
304
488
|
identity.className = "agent-identity";
|
|
305
|
-
const
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
489
|
+
const name = document.createElement("strong");
|
|
490
|
+
name.className = "agent-name";
|
|
491
|
+
name.textContent = `작업 에이전트 ${agent.ordinal}`;
|
|
492
|
+
identity.append(name);
|
|
493
|
+
|
|
494
|
+
const roleLabel = formatAgentRole(agent.agentType);
|
|
495
|
+
if (roleLabel) {
|
|
496
|
+
const role = document.createElement("span");
|
|
497
|
+
role.className = "agent-role";
|
|
498
|
+
role.textContent = roleLabel;
|
|
499
|
+
identity.append(role);
|
|
500
|
+
}
|
|
311
501
|
heading.append(identity, createStatusBadge(agent.status));
|
|
312
502
|
|
|
313
503
|
const metadata = document.createElement("div");
|
|
@@ -317,7 +507,12 @@ function createAgentItem(agent) {
|
|
|
317
507
|
document.createTextNode(` · ${formatDuration(agent.startedAtMs, agent.stoppedAtMs)}`),
|
|
318
508
|
);
|
|
319
509
|
|
|
320
|
-
|
|
510
|
+
const technicalRows = [["에이전트 ID", agent.agentId]];
|
|
511
|
+
if (roleLabel) {
|
|
512
|
+
technicalRows.push(["원본 역할", agent.agentType]);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
item.append(heading, metadata, createTechnicalDetails(technicalRows));
|
|
321
516
|
return item;
|
|
322
517
|
}
|
|
323
518
|
|
|
@@ -334,20 +529,19 @@ function createActivityItem(activity) {
|
|
|
334
529
|
const title = document.createElement("div");
|
|
335
530
|
title.className = "activity-title";
|
|
336
531
|
const eventName = document.createElement("strong");
|
|
337
|
-
eventName.textContent = activity
|
|
532
|
+
eventName.textContent = formatActivityLabel(activity);
|
|
338
533
|
title.append(eventName);
|
|
339
534
|
|
|
340
|
-
if (activity.toolName) {
|
|
341
|
-
const tool = document.createElement("code");
|
|
342
|
-
tool.textContent = activity.toolName;
|
|
343
|
-
title.append(tool);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
535
|
const metadata = document.createElement("div");
|
|
347
536
|
metadata.className = "activity-metadata";
|
|
348
537
|
metadata.append(createStatusBadge(activity.status), createTime(activity.occurredAtMs, ""));
|
|
349
538
|
|
|
350
|
-
|
|
539
|
+
const technicalRows = [["원본 이벤트", activity.eventName]];
|
|
540
|
+
if (activity.toolName) {
|
|
541
|
+
technicalRows.push(["원본 도구", activity.toolName]);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
content.append(title, metadata, createTechnicalDetails(technicalRows));
|
|
351
545
|
item.append(marker, content);
|
|
352
546
|
return item;
|
|
353
547
|
}
|
|
@@ -363,6 +557,7 @@ function createSessionCard(session) {
|
|
|
363
557
|
const listItem = document.createElement("li");
|
|
364
558
|
const article = document.createElement("article");
|
|
365
559
|
article.className = "session-card";
|
|
560
|
+
article.dataset.status = session.status;
|
|
366
561
|
|
|
367
562
|
const cardHeader = document.createElement("header");
|
|
368
563
|
cardHeader.className = "session-header";
|
|
@@ -371,13 +566,14 @@ function createSessionCard(session) {
|
|
|
371
566
|
identity.className = "session-identity";
|
|
372
567
|
const eyebrow = document.createElement("span");
|
|
373
568
|
eyebrow.className = "session-kind";
|
|
374
|
-
eyebrow.
|
|
375
|
-
const id = document.createElement("code");
|
|
376
|
-
id.textContent = session.sessionId;
|
|
377
|
-
eyebrow.append(id);
|
|
569
|
+
eyebrow.textContent = "부모 작업";
|
|
378
570
|
const title = document.createElement("h3");
|
|
379
571
|
title.textContent = session.workspaceLabel || "프로젝트 정보 없음";
|
|
380
|
-
identity.append(
|
|
572
|
+
identity.append(
|
|
573
|
+
eyebrow,
|
|
574
|
+
title,
|
|
575
|
+
createTechnicalDetails([["세션 ID", session.sessionId]]),
|
|
576
|
+
);
|
|
381
577
|
|
|
382
578
|
const sessionState = document.createElement("div");
|
|
383
579
|
sessionState.className = "session-state";
|
|
@@ -394,7 +590,7 @@ function createSessionCard(session) {
|
|
|
394
590
|
const agentPanel = document.createElement("section");
|
|
395
591
|
agentPanel.className = "session-panel";
|
|
396
592
|
const agentTitle = document.createElement("h4");
|
|
397
|
-
agentTitle.textContent =
|
|
593
|
+
agentTitle.textContent = `작업 에이전트 · ${session.agents.length}`;
|
|
398
594
|
agentPanel.append(agentTitle);
|
|
399
595
|
|
|
400
596
|
if (session.agents.length) {
|
|
@@ -405,7 +601,7 @@ function createSessionCard(session) {
|
|
|
405
601
|
});
|
|
406
602
|
agentPanel.append(list);
|
|
407
603
|
} else {
|
|
408
|
-
agentPanel.append(createEmptyPanel("이
|
|
604
|
+
agentPanel.append(createEmptyPanel("이 부모 작업에서 관찰된 작업 에이전트가 없습니다."));
|
|
409
605
|
}
|
|
410
606
|
|
|
411
607
|
const activityPanel = document.createElement("section");
|
|
@@ -422,7 +618,7 @@ function createSessionCard(session) {
|
|
|
422
618
|
});
|
|
423
619
|
activityPanel.append(list);
|
|
424
620
|
} else {
|
|
425
|
-
activityPanel.append(createEmptyPanel("표시할
|
|
621
|
+
activityPanel.append(createEmptyPanel("표시할 최근 활동이 없습니다."));
|
|
426
622
|
}
|
|
427
623
|
|
|
428
624
|
panels.append(agentPanel, activityPanel);
|
|
@@ -440,7 +636,11 @@ function sessionMatchesQuery(session, query) {
|
|
|
440
636
|
session.sessionId,
|
|
441
637
|
session.workspaceLabel,
|
|
442
638
|
session.status,
|
|
443
|
-
...session.agents.flatMap((agent) => [
|
|
639
|
+
...session.agents.flatMap((agent) => [
|
|
640
|
+
agent.agentId,
|
|
641
|
+
formatAgentRole(agent.agentType),
|
|
642
|
+
agent.status,
|
|
643
|
+
]),
|
|
444
644
|
...session.recentActivities.flatMap((activity) => [
|
|
445
645
|
activity.eventName,
|
|
446
646
|
activity.toolName,
|
|
@@ -466,7 +666,7 @@ function filteredSessions() {
|
|
|
466
666
|
return [...viewState.sessions]
|
|
467
667
|
.filter((session) => sessionMatchesQuery(session, query))
|
|
468
668
|
.filter((session) => sessionMatchesStatus(session, status))
|
|
469
|
-
.sort(
|
|
669
|
+
.sort(compareSessions);
|
|
470
670
|
}
|
|
471
671
|
|
|
472
672
|
function renderMetrics() {
|
|
@@ -481,7 +681,7 @@ function renderMetrics() {
|
|
|
481
681
|
elements.metricWaiting.textContent = String(waitingCount);
|
|
482
682
|
elements.metricCompleted.textContent = String(countStatus("completed"));
|
|
483
683
|
elements.lastUpdated.textContent = !viewState.updatedAtMs
|
|
484
|
-
? "수신된
|
|
684
|
+
? "수신된 활동 없음"
|
|
485
685
|
: formatDateTime(viewState.updatedAtMs);
|
|
486
686
|
}
|
|
487
687
|
|
|
@@ -513,11 +713,11 @@ function setEmptyObservationMessage() {
|
|
|
513
713
|
const copy = document.createElement("span");
|
|
514
714
|
|
|
515
715
|
if (viewState.diagnostics.length) {
|
|
516
|
-
heading.textContent = "표시 가능한
|
|
517
|
-
copy.textContent =
|
|
716
|
+
heading.textContent = "표시 가능한 부모 작업이 없습니다.";
|
|
717
|
+
copy.textContent = `로컬 모니터가 활동 정보 ${viewState.diagnostics.length}건을 받았지만 표시 가능한 부모 작업으로 적용하지 못했습니다.`;
|
|
518
718
|
} else {
|
|
519
|
-
heading.textContent = "이 관찰
|
|
520
|
-
copy.textContent = "로컬
|
|
719
|
+
heading.textContent = "이 관찰 화면에서 수신된 작업 활동이 없습니다.";
|
|
720
|
+
copy.textContent = "로컬 모니터 연결은 정상입니다. 이 결과만으로 Codex에 실행 중인 부모 작업이나 작업 에이전트가 없다고 판단할 수 없습니다.";
|
|
521
721
|
}
|
|
522
722
|
|
|
523
723
|
const guidance = document.createElement("div");
|
|
@@ -528,13 +728,13 @@ function setEmptyObservationMessage() {
|
|
|
528
728
|
|
|
529
729
|
const automaticTracking = document.createElement("p");
|
|
530
730
|
automaticTracking.className = "automatic-tracking";
|
|
531
|
-
automaticTracking.textContent = "
|
|
731
|
+
automaticTracking.textContent = "작업 ID를 입력하거나 작업별로 등록할 필요가 없습니다. 신뢰한 hook의 작업 활동이 이 목록에 자동으로 추가됩니다.";
|
|
532
732
|
|
|
533
733
|
const steps = document.createElement("ol");
|
|
534
734
|
for (const step of [
|
|
535
|
-
"
|
|
536
|
-
"새
|
|
537
|
-
"
|
|
735
|
+
"플러그인을 설치한 뒤 공식 Codex 앱을 완전히 재시작했는지 확인합니다.",
|
|
736
|
+
"새 작업에서 표시되는 Codex Agent View hook 명령을 검토하고 직접 신뢰합니다.",
|
|
737
|
+
"신뢰 설정 후 새 작업을 시작해 작업 에이전트를 실행합니다. 새 활동은 이 목록에 자동으로 추가됩니다.",
|
|
538
738
|
]) {
|
|
539
739
|
const item = document.createElement("li");
|
|
540
740
|
item.textContent = step;
|
|
@@ -543,7 +743,7 @@ function setEmptyObservationMessage() {
|
|
|
543
743
|
|
|
544
744
|
const boundary = document.createElement("p");
|
|
545
745
|
boundary.className = "observation-boundary";
|
|
546
|
-
boundary.textContent = "관찰
|
|
746
|
+
boundary.textContent = "관찰 화면은 첫 번째로 신뢰한 hook을 받은 시점부터 시작합니다. 그 전에 이미 지나간 활동과 로컬 상태 수집이 중단된 동안의 활동은 재생되지 않으며, 수집이 다시 시작되면 새 관찰 화면이 열립니다.";
|
|
547
747
|
|
|
548
748
|
guidance.append(guidanceTitle, automaticTracking, steps, boundary);
|
|
549
749
|
|
|
@@ -551,7 +751,7 @@ function setEmptyObservationMessage() {
|
|
|
551
751
|
const diagnostics = document.createElement("details");
|
|
552
752
|
diagnostics.className = "diagnostic-details";
|
|
553
753
|
const summary = document.createElement("summary");
|
|
554
|
-
summary.textContent = `검증
|
|
754
|
+
summary.textContent = `검증 정보 ${viewState.diagnostics.length}건`;
|
|
555
755
|
const codes = document.createElement("ul");
|
|
556
756
|
const diagnosticCounts = new Map();
|
|
557
757
|
for (const { code } of viewState.diagnostics) {
|
|
@@ -585,11 +785,11 @@ function renderSessions() {
|
|
|
585
785
|
|
|
586
786
|
elements.resultsSummary.textContent = hasFilters
|
|
587
787
|
? `전체 ${viewState.sessions.length}개 중 ${visibleSessions.length}개 표시`
|
|
588
|
-
: `${viewState.sessions.length}개 부모
|
|
788
|
+
: `${viewState.sessions.length}개 부모 작업`;
|
|
589
789
|
|
|
590
790
|
if (!viewState.hasLoaded) {
|
|
591
791
|
elements.sessionList.hidden = true;
|
|
592
|
-
setStateMessage("loading", "상태를 불러오는 중입니다.", "로컬
|
|
792
|
+
setStateMessage("loading", "상태를 불러오는 중입니다.", "로컬 모니터에 연결하고 있습니다.");
|
|
593
793
|
return;
|
|
594
794
|
}
|
|
595
795
|
|
|
@@ -604,7 +804,7 @@ function renderSessions() {
|
|
|
604
804
|
"error",
|
|
605
805
|
viewState.canRetry
|
|
606
806
|
? "로컬 상태 연결이 끊겨 다시 시도 중입니다."
|
|
607
|
-
: "이
|
|
807
|
+
: "이 실시간 화면을 인증할 수 없습니다.",
|
|
608
808
|
description,
|
|
609
809
|
viewState.canRetry,
|
|
610
810
|
);
|
|
@@ -641,7 +841,7 @@ function setConnectionStatus(status, labelOverride = "") {
|
|
|
641
841
|
elements.connectionStatus.dataset.status = status;
|
|
642
842
|
const labels = {
|
|
643
843
|
connecting: "로컬 상태 연결 중",
|
|
644
|
-
connected: "로컬
|
|
844
|
+
connected: "로컬 모니터 연결됨",
|
|
645
845
|
error: "연결 끊김 · 재시도 중",
|
|
646
846
|
};
|
|
647
847
|
elements.connectionLabel.textContent = labelOverride || labels[status];
|
|
@@ -656,8 +856,8 @@ async function refreshState() {
|
|
|
656
856
|
viewState.hasLoaded = true;
|
|
657
857
|
viewState.canRetry = false;
|
|
658
858
|
viewState.authenticationFailed = true;
|
|
659
|
-
viewState.errorMessage = "이 탭에는 접근
|
|
660
|
-
setConnectionStatus("error", "
|
|
859
|
+
viewState.errorMessage = "이 탭에는 접근 토큰이 없습니다. Codex 앱에서 Codex Agent View의 실시간 화면 열기를 다시 요청하세요.";
|
|
860
|
+
setConnectionStatus("error", "실시간 화면 인증 필요");
|
|
661
861
|
render();
|
|
662
862
|
return;
|
|
663
863
|
}
|
|
@@ -682,8 +882,8 @@ async function refreshState() {
|
|
|
682
882
|
viewState.hasLoaded = true;
|
|
683
883
|
viewState.canRetry = false;
|
|
684
884
|
viewState.authenticationFailed = true;
|
|
685
|
-
viewState.errorMessage = "이
|
|
686
|
-
setConnectionStatus("error", "
|
|
885
|
+
viewState.errorMessage = "이 실시간 화면의 인증이 더 이상 유효하지 않습니다. Codex 앱에서 Codex Agent View의 실시간 화면 열기를 다시 요청하세요.";
|
|
886
|
+
setConnectionStatus("error", "실시간 화면 인증 필요");
|
|
687
887
|
return;
|
|
688
888
|
}
|
|
689
889
|
|
package/public/index.html
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<meta name="color-scheme" content="light dark">
|
|
7
7
|
<meta
|
|
8
8
|
name="description"
|
|
9
|
-
content="공식 Codex 앱의 부모
|
|
9
|
+
content="공식 Codex 앱의 부모 작업과 작업 에이전트 상태를 로컬에서 읽기 전용으로 확인합니다."
|
|
10
10
|
>
|
|
11
11
|
<title>Codex Agent View</title>
|
|
12
12
|
<link rel="stylesheet" href="/assets/styles.css">
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
<span class="brand-mark" aria-hidden="true">CA</span>
|
|
22
22
|
<span>
|
|
23
23
|
<strong>Codex Agent View</strong>
|
|
24
|
-
<small
|
|
24
|
+
<small>로컬 읽기 전용 모니터</small>
|
|
25
25
|
</span>
|
|
26
26
|
</a>
|
|
27
27
|
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
<main id="main-content" tabindex="-1">
|
|
42
42
|
<section class="hero" aria-labelledby="page-title">
|
|
43
43
|
<div>
|
|
44
|
-
<p class="eyebrow"
|
|
44
|
+
<p class="eyebrow">로컬 · 읽기 전용</p>
|
|
45
45
|
<h1 id="page-title">작업 흐름을 한눈에</h1>
|
|
46
46
|
<p class="hero-copy">
|
|
47
|
-
공식 Codex 앱은 그대로 두고, 부모
|
|
47
|
+
공식 Codex 앱은 그대로 두고, 부모 작업과 작업 에이전트의 현재 상태만
|
|
48
48
|
로컬에서 확인합니다.
|
|
49
49
|
</p>
|
|
50
50
|
</div>
|
|
@@ -63,32 +63,32 @@
|
|
|
63
63
|
|
|
64
64
|
<section class="metrics" aria-label="작업 상태 요약">
|
|
65
65
|
<article class="metric-card">
|
|
66
|
-
<p>부모
|
|
66
|
+
<p>부모 작업</p>
|
|
67
67
|
<strong id="metric-sessions">0</strong>
|
|
68
68
|
<span>현재 관찰 중</span>
|
|
69
69
|
</article>
|
|
70
70
|
<article class="metric-card metric-running">
|
|
71
|
-
<p>실행 중
|
|
71
|
+
<p>실행 중 에이전트</p>
|
|
72
72
|
<strong id="metric-running">0</strong>
|
|
73
73
|
<span>작업 수행 중</span>
|
|
74
74
|
</article>
|
|
75
75
|
<article class="metric-card metric-waiting">
|
|
76
76
|
<p>대기 상태</p>
|
|
77
77
|
<strong id="metric-waiting">0</strong>
|
|
78
|
-
<span>사용자 또는 다음 작업 대기</span>
|
|
78
|
+
<span>사용자 응답 또는 다음 작업 대기</span>
|
|
79
79
|
</article>
|
|
80
80
|
<article class="metric-card metric-completed">
|
|
81
|
-
<p>완료
|
|
81
|
+
<p>완료 에이전트</p>
|
|
82
82
|
<strong id="metric-completed">0</strong>
|
|
83
|
-
<span>현재
|
|
83
|
+
<span>현재 화면 기준</span>
|
|
84
84
|
</article>
|
|
85
85
|
</section>
|
|
86
86
|
|
|
87
87
|
<section class="workspace" aria-labelledby="sessions-heading">
|
|
88
88
|
<div class="section-heading">
|
|
89
89
|
<div>
|
|
90
|
-
<p class="eyebrow"
|
|
91
|
-
<h2 id="sessions-heading">부모
|
|
90
|
+
<p class="eyebrow">실시간 작업</p>
|
|
91
|
+
<h2 id="sessions-heading">부모 작업과 작업 에이전트</h2>
|
|
92
92
|
</div>
|
|
93
93
|
<p id="results-summary" class="results-summary" role="status" aria-live="polite">
|
|
94
94
|
상태를 불러오는 중입니다.
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
<form
|
|
99
99
|
class="toolbar"
|
|
100
100
|
role="search"
|
|
101
|
-
aria-label="자동 수신된
|
|
101
|
+
aria-label="자동 수신된 부모 작업과 작업 에이전트 목록 필터"
|
|
102
102
|
hidden
|
|
103
103
|
>
|
|
104
104
|
<div class="field field-search">
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
id="session-search"
|
|
108
108
|
name="query"
|
|
109
109
|
type="search"
|
|
110
|
-
placeholder="
|
|
110
|
+
placeholder="부모 작업·작업 에이전트 목록에서 찾기"
|
|
111
111
|
autocomplete="off"
|
|
112
112
|
spellcheck="false"
|
|
113
113
|
>
|
|
@@ -129,13 +129,13 @@
|
|
|
129
129
|
<span>Codex 앱의 로컬 상태에 연결하고 있습니다.</span>
|
|
130
130
|
</div>
|
|
131
131
|
|
|
132
|
-
<ul id="session-list" class="session-list" aria-label="Codex 부모
|
|
132
|
+
<ul id="session-list" class="session-list" aria-label="Codex 부모 작업 목록" hidden></ul>
|
|
133
133
|
</section>
|
|
134
134
|
</main>
|
|
135
135
|
|
|
136
136
|
<footer>
|
|
137
|
-
<p>이 화면은
|
|
138
|
-
<p>데이터는 이 기기의 로컬
|
|
137
|
+
<p>이 화면은 사용자 요청 내용과 도구 입력 내용을 표시하지 않습니다.</p>
|
|
138
|
+
<p>데이터는 이 기기의 로컬 모니터에서만 읽습니다.</p>
|
|
139
139
|
</footer>
|
|
140
140
|
</div>
|
|
141
141
|
</body>
|
package/public/styles.css
CHANGED
|
@@ -537,6 +537,15 @@ h1 {
|
|
|
537
537
|
border-radius: var(--radius-md);
|
|
538
538
|
}
|
|
539
539
|
|
|
540
|
+
.session-card[data-status="running"] {
|
|
541
|
+
border-color: color-mix(in srgb, var(--running) 58%, var(--border-default));
|
|
542
|
+
box-shadow: 0 0 0 0.16rem var(--running-soft);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.session-card[data-status="running"] .session-header {
|
|
546
|
+
background: linear-gradient(110deg, var(--running-soft), var(--surface-raised) 72%);
|
|
547
|
+
}
|
|
548
|
+
|
|
540
549
|
.session-header {
|
|
541
550
|
display: flex;
|
|
542
551
|
align-items: center;
|
|
@@ -650,6 +659,11 @@ h1 {
|
|
|
650
659
|
border-radius: var(--radius-sm);
|
|
651
660
|
}
|
|
652
661
|
|
|
662
|
+
.agent-item[data-status="running"] {
|
|
663
|
+
background: color-mix(in srgb, var(--running-soft) 62%, var(--surface-raised));
|
|
664
|
+
border-color: color-mix(in srgb, var(--running) 42%, var(--border-default));
|
|
665
|
+
}
|
|
666
|
+
|
|
653
667
|
.agent-heading {
|
|
654
668
|
display: flex;
|
|
655
669
|
align-items: center;
|
|
@@ -663,18 +677,16 @@ h1 {
|
|
|
663
677
|
gap: 0.15rem;
|
|
664
678
|
}
|
|
665
679
|
|
|
666
|
-
.agent-
|
|
667
|
-
color: var(--text-secondary);
|
|
668
|
-
font-size: var(--text-xs);
|
|
669
|
-
font-weight: 800;
|
|
670
|
-
text-transform: uppercase;
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
.agent-identity code {
|
|
680
|
+
.agent-name {
|
|
674
681
|
color: var(--text-primary);
|
|
675
682
|
font-size: var(--text-sm);
|
|
676
683
|
}
|
|
677
684
|
|
|
685
|
+
.agent-role {
|
|
686
|
+
color: var(--text-secondary);
|
|
687
|
+
font-size: var(--text-xs);
|
|
688
|
+
}
|
|
689
|
+
|
|
678
690
|
.agent-metadata {
|
|
679
691
|
margin-top: var(--space-2);
|
|
680
692
|
}
|
|
@@ -736,6 +748,35 @@ h1 {
|
|
|
736
748
|
height: 0.4rem;
|
|
737
749
|
}
|
|
738
750
|
|
|
751
|
+
.technical-details {
|
|
752
|
+
margin-top: var(--space-2);
|
|
753
|
+
color: var(--text-muted);
|
|
754
|
+
font-size: var(--text-xs);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
.technical-details summary {
|
|
758
|
+
width: fit-content;
|
|
759
|
+
min-height: 2.75rem;
|
|
760
|
+
padding: var(--space-2) 0;
|
|
761
|
+
cursor: pointer;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
.technical-details dl {
|
|
765
|
+
display: grid;
|
|
766
|
+
margin: 0;
|
|
767
|
+
grid-template-columns: max-content minmax(0, 1fr);
|
|
768
|
+
gap: var(--space-1) var(--space-2);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
.technical-details dt,
|
|
772
|
+
.technical-details dd {
|
|
773
|
+
margin: 0;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
.technical-details code {
|
|
777
|
+
color: var(--text-secondary);
|
|
778
|
+
}
|
|
779
|
+
|
|
739
780
|
.panel-empty {
|
|
740
781
|
margin-bottom: 0;
|
|
741
782
|
padding: var(--space-4);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: show-agents
|
|
3
|
-
description: Open the Codex Agent View live task and subagent monitor in the official Codex app. Use when the user explicitly
|
|
3
|
+
description: Open the Codex Agent View live task and subagent monitor in the official Codex app. Use when the user explicitly invokes $show-agents, including from the plugin Quick start starter.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Show Agents
|
|
7
7
|
|
|
8
|
-
Treat
|
|
9
|
-
|
|
10
|
-
terminal instructions or a text-only snapshot. Keep the whole
|
|
11
|
-
workflow inside the calling Codex app task.
|
|
8
|
+
Treat an explicit `$show-agents` invocation, including one inserted by the
|
|
9
|
+
plugin Quick start starter, as a request to open the live monitor. It is not a
|
|
10
|
+
request for terminal instructions or a text-only snapshot. Keep the whole
|
|
11
|
+
ordinary-use workflow inside the calling Codex app task.
|
|
12
12
|
|
|
13
13
|
## Open the live view
|
|
14
14
|
|
|
@@ -20,8 +20,8 @@ workflow inside the calling Codex app task.
|
|
|
20
20
|
running `codex-agent-view status --json`, starting a monitor, or opening a
|
|
21
21
|
panel. Briefly tell the user inside the current Codex app task that the
|
|
22
22
|
installed plugin and global CLI versions differ and that the exact intended
|
|
23
|
-
`codex-agent-view` version must be globally reinstalled before they
|
|
24
|
-
|
|
23
|
+
`codex-agent-view` version must be globally reinstalled before they invoke
|
|
24
|
+
`$show-agents` again. Do not perform the reinstall, change Codex settings,
|
|
25
25
|
expose paths, or quote the diagnostic payload.
|
|
26
26
|
3. Otherwise, check the packaged monitor with
|
|
27
27
|
`codex-agent-view status --json`. Capture the result internally; do not
|