@geminilight/mindos 1.1.6 → 1.1.8
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/dist/server/handlers/agent-activity.d.ts +1 -1
- package/dist/server/handlers/agent-activity.d.ts.map +1 -1
- package/dist/server/handlers/agent-activity.js +8 -6
- package/dist/server/handlers/agent-activity.js.map +1 -1
- package/dist/server/handlers/ask-sessions.d.ts.map +1 -1
- package/dist/server/handlers/ask-sessions.js +150 -23
- package/dist/server/handlers/ask-sessions.js.map +1 -1
- package/dist/server/handlers/audit-log.d.ts +12 -0
- package/dist/server/handlers/audit-log.d.ts.map +1 -0
- package/dist/server/handlers/audit-log.js +265 -0
- package/dist/server/handlers/audit-log.js.map +1 -0
- package/dist/server/handlers/change-log-store.d.ts +13 -0
- package/dist/server/handlers/change-log-store.d.ts.map +1 -0
- package/dist/server/handlers/change-log-store.js +167 -0
- package/dist/server/handlers/change-log-store.js.map +1 -0
- package/dist/server/handlers/changes.d.ts +1 -1
- package/dist/server/handlers/changes.d.ts.map +1 -1
- package/dist/server/handlers/changes.js +27 -15
- package/dist/server/handlers/changes.js.map +1 -1
- package/dist/server/handlers/file.d.ts.map +1 -1
- package/dist/server/handlers/file.js +3 -48
- package/dist/server/handlers/file.js.map +1 -1
- package/dist/server/handlers/graph.d.ts +2 -5
- package/dist/server/handlers/graph.d.ts.map +1 -1
- package/dist/server/handlers/graph.js +6 -115
- package/dist/server/handlers/graph.js.map +1 -1
- package/dist/server/handlers/jsonl-log.d.ts +56 -0
- package/dist/server/handlers/jsonl-log.d.ts.map +1 -0
- package/dist/server/handlers/jsonl-log.js +153 -0
- package/dist/server/handlers/jsonl-log.js.map +1 -0
- package/dist/server/handlers/monitoring.d.ts +8 -0
- package/dist/server/handlers/monitoring.d.ts.map +1 -1
- package/dist/server/handlers/monitoring.js +25 -2
- package/dist/server/handlers/monitoring.js.map +1 -1
- package/dist/server/handlers/sync.d.ts +1 -0
- package/dist/server/handlers/sync.d.ts.map +1 -1
- package/dist/server/handlers/sync.js +35 -4
- package/dist/server/handlers/sync.js.map +1 -1
- package/dist/server/http.d.ts +4 -0
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +22 -5
- package/dist/server/http.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/link-index.d.ts +29 -0
- package/dist/server/link-index.d.ts.map +1 -0
- package/dist/server/link-index.js +137 -0
- package/dist/server/link-index.js.map +1 -0
- package/dist/server/runtime.d.ts +4 -0
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +1 -1
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/tree-cache.d.ts +35 -0
- package/dist/server/tree-cache.d.ts.map +1 -0
- package/dist/server/tree-cache.js +0 -0
- package/dist/server/tree-cache.js.map +1 -0
- package/package.json +9 -9
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AgentAuditEvent } from '../../knowledge/audit/index.js';
|
|
2
2
|
import { type MindosRequestQuery } from '../context.js';
|
|
3
3
|
import { type MindosServerResponse } from '../response.js';
|
|
4
4
|
export type AgentActivityHandlerServices = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-activity.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/agent-activity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-activity.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/agent-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,QAAQ,EAAE,4BAA4B,GACrC,OAAO,CAAC,oBAAoB,CAAC,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAQzE"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { LocalFileSystem } from '../../knowledge/storage/local.js';
|
|
2
|
-
import { listAgentAuditEvents } from '../../knowledge/audit/index.js';
|
|
3
1
|
import { queryValue } from '../context.js';
|
|
4
2
|
import { json, privateCacheHeaders } from '../response.js';
|
|
3
|
+
import { listAgentAuditEventsFromLog } from './audit-log.js';
|
|
5
4
|
export async function handleAgentActivity(query, services) {
|
|
6
5
|
const limit = parseLimit(queryValue(query, 'limit'));
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
try {
|
|
7
|
+
const events = listAgentAuditEventsFromLog(services.mindRoot, limit);
|
|
8
|
+
return json({ events }, { headers: privateCacheHeaders(30) });
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
return json({ error: error instanceof Error ? error.message : String(error) }, { status: 500 });
|
|
12
|
+
}
|
|
11
13
|
}
|
|
12
14
|
function parseLimit(value) {
|
|
13
15
|
const parsed = value ? Number.parseInt(value, 10) : 10;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-activity.js","sourceRoot":"","sources":["../../../src/server/handlers/agent-activity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-activity.js","sourceRoot":"","sources":["../../../src/server/handlers/agent-activity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAA2B,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAA6B,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAU7D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAqC,EACrC,QAAsC;IAEtC,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,2BAA2B,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAyB;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/ask-sessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ask-sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/ask-sessions.ts"],"names":[],"mappings":"AAaA,OAAO,EAAQ,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AASjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,QAAQ,GAAE,0BAA+B,GACxC,oBAAoB,CAAC,iBAAiB,EAAE,CAAC,CAE3C;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,0BAA+B,GACxC,oBAAoB,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAaxD;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,0BAA+B,GACxC,oBAAoB,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBxD"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
2
3
|
import { homedir } from 'node:os';
|
|
3
|
-
import { dirname, join } from 'node:path';
|
|
4
|
+
import { basename, dirname, extname, join } from 'node:path';
|
|
4
5
|
import { json } from '../response.js';
|
|
5
6
|
const MAX_SESSIONS = 30;
|
|
7
|
+
// One session's serialized JSON may not exceed this; oldest messages are
|
|
8
|
+
// dropped first. Keeps a runaway conversation from growing a file unboundedly.
|
|
9
|
+
const MAX_SESSION_BYTES = 4_000_000;
|
|
10
|
+
// Filesystems commonly cap filenames at 255 bytes; hash anything longer.
|
|
11
|
+
const MAX_ENCODED_ID_CHARS = 200;
|
|
6
12
|
export function handleAskSessionsGet(services = {}) {
|
|
7
13
|
return json(readSessions(resolveStorePath(services)));
|
|
8
14
|
}
|
|
@@ -12,16 +18,11 @@ export function handleAskSessionsPost(body, services = {}) {
|
|
|
12
18
|
return json({ error: 'Invalid session payload' }, { status: 400 });
|
|
13
19
|
}
|
|
14
20
|
const storePath = resolveStorePath(services);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
else {
|
|
21
|
-
sessions.push(session);
|
|
22
|
-
}
|
|
23
|
-
sessions.sort((a, b) => getUpdatedAt(b) - getUpdatedAt(a));
|
|
24
|
-
writeSessions(storePath, sessions);
|
|
21
|
+
migrateLegacyStoreIfNeeded(storePath);
|
|
22
|
+
// Per-session files: saving one session writes one small file instead of
|
|
23
|
+
// rewriting every session on each (debounced ~600ms) client flush.
|
|
24
|
+
writeSessionFile(storePath, capSessionSize(session));
|
|
25
|
+
pruneToMaxSessions(storePath);
|
|
25
26
|
return json({ ok: true });
|
|
26
27
|
}
|
|
27
28
|
export function handleAskSessionsDelete(body, services = {}) {
|
|
@@ -35,22 +36,58 @@ export function handleAskSessionsDelete(body, services = {}) {
|
|
|
35
36
|
return json({ error: 'id or ids is required' }, { status: 400 });
|
|
36
37
|
}
|
|
37
38
|
const storePath = resolveStorePath(services);
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
migrateLegacyStoreIfNeeded(storePath);
|
|
40
|
+
for (const id of ids) {
|
|
41
|
+
try {
|
|
42
|
+
unlinkSync(sessionFilePath(storePath, id));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Deleting a session that does not exist is a no-op, matching the
|
|
46
|
+
// previous filter-based behavior.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
40
49
|
return json({ ok: true });
|
|
41
50
|
}
|
|
42
51
|
function resolveStorePath(services) {
|
|
43
52
|
return services.storePath ?? join(homedir(), '.mindos', 'sessions.json');
|
|
44
53
|
}
|
|
54
|
+
/** `~/.mindos/sessions.json` (legacy single file) -> `~/.mindos/sessions/` */
|
|
55
|
+
function sessionsDirFor(storePath) {
|
|
56
|
+
const ext = extname(storePath);
|
|
57
|
+
const stem = ext ? basename(storePath, ext) : `${basename(storePath)}.d`;
|
|
58
|
+
return join(dirname(storePath), stem);
|
|
59
|
+
}
|
|
60
|
+
function encodeSessionId(id) {
|
|
61
|
+
if (id.length === 0)
|
|
62
|
+
return '_';
|
|
63
|
+
const encoded = Buffer.from(id, 'utf-8').toString('base64url');
|
|
64
|
+
if (encoded.length <= MAX_ENCODED_ID_CHARS)
|
|
65
|
+
return encoded;
|
|
66
|
+
return `h-${createHash('sha256').update(id, 'utf-8').digest('hex')}`;
|
|
67
|
+
}
|
|
68
|
+
function sessionFilePath(storePath, id) {
|
|
69
|
+
return join(sessionsDirFor(storePath), `${encodeSessionId(id)}.json`);
|
|
70
|
+
}
|
|
45
71
|
function readSessions(storePath) {
|
|
46
72
|
try {
|
|
47
|
-
|
|
73
|
+
migrateLegacyStoreIfNeeded(storePath);
|
|
74
|
+
const dir = sessionsDirFor(storePath);
|
|
75
|
+
if (!existsSync(dir))
|
|
48
76
|
return [];
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
77
|
+
const sessions = [];
|
|
78
|
+
for (const name of readdirSync(dir)) {
|
|
79
|
+
if (!name.endsWith('.json'))
|
|
80
|
+
continue;
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(readFileSync(join(dir, name), 'utf-8'));
|
|
83
|
+
if (isValidSession(parsed))
|
|
84
|
+
sessions.push(parsed);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Skip an unreadable/corrupted session file; the rest stay available.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return sessions
|
|
54
91
|
.sort((a, b) => getUpdatedAt(b) - getUpdatedAt(a))
|
|
55
92
|
.slice(0, MAX_SESSIONS);
|
|
56
93
|
}
|
|
@@ -58,9 +95,99 @@ function readSessions(storePath) {
|
|
|
58
95
|
return [];
|
|
59
96
|
}
|
|
60
97
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
98
|
+
// CONSTRAINT: read-modify-write here is only safe because every handler in this
|
|
99
|
+
// file is synchronous (single JS turn = no interleaving). If any of this moves
|
|
100
|
+
// to async fs APIs, a write queue must be added or concurrent upserts will
|
|
101
|
+
// clobber each other. Cross-process locking (web + mcp servers sharing the
|
|
102
|
+
// store) is intentionally out of scope — see spec-chat-session-concurrency.md.
|
|
103
|
+
function writeSessionFile(storePath, session) {
|
|
104
|
+
const file = sessionFilePath(storePath, session.id);
|
|
105
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
106
|
+
// Atomic replace: a crash mid-write must never leave a truncated session file.
|
|
107
|
+
const tmpPath = `${file}.${process.pid}.tmp`;
|
|
108
|
+
try {
|
|
109
|
+
writeFileSync(tmpPath, JSON.stringify(session, null, 2), 'utf-8');
|
|
110
|
+
renameSync(tmpPath, file);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
try {
|
|
114
|
+
unlinkSync(tmpPath);
|
|
115
|
+
}
|
|
116
|
+
catch { /* ignore cleanup errors */ }
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Drops oldest messages (by halves) until the serialized session fits the cap. */
|
|
121
|
+
function capSessionSize(session) {
|
|
122
|
+
if (Buffer.byteLength(JSON.stringify(session), 'utf-8') <= MAX_SESSION_BYTES)
|
|
123
|
+
return session;
|
|
124
|
+
let messages = session.messages;
|
|
125
|
+
while (messages.length > 1) {
|
|
126
|
+
messages = messages.slice(Math.ceil(messages.length / 2));
|
|
127
|
+
if (Buffer.byteLength(JSON.stringify({ ...session, messages }), 'utf-8') <= MAX_SESSION_BYTES)
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
return { ...session, messages };
|
|
131
|
+
}
|
|
132
|
+
/** Keeps only the MAX_SESSIONS most recently updated session files. */
|
|
133
|
+
function pruneToMaxSessions(storePath) {
|
|
134
|
+
const dir = sessionsDirFor(storePath);
|
|
135
|
+
let names;
|
|
136
|
+
try {
|
|
137
|
+
names = readdirSync(dir).filter((name) => name.endsWith('.json'));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (names.length <= MAX_SESSIONS)
|
|
143
|
+
return;
|
|
144
|
+
const entries = names.map((name) => {
|
|
145
|
+
let updatedAt = 0;
|
|
146
|
+
let valid = false;
|
|
147
|
+
try {
|
|
148
|
+
const parsed = JSON.parse(readFileSync(join(dir, name), 'utf-8'));
|
|
149
|
+
if (isValidSession(parsed)) {
|
|
150
|
+
valid = true;
|
|
151
|
+
updatedAt = getUpdatedAt(parsed);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Corrupted files sort oldest so they are pruned first.
|
|
156
|
+
}
|
|
157
|
+
return { name, updatedAt, valid };
|
|
158
|
+
});
|
|
159
|
+
entries.sort((a, b) => (Number(b.valid) - Number(a.valid)) || (b.updatedAt - a.updatedAt));
|
|
160
|
+
for (const entry of entries.slice(MAX_SESSIONS)) {
|
|
161
|
+
try {
|
|
162
|
+
unlinkSync(join(dir, entry.name));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Best-effort prune; a leftover file is re-pruned on the next save.
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* One-time migration of the legacy single `sessions.json` (full array rewritten
|
|
171
|
+
* on every save) into per-session files. The legacy file is removed afterwards
|
|
172
|
+
* — even when corrupted — so it can never shadow the new layout.
|
|
173
|
+
*/
|
|
174
|
+
function migrateLegacyStoreIfNeeded(storePath) {
|
|
175
|
+
if (!existsSync(storePath))
|
|
176
|
+
return;
|
|
177
|
+
try {
|
|
178
|
+
const parsed = JSON.parse(readFileSync(storePath, 'utf-8'));
|
|
179
|
+
if (Array.isArray(parsed)) {
|
|
180
|
+
for (const session of parsed.filter(isValidSession).slice(0, MAX_SESSIONS)) {
|
|
181
|
+
if (!existsSync(sessionFilePath(storePath, session.id))) {
|
|
182
|
+
writeSessionFile(storePath, capSessionSize(session));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Corrupted legacy store: previous behavior treated it as empty.
|
|
189
|
+
}
|
|
190
|
+
rmSync(storePath, { force: true });
|
|
64
191
|
}
|
|
65
192
|
function isValidSession(value) {
|
|
66
193
|
return Boolean(value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-sessions.js","sourceRoot":"","sources":["../../../src/server/handlers/ask-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ask-sessions.js","sourceRoot":"","sources":["../../../src/server/handlers/ask-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,MAAM,EACN,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,IAAI,EAA6B,MAAM,gBAAgB,CAAC;AAEjE,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,yEAAyE;AACzE,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,SAAS,CAAC;AACpC,yEAAyE;AACzE,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAsBjC,MAAM,UAAU,oBAAoB,CAClC,WAAuC,EAAE;IAEzC,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,IAAa,EACb,WAAuC,EAAE;IAEzC,MAAM,OAAO,GAAI,IAA2C,EAAE,OAAO,CAAC;IACtE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACtC,yEAAyE;IACzE,mEAAmE;IACnE,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAAa,EACb,WAAuC,EAAE;IAEzC,MAAM,OAAO,GAAG,IAA4C,CAAC;IAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;QACrC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACnF,CAAC,CAAC,OAAO,OAAO,EAAE,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;YACxD,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACd,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACtC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,UAAU,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,kCAAkC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAoC;IAC5D,OAAO,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC3E,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;IACzE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IACjC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,MAAM,IAAI,oBAAoB;QAAE,OAAO,OAAO,CAAC;IAC3D,OAAO,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB,EAAE,EAAU;IACpD,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,IAAI,CAAC;QACH,0BAA0B,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAwB,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAY,CAAC;gBAC7E,IAAI,cAAc,CAAC,MAAM,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;YACxE,CAAC;QACH,CAAC;QACD,OAAO,QAAQ;aACZ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;aACjD,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,2EAA2E;AAC3E,2EAA2E;AAC3E,+EAA+E;AAC/E,SAAS,gBAAgB,CAAC,SAAiB,EAAE,OAA0B;IACrE,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,+EAA+E;IAC/E,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IAC7C,IAAI,CAAC;QACH,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;QAClE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,cAAc,CAAC,OAA0B;IAChD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,iBAAiB;QAAE,OAAO,OAAO,CAAC;IAC7F,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,iBAAiB;YAAE,MAAM;IACvG,CAAC;IACD,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,YAAY;QAAE,OAAO;IAEzC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAY,CAAC;YAC7E,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,KAAK,GAAG,IAAI,CAAC;gBACb,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3F,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,SAAiB;IACnD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAY,CAAC;QACvE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC;gBAC3E,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACxD,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,CACZ,KAAK;WACA,OAAO,KAAK,KAAK,QAAQ;WACzB,OAAQ,KAA0B,CAAC,EAAE,KAAK,QAAQ;WAClD,KAAK,CAAC,OAAO,CAAE,KAAgC,CAAC,QAAQ,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAA0B;IAC9C,OAAO,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentAuditEvent, AgentAuditInput } from '../../knowledge/audit/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Appends a batch of audit events in a single file append (one line per
|
|
4
|
+
* event). This replaces the previous whole-file rewrite per entry, which made
|
|
5
|
+
* batched `.agent-log.json` appends O(N^2).
|
|
6
|
+
*/
|
|
7
|
+
export declare function appendAgentAuditEvents(mindRoot: string, inputs: AgentAuditInput[]): AgentAuditEvent[];
|
|
8
|
+
/** Lists audit events newest-first, normalized for the API boundary. */
|
|
9
|
+
export declare function listAgentAuditEventsFromLog(mindRoot: string, limit?: number): AgentAuditEvent[];
|
|
10
|
+
/** Parses raw `.agent-log.json`-style JSONL content leniently into audit inputs. */
|
|
11
|
+
export declare function parseAgentAuditJsonLines(raw: string): AgentAuditInput[];
|
|
12
|
+
//# sourceMappingURL=audit-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/audit-log.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAoFvF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAOrG;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,eAAe,EAAE,CAa5F;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAsBvE"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { existsSync, readFileSync, rmSync } from 'node:fs';
|
|
2
|
+
import { posix } from 'node:path';
|
|
3
|
+
import { resolveExistingSafe } from '../../foundation/security/index.js';
|
|
4
|
+
import { redactSensitiveObject, redactSensitiveText } from '../../session/redaction.js';
|
|
5
|
+
import { appendJsonlEvents, ensureJsonlStore, readJsonlEvents, writeJsonlMeta, } from './jsonl-log.js';
|
|
6
|
+
/**
|
|
7
|
+
* Append-only agent audit log backed by the shared JSONL store.
|
|
8
|
+
*
|
|
9
|
+
* On-disk format is shared with `packages/web/lib/core/agent-audit-log.ts`:
|
|
10
|
+
* `.mindos/agent-audit-log.json` holds one normalized event per line
|
|
11
|
+
* (oldest-first) and `.mindos/agent-audit-log.meta.json` tracks migration and
|
|
12
|
+
* legacy import counters. Events are redacted/summarized at write time and
|
|
13
|
+
* defensively re-normalized at read time.
|
|
14
|
+
*/
|
|
15
|
+
const LOG_FILE = '.mindos/agent-audit-log.json';
|
|
16
|
+
const META_FILE = '.mindos/agent-audit-log.meta.json';
|
|
17
|
+
const LEGACY_MD_FILE = 'Agent-Audit.md';
|
|
18
|
+
const LEGACY_JSONL_FILE = '.agent-log.json';
|
|
19
|
+
const MAX_EVENTS = 1000;
|
|
20
|
+
const MAX_MESSAGE_CHARS = 2000;
|
|
21
|
+
const COMPACTION = {
|
|
22
|
+
maxEvents: MAX_EVENTS,
|
|
23
|
+
maxBytes: 2_000_000,
|
|
24
|
+
targetBytes: 1_000_000,
|
|
25
|
+
};
|
|
26
|
+
function logPath(mindRoot) {
|
|
27
|
+
return resolveExistingSafe(mindRoot, posix.join('.mindos', 'agent-audit-log.json'));
|
|
28
|
+
}
|
|
29
|
+
function metaPath(mindRoot) {
|
|
30
|
+
return resolveExistingSafe(mindRoot, posix.join('.mindos', 'agent-audit-log.meta.json'));
|
|
31
|
+
}
|
|
32
|
+
function nowIso() {
|
|
33
|
+
return new Date().toISOString();
|
|
34
|
+
}
|
|
35
|
+
function validIso(ts) {
|
|
36
|
+
if (!ts)
|
|
37
|
+
return nowIso();
|
|
38
|
+
const ms = new Date(ts).getTime();
|
|
39
|
+
return Number.isFinite(ms) ? new Date(ms).toISOString() : nowIso();
|
|
40
|
+
}
|
|
41
|
+
function normalizeMessage(message) {
|
|
42
|
+
if (typeof message !== 'string')
|
|
43
|
+
return undefined;
|
|
44
|
+
const redacted = redactSensitiveText(message);
|
|
45
|
+
return redacted.length <= MAX_MESSAGE_CHARS ? redacted : redacted.slice(0, MAX_MESSAGE_CHARS);
|
|
46
|
+
}
|
|
47
|
+
function eventId() {
|
|
48
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
49
|
+
}
|
|
50
|
+
function buildEvent(input) {
|
|
51
|
+
const result = input.result === 'error' ? 'error' : 'ok';
|
|
52
|
+
const params = summarizeAuditParams(input.params && typeof input.params === 'object' ? input.params : {});
|
|
53
|
+
return {
|
|
54
|
+
id: eventId(),
|
|
55
|
+
ts: validIso(input.ts),
|
|
56
|
+
tool: typeof input.tool === 'string' && input.tool.trim() ? input.tool.trim() : 'unknown-tool',
|
|
57
|
+
params,
|
|
58
|
+
result,
|
|
59
|
+
actionSummary: normalizeMessage(input.actionSummary) ?? buildActionSummary(input.tool, params, result, input.message),
|
|
60
|
+
message: normalizeMessage(input.message),
|
|
61
|
+
durationMs: typeof input.durationMs === 'number' ? input.durationMs : undefined,
|
|
62
|
+
agentName: typeof input.agentName === 'string' && input.agentName.trim() ? input.agentName.trim() : undefined,
|
|
63
|
+
...(input.debugCapture === 'redacted_raw'
|
|
64
|
+
? {
|
|
65
|
+
rawDebug: redactSensitiveObject({
|
|
66
|
+
params: input.params && typeof input.params === 'object' ? input.params : {},
|
|
67
|
+
...(typeof input.message === 'string' ? { message: input.message } : {}),
|
|
68
|
+
}),
|
|
69
|
+
}
|
|
70
|
+
: {}),
|
|
71
|
+
op: 'append',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Appends a batch of audit events in a single file append (one line per
|
|
76
|
+
* event). This replaces the previous whole-file rewrite per entry, which made
|
|
77
|
+
* batched `.agent-log.json` appends O(N^2).
|
|
78
|
+
*/
|
|
79
|
+
export function appendAgentAuditEvents(mindRoot, inputs) {
|
|
80
|
+
const file = logPath(mindRoot);
|
|
81
|
+
const metaFile = metaPath(mindRoot);
|
|
82
|
+
importLegacySources(mindRoot);
|
|
83
|
+
const events = inputs.map(buildEvent);
|
|
84
|
+
appendJsonlEvents(file, metaFile, events, COMPACTION);
|
|
85
|
+
return events;
|
|
86
|
+
}
|
|
87
|
+
/** Lists audit events newest-first, normalized for the API boundary. */
|
|
88
|
+
export function listAgentAuditEventsFromLog(mindRoot, limit = 100) {
|
|
89
|
+
try {
|
|
90
|
+
importLegacySources(mindRoot);
|
|
91
|
+
const { events } = readJsonlEvents(logPath(mindRoot), metaPath(mindRoot));
|
|
92
|
+
const safeLimit = Math.max(1, Math.min(limit, MAX_EVENTS));
|
|
93
|
+
return events
|
|
94
|
+
.slice(0, MAX_EVENTS)
|
|
95
|
+
.map(normalizePersistedEvent)
|
|
96
|
+
.filter((event) => Boolean(event))
|
|
97
|
+
.slice(0, safeLimit);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Parses raw `.agent-log.json`-style JSONL content leniently into audit inputs. */
|
|
104
|
+
export function parseAgentAuditJsonLines(raw) {
|
|
105
|
+
const entries = [];
|
|
106
|
+
for (const line of raw.split('\n')) {
|
|
107
|
+
const trimmed = line.trim();
|
|
108
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('//'))
|
|
109
|
+
continue;
|
|
110
|
+
try {
|
|
111
|
+
const parsed = JSON.parse(trimmed);
|
|
112
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
113
|
+
continue;
|
|
114
|
+
entries.push({
|
|
115
|
+
ts: typeof parsed.ts === 'string' ? parsed.ts : nowIso(),
|
|
116
|
+
tool: typeof parsed.tool === 'string' && parsed.tool.trim() ? parsed.tool : 'unknown-tool',
|
|
117
|
+
params: parsed.params && typeof parsed.params === 'object' ? parsed.params : {},
|
|
118
|
+
result: parsed.result === 'error' ? 'error' : 'ok',
|
|
119
|
+
message: typeof parsed.message === 'string' ? parsed.message : undefined,
|
|
120
|
+
durationMs: typeof parsed.durationMs === 'number' ? parsed.durationMs : undefined,
|
|
121
|
+
agentName: typeof parsed.agentName === 'string' ? parsed.agentName : undefined,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Ignore malformed lines.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return entries;
|
|
129
|
+
}
|
|
130
|
+
function parseLegacyMdBlocks(raw) {
|
|
131
|
+
const blocks = [];
|
|
132
|
+
const re = /```agent-op\s*\n([\s\S]*?)```/g;
|
|
133
|
+
let match;
|
|
134
|
+
while ((match = re.exec(raw)) !== null) {
|
|
135
|
+
if (!match[1])
|
|
136
|
+
continue;
|
|
137
|
+
try {
|
|
138
|
+
blocks.push(JSON.parse(match[1].trim()));
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Ignore malformed blocks.
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return blocks;
|
|
145
|
+
}
|
|
146
|
+
function toImportedEvent(entry, op, idx) {
|
|
147
|
+
const tool = typeof entry.tool === 'string' && entry.tool.trim() ? entry.tool.trim() : 'unknown-tool';
|
|
148
|
+
const result = entry.result === 'error' ? 'error' : 'ok';
|
|
149
|
+
const params = summarizeAuditParams(entry.params && typeof entry.params === 'object' ? entry.params : {});
|
|
150
|
+
return {
|
|
151
|
+
id: `legacy-${Date.now().toString(36)}-${idx.toString(36)}`,
|
|
152
|
+
ts: validIso(entry.ts),
|
|
153
|
+
tool,
|
|
154
|
+
params,
|
|
155
|
+
result,
|
|
156
|
+
actionSummary: buildActionSummary(tool, params, result, entry.message),
|
|
157
|
+
message: normalizeMessage(entry.message),
|
|
158
|
+
durationMs: typeof entry.durationMs === 'number' ? entry.durationMs : undefined,
|
|
159
|
+
op,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function importLegacySources(mindRoot) {
|
|
163
|
+
importLegacyFile(mindRoot, LEGACY_MD_FILE, 'mdImportedCount', 'legacy_agent_audit_md_import', parseLegacyMdBlocks);
|
|
164
|
+
importLegacyFile(mindRoot, LEGACY_JSONL_FILE, 'jsonlImportedCount', 'legacy_agent_log_jsonl_import', (raw) => parseAgentAuditJsonLines(raw));
|
|
165
|
+
}
|
|
166
|
+
function importLegacyFile(mindRoot, legacyFileName, counterKey, op, parse) {
|
|
167
|
+
try {
|
|
168
|
+
const legacyPath = resolveExistingSafe(mindRoot, legacyFileName);
|
|
169
|
+
if (!existsSync(legacyPath))
|
|
170
|
+
return;
|
|
171
|
+
const entries = parse(readFileSync(legacyPath, 'utf-8'));
|
|
172
|
+
if (entries.length === 0)
|
|
173
|
+
return;
|
|
174
|
+
const file = logPath(mindRoot);
|
|
175
|
+
const metaFile = metaPath(mindRoot);
|
|
176
|
+
const meta = ensureJsonlStore(file, metaFile, { persistIfMissing: true });
|
|
177
|
+
const importedCount = typeof meta.legacy[counterKey] === 'number' ? meta.legacy[counterKey] : 0;
|
|
178
|
+
if (entries.length > importedCount) {
|
|
179
|
+
const imported = entries.slice(importedCount).map((entry, idx) => toImportedEvent(entry, op, idx));
|
|
180
|
+
appendJsonlEvents(file, metaFile, imported, COMPACTION);
|
|
181
|
+
meta.legacy = { ...meta.legacy, [counterKey]: entries.length, lastImportedAt: nowIso() };
|
|
182
|
+
writeJsonlMeta(metaFile, meta);
|
|
183
|
+
}
|
|
184
|
+
rmSync(legacyPath, { force: true });
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Legacy import is best-effort and must never break the main flow.
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function normalizePersistedEvent(value) {
|
|
191
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
192
|
+
return null;
|
|
193
|
+
const source = value;
|
|
194
|
+
const tool = typeof source.tool === 'string' && source.tool.trim() ? source.tool.trim() : 'unknown-tool';
|
|
195
|
+
const result = source.result === 'error' ? 'error' : 'ok';
|
|
196
|
+
const params = summarizeAuditParams(source.params && typeof source.params === 'object' ? source.params : {});
|
|
197
|
+
return {
|
|
198
|
+
id: typeof source.id === 'string' && source.id ? source.id : eventId(),
|
|
199
|
+
ts: validIso(source.ts),
|
|
200
|
+
tool,
|
|
201
|
+
params,
|
|
202
|
+
result,
|
|
203
|
+
actionSummary: normalizeMessage(source.actionSummary) ?? buildActionSummary(tool, params, result, source.message),
|
|
204
|
+
message: normalizeMessage(source.message),
|
|
205
|
+
durationMs: typeof source.durationMs === 'number' ? source.durationMs : undefined,
|
|
206
|
+
agentName: typeof source.agentName === 'string' && source.agentName.trim() ? source.agentName.trim() : undefined,
|
|
207
|
+
...(source.rawDebug && typeof source.rawDebug === 'object'
|
|
208
|
+
? { rawDebug: redactSensitiveObject(source.rawDebug) }
|
|
209
|
+
: {}),
|
|
210
|
+
op: source.op,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function summarizeAuditParams(params) {
|
|
214
|
+
const redacted = redactSensitiveObject(params);
|
|
215
|
+
return summarizeValue(redacted, 0);
|
|
216
|
+
}
|
|
217
|
+
function summarizeValue(value, depth) {
|
|
218
|
+
if (typeof value === 'string')
|
|
219
|
+
return summarizeString(value);
|
|
220
|
+
if (value === null || value === undefined)
|
|
221
|
+
return value;
|
|
222
|
+
if (typeof value !== 'object')
|
|
223
|
+
return value;
|
|
224
|
+
if (depth >= 5)
|
|
225
|
+
return '[max-depth]';
|
|
226
|
+
if (Array.isArray(value)) {
|
|
227
|
+
if (value.length > 20)
|
|
228
|
+
return `[${value.length} items]`;
|
|
229
|
+
return value.map((item) => summarizeValue(item, depth + 1));
|
|
230
|
+
}
|
|
231
|
+
const output = {};
|
|
232
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
233
|
+
output[key] = shouldSummarizeAuditField(key, nested)
|
|
234
|
+
? `[${String(nested ?? '').length} chars]`
|
|
235
|
+
: summarizeValue(nested, depth + 1);
|
|
236
|
+
}
|
|
237
|
+
return output;
|
|
238
|
+
}
|
|
239
|
+
function shouldSummarizeAuditField(key, value) {
|
|
240
|
+
if (typeof value !== 'string')
|
|
241
|
+
return false;
|
|
242
|
+
// Already-summarized placeholders must stay stable across re-normalization.
|
|
243
|
+
if (/^\[\d+ (chars|items)\]$/.test(value))
|
|
244
|
+
return false;
|
|
245
|
+
return /^(content|text|message|prompt|body|raw|input|output|response|diff)$/i.test(key);
|
|
246
|
+
}
|
|
247
|
+
function summarizeString(value) {
|
|
248
|
+
const redacted = redactSensitiveText(value);
|
|
249
|
+
return redacted.length > MAX_MESSAGE_CHARS ? `[${redacted.length} chars]` : redacted;
|
|
250
|
+
}
|
|
251
|
+
function buildActionSummary(tool, params, result, message) {
|
|
252
|
+
const target = firstString(params.path, params.filePath, params.filename, params.url, params.agent_id, params.agentId);
|
|
253
|
+
const query = firstString(params.q, params.query);
|
|
254
|
+
const suffix = target ? ` target=${target}` : query ? ` query=${query}` : '';
|
|
255
|
+
const note = message ? ` ${normalizeMessage(message) ?? ''}` : '';
|
|
256
|
+
return `${tool} ${result}${suffix}${note}`.trim();
|
|
257
|
+
}
|
|
258
|
+
function firstString(...values) {
|
|
259
|
+
for (const value of values) {
|
|
260
|
+
if (typeof value === 'string' && value.trim())
|
|
261
|
+
return summarizeString(value.trim());
|
|
262
|
+
}
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=audit-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../../../src/server/handlers/audit-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ContentChangeEvent, ContentChangeSource, ContentChangeSummary } from '../../knowledge/audit/index.js';
|
|
2
|
+
export interface ContentChangeListOptions {
|
|
3
|
+
path?: string;
|
|
4
|
+
limit?: number;
|
|
5
|
+
source?: ContentChangeSource;
|
|
6
|
+
op?: string;
|
|
7
|
+
q?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function listContentChangesFromLog(mindRoot: string, options?: ContentChangeListOptions): ContentChangeEvent[];
|
|
10
|
+
export declare function getContentChangeSummaryFromLog(mindRoot: string): ContentChangeSummary;
|
|
11
|
+
/** Marks all changes seen by updating only the small meta sidecar. */
|
|
12
|
+
export declare function markContentChangesSeenInLog(mindRoot: string): void;
|
|
13
|
+
//# sourceMappingURL=change-log-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-log-store.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/change-log-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AA4BxC,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AA8BD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,kBAAkB,EAAE,CAuBtB;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CAcrF;AAED,sEAAsE;AACtE,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMlE"}
|