codex-agent-view 0.5.1 → 0.5.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 -3
- package/README.ko.md +53 -257
- package/README.md +48 -180
- package/package.json +1 -1
- package/public/app.js +123 -7
- package/public/index.html +1 -1
- package/public/styles.css +31 -0
- package/scripts/send-hook.mjs +13 -1
- package/src/core/monitor-store.mjs +207 -0
- package/src/core/normalize-hook-payload.mjs +75 -0
package/README.md
CHANGED
|
@@ -2,234 +2,102 @@
|
|
|
2
2
|
|
|
3
3
|
> [Read in Korean](https://github.com/JunhoYoon95/codex-agent-view/blob/main/README.ko.md)
|
|
4
4
|
|
|
5
|
-
Codex Agent View
|
|
5
|
+
Codex Agent View is an unofficial, read-only companion plugin for the official Codex app. It shows the work Codex is handling, the participating agents, their assigned work when it can be verified, and their latest observable activity. Hook data stays on this device in bounded process memory, and one `@codex-agent-view` invocation opens the live view in the operating system's default browser.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
It does not replace Codex, control tasks or agents, run a hosted service, send telemetry, or keep a persistent event history.
|
|
8
8
|
|
|
9
9
|
## Quick start
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Universal Plugins Directory search installation is not available yet, so use a regular terminal for the **initial installation only**:
|
|
11
|
+
Version `0.5.2` is the current public-release target. Install it from a regular terminal:
|
|
14
12
|
|
|
15
13
|
```bash
|
|
16
|
-
npm install --global codex-agent-view@0.5.
|
|
14
|
+
npm install --global codex-agent-view@0.5.2
|
|
17
15
|
codex-agent-view install
|
|
18
16
|
```
|
|
19
17
|
|
|
20
|
-
The first command installs the npm package. The second explicitly registers
|
|
21
|
-
|
|
22
|
-
After installation:
|
|
23
|
-
|
|
24
|
-
1. If the Codex app was open during installation, quit it completely and reopen it.
|
|
25
|
-
2. In the Codex app's **Plugins** screen, confirm that `Codex Agent View` is installed and enabled.
|
|
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
|
-
4. After enablement and hook review, create a **new task** in the Codex app. Events that occurred before installation are not replayed.
|
|
28
|
-
5. Select the plugin card's **Quick start** action, or select `@codex-agent-view` in a Codex app task and send it. The current source starts or reuses the local monitor and opens an authenticated view in the operating system's default browser.
|
|
29
|
-
6. Keep that browser tab open while monitoring. If you close it, invoke `@codex-agent-view` again; there is no separate skill to select and no localhost address to copy.
|
|
30
|
-
|
|
31
|
-
The bundle keeps one internal skill because that is the Codex plugin execution capability, but it is an implementation detail rather than a second user action. Users do not open a skill picker or type `$show-agents`. The plugin invocation launches the default browser itself after preparing a least-privilege local URL. Routine use requires neither a terminal command nor manual localhost URL management.
|
|
32
|
-
|
|
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`. The current launch capability runs `codex-agent-view open` exactly once; that command prepares or reuses the owned monitor, obtains a bounded viewer grant, and asks the operating system to open the authenticated local view in the default browser. Before sending the runtime bearer, the command verifies a fresh nonce/HMAC ownership proof from the exact owned monitor. It then obtains a one-time, 60-second bootstrap grant signed by that process's runtime token. Only that bounded grant enters the URL fragment: the installation-owned viewer credential and runtime/control token do not. Every request uses the exact `127.0.0.1:<port>` authority and origin-form target. No cookie, CORS access, or user-managed localhost URL is involved.
|
|
34
|
-
|
|
35
|
-
The public Codex plugin API does not provide reliable automatic creation of an app sidebar, panel, or in-app Browser tab. The current source therefore uses the default external browser as the stable display surface. The bootstrap fixes one signed 30-minute credential-family expiry that access, recovery, and refresh can never extend. Fifteen-minute access credentials refresh automatically only inside that family, so the same tab remains connected until the family ends. Recovery is tab-scoped `sessionStorage`, not `localStorage`. A previously authenticated tab can therefore use **Reconnect** after a transient page-level failure. A new tab with no credential, or a tab whose family expired, cannot safely mint access; invoke `@codex-agent-view` again to open a newly authenticated view. The invoking task's validated `CODEX_THREAD_ID` remains signed into the family. A bootstrap is one-use within its issuing process and becomes invalid immediately when that monitor restarts; a family already exchanged under the persistent viewer signing key can reconnect on the same origin until its original absolute expiry.
|
|
36
|
-
|
|
37
|
-
The live UI defaults to English and offers **English**, **Korean**, and **Spanish** in its language selector. Activity remains visible rather than hidden behind refresh-sensitive disclosure toggles, and the two-second polling interval is unchanged. Each work item can show its first valid short request summary derived from `UserPromptSubmit`: the sender inspects at most 4,096 characters, redacts common credentials, email addresses, links, and absolute paths, collapses the result to one line, bounds it to 180 characters, and immediately discards the full request. Later follow-ups do not replace that first valid summary. Verified `SubagentStart` payloads still provide only `agent_id` and `agent_type`; they do not provide a dedicated assignment description. The monitor therefore shows the work-level request summary but does not invent an agent-specific assignment from prompts or tool input.
|
|
38
|
-
|
|
39
|
-
In short: install once in a terminal, invoke `@codex-agent-view` in Codex, and monitor in the browser tab it opens.
|
|
40
|
-
|
|
41
|
-
## Status
|
|
42
|
-
|
|
43
|
-
Current source is the unpublished `0.5.1` ambient-wrapper removal patch candidate. It preserves the public `0.5.0` launch and authentication design: one `@codex-agent-view` invocation runs the bundle's internal capability, prepares the view, and opens the default browser; the user-facing `$show-agents` picker and app panel are not part of the workflow. After bounding inspection to the original prompt's first 4,096 characters, the patch removes a closed exact leading `in-app-browser-context` block before redaction so ambient UI state is not presented as the user's requested work. Publication, tag, GitHub Release, public-artifact verification, and an official fixed E2E for `0.5.1` are still pending.
|
|
44
|
-
|
|
45
|
-
Historical public `0.5.0` evidence: npm `latest` is `0.5.0`. The signed 23-file registry artifact has shasum `bf89ee665840e62d502551d87d7faaed2a1e0206`, integrity `sha512-W8rOv+0Xb5SVsFl/kXHF/vt9CJ/Su0rwDWVFWLWYWhKidZTxx+ea9Z0dtd65k3KBxucLRuwMOUJL3BtHr2p2Dw==`, and SHA-256 `e23c4ea484fa6186c17f2c564b5019a08eb6acca10f99fc85bf95e2f2757bc2c`. Main CI `30816426733` passed on Node.js 18, 20, and 22. This machine was reinstalled from public exact `0.5.0`; the CLI/plugin version matched, all nine hooks were wired, and `events_received: true`. The official app delivered an actual subagent start/stop pair with final status `stopped`. That E2E also exposed automatic `in-app-browser-context` text in the task summary, which is the bounded defect addressed by `0.5.1`. No `v0.5.0` tag or GitHub Release has been created yet.
|
|
46
|
-
|
|
47
|
-
Historical public `0.4.8` evidence: `npm run check` passed all 153 tests plus plugin validation and package dry-run. npm `latest` was `0.4.8` at release time; the signed 25-file registry artifact, exact global installation, enabled plugin `0.4.8`, all nine hooks, healthy doctor result, main/tag CI, annotated tag, and public GitHub Release were verified. The official Codex app delivered an actual new subagent start/stop pair with ordered timestamps and final stopped status. Its historical in-app Browser flow also verified grant authentication, fragment removal, same-tab bare-root recovery, and no recovery button in a new tab. That release evidence does not validate the current `0.5.1` patch candidate.
|
|
48
|
-
|
|
49
|
-
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.
|
|
50
|
-
|
|
51
|
-
`0.2.1` adds `SessionStart`, `SessionEnd`, `UserPromptSubmit`, and `Stop` for parent-task lifecycle visibility and makes `status`, `doctor`, and the empty UI distinguish monitor health from hook delivery. In a real E2E after restarting official Codex app `26.727.40816` (`build 6067`) with plugin `0.2.1` installed and enabled, three parent sessions and three subagents appeared automatically without pre-registering task IDs. Real `SessionStart`, `UserPromptSubmit`, `Stop`, `SubagentStart`, `SubagentStop`, `PreToolUse`, `PostToolUse`, and `PermissionRequest` hooks reached the sender, loopback monitor, and UI. `SessionEnd` is wired but has not yet been observed from the real official app, so compatibility for that event is not claimed.
|
|
52
|
-
|
|
53
|
-
In the lead's `0.3.0` E2E, the official app's built-in thread tools reported the active `kyurasi-next-supabase` task with workspace basename, title, description, explicit `inProgress` status, latest explicit agent commentary, and `subAgentActivity`. Immediately afterward, the list result changed to explicit `idle` with `hasUnreadTurn: true`. The skill separates this into a `Finished / needs review` display group instead of the running/active group, but does not infer completion or success from `idle + unread`. The separate hook/browser monitor also observed a real `SessionEnd`.
|
|
54
|
-
|
|
55
|
-
Maintainer npm 2FA is enabled in `auth-and-writes` mode, and `codex-agent-view@0.3.1` is a verified prior public release. npm publication remains separate from Universal Plugins Directory submission; the plugin is not directory-searchable.
|
|
56
|
-
|
|
57
|
-
Verified `0.2.0` release: npm `gitHead` and the annotated `v0.2.0` tag both resolve to commit `00b62af56698ac875e39c7d1386905c157c3a7e8`; the registry SRI/signature and all 21 package files against the tagged source were verified. [GitHub Release v0.2.0](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.2.0) is public. A separate npm provenance attestation is optional and was not published for this release.
|
|
58
|
-
|
|
59
|
-
Public `0.2.1` patch: registry `latest`, version, `Apache-2.0` license, executable mapping, 21 package files, unpacked size `144644`, npm `gitHead` `8d6a67c9aafa23f801235d747ff018d254378970`, shasum, exact SRI, and registry signature were verified. The annotated `v0.2.1` tag was created at and pushed for that same commit, and [GitHub Release v0.2.1](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.2.1) is public. A clean-cache exact-version `npx --version` passed, and all 21 registry-tarball files are byte-identical to the tagged source. This machine's global install and copied marketplace are also byte-identical to those 21 registry files; CLI `0.2.1`, installed/enabled plugin state, all nine hook declarations, automatic live reception, and a probe subagent's running → stopped/UI completion transition were verified.
|
|
60
|
-
|
|
61
|
-
Public `0.3.0`: npm `latest`/version at release time, `gitHead` `988132d0b525ee5e63f13a0d924810dd3f1bd93a`, shasum `08e2e5fa8c1133a1dcc3faae8f354535f9fc07b0`, exact SRI, registry signature, 21 files, and an unpacked size of `158.8 kB` were verified. The annotated `v0.3.0` tag was pushed and [GitHub Release v0.3.0](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.3.0) is public. This machine was globally reinstalled from exact public `0.3.0`; the plugin is installed/enabled with all nine hooks wired. Registry-to-global artifact diff is zero, and the copied marketplace matches aside from one ownership marker. The public install monitor received real hooks, `workspace_label: codex-agent-view`, `PermissionRequest`, tool lifecycle events, and a probe subagent's running → stopped transition with `has_out_of_order_events: false`.
|
|
62
|
-
|
|
63
|
-
Public `0.3.1`: npm version/`latest` at release time `0.3.1`, `gitHead` `c515ea28be201dc24d31e13bf465a38145050b69`, shasum `4405b183012c04e7b0bc265d4eb14bf85291dcd9`, integrity `sha512-8oF5uHqZobgPt75I2ymoq3/tx4Ab1YX/cvMPjaJHjV7zxVC5Dh318isoCdsKNi6emXEbiTIdxOgX7GcclyuP8A==`, and 21 files were verified. The annotated `v0.3.1` tag and [GitHub Release v0.3.1](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.3.1) are public. Exact `0.3.1` was reinstalled on this machine, with plugin `installed: true` and `enabled: true`. Public exact `0.3.1` app-only E2E is not claimed.
|
|
64
|
-
|
|
65
|
-
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.
|
|
66
|
-
|
|
67
|
-
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.
|
|
68
|
-
|
|
69
|
-
Known `0.4.0` issue: manifest `defaultPrompt: ["Show Agents"]` created a plain plugin-level text starter. That text did not 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` replaced it with the instructional starter `Open @ and select the bundled Show Agents skill.`, but that starter was still guidance rather than invocation. Public `0.4.8` later required explicit skill selection. The unreleased current source instead gives the plugin one internal launch capability and removes the user-facing skill-picker step. Public registry and exact app E2E evidence for each release are claimed only where separately verified and recorded.
|
|
70
|
-
|
|
71
|
-
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.
|
|
72
|
-
|
|
73
|
-
Public `0.4.2` changed the plugin starter text to `$show-agents` and intended it as an in-app reopen shortcut. Real app use later showed that this plugin-card starter could remain plain text rather than dispatching the bundled skill; this paragraph no longer claims otherwise. Release commits `b4d923a` and `3d8f46d` were pushed, main CI run `30712375726` passed on Node.js 18/20/22, and npm publication was verified with `latest: 0.4.2`, Apache-2.0 licensing, the expected executable mapping, 25 files, registry signature, shasum `fac95689395baa26f4ad9ff0cbefd0017d2ebd8d`, and integrity `sha512-FRTPoYxjBuPC6Usb+ylSfZsZVJKlKcHnQPaAPljekg0maTPn9POsBkS+auOcHz5jspg0AXcP8R63PM0WfCn2LQ==`. The release and registry tarballs are byte-identical; annotated tag `v0.4.2` and [GitHub Release v0.4.2](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.4.2) are public. This machine's exact global install, plugin installed/enabled state, all nine hook declarations, installed artifact match, and official Codex in-app Browser visual E2E were also verified.
|
|
74
|
-
|
|
75
|
-
Public `0.4.3` preserves that app-only workflow and adds restart-safe live-view authentication. A user-only private viewer credential is separate from the runtime/control token and persists for the installed plugin's lifetime. The viewer credential can read `/api/state` but cannot ingest hook events or request shutdown; the runtime/control token rotates with the monitor process. Installing `0.4.3` over `0.4.2` seeds a missing viewer credential from the valid legacy runtime token without printing it, so an already-open Codex live tab can reconnect after the backend restarts on the same loopback origin. This credential continuity does not persist task state: restart still begins an empty bounded in-memory observation window.
|
|
76
|
-
|
|
77
|
-
Release commits `a7d938c` and `e2b0543` were pushed, and main CI run `30713618590` passed on Node.js 18/20/22. npm `latest`/version `0.4.3`, Apache-2.0 licensing, 25 files, registry signature, shasum `2dee6bb0ae8c7b4bf505b72cf10d9ec42d5afbc7`, and integrity `sha512-E0Ljs2nDuBBme9UTu66kaW66eCp8mW7BfunLaK5y3u0CVCSjRtCfC9MAJjQA91yQYpeZ1Wj2sKy7d2CW04ZOPw==` were verified. The local release and registry tarballs are byte-identical. This machine's exact global `0.4.3` install, installed/enabled plugin, copied artifact match, all nine hooks, and `doctor` event observation were verified. In the official Codex in-app Browser migration E2E, an open `0.4.2` legacy tab stayed in retrying state without an authentication error during shutdown, then reconnected to the hook-auto-started `0.4.3` monitor and rendered the workspace and agent. Annotated tag `v0.4.3` points to `dea9f39890387ed509cfa0bb511c8167abe11148`; [GitHub Release v0.4.3](https://github.com/JunhoYoon95/codex-agent-view/releases/tag/v0.4.3) is public, non-draft, and non-prerelease. Final main docs CI run `30714110050` and tag CI run `30714144940` succeeded.
|
|
78
|
-
|
|
79
|
-
## Boundaries
|
|
80
|
-
|
|
81
|
-
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.
|
|
82
|
-
|
|
83
|
-
- Historical releases offered a separate app-native current-task snapshot that prioritized explicit status and `subAgentActivity` from the official Codex app's built-in thread tools. The current source consolidates user entry into the hook-backed browser monitor.
|
|
84
|
-
- Hooks remain the source of truth for detailed lifecycle state in the trusted-hook auto-prepared local live backend. Its operational state exists only in bounded process memory; restart begins a new observation window. The separate private viewer credential is authentication metadata, not stored task history.
|
|
85
|
-
- `Stop` marks the observed root turn and the session/work-item summary `completed` immediately. If a child agent or tool was still active, its own row is separately marked `completion_not_observed` because no child stop/tool completion signal was observed. `SessionEnd` has terminal priority; any child agent, tool, or permission still open at that point is shown as `interrupted`, not silently completed.
|
|
86
|
-
- Official `SessionEnd` delivery may be delayed by up to 30 minutes. If no ending hook is observed while activity still appears open, five minutes without a new event changes it to `completion_not_observed` (**End not confirmed**), never inferred `completed`. This keeps a delayed or missing terminal event from turning stale activity into a false success.
|
|
87
|
-
- The installation-owned viewer credential remains private to local runtime files for ownership/legacy boundaries. The runtime/control token remains separate and process-scoped. The normal live-view URL contains neither credential; it contains only a one-use, process-signed 60-second bootstrap grant.
|
|
88
|
-
- 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.
|
|
89
|
-
- There is no external telemetry, remote server, account, required SQLite/persistent event store, or remote control.
|
|
90
|
-
- Full prompt text, transcript paths, full tool input/output, and assistant messages are not retained or displayed by the monitor. Only the bounded, redacted one-line work summary described above may be retained in process memory.
|
|
91
|
-
- The default monitor sorts active work and participating agents first, uses human-readable labels and statuses as the primary presentation, and keeps raw IDs and event names out of the primary reading path. Session IDs are not shown in the live cards.
|
|
92
|
-
- The product cannot stop or restart tasks/subagents, send messages, or approve/deny permissions.
|
|
93
|
-
- Missing, duplicated, or out-of-order events remain visible as empty, unknown, or degraded state instead of being guessed away.
|
|
94
|
-
- The sender keeps its bounded retry and fail-open behavior. It has no disk-backed queue or persistent replay; an event that cannot be delivered within the hook budget is not replayed later.
|
|
95
|
-
|
|
96
|
-
A separately launched Codex `0.146` App Server `thread/list` fallback was also tested. It reported both the current root and subagents as `notLoaded`, so it did not share the official app's live running/completed state. That separate process is not the same as the built-in thread tools exposed directly by the official app; historical `0.3.0` used the latter for its primary snapshot.
|
|
97
|
-
|
|
98
|
-
## The roles of npm, the local browser view, and the Plugins Directory
|
|
99
|
-
|
|
100
|
-
- The current-source plugin card's **Quick start** action launches the same single-purpose flow as sending `@codex-agent-view`: prepare or reuse the local monitor, then open the authenticated view in the default browser. No user-facing skill picker, monitor command, or task-ID registration is required.
|
|
101
|
-
- npm is the initial installation path that distributes the plugin bundle, its internal hook sender/runtime, and static UI to the user's machine.
|
|
102
|
-
- The live view is a local-only page in the operating system's default browser, not a hosted website or telemetry dashboard. The plugin opens it; users do not copy its private localhost URL.
|
|
103
|
-
- The public plugin API cannot reliably create a sidebar, panel, or in-app Browser tab for this flow. A previously authenticated browser tab can reconnect after a transient failure within its fixed credential-family lifetime. A closed tab, a new tab with no credential, or an expired family is reopened safely by invoking `@codex-agent-view` again.
|
|
104
|
-
- 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.
|
|
105
|
-
|
|
106
|
-
## Use from the official Codex app — recommended
|
|
107
|
-
|
|
108
|
-
Use this flow in a **new task** after completing installation and enablement in the quick start. Codex initiates the action; the monitor itself stays open in the operating system's default browser.
|
|
109
|
-
|
|
110
|
-
1. Select **Quick start** on the Codex Agent View plugin card, or select `@codex-agent-view` in a Codex app task and send it.
|
|
111
|
-
2. The plugin's single internal execution capability reuses the backend prepared by trusted hooks, or prepares it when absent, then opens the authenticated live view in the default browser. There is no separate `$show-agents` selection.
|
|
112
|
-
3. The page excludes this invoking viewer task using `CODEX_THREAD_ID`, puts the remaining active work and participating agents first, and uses human-readable project, request-summary, agent, and status text. Session IDs are not shown. The full request, previews, tool input/output, and full workspace paths remain hidden.
|
|
113
|
-
4. Choose **English**, **Korean**, or **Spanish** from the language selector. English is the default, and changing language does not stop the two-second refresh.
|
|
114
|
-
5. Leave the browser tab open while monitoring. If the operating system cannot open the browser, the plugin reports the failure without printing the private authenticated localhost URL.
|
|
115
|
-
|
|
116
|
-
If you close the browser tab, invoke `@codex-agent-view` again. During its fixed 30-minute family, the same tab keeps recovery only in `sessionStorage`, refreshes 15-minute access automatically, and offers **Reconnect** after a transient page-level failure. A different or never-authenticated tab has no recovery credential, and family expiry invalidates recovery; in either case, invoke `@codex-agent-view` again. No terminal command, private URL copy, cookie, or CORS access is part of recovery. A restarted monitor presents a new in-memory observation window; an unused bootstrap issued by the old process is immediately invalid.
|
|
117
|
-
|
|
118
|
-
## Requirements and tested versions
|
|
119
|
-
|
|
120
|
-
- Node.js `>=18`
|
|
121
|
-
- npm
|
|
122
|
-
- A Codex app or CLI build with plugin commands
|
|
123
|
-
|
|
124
|
-
| Runtime | Tested version | Scope |
|
|
125
|
-
| --- | --- | --- |
|
|
126
|
-
| Official Codex app | `26.727.40816` (`build 6067`) | Public `0.3.0` confirmed app-native task snapshots, real `SessionEnd`, workspace labeling, permission/tool lifecycle, and subagent running → stopped |
|
|
127
|
-
| App-embedded Codex | `0.146.0-alpha.9.2` | isolated install/runtime and lifecycle probe |
|
|
128
|
-
| Homebrew Codex CLI | `0.146.0` | isolated install/runtime probe |
|
|
129
|
-
|
|
130
|
-
These versions are a test matrix, not a minimum-version guarantee.
|
|
131
|
-
|
|
132
|
-
## Validate from source
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
git clone https://github.com/JunhoYoon95/codex-agent-view.git
|
|
136
|
-
cd codex-agent-view
|
|
137
|
-
npm test
|
|
138
|
-
npm run validate:plugin
|
|
139
|
-
npm run check
|
|
140
|
-
node bin/codex-agent-view.mjs doctor --json
|
|
141
|
-
node bin/codex-agent-view.mjs install
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
There are no production dependencies; the runtime uses Node.js built-ins. `install` explicitly copies the package into a local marketplace under the runtime directory and registers `codex-agent-view@codex-agent-view`. No `postinstall` script changes Codex settings.
|
|
18
|
+
The first command installs the npm package. The second explicitly registers its bundled local Codex plugin. `npm install` alone does not modify Codex settings, and this package has no `postinstall` script that does so.
|
|
145
19
|
|
|
146
|
-
|
|
20
|
+
Then:
|
|
147
21
|
|
|
148
|
-
|
|
22
|
+
1. If Codex was open during installation, quit it completely and reopen it.
|
|
23
|
+
2. In the Codex app's **Plugins** screen, confirm that **Codex Agent View** is installed and enabled.
|
|
24
|
+
3. If Codex asks you to review hooks, inspect `hooks/hooks.json` and the `node "${PLUGIN_ROOT}/scripts/send-hook.mjs"` command before explicitly trusting the current definition. If the app does not provide hook review, use `/hooks` in the interactive Codex CLI during installation.
|
|
25
|
+
4. Create a new Codex task. Events from before installation are not replayed.
|
|
149
26
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
Only when validating the local runtime from a source checkout, a maintainer can start it without opening an operating-system browser:
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
node bin/codex-agent-view.mjs start --no-open
|
|
156
|
-
```
|
|
27
|
+
## Use
|
|
157
28
|
|
|
158
|
-
|
|
29
|
+
In a Codex app task, select and send:
|
|
159
30
|
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
node bin/codex-agent-view.mjs doctor --json
|
|
31
|
+
```text
|
|
32
|
+
@codex-agent-view
|
|
163
33
|
```
|
|
164
34
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
An empty session list means that this monitor observed no events. It does not prove that Codex has no running task. Stopping or restarting the monitor discards its in-memory state, and downtime events are not replayed.
|
|
168
|
-
|
|
169
|
-
After plugin enablement/trust and an app restart, the first trusted hook internally prepares the backend and retries that event. Newly created or resumed tasks therefore appear without pre-registering a task ID or asking the user to start a monitor. Search is only an optional filter over the automatically received list. If automatic preparation cannot complete within its bounded hook budget, delivery fails open and that event is not persisted for replay.
|
|
35
|
+
That is the whole normal-use command. The plugin prepares or reuses its local monitor and opens an authenticated live view in your operating system's default browser.
|
|
170
36
|
|
|
171
|
-
|
|
37
|
+
- Do not select a separate `$show-agents` skill.
|
|
38
|
+
- Do not start the monitor in a terminal.
|
|
39
|
+
- Do not copy or manage a localhost URL.
|
|
40
|
+
- Closing the browser tab does not stop Codex work. Invoke `@codex-agent-view` again when you want a new authenticated tab.
|
|
172
41
|
|
|
173
|
-
The
|
|
42
|
+
The public Codex plugin API does not provide a reliable automatic app sidebar or in-app panel for this workflow, so the default browser is the supported display surface.
|
|
174
43
|
|
|
175
|
-
|
|
176
|
-
npm install --global codex-agent-view@0.5.0
|
|
177
|
-
codex-agent-view install
|
|
178
|
-
```
|
|
44
|
+
## What the view shows
|
|
179
45
|
|
|
180
|
-
|
|
46
|
+
The live view defaults to English and also supports Korean and Spanish. It refreshes every two seconds without collapsing agent details.
|
|
181
47
|
|
|
182
|
-
|
|
48
|
+
Each work item can include a short, redacted request summary. Each agent card can show:
|
|
183
49
|
|
|
184
|
-
|
|
50
|
+
- **Assigned work** — a bounded summary is shown only when one verified spawn candidate can be correlated unambiguously with one newly observed agent. In the currently observed official-app payload, the protected spawn message is opaque, so a safely humanized task label is the primary usable source. Ambiguous, concurrent, expired, or protected values are not guessed or displayed.
|
|
51
|
+
- **Current activity** — a human-readable description such as a file edit in progress or a recently completed terminal action. It is shown only when the observed tool lifecycle has the exact `turn_id` of one and only one agent.
|
|
185
52
|
|
|
186
|
-
|
|
53
|
+
These fields describe observable assignment and tool lifecycle signals, not an agent's internal reasoning. The monitor does not retain or display raw spawn messages, full prompts, full tool input, or full tool output. Missing or ambiguous information remains unavailable instead of being inferred from timing.
|
|
187
54
|
|
|
188
|
-
##
|
|
55
|
+
## Reconnect and recovery
|
|
189
56
|
|
|
190
|
-
|
|
191
|
-
2. If `monitor.events_received` is `false`, do not confuse monitor connectivity with successful hook delivery.
|
|
192
|
-
3. In interactive Codex CLI `/hooks`, review and trust the exact current `send-hook.mjs` definition.
|
|
193
|
-
4. Fully quit and reopen an official app process that was running before plugin installation.
|
|
194
|
-
5. Create a new task after enablement/trust, then run a parent prompt and a subagent.
|
|
57
|
+
The opened tab refreshes its short-lived read-only access only within one fixed credential-family lifetime.
|
|
195
58
|
|
|
196
|
-
|
|
59
|
+
- For a temporary connection or access error in the same previously authenticated tab, use **Reconnect**.
|
|
60
|
+
- A new tab has no inherited credential because recovery is stored in tab-scoped `sessionStorage`, not `localStorage`.
|
|
61
|
+
- If the tab was closed, the credential family expired, or the monitor restarted before the one-use grant was exchanged, invoke `@codex-agent-view` again.
|
|
197
62
|
|
|
198
|
-
|
|
63
|
+
The private target and credentials are passed directly to the browser launcher. They are not printed for users to copy.
|
|
199
64
|
|
|
200
|
-
|
|
65
|
+
## Privacy and trust boundary
|
|
201
66
|
|
|
202
|
-
|
|
67
|
+
- The monitor binds only to IPv4 loopback (`127.0.0.1`) and has no external telemetry, hosted backend, SQLite database, or remote event store.
|
|
68
|
+
- Live operational state exists only in bounded process memory and resets when the monitor restarts.
|
|
69
|
+
- The sender minimizes hook payloads before delivery. A short task summary is locally redacted and bounded; raw prompt and tool content are not retained by the normal monitor path.
|
|
70
|
+
- The plugin is read-only. It cannot stop tasks, send messages, answer permission requests, or approve actions.
|
|
71
|
+
- Hook commands execute locally with your user account's permissions. Review and explicitly trust the exact hook definition before use.
|
|
203
72
|
|
|
204
|
-
|
|
73
|
+
See [Privacy](docs/privacy.md), [Security](SECURITY.md), and [Terms](docs/terms.md) for the complete boundaries.
|
|
205
74
|
|
|
206
75
|
## Uninstall
|
|
207
76
|
|
|
208
|
-
|
|
77
|
+
Use the explicit lifecycle command from a terminal:
|
|
209
78
|
|
|
210
79
|
```bash
|
|
211
80
|
codex-agent-view uninstall
|
|
212
81
|
```
|
|
213
82
|
|
|
214
|
-
|
|
83
|
+
It authenticates and stops only an owned Codex Agent View monitor, then removes the plugin and copied marketplace registration. If ownership cannot be verified, it fails without deleting uncertain files or stopping another loopback service.
|
|
215
84
|
|
|
216
|
-
|
|
85
|
+
To also remove only recognized owned runtime data when safe:
|
|
217
86
|
|
|
218
87
|
```bash
|
|
219
88
|
codex-agent-view uninstall --purge
|
|
220
89
|
```
|
|
221
90
|
|
|
222
|
-
`--purge`
|
|
91
|
+
`--purge` preserves unrecognized files, unrelated services, non-empty directories, and separately stored opt-in diagnostic captures. Inspect and remove any such capture by its exact path; never delete a broad Codex or home directory as a cleanup shortcut.
|
|
223
92
|
|
|
224
|
-
|
|
93
|
+
## Release and project documentation
|
|
225
94
|
|
|
226
|
-
|
|
95
|
+
The package and plugin manifest are version `0.5.2`. npm publication, registry metadata and digests, the annotated tag, GitHub Release, CI, and exact public reinstall are verified and recorded only after each step actually succeeds. npm publication is separate from submission to the Universal Plugins Directory; directory search availability is not claimed here.
|
|
227
96
|
|
|
97
|
+
- [Distribution and release evidence](docs/distribution.md)
|
|
98
|
+
- [Plugin directory submission status](docs/plugin-submission.md)
|
|
99
|
+
- [Technical findings](docs/phase-0-findings.md)
|
|
228
100
|
- [Roadmap](ROADMAP.md)
|
|
229
|
-
- [Phase 0 findings](docs/phase-0-findings.md)
|
|
230
|
-
- [Privacy](docs/privacy.md)
|
|
231
|
-
- [Terms](docs/terms.md)
|
|
232
101
|
- [Support](SUPPORT.md)
|
|
233
|
-
- [Security](SECURITY.md)
|
|
234
102
|
|
|
235
103
|
Copyright 2026 Junho Yoon. Licensed under the Apache License 2.0; see [LICENSE](LICENSE) and [NOTICE](NOTICE).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codex-agent-view",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Follow Codex work and participating agent progress in a clear, read-only live view opened from the official Codex app.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/core/index.mjs",
|
package/public/app.js
CHANGED
|
@@ -72,7 +72,7 @@ const MESSAGES = Object.freeze({
|
|
|
72
72
|
interruptedExplanation: "This activity was still open when the work ended; its own completion signal was not observed.",
|
|
73
73
|
connectingCopy: "Connecting this browser to the local Codex monitor on this device.",
|
|
74
74
|
sessionListAria: "Codex work list",
|
|
75
|
-
privacyPrompt: "This view shows only
|
|
75
|
+
privacyPrompt: "This view shows only shortened request and agent-work summaries; it never displays full requests or tool inputs.",
|
|
76
76
|
privacyLocal: "Data is read only from the local monitor on this device.",
|
|
77
77
|
timeUnknown: "Time unavailable",
|
|
78
78
|
startedUnknown: "Start time unavailable",
|
|
@@ -86,7 +86,19 @@ const MESSAGES = Object.freeze({
|
|
|
86
86
|
subagentsCount: "Participating agents · {count}",
|
|
87
87
|
subagentName: "Agent {ordinal}",
|
|
88
88
|
agentProfile: "Role/profile · {profile}",
|
|
89
|
-
agentProfileNote: "
|
|
89
|
+
agentProfileNote: "When available, each agent shows a shortened assigned-work summary and current activity.",
|
|
90
|
+
agentAssignment: "Assigned work",
|
|
91
|
+
agentAssignmentUnavailable: "No assignment detail was observed for this agent.",
|
|
92
|
+
agentCurrentActivity: "Current activity",
|
|
93
|
+
agentCurrentActivityUnavailable: "Current activity details are not available yet.",
|
|
94
|
+
agentToolRunning: "{tool} in progress",
|
|
95
|
+
agentToolRunningObserved: "{tool} in progress · observed {time}",
|
|
96
|
+
agentToolCompletedRecently: "Recent activity: {tool} completed",
|
|
97
|
+
agentToolCompletedRecentlyObserved: "Recent activity: {tool} completed · observed {time}",
|
|
98
|
+
agentWorkEnded: "Agent work ended",
|
|
99
|
+
agentLastActivityCompletionUnconfirmed: "Agent work ended, but completion of its last activity was not confirmed.",
|
|
100
|
+
agentWaitingForNextStep: "Waiting for input or the next step",
|
|
101
|
+
agentCurrentStatusUnverified: "The agent's current status could not be verified.",
|
|
90
102
|
noSubagents: "No participating agents have been observed for this work item.",
|
|
91
103
|
noRecentActivity: "No recent activity to display.",
|
|
92
104
|
technicalInfo: "Technical information",
|
|
@@ -215,7 +227,7 @@ const MESSAGES = Object.freeze({
|
|
|
215
227
|
interruptedExplanation: "전체 작업이 끝날 때 이 활동이 열린 상태였습니다. 이 활동 자체의 완료 신호는 확인되지 않았습니다.",
|
|
216
228
|
connectingCopy: "이 브라우저를 기기의 로컬 Codex 모니터에 연결하고 있습니다.",
|
|
217
229
|
sessionListAria: "Codex 작업 목록",
|
|
218
|
-
privacyPrompt: "이 화면은 짧게 줄인
|
|
230
|
+
privacyPrompt: "이 화면은 짧게 줄인 요청과 에이전트 작업 요약만 표시하며, 전체 요청이나 도구 입력은 표시하지 않습니다.",
|
|
219
231
|
privacyLocal: "데이터는 이 기기의 로컬 모니터에서만 읽습니다.",
|
|
220
232
|
timeUnknown: "시간 정보 없음",
|
|
221
233
|
startedUnknown: "시작 시간 없음",
|
|
@@ -229,7 +241,19 @@ const MESSAGES = Object.freeze({
|
|
|
229
241
|
subagentsCount: "참여 에이전트 · {count}",
|
|
230
242
|
subagentName: "에이전트 {ordinal}",
|
|
231
243
|
agentProfile: "역할/프로필 · {profile}",
|
|
232
|
-
agentProfileNote: "
|
|
244
|
+
agentProfileNote: "확인 가능한 경우 각 에이전트에 짧게 줄인 할당 작업 요약과 현재 활동을 표시합니다.",
|
|
245
|
+
agentAssignment: "할당된 작업",
|
|
246
|
+
agentAssignmentUnavailable: "이 에이전트의 할당 작업 설명을 확인하지 못했습니다.",
|
|
247
|
+
agentCurrentActivity: "현재 작업",
|
|
248
|
+
agentCurrentActivityUnavailable: "현재 작업 정보를 아직 확인할 수 없습니다.",
|
|
249
|
+
agentToolRunning: "{tool} 진행 중",
|
|
250
|
+
agentToolRunningObserved: "{tool} 진행 중 · {time} 확인",
|
|
251
|
+
agentToolCompletedRecently: "최근 활동: {tool} 완료",
|
|
252
|
+
agentToolCompletedRecentlyObserved: "최근 활동: {tool} 완료 · {time} 확인",
|
|
253
|
+
agentWorkEnded: "에이전트 작업 종료 확인됨",
|
|
254
|
+
agentLastActivityCompletionUnconfirmed: "에이전트 작업 종료는 확인됐지만 마지막 활동의 완료는 확인되지 않았습니다.",
|
|
255
|
+
agentWaitingForNextStep: "입력 또는 다음 단계를 기다리는 중",
|
|
256
|
+
agentCurrentStatusUnverified: "에이전트의 현재 상태를 확인할 수 없습니다.",
|
|
233
257
|
noSubagents: "이 작업에 참여한 에이전트가 아직 관찰되지 않았습니다.",
|
|
234
258
|
noRecentActivity: "표시할 최근 활동이 없습니다.",
|
|
235
259
|
technicalInfo: "기술 정보",
|
|
@@ -358,7 +382,7 @@ const MESSAGES = Object.freeze({
|
|
|
358
382
|
interruptedExplanation: "Esta actividad seguía abierta cuando terminó el trabajo; no se observó su propia señal de finalización.",
|
|
359
383
|
connectingCopy: "Conectando este navegador al monitor local de Codex en este dispositivo.",
|
|
360
384
|
sessionListAria: "Lista de trabajos de Codex",
|
|
361
|
-
privacyPrompt: "Esta vista solo muestra
|
|
385
|
+
privacyPrompt: "Esta vista solo muestra resúmenes abreviados de solicitudes y trabajo de agentes; nunca muestra solicitudes completas ni entradas de herramientas.",
|
|
362
386
|
privacyLocal: "Los datos se leen únicamente del monitor local de este dispositivo.",
|
|
363
387
|
timeUnknown: "Hora no disponible",
|
|
364
388
|
startedUnknown: "Hora de inicio no disponible",
|
|
@@ -372,7 +396,19 @@ const MESSAGES = Object.freeze({
|
|
|
372
396
|
subagentsCount: "Agentes participantes · {count}",
|
|
373
397
|
subagentName: "Agente {ordinal}",
|
|
374
398
|
agentProfile: "Rol/perfil · {profile}",
|
|
375
|
-
agentProfileNote: "
|
|
399
|
+
agentProfileNote: "Cuando está disponible, cada agente muestra un resumen abreviado del trabajo asignado y su actividad actual.",
|
|
400
|
+
agentAssignment: "Trabajo asignado",
|
|
401
|
+
agentAssignmentUnavailable: "No se observó información sobre el trabajo asignado de este agente.",
|
|
402
|
+
agentCurrentActivity: "Actividad actual",
|
|
403
|
+
agentCurrentActivityUnavailable: "Los detalles de la actividad actual aún no están disponibles.",
|
|
404
|
+
agentToolRunning: "{tool} en curso",
|
|
405
|
+
agentToolRunningObserved: "{tool} en curso · observado {time}",
|
|
406
|
+
agentToolCompletedRecently: "Actividad reciente: {tool} completada",
|
|
407
|
+
agentToolCompletedRecentlyObserved: "Actividad reciente: {tool} completada · observada {time}",
|
|
408
|
+
agentWorkEnded: "Fin del trabajo del agente confirmado",
|
|
409
|
+
agentLastActivityCompletionUnconfirmed: "El trabajo del agente terminó, pero no se confirmó que su última actividad se completara.",
|
|
410
|
+
agentWaitingForNextStep: "Esperando una respuesta o el siguiente paso",
|
|
411
|
+
agentCurrentStatusUnverified: "No se pudo verificar el estado actual del agente.",
|
|
376
412
|
noSubagents: "Todavía no se observaron agentes participantes en este trabajo.",
|
|
377
413
|
noRecentActivity: "No hay actividad reciente que mostrar.",
|
|
378
414
|
technicalInfo: "Información técnica",
|
|
@@ -875,6 +911,14 @@ function safeString(value, fallback) {
|
|
|
875
911
|
return typeof value === "string" && value.trim() ? value.trim() : fallback;
|
|
876
912
|
}
|
|
877
913
|
|
|
914
|
+
function safeSummary(value) {
|
|
915
|
+
return safeString(value, "")
|
|
916
|
+
.replace(CONTROL_CHARACTERS, " ")
|
|
917
|
+
.replace(/\s+/g, " ")
|
|
918
|
+
.trim()
|
|
919
|
+
.slice(0, 240);
|
|
920
|
+
}
|
|
921
|
+
|
|
878
922
|
function sanitizedFallbackLabel(value, fallback) {
|
|
879
923
|
const normalized = safeString(value, "")
|
|
880
924
|
.replace(CONTROL_CHARACTERS, " ")
|
|
@@ -932,6 +976,56 @@ function formatActivityLabel(activity) {
|
|
|
932
976
|
});
|
|
933
977
|
}
|
|
934
978
|
|
|
979
|
+
function formatAgentCurrentActivity(agent) {
|
|
980
|
+
if (agent.status === "completed") {
|
|
981
|
+
if (
|
|
982
|
+
agent.currentToolStatus === "completion_not_observed" ||
|
|
983
|
+
agent.currentToolStatus === "interrupted"
|
|
984
|
+
) {
|
|
985
|
+
return t("agentLastActivityCompletionUnconfirmed");
|
|
986
|
+
}
|
|
987
|
+
return t("agentWorkEnded");
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
const lifecycleExplanationKey = STATUS_EXPLANATION_KEYS[agent.status];
|
|
991
|
+
if (lifecycleExplanationKey) {
|
|
992
|
+
return t(lifecycleExplanationKey);
|
|
993
|
+
}
|
|
994
|
+
if (agent.status === "unknown") {
|
|
995
|
+
return t("agentCurrentStatusUnverified");
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
if (agent.currentToolName && agent.currentToolStatus === "running") {
|
|
999
|
+
const tool = formatToolLabel(agent.currentToolName);
|
|
1000
|
+
return agent.currentToolObservedAtMs === null
|
|
1001
|
+
? t("agentToolRunning", { tool })
|
|
1002
|
+
: t("agentToolRunningObserved", {
|
|
1003
|
+
tool,
|
|
1004
|
+
time: formatRelativeTime(agent.currentToolObservedAtMs),
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
if (
|
|
1009
|
+
agent.status === "running" &&
|
|
1010
|
+
agent.currentToolName &&
|
|
1011
|
+
agent.currentToolStatus === "completed"
|
|
1012
|
+
) {
|
|
1013
|
+
const tool = formatToolLabel(agent.currentToolName);
|
|
1014
|
+
return agent.currentToolObservedAtMs === null
|
|
1015
|
+
? t("agentToolCompletedRecently", { tool })
|
|
1016
|
+
: t("agentToolCompletedRecentlyObserved", {
|
|
1017
|
+
tool,
|
|
1018
|
+
time: formatRelativeTime(agent.currentToolObservedAtMs),
|
|
1019
|
+
});
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
if (agent.status === "waiting") {
|
|
1023
|
+
return t("agentWaitingForNextStep");
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
return t("agentCurrentActivityUnavailable");
|
|
1027
|
+
}
|
|
1028
|
+
|
|
935
1029
|
function safeTimestamp(value) {
|
|
936
1030
|
return Number.isFinite(value) && value >= 0 && value <= 8_640_000_000_000_000
|
|
937
1031
|
? value
|
|
@@ -969,6 +1063,10 @@ function normalizeAgent(value, index) {
|
|
|
969
1063
|
return {
|
|
970
1064
|
agentId: safeString(agent.agent_id, `unknown-agent-${index + 1}`),
|
|
971
1065
|
agentType: safeString(agent.agent_type, "unknown"),
|
|
1066
|
+
assignmentSummary: safeSummary(agent.assignment_summary),
|
|
1067
|
+
currentToolName: safeSummary(agent.current_tool_name),
|
|
1068
|
+
currentToolStatus: normalizeCoreStatus(agent.current_tool_status),
|
|
1069
|
+
currentToolObservedAtMs: safeTimestamp(agent.current_tool_observed_at_ms),
|
|
972
1070
|
status: normalizeCoreStatus(agent.status),
|
|
973
1071
|
startedAtMs: safeTimestamp(agent.started_at_ms),
|
|
974
1072
|
stoppedAtMs: safeTimestamp(agent.stopped_at_ms),
|
|
@@ -1288,10 +1386,26 @@ function createAgentItem(agent) {
|
|
|
1288
1386
|
|
|
1289
1387
|
const statusExplanation = createStatusExplanation(agent.status);
|
|
1290
1388
|
|
|
1389
|
+
const workSummary = document.createElement("dl");
|
|
1390
|
+
workSummary.className = "agent-work-summary";
|
|
1391
|
+
const summaryRows = [
|
|
1392
|
+
[t("agentAssignment"), agent.assignmentSummary || t("agentAssignmentUnavailable")],
|
|
1393
|
+
[t("agentCurrentActivity"), formatAgentCurrentActivity(agent)],
|
|
1394
|
+
];
|
|
1395
|
+
for (const [label, value] of summaryRows) {
|
|
1396
|
+
const row = document.createElement("div");
|
|
1397
|
+
const term = document.createElement("dt");
|
|
1398
|
+
term.textContent = label;
|
|
1399
|
+
const description = document.createElement("dd");
|
|
1400
|
+
description.textContent = value;
|
|
1401
|
+
row.append(term, description);
|
|
1402
|
+
workSummary.append(row);
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1291
1405
|
const technicalRows = [[t("agentId"), agent.agentId]];
|
|
1292
1406
|
technicalRows.push([t("rawProfile"), agent.agentType]);
|
|
1293
1407
|
|
|
1294
|
-
item.append(heading, metadata);
|
|
1408
|
+
item.append(heading, workSummary, metadata);
|
|
1295
1409
|
if (statusExplanation) {
|
|
1296
1410
|
item.append(statusExplanation);
|
|
1297
1411
|
}
|
|
@@ -1433,6 +1547,8 @@ function sessionMatchesQuery(session, query) {
|
|
|
1433
1547
|
...session.agents.flatMap((agent) => [
|
|
1434
1548
|
agent.agentId,
|
|
1435
1549
|
formatAgentRole(agent.agentType),
|
|
1550
|
+
agent.assignmentSummary,
|
|
1551
|
+
formatAgentCurrentActivity(agent),
|
|
1436
1552
|
agent.status,
|
|
1437
1553
|
]),
|
|
1438
1554
|
...session.recentActivities.flatMap((activity) => [
|
package/public/index.html
CHANGED
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
</main>
|
|
147
147
|
|
|
148
148
|
<footer>
|
|
149
|
-
<p data-i18n="privacyPrompt">This view shows only
|
|
149
|
+
<p data-i18n="privacyPrompt">This view shows only shortened request and agent-work summaries; it never displays full requests or tool inputs.</p>
|
|
150
150
|
<p data-i18n="privacyLocal">Data is read only from the local monitor on this device.</p>
|
|
151
151
|
</footer>
|
|
152
152
|
</div>
|
package/public/styles.css
CHANGED
|
@@ -810,6 +810,32 @@ h1 {
|
|
|
810
810
|
margin-top: var(--space-2);
|
|
811
811
|
}
|
|
812
812
|
|
|
813
|
+
.agent-work-summary {
|
|
814
|
+
display: grid;
|
|
815
|
+
margin: var(--space-3) 0 0;
|
|
816
|
+
gap: var(--space-2);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
.agent-work-summary div {
|
|
820
|
+
display: grid;
|
|
821
|
+
grid-template-columns: minmax(6.5rem, 0.28fr) minmax(0, 1fr);
|
|
822
|
+
gap: var(--space-2);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
.agent-work-summary dt {
|
|
826
|
+
color: var(--text-muted);
|
|
827
|
+
font-size: var(--text-xs);
|
|
828
|
+
font-weight: 700;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
.agent-work-summary dd {
|
|
832
|
+
min-width: 0;
|
|
833
|
+
margin: 0;
|
|
834
|
+
color: var(--text-primary);
|
|
835
|
+
font-size: var(--text-sm);
|
|
836
|
+
overflow-wrap: anywhere;
|
|
837
|
+
}
|
|
838
|
+
|
|
813
839
|
.agent-profile-note {
|
|
814
840
|
margin: calc(-1 * var(--space-2)) 0 var(--space-3);
|
|
815
841
|
color: var(--text-muted);
|
|
@@ -1019,6 +1045,11 @@ footer p {
|
|
|
1019
1045
|
align-items: flex-start;
|
|
1020
1046
|
flex-direction: column;
|
|
1021
1047
|
}
|
|
1048
|
+
|
|
1049
|
+
.agent-work-summary div {
|
|
1050
|
+
grid-template-columns: 1fr;
|
|
1051
|
+
gap: var(--space-1);
|
|
1052
|
+
}
|
|
1022
1053
|
}
|
|
1023
1054
|
|
|
1024
1055
|
@media (prefers-color-scheme: dark) {
|