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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-agent-view",
3
- "version": "0.4.0",
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
- "Show Agents"
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는 exact `codex-agent-view@0.4.0` release를 설명한다. **최초 설치만** 일반 터미널에서 아래 exact-version 명령으로 진행한다. npm 해당 version을 찾지 못하면 `0.4.0` registry publish가 완료됐는지 확인한 뒤 다시 시도한다.
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.0
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. task의 `@` 메뉴에서 **Codex Agent View**를 고르고 bundled **Show Agents** skill을 선택해 실행한다.
29
- 6. Live 화면을 닫았다면 같은 `@` 메뉴에서 **Show Agents**를 다시 선택해 재오픈한다.
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 화면을 처음 열 때 Codex task에서 **Show Agents**를 명시적으로 선택해야 한다. 이미 오른쪽에 열린 live tab은 같은 monitor 관찰 window 동안 2초마다 자동 갱신하고 일시 연결 단절 뒤에도 기존 token으로 재연결한다.
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 version은 `0.4.0`이다. 다음 구성이 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
- - 공식 Codex 앱의 `@` 메뉴에서 **Codex Agent View Show Agents**를 선택하는 것이 canonical UX다. 별도 monitor 실행이나 task ID 등록이 필요 없다.
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는 사용자가 앱 안에서 **Show Agents**를 선택했을 때만 열린다. 외부 website나 telemetry dashboard가 아니다.
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. task의 `@` 메뉴에서 **Codex Agent View**를 고르고 bundled **Show Agents** skill을 선택한다.
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은 관찰한 task와 subagent privacy-minimized hook 상태를 표시한다. Prompt, preview, tool input/output, full workspace path와 internal thread ID기본 표시하지 않는다.
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 화면을 닫았다면 같은 `@` 메뉴에서 **Show Agents**를 다시 선택해 재오픈한다. 열린 tab은 같은 관찰 window에서 자동 갱신하고 일시 단절 뒤 재연결한다.
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 개발자와 문제 보고를 위한 진단 참고 자료이며 일반 사용자 사용법이 아니다. 설치가 끝난 사용자는 Codex 앱의 `@` 메뉴에서 **Codex Agent View Show Agents**를 선택한다. 아래 명령과 localhost 주소를 정상 사용 순서에 넣거나 사용자에게 직접 관리하도록 요구하지 않는다.
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
- 아래 명령은 이 README가 설명하는 release와 일치하는 exact `0.4.0` 설치 명령이다. Exact version 고정은 설치 package와 문서를 일치시키며, registry가 해당 version을 찾지 못하면 publish 완료 여부를 확인한 뒤 다시 시도한다.
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.0
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를 실행하지 않는다. task의 `@` 메뉴에서 **Codex Agent View → Show Agents**를 선택해 live 화면을 열며, 화면을 닫았으면 같은 skill을 다시 선택한다.
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.0`에서 지원하는 설치 경로는 위의 global package 설치와 명시적인 `codex-agent-view install` command 조합이다. 이후 일반 사용은 Codex 앱 안에서 진행한다.
215
+ `0.4.2`에서 계획한 설치 경로는 위의 global package 설치와 명시적인 `codex-agent-view install` command 조합이다. 이후 일반 사용은 Codex 앱 안에서 진행한다.
205
216
 
206
- `0.2.0`/`0.2.1`/`0.3.0`/`0.3.1`/`0.3.2` release evidence는 보존한다. `0.4.0` registry, tagartifact evidence는 release 단계의 실제 완료를 관찰한 뒤에만 기록한다. Registry evidence와 검증 경계는 [docs/distribution.md](docs/distribution.md)에 기록한다.
217
+ `0.2.0`부터 public `0.4.1`까지의 release evidence는 보존한다. `0.4.2` candidate는 publishvisual 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 확인은 명시적인 문제 조사용이다. 정상 사용자는 Codex 앱의 `@` 메뉴에서 **Codex Agent View Show Agents**를 선택한다.
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 exact `codex-agent-view@0.4.0` release. Use the exact-version command below for the one-time terminal installation. If npm reports that the version is unavailable, verify that the `0.4.0` registry publication has completed before retrying.
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.0
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. In the new task, open the `@` menu, choose **Codex Agent View**, select its bundled **Show Agents** skill, and run it.
29
- 6. If you close the live view, select the same **Show Agents** skill from the `@` menu again to reopen it.
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 selecting **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.
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 version `0.4.0`. They include 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.
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
- - Selecting **Codex Agent View Show Agents** from the official Codex app's `@` menu is the canonical UX; it does not require starting a monitor or registering task IDs.
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 the user selects **Show Agents**; it is not an external website or telemetry dashboard.
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. Open the task's `@` menu, choose **Codex Agent View**, and select the bundled **Show Agents** skill.
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 displays privacy-minimized hook state for observed tasks and subagents. Prompts, previews, tool input/output, full workspace paths, and internal thread IDs remain hidden by default.
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, select **Show Agents** from the same `@` menu again. An open tab refreshes and reconnects automatically within the same observation window.
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 select **Codex Agent View → Show Agents** from the app's `@` menu; do not make them manage these commands or localhost URLs.
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 documented release's exact package version, `0.4.0`. Exact version pinning keeps the installed package aligned with this README; if the registry reports that version as unavailable, verify publication before retrying.
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.0
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. In that task's `@` menu, choose **Codex Agent View Show Agents** to open the live view; select the same skill whenever a closed view needs to be reopened.
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 supported `0.4.0` 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.
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`, `0.2.1`, `0.3.0`, `0.3.1`, and `0.3.2` release evidence is preserved. Record `0.4.0` registry, tag, and artifact evidence only after observing each completed release step. See [Distribution](docs/distribution.md).
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-agent-view",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Read-only Codex app task view with a trusted-hook auto-prepared local live backend.",
5
5
  "type": "module",
