@agent-beam/beam 0.2.22 → 0.2.24
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/README.md +115 -1
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -1
- package/dist/client.js +35 -1
- package/dist/client.js.map +1 -1
- package/dist/core.d.ts +11 -0
- package/dist/core.js +9 -1
- package/dist/core.js.map +1 -1
- package/dist/cve.d.ts +11 -0
- package/dist/cve.js +73 -0
- package/dist/cve.js.map +1 -0
- package/dist/edit-stats.d.ts +6 -0
- package/dist/edit-stats.js +74 -0
- package/dist/edit-stats.js.map +1 -0
- package/dist/hook-adapters.js +4 -2
- package/dist/hook-adapters.js.map +1 -1
- package/dist/judge-cli.d.ts +2 -0
- package/dist/judge-cli.js +73 -0
- package/dist/judge-cli.js.map +1 -0
- package/dist/judge.d.ts +40 -0
- package/dist/judge.js +189 -0
- package/dist/judge.js.map +1 -0
- package/dist/lockfiles.d.ts +19 -0
- package/dist/lockfiles.js +255 -0
- package/dist/lockfiles.js.map +1 -0
- package/dist/monitor-client.d.ts +90 -0
- package/dist/monitor-client.js +46 -0
- package/dist/monitor-client.js.map +1 -0
- package/dist/monitor-llm.d.ts +20 -0
- package/dist/monitor-llm.js +108 -0
- package/dist/monitor-llm.js.map +1 -0
- package/dist/monitor-rules.d.ts +32 -0
- package/dist/monitor-rules.js +108 -0
- package/dist/monitor-rules.js.map +1 -0
- package/dist/monitor.d.ts +72 -0
- package/dist/monitor.js +459 -0
- package/dist/monitor.js.map +1 -0
- package/dist/session-title.d.ts +25 -0
- package/dist/session-title.js +185 -0
- package/dist/session-title.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { mkdir, readdir, readFile, rename, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { getDataDirectory } from "./config.js";
|
|
5
|
+
import { redact } from "./core.js";
|
|
6
|
+
// A session's title is decided once, on the device, and never recomputed per event:
|
|
7
|
+
// 1. the first prompt of a session, trimmed and redacted, becomes the title straight away;
|
|
8
|
+
// 2. Claude Code / Codex write their own title a moment later -- if one shows up it replaces the
|
|
9
|
+
// prompt title exactly once, then the title is locked.
|
|
10
|
+
// Everything here is plain string/file work -- no model call, so it never spends the user's tokens.
|
|
11
|
+
// Set BEAM_SESSION_TITLES=off to stop titles (and so any prompt text) leaving the machine.
|
|
12
|
+
const TITLE_MAX = 80;
|
|
13
|
+
const AGENT_TITLE_ATTEMPTS = 3;
|
|
14
|
+
const MAX_TRANSCRIPT_BYTES = 20_000_000;
|
|
15
|
+
const MAX_TRACKED_SESSIONS = 200;
|
|
16
|
+
const STATE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
17
|
+
export function sessionTitlesEnabled() {
|
|
18
|
+
return !/^(off|0|false|no)$/i.test(process.env.BEAM_SESSION_TITLES ?? "");
|
|
19
|
+
}
|
|
20
|
+
/** First line of the prompt, secrets redacted, whitespace collapsed, capped at TITLE_MAX. */
|
|
21
|
+
export function titleFromPrompt(prompt) {
|
|
22
|
+
const firstLine = prompt
|
|
23
|
+
.replace(/<[^>\n]+>[\s\S]*?<\/[^>\n]+>/g, " ") // injected wrappers like <timestamp>...</timestamp>
|
|
24
|
+
.split(/\r?\n/)
|
|
25
|
+
.map(line => line.trim())
|
|
26
|
+
.find(line => line.length > 0) ?? "";
|
|
27
|
+
const clean = redact(firstLine).replace(/\s+/g, " ").trim();
|
|
28
|
+
return clean.length > TITLE_MAX ? `${clean.slice(0, TITLE_MAX - 1).trimEnd()}…` : clean;
|
|
29
|
+
}
|
|
30
|
+
function statePath() { return join(getDataDirectory(), "session-titles.json"); }
|
|
31
|
+
async function loadState() {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(await readFile(statePath(), "utf8"));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function saveState(state) {
|
|
40
|
+
try {
|
|
41
|
+
const cutoff = Date.now() - STATE_TTL_MS;
|
|
42
|
+
const kept = Object.entries(state)
|
|
43
|
+
.filter(([, entry]) => entry.ts >= cutoff)
|
|
44
|
+
.sort((a, b) => b[1].ts - a[1].ts)
|
|
45
|
+
.slice(0, MAX_TRACKED_SESSIONS);
|
|
46
|
+
const dir = getDataDirectory();
|
|
47
|
+
await mkdir(dir, { recursive: true });
|
|
48
|
+
const target = statePath();
|
|
49
|
+
const temp = `${target}.${process.pid}.tmp`;
|
|
50
|
+
await writeFile(temp, JSON.stringify(Object.fromEntries(kept)), { mode: 0o600 });
|
|
51
|
+
await rename(temp, target);
|
|
52
|
+
}
|
|
53
|
+
catch { /* best-effort enrichment only */ }
|
|
54
|
+
}
|
|
55
|
+
// Claude Code appends {"type":"ai-title","aiTitle":"...","sessionId":"..."} to the session transcript.
|
|
56
|
+
async function claudeCodeTitle(home, sessionId, transcriptPath) {
|
|
57
|
+
const candidates = [];
|
|
58
|
+
if (transcriptPath)
|
|
59
|
+
candidates.push(transcriptPath);
|
|
60
|
+
else {
|
|
61
|
+
const projectsDir = join(home, ".claude", "projects");
|
|
62
|
+
let dirs = [];
|
|
63
|
+
try {
|
|
64
|
+
dirs = await readdir(projectsDir);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return "";
|
|
68
|
+
}
|
|
69
|
+
for (const dir of dirs)
|
|
70
|
+
candidates.push(join(projectsDir, dir, `${sessionId}.jsonl`));
|
|
71
|
+
}
|
|
72
|
+
for (const file of candidates) {
|
|
73
|
+
try {
|
|
74
|
+
if ((await stat(file)).size > MAX_TRANSCRIPT_BYTES)
|
|
75
|
+
continue;
|
|
76
|
+
const content = await readFile(file, "utf8");
|
|
77
|
+
const at = content.lastIndexOf('"type":"ai-title"');
|
|
78
|
+
if (at < 0)
|
|
79
|
+
return "";
|
|
80
|
+
const lineStart = content.lastIndexOf("\n", at) + 1;
|
|
81
|
+
const lineEnd = content.indexOf("\n", at);
|
|
82
|
+
const row = JSON.parse(content.slice(lineStart, lineEnd < 0 ? undefined : lineEnd));
|
|
83
|
+
return typeof row.aiTitle === "string" ? row.aiTitle : "";
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return "";
|
|
90
|
+
}
|
|
91
|
+
// Codex keeps {"id":"<session id>","thread_name":"..."} lines in ~/.codex/session_index.jsonl.
|
|
92
|
+
async function codexTitle(home, sessionId) {
|
|
93
|
+
try {
|
|
94
|
+
const lines = (await readFile(join(home, ".codex", "session_index.jsonl"), "utf8")).split("\n");
|
|
95
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
96
|
+
if (!lines[i].includes(sessionId))
|
|
97
|
+
continue;
|
|
98
|
+
const row = JSON.parse(lines[i]);
|
|
99
|
+
if (row.id === sessionId && typeof row.thread_name === "string")
|
|
100
|
+
return row.thread_name;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch { /* no index yet */ }
|
|
104
|
+
return "";
|
|
105
|
+
}
|
|
106
|
+
async function agentTitle(agent, home, sessionId, transcriptPath) {
|
|
107
|
+
const raw = agent === "claude-code" ? await claudeCodeTitle(home, sessionId, transcriptPath)
|
|
108
|
+
: agent === "codex" ? await codexTitle(home, sessionId)
|
|
109
|
+
: "";
|
|
110
|
+
return raw ? titleFromPrompt(raw) : "";
|
|
111
|
+
}
|
|
112
|
+
const STOPWORDS = new Set(["the", "and", "for", "that", "this", "with", "from", "have", "what", "when", "where", "which", "into", "can", "you", "please", "also", "then", "them", "they", "just", "will", "would", "should", "could", "about", "there", "here", "yes", "not", "but", "are", "was", "how", "why", "now"]);
|
|
113
|
+
const RECENT_TOPICS = 3;
|
|
114
|
+
const MIN_TOPIC_WORDS = 3;
|
|
115
|
+
const SHIFT_OVERLAP = 0.15;
|
|
116
|
+
function words(text) {
|
|
117
|
+
return [...new Set(text.toLowerCase().match(/[a-z0-9_.\/-]{4,}/g)?.filter(w => !STOPWORDS.has(w)) ?? [])];
|
|
118
|
+
}
|
|
119
|
+
// Word overlap against the last few topics -- a cheap local check, no model. Short follow-ups
|
|
120
|
+
// ("yes", "continue", "run the tests") carry too little signal to move the topic or flag a shift.
|
|
121
|
+
function isTopicShift(topic, recent) {
|
|
122
|
+
const next = words(topic);
|
|
123
|
+
if (next.length < MIN_TOPIC_WORDS - 1 || !recent.length)
|
|
124
|
+
return false;
|
|
125
|
+
const previous = new Set(recent.flatMap(words));
|
|
126
|
+
if (!previous.size)
|
|
127
|
+
return false;
|
|
128
|
+
const shared = next.filter(w => previous.has(w)).length;
|
|
129
|
+
return shared / Math.min(next.length, previous.size) < SHIFT_OVERLAP;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Called for a prompt.submit event, before the prompt is stripped. The first prompt fixes the
|
|
133
|
+
* session title (never changed by later prompts); every prompt starts a new turn and, when it is
|
|
134
|
+
* substantive, becomes the "now working on" topic and is checked for a topic/directory shift.
|
|
135
|
+
*/
|
|
136
|
+
export async function notePrompt(sessionId, prompt, cwd = "") {
|
|
137
|
+
if (!sessionId || !prompt)
|
|
138
|
+
return;
|
|
139
|
+
const topic = titleFromPrompt(prompt);
|
|
140
|
+
if (!topic)
|
|
141
|
+
return;
|
|
142
|
+
const state = await loadState();
|
|
143
|
+
const entry = state[sessionId];
|
|
144
|
+
if (!entry) {
|
|
145
|
+
state[sessionId] = { title: topic, source: "prompt", attempts: 0, ts: Date.now(), turn: 1, topic, shift: false, cwd, recent: [topic] };
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const substantive = words(topic).length >= MIN_TOPIC_WORDS - 1;
|
|
149
|
+
const cwdChanged = Boolean(cwd && entry.cwd && cwd !== entry.cwd);
|
|
150
|
+
entry.turn = (entry.turn ?? 1) + 1;
|
|
151
|
+
entry.ts = Date.now();
|
|
152
|
+
entry.shift = cwdChanged || (substantive && isTopicShift(topic, entry.recent ?? []));
|
|
153
|
+
if (substantive) {
|
|
154
|
+
entry.topic = topic;
|
|
155
|
+
entry.recent = [...(entry.recent ?? []), topic].slice(-RECENT_TOPICS);
|
|
156
|
+
}
|
|
157
|
+
if (cwd)
|
|
158
|
+
entry.cwd = cwd;
|
|
159
|
+
}
|
|
160
|
+
await saveState(state);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* The locked title plus the current turn for a session, or null if none is known yet. A prompt-derived title gets a few
|
|
164
|
+
* chances (AGENT_TITLE_ATTEMPTS) to be replaced by the agent's own title; after that, or once an
|
|
165
|
+
* agent title is in, the answer comes straight from the small local state file.
|
|
166
|
+
*/
|
|
167
|
+
export async function sessionContextFor(agent, sessionId, options = {}) {
|
|
168
|
+
if (!sessionId)
|
|
169
|
+
return null;
|
|
170
|
+
const state = await loadState();
|
|
171
|
+
const entry = state[sessionId];
|
|
172
|
+
if (!entry)
|
|
173
|
+
return null;
|
|
174
|
+
if (entry.source === "prompt" && entry.attempts < AGENT_TITLE_ATTEMPTS) {
|
|
175
|
+
const found = await agentTitle(agent, options.home ?? homedir(), sessionId, options.transcriptPath);
|
|
176
|
+
entry.attempts += 1;
|
|
177
|
+
if (found) {
|
|
178
|
+
entry.title = found;
|
|
179
|
+
entry.source = "agent";
|
|
180
|
+
}
|
|
181
|
+
await saveState(state);
|
|
182
|
+
}
|
|
183
|
+
return { title: entry.title, titleSource: entry.source, turn: entry.turn ?? 1, topic: entry.topic ?? entry.title, shift: Boolean(entry.shift) };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=session-title.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-title.js","sourceRoot":"","sources":["../src/session-title.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-beam/beam",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.24",
|
|
4
4
|
"description": "Local-first observation and heuristic risk scanning for AI coding agents (Claude Code, Codex, Cursor, Copilot CLI, Gemini). Redacts secrets, flags risky tool calls, scans skills and MCP configs offline.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai agent security",
|
|
@@ -75,4 +75,4 @@
|
|
|
75
75
|
"tsx": "^4.19.2",
|
|
76
76
|
"typescript": "^5.7.2"
|
|
77
77
|
}
|
|
78
|
-
}
|
|
78
|
+
}
|