agent-lookout 0.2.0 → 0.2.3
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/CHANGELOG.md +32 -0
- package/PRIVACY.md +94 -18
- package/README.md +25 -13
- package/SECURITY.md +11 -6
- package/bin/agent-lookout.mjs +49 -24
- package/dist/assets/HistoryPanel-DMnhIoFB.js +1 -0
- package/dist/assets/SessionPanel-BNm9wCzf.js +1 -0
- package/dist/assets/index-Ckda8OV4.js +2 -0
- package/dist/assets/index-DFR77qn5.css +1 -0
- package/dist/cli/agent-lookout.js +4 -4
- package/dist/cli/{chunk-UYGESSPG.js → chunk-4C34YX6S.js} +1 -1
- package/dist/cli/{chunk-XJM5RZNV.js → chunk-54ODUY75.js} +1 -1
- package/dist/cli/{chunk-PQ3B5TN6.js → chunk-GOX5UB5L.js} +4 -0
- package/dist/cli/{mcpServer-CGLIGL4X.js → mcpServer-QQFQR6DC.js} +3 -3
- package/dist/cli/{startCommand-6YPFCG3S.js → startCommand-H6O35VYR.js} +1775 -204
- package/dist/index.html +2 -2
- package/docs/API.md +181 -53
- package/docs/GUIDE.md +152 -17
- package/package.json +7 -2
- package/dist/assets/HistoryPanel-DfqfRz1u.js +0 -1
- package/dist/assets/SessionPanel-Bo6eqCwI.js +0 -1
- package/dist/assets/index-BEOekdx1.js +0 -2
- package/dist/assets/index-CtnpRdvw.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
Changes that a user of Agent Lookout would notice, newest first.
|
|
4
4
|
|
|
5
|
+
## 0.2.3 - 2026-10-06
|
|
6
|
+
|
|
7
|
+
The Mac app shows waiting sessions in the menu bar, the Overview says how long sessions waited on you today and over seven days, email and the webhook can carry what a waiting session is asking, new versions on npm come with provenance, and Node.js 22.12 is now the minimum.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- The email and the webhook post for a wait can say what the session is asking, as the dashboard does, such as `Run: npm test`. Each has its own setting, off unless you set it: `AGENT_LOOKOUT_EMAIL_ASKING=on` puts it in the email, as an `Asking:` line in the body and never in the subject, and `AGENT_LOOKOUT_WEBHOOK_ASKING=on` puts it in the post, after the reason in the line Slack shows and in a field of its own, `asking`. That line can hold a command, a web address or a file's full path, so with either on it leaves this computer. It is taken at the moment the email or post is sent, is never kept, and is never sent for a session that finished, failed or ended, and `agent-lookout mcp` still never carries it. The Email and Webhook cards in Settings say whether each one includes it.
|
|
12
|
+
- The Mac app shows in the menu bar how many sessions need you, beside its icon, with the window open or closed, and the icon alone when none do. Click it to list those sessions, the longest wait first, each with how long it has waited, its reason and what it is asking, cut to one line. Two sessions with the same name show their agent, project, branch or app in brackets. Choose one to open its details in the window, which opens if it was closed. The menu also has Open Agent Lookout, Check for Updates…, Settings… and Quit Agent Lookout. Show in menu bar, under Menu bar in Settings, takes the icon away. [Menu bar](docs/GUIDE.md#menu-bar) has the details.
|
|
13
|
+
- Each new version on npm comes with provenance: the package's page on npmjs.com shows the commit of this repository and the GitHub Actions run it was built from, and `npm audit signatures`, run where it is installed, checks it.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- Agent Lookout needs Node.js 22.12 or newer. Node.js 20 reached the end of its life on 30 April 2026 and no longer gets security fixes, so it is no longer supported. On an older Node, `npx agent-lookout` and `agent-lookout` stop at once with one line that names the version needed and the version found, and exit with 1, or with 2 for `agent-lookout status`. The Mac app needs no Node.js.
|
|
18
|
+
- The Overview has a Waits card that says how long sessions waited on you today and over the last 7 days, with a bar for each day and the five sessions that waited longest, today or over the 7 days, with how many times each waited. It is worked out on this computer from the history Agent Lookout keeps, counts only the time Agent Lookout was running, and says how much of each day and of the 7 days that was. With `AGENT_LOOKOUT_HISTORY=off` it covers only the time since Agent Lookout started, and says so. `GET /api/waits` gives the same totals to a program on this computer.
|
|
19
|
+
|
|
20
|
+
## 0.2.2 - 2026-10-06
|
|
21
|
+
|
|
22
|
+
History now survives a restart. The Mac app offers this version as its first update.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- The Events log and the charts are kept on this computer, in `~/.agent-lookout/history`, so they are still there after Agent Lookout restarts, with the time it was not running shown as not measured and a Watching resumed row for each restart. A session that changed status or ended while it was stopped is recorded at the first poll after it starts again. They are kept for 8 days and up to 20 MB, and hold no folder path, prompt or anything a waiting session is asking. The History card in Settings says where they are, how much they hold and since when, and Clear history deletes them, after asking. `AGENT_LOOKOUT_HISTORY_DIR` keeps them in another folder, and `AGENT_LOOKOUT_HISTORY=off` keeps them in memory only, as before.
|
|
27
|
+
|
|
28
|
+
## 0.2.1 - 2026-10-06
|
|
29
|
+
|
|
30
|
+
The first version with a Mac app to download: its [release on GitHub](https://github.com/Olanetsoft/agent-lookout/releases/tag/v0.2.1) has a disk image for Apple silicon and one for Intel.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- A Mac app for Apple silicon and for Intel, to download from the release or build from the repository with `npm run dist:mac`. It shows the dashboard in its own window, runs Agent Lookout inside itself with no port opened, keeps running in the Dock when the window is closed, shows on its Dock icon how many sessions need you, and shows notifications under its own name. It is not signed yet, so macOS asks once before it first opens: [Desktop app](docs/GUIDE.md#desktop-app) has the steps.
|
|
35
|
+
- The Mac app can update itself from the project's releases on GitHub. About once a day while it runs, it asks GitHub whether a newer version is out, sending nothing about your sessions, and a switch under Updates in Settings turns that off. Check for Updates…, in the Agent Lookout menu and in Settings, checks at once. A newer version is downloaded and checked against the size and SHA-512 its release gives, and installed only when you press Install and Restart, which quits the app and opens the new version. It updates itself from Applications or any folder it can change, and run from its disk image, another disk or a read-only copy it says how to move it instead. The npm package and the repository never check. [Updates](docs/GUIDE.md#updates) has the details.
|
|
36
|
+
|
|
5
37
|
## 0.2.0 - 2026-10-06
|
|
6
38
|
|
|
7
39
|
The first version on npm. It shows Claude Code and Codex sessions, and those of any agent that writes a status file. The one thing it changes on the machine is which tmux pane, or which tab of Terminal or iTerm2, is in front, when you press Jump.
|
package/PRIVACY.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Privacy
|
|
2
2
|
|
|
3
|
-
Agent Lookout runs on your machine and reads a small amount of metadata about your Claude Code and Codex sessions, and about the sessions of any agent that writes a status file for Agent Lookout to read, and which git branch each session's folder has checked out. By default Agent Lookout itself sends nothing anywhere. Email notifications are off unless you set them up. Once you do, it sends a short email when a session has waited, and, if you choose, when one finishes, fails or ends, through the mail server you name, to the address you name, and nothing else. [Email](#email) says what one holds. Webhook posts are off unless you set an address for them. Once you do, it sends the same notices as short JSON posts to that one address, such as a Slack channel's incoming webhook, and nowhere else. [Webhook](#webhook) says what one holds. It does run Claude Code's own listing command, which may contact Anthropic the way Claude Code normally does. Its MCP server, `agent-lookout mcp`, runs only once you add it to an agent's app, and answers that app and nothing else. That app may pass what it learns to its model: [The MCP server](#the-mcp-server) says what an answer holds.
|
|
3
|
+
Agent Lookout runs on your machine and reads a small amount of metadata about your Claude Code and Codex sessions, and about the sessions of any agent that writes a status file for Agent Lookout to read, and which git branch each session's folder has checked out. By default Agent Lookout itself sends nothing anywhere. Email notifications are off unless you set them up. Once you do, it sends a short email when a session has waited, and, if you choose, when one finishes, fails or ends, through the mail server you name, to the address you name, and nothing else. [Email](#email) says what one holds. Webhook posts are off unless you set an address for them. Once you do, it sends the same notices as short JSON posts to that one address, such as a Slack channel's incoming webhook, and nowhere else. [Webhook](#webhook) says what one holds. The Mac app, and only the Mac app, asks GitHub about once a day whether a newer version of it has been released, unless you turn that off in Settings. It sends nothing about your sessions: [Updates (Mac app only)](#updates-mac-app-only) says what it sends. The npm package, `npx agent-lookout` and the repository never check for anything. It does run Claude Code's own listing command, which may contact Anthropic the way Claude Code normally does. Its MCP server, `agent-lookout mcp`, runs only once you add it to an agent's app, and answers that app and nothing else. That app may pass what it learns to its model: [The MCP server](#the-mcp-server) says what an answer holds.
|
|
4
4
|
|
|
5
|
-
For a Claude Code session that is waiting for you, Agent Lookout reads the last message of its transcript, to show what the session is asking, such as the command it wants to run or the question it put to you. It reads nothing of a transcript while the session is not waiting, keeps nothing of it once the wait ends
|
|
5
|
+
For a Claude Code session that is waiting for you, Agent Lookout reads the last message of its transcript, to show what the session is asking, such as the command it wants to run or the question it put to you. It reads nothing of a transcript while the session is not waiting, and keeps nothing of it once the wait ends. It sends that line off the machine only if you turn it on for email, with `AGENT_LOOKOUT_EMAIL_ASKING=on`, or for the webhook, with `AGENT_LOOKOUT_WEBHOOK_ASKING=on`, and then only in the email or post for that wait. No answer of `agent-lookout mcp` holds it. [Claude Code's transcripts](#claude-codes-transcripts) says exactly what is read, and `AGENT_LOOKOUT_WAITING_TEXT=off` turns it off.
|
|
6
6
|
|
|
7
7
|
For Codex, Agent Lookout opens Codex's session files, which hold the whole conversation. It reads them to find when each turn started and ended, and keeps only that and the few fields listed below. It keeps no prompt, reply, command or output.
|
|
8
8
|
|
|
@@ -29,7 +29,7 @@ From those bytes it takes the last tool the session asked to use that has no ans
|
|
|
29
29
|
|
|
30
30
|
Everything else in those bytes, which can include your prompts, the agent's replies, the code it wrote and the output of tools, is dropped as soon as the line is made. When nothing in the end of the file fits, there is no line, and nothing is guessed.
|
|
31
31
|
|
|
32
|
-
That line is shown in the Needs you panel and in the session's details, is put in the notification of that wait that the dashboard page or the server shows on this machine, and is in the session list the API serves on this computer. It is kept in memory beside the place of the file and its size and modified time, only while the session waits, and is forgotten on the first poll after the wait ends. It is not written to disk, not kept in the event log or the history, and not put in an email
|
|
32
|
+
That line is shown in the Needs you panel and in the session's details, is put in the notification of that wait that the dashboard page or the server shows on this machine, in the Mac app is in the menu that its icon in the menu bar opens, and is in the session list the API serves on this computer. It is kept in memory beside the place of the file and its size and modified time, only while the session waits, and is forgotten on the first poll after the wait ends. It is not written to disk, not kept in the event log or the history, and not put in an answer of `agent-lookout mcp`. It is put in an email or a webhook post only when you turn that on, as [Email](#email) and [Webhook](#webhook) say. Set `AGENT_LOOKOUT_WAITING_TEXT=off` and no transcript is opened at all, so there is no line to send either.
|
|
33
33
|
|
|
34
34
|
### `claude agents --json --all`
|
|
35
35
|
|
|
@@ -149,7 +149,7 @@ Only when you start it with `agent-lookout --open`, Agent Lookout runs `/usr/bin
|
|
|
149
149
|
|
|
150
150
|
### Settings
|
|
151
151
|
|
|
152
|
-
It reads twenty settings from the environment: `AGENT_LOOKOUT_CLAUDE_HOME`, `AGENT_LOOKOUT_CLAUDE_BIN`, `AGENT_LOOKOUT_CLAUDE_FEED`, `AGENT_LOOKOUT_WAITING_TEXT`, `AGENT_LOOKOUT_CODEX_HOME`, `AGENT_LOOKOUT_STATUS_DIR`, `AGENT_LOOKOUT_NOTIFICATIONS`, `AGENT_LOOKOUT_TMUX`, `AGENT_LOOKOUT_TERMINAL_JUMP`, `AGENT_LOOKOUT_PORT`, `AGENT_LOOKOUT_HOST`, Codex's own `CODEX_HOME`, the
|
|
152
|
+
It reads twenty-four settings from the environment: `AGENT_LOOKOUT_CLAUDE_HOME`, `AGENT_LOOKOUT_CLAUDE_BIN`, `AGENT_LOOKOUT_CLAUDE_FEED`, `AGENT_LOOKOUT_WAITING_TEXT`, `AGENT_LOOKOUT_CODEX_HOME`, `AGENT_LOOKOUT_STATUS_DIR`, `AGENT_LOOKOUT_HISTORY`, `AGENT_LOOKOUT_HISTORY_DIR`, `AGENT_LOOKOUT_NOTIFICATIONS`, `AGENT_LOOKOUT_TMUX`, `AGENT_LOOKOUT_TERMINAL_JUMP`, `AGENT_LOOKOUT_PORT`, `AGENT_LOOKOUT_HOST`, Codex's own `CODEX_HOME`, the six email settings, `AGENT_LOOKOUT_EMAIL_TO`, `AGENT_LOOKOUT_SMTP_URL`, `AGENT_LOOKOUT_EMAIL_FROM`, `AGENT_LOOKOUT_EMAIL_AFTER`, `AGENT_LOOKOUT_EMAIL_EVENTS` and `AGENT_LOOKOUT_EMAIL_ASKING`, and the four webhook settings, `AGENT_LOOKOUT_WEBHOOK_URL`, `AGENT_LOOKOUT_WEBHOOK_EVENTS`, `AGENT_LOOKOUT_WEBHOOK_AFTER` and `AGENT_LOOKOUT_WEBHOOK_ASKING`. The `agent-lookout` command reads one more, `AGENT_LOOKOUT_URL`, the address of the Agent Lookout to ask, and `agent-lookout status` reads tmux's own `TMUX`, only to tell whether tmux is running it. `AGENT_LOOKOUT_CLAUDE_HOME` replaces `~/.claude` in everything above. [Email](#email) says how the email settings are kept, and [Webhook](#webhook) how the webhook's are. The [guide](docs/GUIDE.md#settings-you-can-change) says what each setting does.
|
|
153
153
|
|
|
154
154
|
## What it never reads
|
|
155
155
|
|
|
@@ -160,11 +160,11 @@ It reads twenty settings from the environment: `AGENT_LOOKOUT_CLAUDE_HOME`, `AGE
|
|
|
160
160
|
- In a git repository, anything but the `.git` file, `HEAD` and a worktree's `commondir` described under [Git repositories](#git-repositories).
|
|
161
161
|
- The files of any other application.
|
|
162
162
|
|
|
163
|
-
It runs no program but the `claude` binary, `ps`, `tmux`, on macOS `osascript`, to show a notification and to bring a tab of Terminal or iTerm2 forward, and, only for `--open`, `open` or `xdg-open`. It runs no git command. It never writes to `~/.claude`, to the Codex folder, to the folder of status files, to any git repository or to any agent tool's files, and it never sends input to a session. It never makes, renames or deletes a status file. The one thing it changes outside itself is which tmux pane, window and session are selected, or which tab of Terminal or iTerm2 is in front, and only when you press Jump.
|
|
163
|
+
It runs no program but the `claude` binary, `ps`, `tmux`, on macOS `osascript`, to show a notification and to bring a tab of Terminal or iTerm2 forward, and, only for `--open`, `open` or `xdg-open`. The Mac app also runs `ditto` and `plutil` to unpack and check a newer version of itself, and, only when you press Install and Restart, a short `sh` script that puts it in place, as [Updates (Mac app only)](#updates-mac-app-only) describes. It runs no git command. It never writes to `~/.claude`, to the Codex folder, to the folder of status files, to any git repository or to any agent tool's files, and it never sends input to a session. It never makes, renames or deletes a status file. The one thing it changes outside itself is which tmux pane, window and session are selected, or which tab of Terminal or iTerm2 is in front, and only when you press Jump.
|
|
164
164
|
|
|
165
165
|
## Network
|
|
166
166
|
|
|
167
|
-
With email and the webhook off, which is the default, the only network traffic Agent Lookout's own code makes is between its own server and the dashboard in your browser, or the `agent-lookout status` and `agent-lookout mcp` commands, on the same machine. With email set up, it also connects to the mail server you named, once for each email, as [Email](#email) describes. With a webhook address set, it also connects to that address, once for each post, as [Webhook](#webhook) describes. One more connection never leaves the machine either: before `npm start` or `agent-lookout` begins listening, it connects once to its own address and port to see whether another program already answers there, and sends nothing over that connection. There is no telemetry, no analytics, no crash reporting and no update check,
|
|
167
|
+
With email and the webhook off, which is the default, the only network traffic Agent Lookout's own code makes is between its own server and the dashboard in your browser, or the `agent-lookout status` and `agent-lookout mcp` commands, on the same machine. With email set up, it also connects to the mail server you named, once for each email, as [Email](#email) describes. With a webhook address set, it also connects to that address, once for each post, as [Webhook](#webhook) describes. One more connection never leaves the machine either: before `npm start` or `agent-lookout` begins listening, it connects once to its own address and port to see whether another program already answers there, and sends nothing over that connection. There is no telemetry, no analytics, no crash reporting and no account. There is no update check either, except in the Mac app, which asks GitHub about once a day whether a newer version of it is out, as [Updates (Mac app only)](#updates-mac-app-only) describes. Fonts and scripts are bundled, so the page loads nothing from the internet.
|
|
168
168
|
|
|
169
169
|
Started with `npx agent-lookout`, npm itself contacts its registry: to download the package the first time, and each time after to ask whether a newer version is out, as it does for any package it runs. That is npm's own traffic, not Agent Lookout's. Installed with `npm install -g agent-lookout` and started as `agent-lookout`, npm is not involved.
|
|
170
170
|
|
|
@@ -174,11 +174,11 @@ The `claude agents` command is Claude Code's own program, and it may contact Ant
|
|
|
174
174
|
|
|
175
175
|
The API refuses any request whose `Host` header is not `localhost`, `127.0.0.1` or `[::1]`, any request whose `Origin` header names another site, and any request the browser marks as cross-site. It sends no CORS headers. Together these stop a website you visit from reading your session names and paths through your browser.
|
|
176
176
|
|
|
177
|
-
Each request the dashboard makes carries one header of Agent Lookout's own, `X-Agent-Lookout-Notifications`, which says which events that page has notifications on for: `off`, `on`, which means a session starting to wait, or `on; events=` followed by the names of the events, such as `on; events=needs-you,finished`. It holds nothing else. It goes to Agent Lookout's own server and nowhere else. [Notifications](#notifications) says what the server does with it. The request the Jump button sends for a session in tmux, Terminal or iTerm2 carries one more, `X-Agent-Lookout-Action: jump`, which names what is asked for.
|
|
177
|
+
Each request the dashboard makes carries one header of Agent Lookout's own, `X-Agent-Lookout-Notifications`, which says which events that page has notifications on for: `off`, `on`, which means a session starting to wait, or `on; events=` followed by the names of the events, such as `on; events=needs-you,finished`. It holds nothing else. It goes to Agent Lookout's own server and nowhere else. [Notifications](#notifications) says what the server does with it. The request the Jump button sends for a session in tmux, Terminal or iTerm2 carries one more, `X-Agent-Lookout-Action: jump`, which names what is asked for, and the request the Clear history button in Settings sends carries `X-Agent-Lookout-Action: clear-history`, with an empty body.
|
|
178
178
|
|
|
179
|
-
The local server has no password. While Agent Lookout is running, another program on the same machine can request the same data, and on a shared computer so can another user account. Such a program can also send that header, and so turn the notifications the server shows on or off. It can also ask the server to select a tmux pane, or bring a tab of Terminal or iTerm2 forward, as the Jump button does.
|
|
179
|
+
The local server has no password. While Agent Lookout is running, another program on the same machine can request the same data, and on a shared computer so can another user account. Such a program can also send that header, and so turn the notifications the server shows on or off. It can also ask the server to select a tmux pane, or bring a tab of Terminal or iTerm2 forward, as the Jump button does, and to clear the history, as the Clear history button does.
|
|
180
180
|
|
|
181
|
-
For a session in VS Code, the Jump button opens a `vscode://` address that contains the session ID. Your operating system hands it to VS Code. For a session in tmux, the Jump button sends a request that holds the session's ID to Agent Lookout's own server, which selects the pane as described under [`tmux`](#tmux). For a session in Terminal or iTerm2 it sends the same request, and the server brings the tab forward as described under [Terminal and iTerm2](#terminal-and-iterm2). That request
|
|
181
|
+
For a session in VS Code, the Jump button opens a `vscode://` address that contains the session ID. Your operating system hands it to VS Code. For a session in tmux, the Jump button sends a request that holds the session's ID to Agent Lookout's own server, which selects the pane as described under [`tmux`](#tmux). For a session in Terminal or iTerm2 it sends the same request, and the server brings the tab forward as described under [Terminal and iTerm2](#terminal-and-iterm2). That request and the one Clear history sends are the only ones that change anything, and the server answers them only for a page served from this machine. [SECURITY.md](SECURITY.md) lists its checks.
|
|
182
182
|
|
|
183
183
|
## Notifications
|
|
184
184
|
|
|
@@ -225,7 +225,7 @@ A notification the server shows differs from the browser's:
|
|
|
225
225
|
|
|
226
226
|
## Email
|
|
227
227
|
|
|
228
|
-
Email notifications are off until you set them up, and they can be set up only in the environment Agent Lookout starts with: `AGENT_LOOKOUT_EMAIL_TO`, the one address emails go to, and `AGENT_LOOKOUT_SMTP_URL`, the mail server they go through, with the user name and password to sign in with. `AGENT_LOOKOUT_EMAIL_FROM`, the sender's address, `AGENT_LOOKOUT_EMAIL_AFTER`, how long a wait lasts before it is emailed,
|
|
228
|
+
Email notifications are off until you set them up, and they can be set up only in the environment Agent Lookout starts with: `AGENT_LOOKOUT_EMAIL_TO`, the one address emails go to, and `AGENT_LOOKOUT_SMTP_URL`, the mail server they go through, with the user name and password to sign in with. `AGENT_LOOKOUT_EMAIL_FROM`, the sender's address, `AGENT_LOOKOUT_EMAIL_AFTER`, how long a wait lasts before it is emailed, `AGENT_LOOKOUT_EMAIL_EVENTS`, what is emailed, and `AGENT_LOOKOUT_EMAIL_ASKING`, whether the email for a wait says what the session is asking, can be left out. While either of the first two is unset, no email is sent, the mail library is not loaded and no connection is opened. The same holds when any of the six is set to something Agent Lookout cannot read. The [guide](docs/GUIDE.md#email) says how to set them up and how to turn them off.
|
|
229
229
|
|
|
230
230
|
### What an email holds
|
|
231
231
|
|
|
@@ -238,7 +238,18 @@ An email is plain text. Its subject is the session's name followed by the reason
|
|
|
238
238
|
- the agent, such as Claude Code or Codex, or the agent a status file names
|
|
239
239
|
- one line saying Agent Lookout sent it and how to stop these emails
|
|
240
240
|
|
|
241
|
-
It holds no folder path, no prompt, none of Claude Code's own wording for the wait,
|
|
241
|
+
It holds no folder path, no prompt, none of Claude Code's own wording for the wait, no link, no image, nothing that reports back when it is opened and, unless you set `AGENT_LOOKOUT_EMAIL_ASKING=on` (below), nothing of what a waiting session is asking. Its headers are the ones the mail library writes for every email: From, with the name Agent Lookout and the sender's address, To, Subject, Date, Message-ID, and three that say it is plain text in UTF-8. A session's name and its folder's name are cut to 80 characters, and anything in them that would end a line becomes a space, so nothing in a name can add a header or a recipient.
|
|
242
|
+
|
|
243
|
+
#### What a waiting session is asking, in an email
|
|
244
|
+
|
|
245
|
+
Start Agent Lookout with `AGENT_LOOKOUT_EMAIL_ASKING=on`, and the email for a wait also holds one more line, before the folder's name: `Asking:` followed by what the session is asking, such as `Asking: Run: npm test`. It is the line the Needs you panel shows, as [Claude Code's transcripts](#claude-codes-transcripts) describes, cleaned and cut in the same way: control characters taken out, made one line, and cut to 200 characters. It can hold:
|
|
246
|
+
|
|
247
|
+
- a command, which can name any path, a server or a password typed on the command line
|
|
248
|
+
- a web address, which your mail app may show as a link
|
|
249
|
+
- a file's path, which is the full path, and can name your home folder, when the file is outside the session's folder
|
|
250
|
+
- the question the session put to you, in the session's own words
|
|
251
|
+
|
|
252
|
+
It is never in the subject, and never in an email for a session that finished, failed or ended. Only a Claude Code session has one, and only when its transcript says, so an email for any other wait is the same as with the setting off. It is taken from the session list at the moment the email is sent, and is not kept for it: a wait that has not yet been emailed is remembered by its session's ID and the time it began alone, so a session that moves on to another tool while it waits is emailed with what it asks when the email goes. Once the email is handed to the mail server, Agent Lookout holds nothing of it. `AGENT_LOOKOUT_EMAIL_ASKING=off`, or leaving it out, puts nothing of it in an email, and anything else turns email off until it is corrected.
|
|
242
253
|
|
|
243
254
|
### Where it goes, and how
|
|
244
255
|
|
|
@@ -256,13 +267,13 @@ The button and the switches for notifications in Settings do not turn emails on
|
|
|
256
267
|
|
|
257
268
|
The settings, password included, live in the environment of the Agent Lookout process, as every setting on this page does. Programs running as your user on this machine can read a process's environment. Agent Lookout never writes them to a file, never sends them to the dashboard, and never prints them. When one cannot be read, it prints one line that names the setting and never its value. A setting typed in front of the command can be kept by your shell in its history file. The guide shows how to keep the password out of it.
|
|
258
269
|
|
|
259
|
-
Through `GET /api/email`, the dashboard learns whether email is on, the address with all but its first letter before the @ hidden, such as `n…@example.com`, the events that are emailed, the delay, and when the last email was tried, with whether it was sent or a short reason why not. It never learns the server, the user name or the password. That, and the times of the emails of the last hour, are held in memory and are gone when Agent Lookout stops.
|
|
270
|
+
Through `GET /api/email`, the dashboard learns whether email is on, the address with all but its first letter before the @ hidden, such as `n…@example.com`, the events that are emailed, the delay, whether the email for a wait says what the session is asking, never what it was asking, and when the last email was tried, with whether it was sent or a short reason why not. It never learns the server, the user name or the password. That, and the times of the emails of the last hour, are held in memory and are gone when Agent Lookout stops.
|
|
260
271
|
|
|
261
272
|
Once an email has been handed to the mail server, Agent Lookout has no hold on it. The mail server you named and the mailbox it is delivered to keep the email, and whatever they record about it, for as long as their own settings and terms say. Agent Lookout cannot recall or delete it.
|
|
262
273
|
|
|
263
274
|
## Webhook
|
|
264
275
|
|
|
265
|
-
Webhook posts are off until you set them up, and they can be set up only in the environment Agent Lookout starts with: `AGENT_LOOKOUT_WEBHOOK_URL`, the one address posts go to. `AGENT_LOOKOUT_WEBHOOK_EVENTS`, what is posted,
|
|
276
|
+
Webhook posts are off until you set them up, and they can be set up only in the environment Agent Lookout starts with: `AGENT_LOOKOUT_WEBHOOK_URL`, the one address posts go to. `AGENT_LOOKOUT_WEBHOOK_EVENTS`, what is posted, `AGENT_LOOKOUT_WEBHOOK_AFTER`, how long a wait lasts before it is posted, and `AGENT_LOOKOUT_WEBHOOK_ASKING`, whether the post for a wait says what the session is asking, can be left out. While the address is unset, nothing is posted and no connection is opened. The same holds when any of the four is set to something Agent Lookout cannot read. The [guide](docs/GUIDE.md#webhook) says how to set it up and how to turn it off.
|
|
266
277
|
|
|
267
278
|
### What a post holds
|
|
268
279
|
|
|
@@ -293,10 +304,21 @@ It holds:
|
|
|
293
304
|
- `at`: when it happened, as a time in UTC: when the wait began, or when Agent Lookout saw the session finish, fail or end.
|
|
294
305
|
- `waitedSeconds`, for a wait only: how long it had waited when it was posted.
|
|
295
306
|
|
|
296
|
-
It holds no folder path, no prompt, none of Claude Code's own wording for the wait,
|
|
307
|
+
It holds no folder path, no prompt, none of Claude Code's own wording for the wait, no session ID or process ID, nothing about this computer and, unless you set `AGENT_LOOKOUT_WEBHOOK_ASKING=on` (below), nothing of what a waiting session is asking. Its headers are `Content-Type: application/json`, `Content-Length`, `User-Agent: Agent Lookout/` followed by the version, `Host` and `Connection: close`. It carries no cookie and no other header.
|
|
297
308
|
|
|
298
309
|
A session's name, its folder's name and its agent's are each cut to 80 characters, and anything in them that would end a line becomes a space. In `text`, `<`, `>` and `&` are written as `<`, `>` and `&`, which Slack shows as the characters themselves, and each `@` is followed by a space of no width, so nothing in a name can mention someone, ping a channel or make a link that shows other words than its address. The JSON is written whole by Node's own writer, so nothing in a name can add a field. Slack does show a web address written out in a name as a link to that address.
|
|
299
310
|
|
|
311
|
+
#### What a waiting session is asking, in a post
|
|
312
|
+
|
|
313
|
+
Start Agent Lookout with `AGENT_LOOKOUT_WEBHOOK_ASKING=on`, and the post for a wait also says what the session is asking, in two places: in `text`, after the reason, as in `checkout-flow is waiting for permission: Run: npm test (4m 12s, storefront, VS Code, Claude Code)`, and in a field of its own, `asking`, after `reason`, such as `"asking": "Run: npm test"`. It is the line the Needs you panel shows, as [Claude Code's transcripts](#claude-codes-transcripts) describes, cleaned and cut in the same way: control characters taken out, made one line, and cut to 200 characters. It can hold:
|
|
314
|
+
|
|
315
|
+
- a command, which can name any path, a server or a password typed on the command line
|
|
316
|
+
- a web address, which Slack shows as a link to that address
|
|
317
|
+
- a file's path, which is the full path, and can name your home folder, when the file is outside the session's folder
|
|
318
|
+
- the question the session put to you, in the session's own words
|
|
319
|
+
|
|
320
|
+
In `text` it is written as names are, with `<`, `>` and `&` as entities and each `@` followed by a space of no width, so it cannot mention someone or ping a channel. In `asking` it is as the dashboard shows it. It is never in a post for a session that finished, failed or ended, and a post without it has no `asking` field. Only a Claude Code session has one, and only when its transcript says. It is taken from the session list at the moment the post is sent, and is not kept for it, as for email. Once the post is sent, Agent Lookout holds nothing of it. Everyone who can read the channel sees it. `AGENT_LOOKOUT_WEBHOOK_ASKING=off`, or leaving it out, puts nothing of it in a post, and anything else turns the webhook off until it is corrected. It is separate from `AGENT_LOOKOUT_EMAIL_ASKING`, so it can go to your own mailbox and stay out of a channel others read.
|
|
321
|
+
|
|
300
322
|
### Where it goes, and how
|
|
301
323
|
|
|
302
324
|
Each post goes to the one address in `AGENT_LOOKOUT_WEBHOOK_URL`, and to no other. For each post Agent Lookout looks up the address's host, opens a connection to it, sends the post, reads the status of the answer and closes the connection. The rest of the answer is read and dropped. A redirect is not followed, and a post is never tried again. The address must begin `https://`, so the connection is encrypted with TLS, and the certificate is always checked. Only to an address on this computer, at `127.0.0.1` or `localhost`, may it begin `http://`, since nothing leaves the machine on the way to it. The service at the address sees the network address the connection comes from, as any server you connect to does.
|
|
@@ -311,10 +333,40 @@ The button and the switches for notifications in Settings do not turn posts on o
|
|
|
311
333
|
|
|
312
334
|
Anyone who has the address can post to the channel behind it, so it is kept like a password. It lives in the environment of the Agent Lookout process, as every setting on this page does, and programs running as your user on this machine can read a process's environment. Agent Lookout never writes it to a file, never sends it to the dashboard, and never prints it. When a webhook setting cannot be read, it prints one line that names the setting and never its value. A setting typed in front of the command can be kept by your shell in its history file. The guide shows how to keep the address out of it.
|
|
313
335
|
|
|
314
|
-
Through `GET /api/webhook`, the dashboard learns whether the webhook is on, the host the posts go to and nothing else of the address, such as `hooks.slack.com`, the events that are posted, the delay, and when the last post was tried, with whether it was sent or a short reason why not. That, and the times of the posts of the last hour, are held in memory and are gone when Agent Lookout stops. Settings shows the host in full, so with a service that puts its secret in the host, keep Settings out of screenshots too.
|
|
336
|
+
Through `GET /api/webhook`, the dashboard learns whether the webhook is on, the host the posts go to and nothing else of the address, such as `hooks.slack.com`, the events that are posted, the delay, whether the post for a wait says what the session is asking, never what it was asking, and when the last post was tried, with whether it was sent or a short reason why not. That, and the times of the posts of the last hour, are held in memory and are gone when Agent Lookout stops. Settings shows the host in full, so with a service that puts its secret in the host, keep Settings out of screenshots too.
|
|
315
337
|
|
|
316
338
|
Once a post has been sent, Agent Lookout has no hold on it. The service at the address, such as Slack or Discord, keeps the message, and whatever it records about it, for as long as its own settings and terms say, and shows it to everyone who can read that channel. Agent Lookout cannot recall or delete it.
|
|
317
339
|
|
|
340
|
+
## Updates (Mac app only)
|
|
341
|
+
|
|
342
|
+
The Mac app checks whether a newer version of it has been released. Nothing else does: the npm package, `npx agent-lookout`, `npm start`, `npm run dev` and a development run of the app, `npm run dev:desktop`, never check by themselves.
|
|
343
|
+
|
|
344
|
+
### What it asks for, and from where
|
|
345
|
+
|
|
346
|
+
It asks GitHub, over HTTPS, for one small file, `latest-mac.yml`, from the latest release of the project, at `https://github.com/Olanetsoft/agent-lookout/releases/latest/download/latest-mac.yml`. The file gives the latest version's number, and the name, size and SHA-512 of each of its files. GitHub answers with a redirect to its own file host, `release-assets.githubusercontent.com`, or `objects.githubusercontent.com`, and the app follows a redirect only to one of those three hosts, only over HTTPS. The file may be no larger than 64 KB.
|
|
347
|
+
|
|
348
|
+
Only when that version is newer than the one running, and is not a prerelease, does it ask for one more file: the zip of the new version for your kind of Mac, from that version's release, about 120 MB, from the same hosts. It checks the zip's size and SHA-512 against `latest-mac.yml` as it downloads, unpacks it with `/usr/bin/ditto`, and checks with the bundle's `Info.plist`, turned into text by `/usr/bin/plutil` when it needs to be, that it is Agent Lookout and the version offered. A file that does not match is deleted.
|
|
349
|
+
|
|
350
|
+
### What a request holds
|
|
351
|
+
|
|
352
|
+
Each request holds the address above and a `User-Agent` header, `Agent-Lookout/` followed by the version running, such as `Agent-Lookout/0.2.1`, and an `Accept` header. It holds no cookie, no account, no session data, no name, path or count of sessions, and nothing else about this computer. As with any web request, GitHub sees the network address the request comes from, and it may keep what it records of requests under its own terms. The requests are made by the app's main process with Node's own HTTPS client, with the certificate checked. The page in the app's window cannot make any request off the machine.
|
|
353
|
+
|
|
354
|
+
### How often
|
|
355
|
+
|
|
356
|
+
A short while after the app starts, if a day has passed since the last check that had an answer, and then once a day while it runs. A check that had no answer, because the Mac was offline for instance, is tried again after six hours. Check for Updates…, in the Agent Lookout menu and in Settings, checks at once, whether or not the automatic check is on.
|
|
357
|
+
|
|
358
|
+
### Turning it off
|
|
359
|
+
|
|
360
|
+
Settings has an Updates card, in the Mac app only, with the switch Check for updates automatically. Turned off, the app asks GitHub nothing until you press Check for Updates…. It is on until you turn it off.
|
|
361
|
+
|
|
362
|
+
### Installing
|
|
363
|
+
|
|
364
|
+
Nothing is installed until you press Install and Restart, in Settings, or in the dialog Check for Updates… shows when the window is closed. The app then starts a short script, `/bin/sh` with a script that never changes, and quits. The script waits for the app to quit, moves the old app into the update's temporary folder, moves the new one into its place, and opens it, using `/bin/kill`, `/bin/sleep`, `/bin/mv` and `/usr/bin/open`. It is given the app's process ID and three paths: where the app is, and two in the temporary folder the app made itself. Nothing from the network reaches its arguments. If the new version cannot be moved in, the old one is put back and opened, and says under Updates in Settings that the version could not be installed. The app does this only from a folder it can change, such as Applications, and not when macOS runs it from where it was downloaded, or when it runs from its disk image or another disk under `/Volumes/`: then it says so, and links to the release page.
|
|
365
|
+
|
|
366
|
+
### What is kept
|
|
367
|
+
|
|
368
|
+
`update-state.json`, in `~/Library/Application Support/Agent Lookout/`, holds whether the automatic check is on, when a check last had an answer, the last version a notification was shown for, so each version is told of once, and, from Install and Restart until the app opens again, the version being installed, so the copy that opens knows whether that worked. The download is in a folder of the app's own in the system's temporary folder, and is deleted when the app quits without installing it, or when it does not match. After an install, the old app stays in that folder, and macOS clears it there in time.
|
|
369
|
+
|
|
318
370
|
## The MCP server
|
|
319
371
|
|
|
320
372
|
`agent-lookout mcp` does nothing until you add it to an agent's app, such as Claude Code, as the [guide](docs/GUIDE.md#for-your-agents) shows. The app then starts it, and speaks to it over its stdin and stdout. It opens no port.
|
|
@@ -343,9 +395,31 @@ Nothing. Each answer is worked out from one reading of the list and is gone once
|
|
|
343
395
|
|
|
344
396
|
## Storage
|
|
345
397
|
|
|
346
|
-
Agent Lookout
|
|
398
|
+
Agent Lookout keeps one thing about your sessions on disk: the history behind the Events log and the charts, so that they are still there after it restarts. [The history](#the-history) says what it holds, where it is, how long it is kept, how to clear it and how to turn it off. Apart from that, its own code writes no files, except the Mac app's, below.
|
|
399
|
+
|
|
400
|
+
The latest session list is held in memory only, and is gone when Agent Lookout stops. What a waiting session is asking is in that list only while it waits, and in no event or point of history, on disk or in memory. With `AGENT_LOOKOUT_EMAIL_ASKING=on` or `AGENT_LOOKOUT_WEBHOOK_ASKING=on`, it is also in the email or post for that wait from the moment it is written until it is handed over, and nowhere else. So are the tmux panes and terminal tabs it last found, the branches and repositories it last read, and what the dashboard pages last said about notifications.
|
|
401
|
+
|
|
402
|
+
### The history
|
|
403
|
+
|
|
404
|
+
The history is kept in the folder `~/.agent-lookout/history`, beside the folder of status files, or in the folder `AGENT_LOOKOUT_HISTORY_DIR` names. Agent Lookout makes the folder, and any folder above it that is not there, with mode 700, so only your user can open it, and makes each file in it with mode 600, so only your user can read or change it.
|
|
347
405
|
|
|
348
|
-
|
|
406
|
+
It writes there what it already holds in memory for the Events log and the charts, and nothing else:
|
|
407
|
+
|
|
408
|
+
- Each event: its ID, its time, the session's ID and name, whether the session appeared, changed status or ended, the status it changed from and to, and how serious the change was. A session's ID is its agent's own ID for it, or the name of its status file.
|
|
409
|
+
- Each history point, one for each poll: its time, and how many sessions were waiting on you, working, idle, and in all.
|
|
410
|
+
- When Agent Lookout started writing, and when the history was cleared.
|
|
411
|
+
|
|
412
|
+
Each event holds the session's name as the dashboard shows it: the name its agent gave it, from Claude Code's session file or the `claude` command's list, from Codex's `session_index.jsonl` or from a status file, or else the name of its folder, which for a Codex session is read from the start of its session file. Nothing else from a transcript or from Codex's session files is written, and no folder path, branch, prompt or anything a waiting session is asking.
|
|
413
|
+
|
|
414
|
+
What it learns is written every 5 seconds, and once more as it stops. The files are JSON lines, one file for each day by the UTC clock, such as `v1-2026-10-06.jsonl`. A day that grows past 2 MB goes on in `v1-2026-10-06-2.jsonl`, and so on. Each day's file is deleted once that day ended more than 8 days ago, and the files hold 20 MB at most: before writing more than that, Agent Lookout deletes the oldest. When it starts, it reads the files back, and keeps in memory the last 1,000 events and the last six hours of points, as it does while it runs. For the Waits card it also keeps in memory, for 9 days, the events of sessions starting and stopping waiting on you, and the stretches of time it was measuring, which it works the card's totals out from. It reads only ordinary files in that folder of about 2 MB or less, does not follow a link, and passes over a line it cannot read. A file whose name says it was written by a later version of Agent Lookout, such as `v2-2026-10-06.jsonl`, is not read, written or deleted, for its age or by Clear history. A line dated more than a minute after the computer's clock was written while the clock was wrong, and is not read back.
|
|
415
|
+
|
|
416
|
+
When more than one copy runs at once, such as the Mac app and `npx agent-lookout`, one of them writes the history. It keeps a file in the folder, `writer.lock`, that holds its process ID, a random mark that tells it from another copy in the same process, and a fingerprint of the folders it reads sessions from, which names none of them. It deletes the file as it stops. The others read what had been kept when they started, keep what they see in memory, and one of them takes over when the writer stops. A copy that reads sessions from other folders than the writer's, such as a dev server pointed at empty folders, says so on its History card.
|
|
417
|
+
|
|
418
|
+
To clear the history, press Clear history on the History card in Settings and confirm. Agent Lookout deletes every history file this version wrote in the folder, and empties the Events log and the charts, which start again from that moment. The History card says where the files are, how much they hold and how far back they go. Deleting the folder while Agent Lookout is stopped clears it too.
|
|
419
|
+
|
|
420
|
+
To keep nothing on disk, start Agent Lookout with `AGENT_LOOKOUT_HISTORY=off`. It then makes no folder and writes no file, and the last 1,000 events, the last six hours of history and what the Waits card counts are held in memory only and are gone when it stops.
|
|
421
|
+
|
|
422
|
+
With notifications on, each notification holds a session's name, and for a wait what the session is asking, and the operating system keeps it in its notification list, as does the browser for one it made. [Notifications](#notifications) says what it holds and how long it stays. With email set up, each email holds a session's name and its folder's name, and with `AGENT_LOOKOUT_EMAIL_ASKING=on` the email for a wait holds what the session was asking, and the mail server and the mailbox keep it, as [Email](#email) says. With a webhook set up, each post holds the same, with `AGENT_LOOKOUT_WEBHOOK_ASKING=on` for what a session was asking, and the service it went to keeps it, as [Webhook](#webhook) says.
|
|
349
423
|
|
|
350
424
|
The tools that run it write files of their own. None of these holds session data.
|
|
351
425
|
|
|
@@ -355,13 +429,15 @@ The tools that run it write files of their own. None of these holds session data
|
|
|
355
429
|
- `npm run dev` runs through Vite, which keeps pre-bundled copies of the dependencies in `node_modules/.vite/`.
|
|
356
430
|
- `npm run build` writes the built dashboard to `dist/` and the type checker's records to `node_modules/.tmp/`. `npm run build:package` also writes the bundled command to `dist/cli/`.
|
|
357
431
|
|
|
432
|
+
The Mac app keeps the history in the same folder as `npx agent-lookout` and `npm start`, and four files of its own. `window-state.json`, in `~/Library/Application Support/Agent Lookout/`, holds the window's place and size and the colour of the theme it last showed. `update-state.json`, beside it, holds whether it checks for updates by itself, when it last checked, the last version it told you of and, during an install, the version being installed, as [Updates (Mac app only)](#updates-mac-app-only) says, and a newer version it downloads waits in the system's temporary folder until it is installed or the app quits. `menu-bar-state.json`, beside it, holds whether its icon is shown in the menu bar. Its log, `~/Library/Logs/Agent Lookout/main.log`, holds the errors it met and the lines `npm start` would print, such as the one that says an email setting is wrong. None of them holds a session's name, though an error in the log can name a file the app could not read. Electron, which the app is built on, keeps the page's local storage, below, and caches of its own in the first folder.
|
|
433
|
+
|
|
358
434
|
The dashboard saves six values in your browser's local storage. Your theme choice is under the key `agent-lookout-theme`. Whether notifications are on is under the key `agent-lookout-notifications`, as `on` or `off`, and is written only when you turn them on or off. The events that send one are under the key `agent-lookout-notification-events`, as their names separated by commas, such as `needs-you,finished`, and are written only when you switch one. The apps the page has said macOS will ask about, when you first jumped to a tab of one, are under the key `agent-lookout-automation-note`, as `Terminal`, `iTerm2` or both separated by a comma. The last time the Events log was on screen is under the key `agent-lookout-last-looked`, as a number of milliseconds since 1970, and is written when the page goes out of sight or is closed. It is what the line in the Events log that marks where you left off is drawn from, and while that line still shows, the time kept is the line's own. It holds nothing about any session or event. Whether the Sessions card shows the list, the list grouped by repository or the board is under the key `agent-lookout-sessions-layout`, as `list`, `repositories` or `board`, and is written only when you choose one. All six belong to one browser at one address.
|
|
359
435
|
|
|
360
436
|
## What is on screen
|
|
361
437
|
|
|
362
438
|
Session names, folder paths, repository names, branch names and what a waiting session is asking, such as a command or a file, can show what you are working on. Check a screenshot before you share it.
|
|
363
439
|
|
|
364
|
-
With notifications on, a session's name, and what a waiting session is asking, also appear in a system notification, outside the dashboard: over other apps, in Notification Centre and, depending on your system's settings, on the lock screen and while you mirror, share or record the screen. One the dashboard page made for a wait stays there until the session stops waiting or you clear it, and one that says Finished, Failed or Ended stays until you clear it. One the server showed stays until you clear it. To keep names off those, open Notifications in System Settings on macOS and change what your browser's notifications may show, which does not cover the ones the server shows, or leave notifications off. An email shows the same name, and the folder's, wherever that mailbox is read, including the notifications a phone shows for it
|
|
440
|
+
With notifications on, a session's name, and what a waiting session is asking, also appear in a system notification, outside the dashboard: over other apps, in Notification Centre and, depending on your system's settings, on the lock screen and while you mirror, share or record the screen. One the dashboard page made for a wait stays there until the session stops waiting or you clear it, and one that says Finished, Failed or Ended stays until you clear it. One the server showed stays until you clear it. To keep names off those, open Notifications in System Settings on macOS and change what your browser's notifications may show, which does not cover the ones the server shows, or leave notifications off. In the Mac app, the number of sessions that need you is shown in the menu bar, beside its icon, and the menu it opens lists their names and what each is asking, with the agent, project, branch or app of two that share a name. Both show while you share or record the screen. To keep them off the menu bar, set Show in menu bar to Off in Settings. An email shows the same name, and the folder's, wherever that mailbox is read, including the notifications a phone shows for it, and so does what a waiting session is asking, with `AGENT_LOOKOUT_EMAIL_ASKING=on`. A webhook post shows them to everyone who can read the channel it goes to, and in the notifications their apps show for it, and with `AGENT_LOOKOUT_WEBHOOK_ASKING=on` shows what a waiting session is asking there too.
|
|
365
441
|
|
|
366
442
|
## Changes
|
|
367
443
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Agent Lookout shows the AI agent sessions on your Mac or Linux computer in one browser page, and which need you.
|
|
4
4
|
|
|
5
|
-
It finds Claude Code and Codex sessions with no setup, and the sessions of any other agent that writes a small status file. It only watches: it never starts, stops or answers a session. By default Agent Lookout itself sends nothing anywhere. Start it with `npx agent-lookout
|
|
5
|
+
It finds Claude Code and Codex sessions with no setup, and the sessions of any other agent that writes a small status file. It only watches: it never starts, stops or answers a session. By default Agent Lookout itself sends nothing anywhere. Start it with `npx agent-lookout`, or download the [Mac app](#mac-app).
|
|
6
6
|
|
|
7
7
|
[Install](#install) · [Guide](docs/GUIDE.md) · [Privacy](#privacy) · [Roadmap](https://github.com/Olanetsoft/agent-lookout/milestones) · [Website](https://agent-lookout.vercel.app)
|
|
8
8
|
|
|
@@ -24,7 +24,7 @@ It finds Claude Code and Codex sessions with no setup, and the sessions of any o
|
|
|
24
24
|
| [`agent-lookout mcp`](docs/GUIDE.md#for-your-agents) | Lets an AI agent ask which sessions need you. Its tools only read. |
|
|
25
25
|
| [Status files](docs/GUIDE.md#your-own-agents) | Show any other agent, including one you wrote, when it writes one small JSON file for each session. |
|
|
26
26
|
|
|
27
|
-
The Overview also has a chart of the last hour, a log of events and a
|
|
27
|
+
The Overview also has a chart of the last hour, a log of events, a timeline, and how long sessions waited on you today and over the last 7 days, day by day, with the sessions that waited longest. What they show is kept on this computer for 8 days, so a restart does not empty them. Press `/` to search every session. Sources says what Agent Lookout reads for each agent. [The screen](docs/GUIDE.md#the-screen) covers each part.
|
|
28
28
|
|
|
29
29
|
## Supported agents and systems
|
|
30
30
|
|
|
@@ -42,6 +42,18 @@ Agent Lookout is developed and tested on macOS. On Linux, CI runs every test on
|
|
|
42
42
|
|
|
43
43
|
## Install
|
|
44
44
|
|
|
45
|
+
### Mac app
|
|
46
|
+
|
|
47
|
+
Download the disk image for your Mac from the [latest release](https://github.com/Olanetsoft/agent-lookout/releases/latest): the one that ends in `mac-arm64.dmg` for Apple silicon, or `mac-x64.dmg` for Intel. Open it and drag Agent Lookout to Applications. The app needs no Node.js.
|
|
48
|
+
|
|
49
|
+
It is not signed with an Apple Developer ID yet, so the first time you open it, macOS says “Agent Lookout” Not Opened. Press Done, then open System Settings › Privacy & Security and press Open Anyway. [Desktop app](docs/GUIDE.md#desktop-app) has the steps.
|
|
50
|
+
|
|
51
|
+
Its icon in the menu bar shows how many sessions need you, with the window open or closed, and a click lists them: choose one to open it.
|
|
52
|
+
|
|
53
|
+
Kept in Applications, it updates itself: about once a day it asks GitHub whether a newer version is out, and installs it when you press Install and Restart. Settings turns the daily check off. The app opens no port, so `agent-lookout status` and `agent-lookout mcp` cannot reach it. For those, start it with npx as well, and turn notifications on in only one of the two, or you get each one twice.
|
|
54
|
+
|
|
55
|
+
### With npx
|
|
56
|
+
|
|
45
57
|
1. Check what you have.
|
|
46
58
|
|
|
47
59
|
```sh
|
|
@@ -51,7 +63,7 @@ Agent Lookout is developed and tested on macOS. On Linux, CI runs every test on
|
|
|
51
63
|
codex --version
|
|
52
64
|
```
|
|
53
65
|
|
|
54
|
-
`node --version` prints `
|
|
66
|
+
`node --version` prints `v22.12.0` or later. `claude --version` prints a version number followed by `(Claude Code)`, and `claude agents --help` prints a line that starts with `Usage: claude agents`. `codex --version` prints `codex-cli` followed by a version number.
|
|
55
67
|
|
|
56
68
|
You need Node.js, and Claude Code, Codex or both. A command for a program you do not use prints `command not found`: carry on. Agent Lookout never runs `codex`, so the Codex desktop app needs no CLI. Without `claude agents` the rest works, but Claude Code's finished and failed background jobs are not listed.
|
|
57
69
|
|
|
@@ -78,9 +90,9 @@ Agent Lookout is developed and tested on macOS. On Linux, CI runs every test on
|
|
|
78
90
|
curl -s http://127.0.0.1:4777/api/health
|
|
79
91
|
```
|
|
80
92
|
|
|
81
|
-
It prints `{"ok":true,"version":"0.2.
|
|
93
|
+
It prints `{"ok":true,"version":"0.2.1"}`, or a later version number.
|
|
82
94
|
|
|
83
|
-
4. Open <http://127.0.0.1:4777>. Your sessions appear within a few seconds. If none do, see [No sessions appear](docs/GUIDE.md#no-sessions-appear). If you used `npm run dev` before, turn notifications on again here: the browser keeps them for each address.
|
|
95
|
+
4. Open <http://127.0.0.1:4777>. Your sessions appear within a few seconds. If none do, see [No sessions appear](docs/GUIDE.md#no-sessions-appear). If you used `npm run dev` before, turn notifications on again here: the browser keeps them for each address. To update later, run `npx agent-lookout@latest`, which also makes sure npx does not reuse an older copy it keeps.
|
|
84
96
|
|
|
85
97
|
If a step prints something else, [When something goes wrong](docs/GUIDE.md#when-something-goes-wrong) says what to do for the common problems.
|
|
86
98
|
|
|
@@ -115,8 +127,8 @@ A coding agent such as Claude Code or Codex can start it for you. Give it this p
|
|
|
115
127
|
|
|
116
128
|
```text
|
|
117
129
|
Start Agent Lookout on this computer. First check that node --version
|
|
118
|
-
prints
|
|
119
|
-
|
|
130
|
+
prints v22.12.0 or later. Then run npx --yes agent-lookout in the
|
|
131
|
+
background and leave it running.
|
|
120
132
|
It should print "Agent Lookout is running at http://127.0.0.1:4777".
|
|
121
133
|
If it prints anything else, or says the port is in use, stop and tell
|
|
122
134
|
me what it printed.
|
|
@@ -177,30 +189,30 @@ AGENT_LOOKOUT_CLAUDE_FEED=off npx agent-lookout
|
|
|
177
189
|
| `AGENT_LOOKOUT_NOTIFICATIONS=on` | On a Mac, shows notifications of waits from the moment it starts, with no dashboard tab open. |
|
|
178
190
|
| `AGENT_LOOKOUT_CLAUDE_FEED=off` | Never runs the `claude` command. Sessions come from Claude Code's session files alone. |
|
|
179
191
|
| `AGENT_LOOKOUT_WAITING_TEXT=off` | Never opens a Claude Code transcript. A waiting session shows its reason alone. |
|
|
192
|
+
| `AGENT_LOOKOUT_HISTORY=off` | Keeps the Events log and the charts in memory only, so they start empty each time. Nothing is written to `~/.agent-lookout/history`. |
|
|
180
193
|
|
|
181
194
|
[The guide](docs/GUIDE.md#settings-you-can-change) lists every setting, those for [email](docs/GUIDE.md#email) and the [webhook](docs/GUIDE.md#webhook) among them. The theme and the page's notifications are in the dashboard's Settings view.
|
|
182
195
|
|
|
183
196
|
## Privacy
|
|
184
197
|
|
|
185
|
-
By default Agent Lookout itself sends nothing anywhere: no telemetry, no analytics, no crash reports
|
|
198
|
+
By default Agent Lookout itself sends nothing anywhere: no telemetry, no analytics, no crash reports and no account. The one exception is the Mac app, which asks GitHub about once a day whether a newer version of it is out and sends nothing about your sessions: Settings turns that off, [Updates (Mac app only)](PRIVACY.md#updates-mac-app-only) says what it sends, and `npx agent-lookout` and the repository never check. Its fonts and scripts are bundled, so the page loads nothing from the internet. It keeps the Events log and the counts behind the charts on this computer, in `~/.agent-lookout/history`, so they are still there after a restart: for 8 days and up to 20 MB, with each session's name and status changes and no folder path, prompt or anything a waiting session is asking. Clear history in Settings deletes them, and `AGENT_LOOKOUT_HISTORY=off` keeps them in memory only. [PRIVACY.md](PRIVACY.md) lists everything it reads, runs, keeps and can send.
|
|
186
199
|
|
|
187
|
-
- Email and the webhook are off until you set them up. Then each goes only to the one address you name, and email goes through the mail server you name. A message holds the session's name, what happened and when, how long a wait has lasted, and the names of its folder, app and agent. It holds no path and no prompt.
|
|
200
|
+
- Email and the webhook are off until you set them up. Then each goes only to the one address you name, and email goes through the mail server you name. A message holds the session's name, what happened and when, how long a wait has lasted, and the names of its folder, app and agent. It holds no path and no prompt, unless you also turn on what a waiting session is asking, below.
|
|
188
201
|
- Started with `npx agent-lookout`, npm contacts its registry: to download the package the first time, and each time after to ask whether a newer version is out. That is npm's own traffic, not Agent Lookout's. Installed with `npm install -g agent-lookout` and started as `agent-lookout`, npm is not involved.
|
|
189
202
|
- It runs Claude Code's own `claude agents` command, which may contact Anthropic the way Claude Code normally does. `AGENT_LOOKOUT_CLAUDE_FEED=off` stops it running that command.
|
|
190
|
-
- While a Claude Code session waits for you, it reads the end of its transcript to show what it asks, such as `Run: npm test`. It forgets that line when the wait ends. The line stays on this machine
|
|
203
|
+
- While a Claude Code session waits for you, it reads the end of its transcript to show what it asks, such as `Run: npm test`. It forgets that line when the wait ends. The line stays on this machine unless you start Agent Lookout with `AGENT_LOOKOUT_EMAIL_ASKING=on` or `AGENT_LOOKOUT_WEBHOOK_ASKING=on`, which put it in the email or post for that wait. It can hold a command, a web address or a file's full path. No answer of `agent-lookout mcp` holds it. `AGENT_LOOKOUT_WAITING_TEXT=off` turns it off.
|
|
191
204
|
- Codex's session files hold your conversations. Agent Lookout reads them for when each turn started and ended, and for a few details such as the session's folder. It keeps none of your prompts, Codex's replies or the commands Codex ran.
|
|
192
205
|
- `agent-lookout mcp` does nothing until you add it to an agent's app. That app usually hands its answers, with your session names, folders and branches, to its model, which for most agents runs on the vendor's servers. [The MCP server](PRIVACY.md#the-mcp-server) says what an answer holds.
|
|
193
206
|
- Jump to a Terminal or iTerm2 tab needs macOS to let the program you start Agent Lookout from control that app. macOS asks once, and what you allow covers anything else you run from that program. Choose Don't Allow and only that Jump stops working. `AGENT_LOOKOUT_TERMINAL_JUMP=off` turns it off.
|
|
194
207
|
|
|
195
|
-
It listens on a loopback address only, `127.0.0.1`, or `::1` if you set `AGENT_LOOKOUT_HOST`, and refuses any other, so other computers cannot reach it. It turns away requests from websites open in your browser. It has no password. While it runs, other programs and other user accounts on this computer can read it. They can also turn the notifications it shows on or off,
|
|
208
|
+
It listens on a loopback address only, `127.0.0.1`, or `::1` if you set `AGENT_LOOKOUT_HOST`, and refuses any other, so other computers cannot reach it. It turns away requests from websites open in your browser. It has no password. While it runs, other programs and other user accounts on this computer can read it. They can also turn the notifications it shows on or off, do what the Jump button does, and clear the history. It writes to no agent's files. The one thing it changes outside itself is which tmux pane, or which Terminal or iTerm2 tab, is in front, when you press Jump.
|
|
196
209
|
|
|
197
210
|
## What it does not do yet
|
|
198
211
|
|
|
199
212
|
- Neither it nor an agent using `agent-lookout mcp` can stop, resume or answer a session.
|
|
200
213
|
- It shows only sessions on this computer. Cloud sessions, Codex cloud tasks and chats in a browser tab do not appear.
|
|
201
214
|
- Claude Code's session files and Codex's files are not documented by their makers. An update to either can make Agent Lookout show less, or nothing, until it is updated. [docs/adapters/codex.md](docs/adapters/codex.md#what-breaks-when-codex-changes) lists what breaks when Codex changes.
|
|
202
|
-
- The
|
|
203
|
-
- There is no Mac app yet. It is planned, with support for more agents, in the [milestones](https://github.com/Olanetsoft/agent-lookout/milestones).
|
|
215
|
+
- The Mac app is not signed with an Apple Developer ID yet, so the first time it is opened, macOS does not open it until you allow it in Privacy & Security. There is no app for Linux. Support for more agents is planned in the [milestones](https://github.com/Olanetsoft/agent-lookout/milestones).
|
|
204
216
|
|
|
205
217
|
[What it does not do yet](docs/GUIDE.md#what-it-does-not-do-yet) has the details.
|
|
206
218
|
|
package/SECURITY.md
CHANGED
|
@@ -8,19 +8,19 @@ Say what you found, how to reproduce it and what someone could do with it. Leave
|
|
|
8
8
|
|
|
9
9
|
If that page does not open, or shows no form, reach the maintainer, Idris Olubisi, through the links on the [Olanetsoft GitHub profile](https://github.com/Olanetsoft). In that first message, say only that you have a security report for Agent Lookout. The maintainer will agree a private way to send the details.
|
|
10
10
|
|
|
11
|
-
The project has one maintainer, so replies are best effort.
|
|
11
|
+
The project has one maintainer, so replies are best effort. Fixes land on `main` and go out in the next release, whose version only changes its last number, as in 0.2.1 to 0.2.2. Use the latest release.
|
|
12
12
|
|
|
13
13
|
## What the app handles
|
|
14
14
|
|
|
15
|
-
Agent Lookout reads metadata about the Claude Code and Codex sessions on your machine: names, working directories, statuses and, for Claude Code, process IDs. For each session's folder it reads which git branch is checked out, and which repository the folder belongs to, from the repository's `.git` entry, `HEAD` and a worktree's `commondir` alone, and runs no git command. On a Mac it also lists every process's ID, parent, terminal and program name with `ps` when a new Claude Code session appears, to find the Terminal or iTerm2 tab it runs in, and keeps only the app and the session's terminal. It serves that to the dashboard over HTTP on a loopback address. Of Claude Code's transcripts it reads only the end of a waiting session's own, opened without following a link, and keeps one line of it, what the session is asking, until the wait ends. That line goes to the dashboard and to notifications on this machine, never to an email, a webhook post or `agent-lookout mcp`. It does open Codex's session files, which hold whole conversations, and keeps only when turns started and ended and a few fields. It writes to no agent's files. It also reads the folder of status files, `~/.agent-lookout/sessions` or the one `AGENT_LOOKOUT_STATUS_DIR` names, where any program can write a small JSON file to show one of its sessions, and it writes nothing there. [PRIVACY.md](PRIVACY.md) lists everything it reads, runs and keeps.
|
|
15
|
+
Agent Lookout reads metadata about the Claude Code and Codex sessions on your machine: names, working directories, statuses and, for Claude Code, process IDs. For each session's folder it reads which git branch is checked out, and which repository the folder belongs to, from the repository's `.git` entry, `HEAD` and a worktree's `commondir` alone, and runs no git command. On a Mac it also lists every process's ID, parent, terminal and program name with `ps` when a new Claude Code session appears, to find the Terminal or iTerm2 tab it runs in, and keeps only the app and the session's terminal. It serves that to the dashboard over HTTP on a loopback address. Of Claude Code's transcripts it reads only the end of a waiting session's own, opened without following a link, and keeps one line of it, what the session is asking, until the wait ends. That line goes to the dashboard and to notifications on this machine, never to an email, a webhook post or `agent-lookout mcp`. It does open Codex's session files, which hold whole conversations, and keeps only when turns started and ended and a few fields. It writes to no agent's files. It also reads the folder of status files, `~/.agent-lookout/sessions` or the one `AGENT_LOOKOUT_STATUS_DIR` names, where any program can write a small JSON file to show one of its sessions, and it writes nothing there. It keeps the Events log and the counts behind its charts in its own folder, `~/.agent-lookout/history`, which it makes with mode 700, in files of mode 600 that it neither reads nor writes through a link. They hold session IDs and names, statuses and times, and never what a waiting session is asking. `AGENT_LOOKOUT_HISTORY=off` keeps them in memory only. [PRIVACY.md](PRIVACY.md) lists everything it reads, runs and keeps.
|
|
16
16
|
|
|
17
17
|
With notifications turned on in Settings, the dashboard page hands a session's name and a fixed text, the reason it waits or Finished, Failed or Ended, to the browser's Notifications API, which passes them to the operating system. When no dashboard page is open, the local server shows the notification itself on macOS: it runs `/usr/bin/osascript` with a fixed script, and passes the name and the text to that script as arguments. Each dashboard page tells the server whether its notifications are on, in a header on its requests, and the server shows its own only while the last page to say so said they are on, or `AGENT_LOOKOUT_NOTIFICATIONS=on` was set and no page has said anything. Nothing is sent over the network for any of this. [PRIVACY.md](PRIVACY.md#notifications) has the details.
|
|
18
18
|
|
|
19
|
-
Email notifications are off unless they are set up in the environment Agent Lookout starts with. Then, for a session that has waited the delay set, and, if `AGENT_LOOKOUT_EMAIL_EVENTS` asks for them, for one that finishes, fails or ends, the collector sends one short plain-text email, through the mail server named in `AGENT_LOOKOUT_SMTP_URL`, to the one address in `AGENT_LOOKOUT_EMAIL_TO`. It holds the session's name, what happened, how long it waited or when it ended, the name of its project folder, its app and its agent. The password for the mail server is in `AGENT_LOOKOUT_SMTP_URL`, so it lives in the environment of the Agent Lookout process and nowhere else: it is never written to a file, sent to the dashboard or printed. The connection to the mail server is encrypted with TLS, with its certificate checked, except to a mail server on this machine. `GET /api/email` tells the dashboard only whether email is on, the address with most of it hidden, the events, the delay and how the last email went. [PRIVACY.md](PRIVACY.md#email) has the details.
|
|
19
|
+
Email notifications are off unless they are set up in the environment Agent Lookout starts with. Then, for a session that has waited the delay set, and, if `AGENT_LOOKOUT_EMAIL_EVENTS` asks for them, for one that finishes, fails or ends, the collector sends one short plain-text email, through the mail server named in `AGENT_LOOKOUT_SMTP_URL`, to the one address in `AGENT_LOOKOUT_EMAIL_TO`. It holds the session's name, what happened, how long it waited or when it ended, the name of its project folder, its app and its agent, and, for a wait with `AGENT_LOOKOUT_EMAIL_ASKING=on`, what the session is asking, which can hold a command, a web address or a file's full path. The password for the mail server is in `AGENT_LOOKOUT_SMTP_URL`, so it lives in the environment of the Agent Lookout process and nowhere else: it is never written to a file, sent to the dashboard or printed. The connection to the mail server is encrypted with TLS, with its certificate checked, except to a mail server on this machine. `GET /api/email` tells the dashboard only whether email is on, the address with most of it hidden, the events, the delay, whether a wait's email says what the session is asking, and how the last email went. [PRIVACY.md](PRIVACY.md#email) has the details.
|
|
20
20
|
|
|
21
|
-
Webhook posts are off unless `AGENT_LOOKOUT_WEBHOOK_URL` is set in the environment Agent Lookout starts with. Then, for each event chosen, the collector sends one short JSON post to that one address, over HTTPS with the certificate checked, or over plain HTTP only to `127.0.0.1` or `localhost`. It holds the session's name, what happened, when, the name of its project folder, its app and its agent. It follows no redirect and tries nothing twice. The address is itself a secret: whoever has a Slack incoming webhook's address can post to its channel. So it lives in the environment of the Agent Lookout process and nowhere else: it is never written to a file, sent to the dashboard or printed. `GET /api/webhook` tells the dashboard only whether the webhook is on, the host, the events, the delay and how the last post went. [PRIVACY.md](PRIVACY.md#webhook) has the details.
|
|
21
|
+
Webhook posts are off unless `AGENT_LOOKOUT_WEBHOOK_URL` is set in the environment Agent Lookout starts with. Then, for each event chosen, the collector sends one short JSON post to that one address, over HTTPS with the certificate checked, or over plain HTTP only to `127.0.0.1` or `localhost`. It holds the session's name, what happened, when, the name of its project folder, its app and its agent, and, for a wait with `AGENT_LOOKOUT_WEBHOOK_ASKING=on`, what the session is asking. It follows no redirect and tries nothing twice. The address is itself a secret: whoever has a Slack incoming webhook's address can post to its channel. So it lives in the environment of the Agent Lookout process and nowhere else: it is never written to a file, sent to the dashboard or printed. `GET /api/webhook` tells the dashboard only whether the webhook is on, the host, the events, the delay, whether a wait's post says what the session is asking, and how the last post went. [PRIVACY.md](PRIVACY.md#webhook) has the details.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Two routes of the local API change something: `POST /api/jump`, which the Jump button of a session in tmux, Terminal or iTerm2 sends, and `POST /api/history/clear`, which the Clear history button in Settings sends. Every other route only reads. `POST /api/history/clear` deletes the history files in Agent Lookout's own folder and empties the Events log and the history in memory. Its body is exactly `{}`, nothing in it names a file, and it makes the same checks as the jump route, below, with `X-Agent-Lookout-Action: clear-history`. The rest of this part is about `POST /api/jump`. For a session in tmux it can change three things, all inside tmux: which pane is selected in its window, which window is selected in its tmux session, and which tmux session each attached terminal is showing. For a session in a tab of Terminal or iTerm2, on macOS, it can bring that tab forward: select it in its window, bring the window back from the Dock if it was minimised and in front of the app's others, and bring the app to the front. It sends no keys, runs nothing inside a pane or a tab, starts no tmux server and starts no app.
|
|
24
24
|
|
|
25
25
|
A request to it names a session by its ID and nothing else. The server looks that session up in its own list and takes the pane it found for that session's process when it last asked tmux. It checks that the pane's ID is a `%` followed by digits, and gives it to a fixed list of tmux commands: `select-window`, `select-pane`, `display-message -p`, `list-clients` and `switch-client`. Nothing from the request is passed to tmux, and tmux is started directly, never through a shell. So the route can never be made to run another program, another tmux command or a command with other arguments. The most a request can do is choose which of the panes already found for a listed session is selected.
|
|
26
26
|
|
|
@@ -36,7 +36,9 @@ On top of the checks every route makes, the route answers only a request that:
|
|
|
36
36
|
|
|
37
37
|
It makes one jump a second, and one at a time. `AGENT_LOOKOUT_TMUX=off` stops Agent Lookout running tmux, and the route then finds no pane for any session. `AGENT_LOOKOUT_TERMINAL_JUMP=off` stops it looking for tabs, and the route then brings no tab forward. [PRIVACY.md](PRIVACY.md#tmux) lists each command, and [Terminal and iTerm2](PRIVACY.md#terminal-and-iterm2) the script.
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
The Mac app answers four more routes, under `/api/app/` on its own address, which no port reaches and which `npm start` and the npm package do not have: `GET /api/app/update`, and three POSTs that check GitHub for a newer version, install the one that is ready, and turn the daily check on or off. Each POST passes the checks above, with an `X-Agent-Lookout-Action` of its own, and a body of 256 bytes or less that is exactly what it needs. The app's only requests off the machine are the update check's and its download's, over HTTPS, with the certificate checked, to GitHub and the two hosts GitHub redirects a release's downloads to, and to no other address, a redirect's included. A download must have the size and SHA-512 the release's `latest-mac.yml` gives, and the bundle in it must be this app, by its bundle identifier, at the version offered, with no link where the bundle, its `Contents` or its `Info.plist` should be. Only Install and Restart starts the helper that replaces the app: `/bin/sh` with a fixed script, and the app's process ID and three paths as its arguments, two of them in the app's own temporary folder. Nothing from the network or from a request reaches its arguments or any command. The app is not signed with a Developer ID yet, so a download is vouched for by the release it comes from and the hash in that release, and is as safe as the project's GitHub releases are.
|
|
40
|
+
|
|
41
|
+
`agent-lookout mcp` is a Model Context Protocol server for an agent that keeps track of your other agents. The agent's app starts it and speaks to it over stdin and stdout, so it opens no port. For each tool call it reads `GET /api/sessions` from the local server, at a loopback address only, with no `Origin` and no notifications header, exactly as `agent-lookout status` does, and answers the app with what it read. Its three tools only read: none of them reaches `POST /api/jump` or `POST /api/history/clear`, changes a notification or changes anything else. A session's name, agent, folder and branch are text that other programs wrote, and the client is a model that takes instructions from text. So each tool's description and each answer say that this text is data, never instructions, the one-sentence summary puts each name in quotation marks, and escape sequences and control characters are taken out of every text, as `agent-lookout status` does. So are characters that show nothing, such as zero-width spaces and Unicode's tag characters, in which words can be hidden from a person but not from a model.
|
|
40
42
|
|
|
41
43
|
The local API has no token, and the MCP server adds none, though one was suggested for it. The server opens no port of its own, and the API it reads is the same loopback API that the dashboard and `agent-lookout status` read without one. Websites and other computers are already kept away from that API by the `Host` and `Origin` checks and by its listening on loopback alone. Against websites and other computers a token would add nothing to those checks, and programs running as you could read a token as easily as the API. It could keep out other accounts on a shared computer, the known limit listed below, and is left for later. An API that can be reached some other way, such as from another computer, would need one too, and Agent Lookout has none. [docs/API.md](docs/API.md) describes every route and its checks.
|
|
42
44
|
|
|
@@ -57,6 +59,8 @@ Session names and folder paths can be sensitive. The main risk is that something
|
|
|
57
59
|
- A post that holds more than PRIVACY.md lists, or that goes to any address but the one in `AGENT_LOOKOUT_WEBHOOK_URL`, including by following a redirect.
|
|
58
60
|
- A session's name, folder or anything else from a session that changes the structure of a post, adds a field or a header to it, or, in Slack or a service that reads Slack's format, mentions someone, pings a channel or makes a link that shows other words than its address.
|
|
59
61
|
- A post sent over plain HTTP to an address that is not on this machine, or to a server whose certificate was not checked.
|
|
62
|
+
- What a waiting session is asking reaching an email while `AGENT_LOOKOUT_EMAIL_ASKING` is not `on`, a post while `AGENT_LOOKOUT_WEBHOOK_ASKING` is not `on`, an email's headers, or the email or post for anything but a wait.
|
|
63
|
+
- What a waiting session is asking being written to a file, an event or the history, or reaching `GET /api/email` or `GET /api/webhook`.
|
|
60
64
|
- Any write to `~/.claude` or to another tool's files, and any read of the `.key` files in `~/.claude/sessions/`.
|
|
61
65
|
- Any write under the Codex folder (`~/.codex`, or the folder `CODEX_HOME` or `AGENT_LOOKOUT_CODEX_HOME` names), any open of a file in its `thread-writer-locks/`, and any read of a Codex file that PRIVACY.md does not list.
|
|
62
66
|
- Text from a Codex session file, such as a prompt, a reply or a command's output, reaching the API or the dashboard.
|
|
@@ -68,6 +72,7 @@ Session names and folder paths can be sensitive. The main risk is that something
|
|
|
68
72
|
- Agent Lookout reading any file in or through a git repository but a `.git` file, a `HEAD` and a worktree's `commondir`, as PRIVACY.md describes, writing anything in a repository, or running a git command.
|
|
69
73
|
- Anything from the list of processes that `ps` prints, other than the name of the app a session runs in, reaching the dashboard, the API, a log or a file.
|
|
70
74
|
- A way to make the app run anything other than the `claude` binary it found, `ps`, the `tmux` binary it found and `/usr/bin/osascript`, or to pass any of them arguments they should not get.
|
|
75
|
+
- In the Mac app, a request, a release or anything from the network that makes it run anything but `/usr/bin/ditto`, `/usr/bin/plutil` and its fixed update helper, passes them arguments it did not make itself, installs a download whose size or SHA-512 is not the one the release gives or whose bundle is not Agent Lookout at the version offered, installs anything before Install and Restart is pressed, or makes a request to any host but GitHub's three for a release.
|
|
71
76
|
- A website, or a page served from anywhere but this machine, making the app select a tmux pane or bring a tab of Terminal or iTerm2 forward.
|
|
72
77
|
- A request to `POST /api/jump` that makes tmux do anything but select a pane found for a listed session, its window and its tmux session: running a command, sending keys, or reaching any other pane.
|
|
73
78
|
- A session's name, a tmux session's name, or anything else from a session or from tmux, that `tmux` reads as a command, a target or an option.
|