6
6
  "main": "./src/core/index.mjs",
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 type = document.createElement("span");
306
- type.className = "agent-type";
307
- type.textContent = agent.agentType;
308
- const id = document.createElement("code");
309
- id.textContent = agent.agentId;
310
- identity.append(type, id);
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
- item.append(heading, metadata);
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.eventName;
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
- content.append(title, metadata);
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.append("PARENT TASK · ");
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(eyebrow, title);
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 = `Subagents · ${session.agents.length}`;
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("이 task에서 관찰된 subagent가 없습니다."));
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("표시할 lifecycle event가 없습니다."));
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) => [agent.agentId, agent.agentType, agent.status]),
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(compareByActivity);
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
- ? "수신된 hook 없음"
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 = "표시 가능한 task가 없습니다.";
517
- copy.textContent = `Monitor가 hook 입력 ${viewState.diagnostics.length}건을 받았지만 유효한 session으로 적용하지 않았습니다.`;
716
+ heading.textContent = "표시 가능한 부모 작업이 없습니다.";
717
+ copy.textContent = `로컬 모니터가 활동 정보 ${viewState.diagnostics.length}건을 받았지만 표시 가능한 부모 작업으로 적용하지 못했습니다.`;
518
718
  } else {
519
- heading.textContent = "이 관찰 창에서 수신된 hook event가 0건입니다.";
520
- copy.textContent = "로컬 monitor 연결은 정상입니다. 이 결과만으로 Codex에 실행 중인 task나 agent가 없다고 판단할 수 없습니다.";
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 = "task ID를 입력하거나 task별로 등록할 필요가 없습니다. Trusted hook event가 자동으로 이 목록에 추가됩니다.";
731
+ automaticTracking.textContent = "작업 ID를 입력하거나 작업별로 등록할 필요가 없습니다. 신뢰한 hook 작업 활동이 이 목록에 자동으로 추가됩니다.";
532
732
 
533
733
  const steps = document.createElement("ol");
534
734
  for (const step of [
535
- "Plugin을 설치한 뒤 공식 Codex 앱을 완전히 재시작했는지 확인합니다.",
536
- "새 task에서 표시되는 Codex Agent View hook command를 검토하고 직접 trust합니다.",
537
- "Trust 이후task를 시작해 subagent 작업을 실행합니다. Hook event가 이 목록에 자동으로 추가됩니다.",
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 = "관찰 window는trusted hook에서 시작합니다. 그 전에 이미 지나간 event와 로컬 상태 수집이 중단된 동안의 event는 재생되지 않으며, 수집이 다시 시작되면 새 관찰 window가 열립니다.";
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 = `검증 diagnostic ${viewState.diagnostics.length}건`;
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}개 부모 task`;
788
+ : `${viewState.sessions.length}개 부모 작업`;
589
789
 
590
790
  if (!viewState.hasLoaded) {
591
791
  elements.sessionList.hidden = true;
592
- setStateMessage("loading", "상태를 불러오는 중입니다.", "로컬 monitor에 연결하고 있습니다.");
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
- : "이 live view를 인증할 수 없습니다.",
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: "로컬 monitor 연결됨",
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 = "이 탭에는 접근 token이 없습니다. Codex 앱에서 Codex Agent View live view 열기를 다시 요청하세요.";
660
- setConnectionStatus("error", "live view 인증 필요");
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 = "이 live view의 인증이 더 이상 유효하지 않습니다. Codex 앱에서 Codex Agent View live view 열기를 다시 요청하세요.";
686
- setConnectionStatus("error", "live view 인증 필요");
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 앱의 부모 task와 subagent 상태를 로컬에서 읽기 전용으로 확인합니다."
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>Local companion monitor</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">LOCAL · READ ONLY</p>
44
+ <p class="eyebrow">로컬 · 읽기 전용</p>
45
45
  <h1 id="page-title">작업 흐름을 한눈에</h1>
46
46
  <p class="hero-copy">
47
- 공식 Codex 앱은 그대로 두고, 부모 task와 subagent의 현재 상태만
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>부모 task</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>실행 중 agent</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>완료 agent</p>
81
+ <p>완료 에이전트</p>
82
82
  <strong id="metric-completed">0</strong>
83
- <span>현재 snapshot 기준</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">LIVE SESSIONS</p>
91
- <h2 id="sessions-heading">부모 task와 subagent</h2>
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="자동 수신된 task와 subagent 목록 필터"
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="자동 수신된 task·agent 목록에서 찾기"
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 부모 task 목록" hidden></ul>
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>이 화면은 prompt와 tool input을 표시하지 않습니다.</p>
138
- <p>데이터는 이 기기의 로컬 monitor에서만 읽습니다.</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-type {
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 selects the bundled Show Agents skill from the app's @ menu.
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 selection of the bundled **Show Agents** skill from the Codex app's `@`
9
- menu as an explicit request to open the live monitor, not as a request for
10
- terminal instructions or a text-only snapshot. Keep the whole ordinary-use
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 select
24
- **Show Agents** again. Do not perform the reinstall, change Codex settings,
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
@@ -1,5 +1,6 @@
1
1
  interface:
2
2
  display_name: "Show Agents"
3
3
  short_description: "Open the live agent monitor inside Codex"
4
+ default_prompt: "Use $show-agents to open the live agent monitor."
4
5
  policy:
5
6
  allow_implicit_invocation: false