@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.
Files changed (59) hide show
  1. package/dist/server/handlers/agent-activity.d.ts +1 -1
  2. package/dist/server/handlers/agent-activity.d.ts.map +1 -1
  3. package/dist/server/handlers/agent-activity.js +8 -6
  4. package/dist/server/handlers/agent-activity.js.map +1 -1
  5. package/dist/server/handlers/ask-sessions.d.ts.map +1 -1
  6. package/dist/server/handlers/ask-sessions.js +150 -23
  7. package/dist/server/handlers/ask-sessions.js.map +1 -1
  8. package/dist/server/handlers/audit-log.d.ts +12 -0
  9. package/dist/server/handlers/audit-log.d.ts.map +1 -0
  10. package/dist/server/handlers/audit-log.js +265 -0
  11. package/dist/server/handlers/audit-log.js.map +1 -0
  12. package/dist/server/handlers/change-log-store.d.ts +13 -0
  13. package/dist/server/handlers/change-log-store.d.ts.map +1 -0
  14. package/dist/server/handlers/change-log-store.js +167 -0
  15. package/dist/server/handlers/change-log-store.js.map +1 -0
  16. package/dist/server/handlers/changes.d.ts +1 -1
  17. package/dist/server/handlers/changes.d.ts.map +1 -1
  18. package/dist/server/handlers/changes.js +27 -15
  19. package/dist/server/handlers/changes.js.map +1 -1
  20. package/dist/server/handlers/file.d.ts.map +1 -1
  21. package/dist/server/handlers/file.js +3 -48
  22. package/dist/server/handlers/file.js.map +1 -1
  23. package/dist/server/handlers/graph.d.ts +2 -5
  24. package/dist/server/handlers/graph.d.ts.map +1 -1
  25. package/dist/server/handlers/graph.js +6 -115
  26. package/dist/server/handlers/graph.js.map +1 -1
  27. package/dist/server/handlers/jsonl-log.d.ts +56 -0
  28. package/dist/server/handlers/jsonl-log.d.ts.map +1 -0
  29. package/dist/server/handlers/jsonl-log.js +153 -0
  30. package/dist/server/handlers/jsonl-log.js.map +1 -0
  31. package/dist/server/handlers/monitoring.d.ts +8 -0
  32. package/dist/server/handlers/monitoring.d.ts.map +1 -1
  33. package/dist/server/handlers/monitoring.js +25 -2
  34. package/dist/server/handlers/monitoring.js.map +1 -1
  35. package/dist/server/handlers/sync.d.ts +1 -0
  36. package/dist/server/handlers/sync.d.ts.map +1 -1
  37. package/dist/server/handlers/sync.js +35 -4
  38. package/dist/server/handlers/sync.js.map +1 -1
  39. package/dist/server/http.d.ts +4 -0
  40. package/dist/server/http.d.ts.map +1 -1
  41. package/dist/server/http.js +22 -5
  42. package/dist/server/http.js.map +1 -1
  43. package/dist/server/index.d.ts +1 -1
  44. package/dist/server/index.d.ts.map +1 -1
  45. package/dist/server/index.js +1 -1
  46. package/dist/server/index.js.map +1 -1
  47. package/dist/server/link-index.d.ts +29 -0
  48. package/dist/server/link-index.d.ts.map +1 -0
  49. package/dist/server/link-index.js +137 -0
  50. package/dist/server/link-index.js.map +1 -0
  51. package/dist/server/runtime.d.ts +4 -0
  52. package/dist/server/runtime.d.ts.map +1 -1
  53. package/dist/server/runtime.js +1 -1
  54. package/dist/server/runtime.js.map +1 -1
  55. package/dist/server/tree-cache.d.ts +35 -0
  56. package/dist/server/tree-cache.d.ts.map +1 -0
  57. package/dist/server/tree-cache.js +0 -0
  58. package/dist/server/tree-cache.js.map +1 -0
  59. package/package.json +9 -9
@@ -1,4 +1,4 @@
1
- import { type AgentAuditEvent } from '../../knowledge/audit/index.js';
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":"AACA,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtF,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,CAMzE"}
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
- const result = await listAgentAuditEvents(new LocalFileSystem(), services.mindRoot, limit);
8
- return result.ok
9
- ? json({ events: result.value }, { headers: privateCacheHeaders(30) })
10
- : json({ error: result.error.message }, { status: 500 });
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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAwB,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,UAAU,EAA2B,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAA6B,MAAM,gBAAgB,CAAC;AAUtF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAqC,EACrC,QAAsC;IAEtC,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,eAAe,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC,EAAE;QACd,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC;QACtE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAC7D,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
+ {"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":"AAGA,OAAO,EAAQ,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAIjE,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,CAkBxD;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,CAgBxD"}
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
- const sessions = readSessions(storePath);
16
- const idx = sessions.findIndex((item) => item.id === session.id);
17
- if (idx >= 0) {
18
- sessions[idx] = session;
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
- const deleteSet = new Set(ids);
39
- writeSessions(storePath, readSessions(storePath).filter((session) => !deleteSet.has(session.id)));
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
- if (!existsSync(storePath))
73
+ migrateLegacyStoreIfNeeded(storePath);
74
+ const dir = sessionsDirFor(storePath);
75
+ if (!existsSync(dir))
48
76
  return [];
49
- const parsed = JSON.parse(readFileSync(storePath, 'utf-8'));
50
- if (!Array.isArray(parsed))
51
- return [];
52
- return parsed
53
- .filter(isValidSession)
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
- function writeSessions(storePath, sessions) {
62
- mkdirSync(dirname(storePath), { recursive: true });
63
- writeFileSync(storePath, JSON.stringify(sessions.slice(0, MAX_SESSIONS), null, 2), 'utf-8');
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,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,IAAI,EAA6B,MAAM,gBAAgB,CAAC;AAEjE,MAAM,YAAY,GAAG,EAAE,CAAC;AAsBxB,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,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;IACjE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnC,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,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClG,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,SAAS,YAAY,CAAC,SAAiB;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAY,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAM;aACV,MAAM,CAAC,cAAc,CAAC;aACtB,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,SAAS,aAAa,CAAC,SAAiB,EAAE,QAA6B;IACrE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9F,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"}
1
+ {"version":3,"file":"ask-sessions.js","sourceRoot":"","sources":["../../../src/server/handlers/ask-sessions.ts"],"names":[],"mappings":"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"}
@@ -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"}