@geminilight/mindos 1.1.5 → 1.1.7
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/contract.d.ts.map +1 -1
- package/dist/server/contract.js +3 -0
- package/dist/server/contract.js.map +1 -1
- 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/assistants.d.ts +89 -0
- package/dist/server/handlers/assistants.d.ts.map +1 -0
- package/dist/server/handlers/assistants.js +369 -0
- package/dist/server/handlers/assistants.js.map +1 -0
- 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 +24 -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/mcp-install.d.ts.map +1 -1
- package/dist/server/handlers/mcp-install.js +5 -2
- package/dist/server/handlers/mcp-install.js.map +1 -1
- 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 +35 -5
- package/dist/server/http.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -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/route-ownership.d.ts.map +1 -1
- package/dist/server/route-ownership.js +1 -0
- package/dist/server/route-ownership.js.map +1 -1
- 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
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { posix } from 'node:path';
|
|
3
|
+
import { resolveExistingSafe, resolveSafe } from '../../foundation/security/index.js';
|
|
4
|
+
import { json, privateCacheHeaders } from '../response.js';
|
|
5
|
+
export const MINDOS_ASSISTANTS_ROOT = '.mindos/assistants';
|
|
6
|
+
const SAFE_ASSISTANT_ID = /^[a-z0-9][a-z0-9-]*$/;
|
|
7
|
+
const MAX_PROMPT_BYTES = 256 * 1024;
|
|
8
|
+
const BUILTIN_ASSISTANT_IDS = new Set([
|
|
9
|
+
'inbox-organizer',
|
|
10
|
+
'daily-signal',
|
|
11
|
+
'decision-synthesizer',
|
|
12
|
+
'rule-keeper',
|
|
13
|
+
'boundary-reviewer',
|
|
14
|
+
'method-organizer',
|
|
15
|
+
'checklist-builder',
|
|
16
|
+
'tool-inventory',
|
|
17
|
+
'resource-auditor',
|
|
18
|
+
]);
|
|
19
|
+
export function handleAssistantsGet(services) {
|
|
20
|
+
try {
|
|
21
|
+
return json({
|
|
22
|
+
root: MINDOS_ASSISTANTS_ROOT,
|
|
23
|
+
assistants: listLocalAssistants(services.mindRoot),
|
|
24
|
+
}, { headers: privateCacheHeaders(10) });
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
28
|
+
if (/access denied|outside root|absolute paths|symlink/i.test(message)) {
|
|
29
|
+
return json({ error: 'Access denied' }, { status: 403 });
|
|
30
|
+
}
|
|
31
|
+
return json({ error: message }, { status: 500 });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function handleAssistantsPost(body, services) {
|
|
35
|
+
try {
|
|
36
|
+
const record = objectBody(body);
|
|
37
|
+
const assistantId = sanitizeAssistantId(record.id);
|
|
38
|
+
if (!assistantId) {
|
|
39
|
+
return json({ error: 'Invalid assistant id' }, { status: 400 });
|
|
40
|
+
}
|
|
41
|
+
if (isMindosBuiltinAssistantId(assistantId)) {
|
|
42
|
+
return json({ error: 'Built-in assistants are managed by MindOS' }, { status: 409 });
|
|
43
|
+
}
|
|
44
|
+
const rootRelPath = posix.join(MINDOS_ASSISTANTS_ROOT, assistantId);
|
|
45
|
+
ensureAssistantsRoot(services.mindRoot);
|
|
46
|
+
const rootPath = resolveSafe(services.mindRoot, rootRelPath);
|
|
47
|
+
if (existsSync(rootPath)) {
|
|
48
|
+
return json({ error: 'Assistant already exists' }, { status: 409 });
|
|
49
|
+
}
|
|
50
|
+
mkdirSync(rootPath, { recursive: false });
|
|
51
|
+
resolveExistingSafe(services.mindRoot, rootRelPath);
|
|
52
|
+
const name = sanitizeString(record.name, 80) ?? titleizeAssistantId(assistantId);
|
|
53
|
+
const description = sanitizeString(record.description, 280) ?? '';
|
|
54
|
+
const preferredAgent = sanitizeString(record.preferredAgent, 120) ?? 'mindos-agent';
|
|
55
|
+
const profile = {
|
|
56
|
+
name,
|
|
57
|
+
description,
|
|
58
|
+
schemaVersion: 1,
|
|
59
|
+
preferredAgent,
|
|
60
|
+
skills: sanitizeStringArray(record.skills) ?? [],
|
|
61
|
+
mcp: sanitizeStringArray(record.mcp) ?? [],
|
|
62
|
+
};
|
|
63
|
+
const prompt = sanitizeMultiline(record.prompt) ?? defaultAssistantPrompt(name, description);
|
|
64
|
+
writeFileSync(resolveSafe(services.mindRoot, posix.join(rootRelPath, 'profile.json')), `${JSON.stringify(profile, null, 2)}\n`, 'utf-8');
|
|
65
|
+
writeFileSync(resolveSafe(services.mindRoot, posix.join(rootRelPath, 'prompt.md')), prompt.endsWith('\n') ? prompt : `${prompt}\n`, 'utf-8');
|
|
66
|
+
return json({
|
|
67
|
+
ok: true,
|
|
68
|
+
id: assistantId,
|
|
69
|
+
paths: {
|
|
70
|
+
root: rootRelPath,
|
|
71
|
+
profile: posix.join(rootRelPath, 'profile.json'),
|
|
72
|
+
prompt: posix.join(rootRelPath, 'prompt.md'),
|
|
73
|
+
},
|
|
74
|
+
}, { status: 201 });
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return assistantErrorResponse(error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function handleAssistantsDelete(body, services) {
|
|
81
|
+
try {
|
|
82
|
+
const record = objectBody(body);
|
|
83
|
+
const assistantId = sanitizeAssistantId(record.id);
|
|
84
|
+
if (!assistantId) {
|
|
85
|
+
return json({ error: 'Invalid assistant id' }, { status: 400 });
|
|
86
|
+
}
|
|
87
|
+
if (isMindosBuiltinAssistantId(assistantId)) {
|
|
88
|
+
return json({ error: 'Built-in assistants cannot be deleted' }, { status: 403 });
|
|
89
|
+
}
|
|
90
|
+
const rootRelPath = posix.join(MINDOS_ASSISTANTS_ROOT, assistantId);
|
|
91
|
+
const rootPath = resolveExistingSafe(services.mindRoot, rootRelPath);
|
|
92
|
+
if (!existsSync(rootPath)) {
|
|
93
|
+
return json({ error: 'Assistant not found' }, { status: 404 });
|
|
94
|
+
}
|
|
95
|
+
if (!lstatSync(rootPath).isDirectory()) {
|
|
96
|
+
return json({ error: 'Assistant path is not a directory' }, { status: 409 });
|
|
97
|
+
}
|
|
98
|
+
rmSync(rootPath, { recursive: true, force: false });
|
|
99
|
+
return json({ ok: true, id: assistantId });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return assistantErrorResponse(error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function listLocalAssistants(mindRoot) {
|
|
106
|
+
const rootPath = resolveExistingSafe(mindRoot, MINDOS_ASSISTANTS_ROOT);
|
|
107
|
+
if (!existsSync(rootPath))
|
|
108
|
+
return [];
|
|
109
|
+
if (!statSync(rootPath).isDirectory())
|
|
110
|
+
return [];
|
|
111
|
+
return readdirSync(rootPath, { withFileTypes: true })
|
|
112
|
+
.filter((entry) => entry.isDirectory() && SAFE_ASSISTANT_ID.test(entry.name))
|
|
113
|
+
.map((entry) => readAssistantDirectory(mindRoot, entry.name))
|
|
114
|
+
.sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id));
|
|
115
|
+
}
|
|
116
|
+
export function isMindosBuiltinAssistantId(assistantId) {
|
|
117
|
+
return BUILTIN_ASSISTANT_IDS.has(assistantId);
|
|
118
|
+
}
|
|
119
|
+
function readAssistantDirectory(mindRoot, assistantId) {
|
|
120
|
+
const rootRelPath = posix.join(MINDOS_ASSISTANTS_ROOT, assistantId);
|
|
121
|
+
const promptPath = posix.join(MINDOS_ASSISTANTS_ROOT, assistantId, 'prompt.md');
|
|
122
|
+
const profilePath = posix.join(MINDOS_ASSISTANTS_ROOT, assistantId, 'profile.json');
|
|
123
|
+
const profile = readAssistantProfile(mindRoot, profilePath);
|
|
124
|
+
const prompt = readAssistantPrompt(mindRoot, promptPath);
|
|
125
|
+
const promptBody = stripLeadingFrontmatter(prompt.content);
|
|
126
|
+
const promptTitle = extractPromptTitle(promptBody);
|
|
127
|
+
const fallbackName = promptTitle ?? titleizeAssistantId(assistantId);
|
|
128
|
+
const source = isMindosBuiltinAssistantId(assistantId) ? 'builtin' : 'custom';
|
|
129
|
+
const healthIssues = assistantHealthIssues(profile, prompt);
|
|
130
|
+
const description = firstNonEmptyString(profile.description, prompt.promptPreview, 'Local assistant profile.');
|
|
131
|
+
return {
|
|
132
|
+
id: assistantId,
|
|
133
|
+
name: firstNonEmptyString(profile.name, fallbackName),
|
|
134
|
+
description,
|
|
135
|
+
schemaVersion: 1,
|
|
136
|
+
...(profile.preferredAgent ? { preferredAgent: profile.preferredAgent } : {}),
|
|
137
|
+
skills: profile.skills,
|
|
138
|
+
mcp: profile.mcp,
|
|
139
|
+
source,
|
|
140
|
+
deletable: source === 'custom',
|
|
141
|
+
paths: {
|
|
142
|
+
root: rootRelPath,
|
|
143
|
+
profile: profilePath,
|
|
144
|
+
prompt: promptPath,
|
|
145
|
+
},
|
|
146
|
+
prompt: {
|
|
147
|
+
exists: prompt.exists,
|
|
148
|
+
...(prompt.content ? { content: prompt.content } : {}),
|
|
149
|
+
},
|
|
150
|
+
health: {
|
|
151
|
+
state: healthIssues.length > 0 ? 'warning' : 'ready',
|
|
152
|
+
issues: healthIssues,
|
|
153
|
+
},
|
|
154
|
+
promptPath,
|
|
155
|
+
profilePath,
|
|
156
|
+
promptReady: prompt.exists && !prompt.tooLarge,
|
|
157
|
+
profileReady: profile.ready,
|
|
158
|
+
...(promptTitle ? { promptTitle } : {}),
|
|
159
|
+
promptPreview: prompt.promptPreview,
|
|
160
|
+
...(profile.error ? { profileError: profile.error } : {}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function readAssistantProfile(mindRoot, profilePath) {
|
|
164
|
+
const result = {
|
|
165
|
+
ready: false,
|
|
166
|
+
exists: false,
|
|
167
|
+
schemaVersion: 1,
|
|
168
|
+
skills: [],
|
|
169
|
+
mcp: [],
|
|
170
|
+
};
|
|
171
|
+
let resolvedPath;
|
|
172
|
+
try {
|
|
173
|
+
resolvedPath = resolveExistingSafe(mindRoot, profilePath);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
if (!existsSync(resolvedPath))
|
|
179
|
+
return result;
|
|
180
|
+
try {
|
|
181
|
+
if (!lstatSync(resolvedPath).isFile())
|
|
182
|
+
return result;
|
|
183
|
+
const parsed = JSON.parse(readFileSync(resolvedPath, 'utf-8'));
|
|
184
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
185
|
+
return { ...result, ready: true, error: 'invalid_json' };
|
|
186
|
+
}
|
|
187
|
+
const record = parsed;
|
|
188
|
+
const schemaVersion = sanitizeSchemaVersion(record.schemaVersion);
|
|
189
|
+
return {
|
|
190
|
+
ready: true,
|
|
191
|
+
exists: true,
|
|
192
|
+
name: sanitizeString(record.name, 80),
|
|
193
|
+
description: sanitizeString(record.description, 280) ?? sanitizeString(record.desc, 280),
|
|
194
|
+
schemaVersion,
|
|
195
|
+
preferredAgent: sanitizeString(record.preferredAgent, 120),
|
|
196
|
+
skills: sanitizeStringArray(record.skills) ?? [],
|
|
197
|
+
mcp: sanitizeStringArray(record.mcp) ?? [],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (error instanceof SyntaxError)
|
|
202
|
+
return { ...result, ready: true, exists: true, error: 'invalid_json' };
|
|
203
|
+
return { ...result, ready: true, exists: true, error: 'unreadable' };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function readAssistantPrompt(mindRoot, promptPath) {
|
|
207
|
+
let resolvedPath;
|
|
208
|
+
try {
|
|
209
|
+
resolvedPath = resolveExistingSafe(mindRoot, promptPath);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return { exists: false, content: '', promptPreview: '' };
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
if (!existsSync(resolvedPath) || !lstatSync(resolvedPath).isFile()) {
|
|
216
|
+
return { exists: false, content: '', promptPreview: '' };
|
|
217
|
+
}
|
|
218
|
+
const stat = statSync(resolvedPath);
|
|
219
|
+
if (stat.size > MAX_PROMPT_BYTES) {
|
|
220
|
+
return {
|
|
221
|
+
exists: true,
|
|
222
|
+
content: '',
|
|
223
|
+
promptPreview: `Prompt is larger than ${Math.round(MAX_PROMPT_BYTES / 1024)} KB. Open the file to inspect it.`,
|
|
224
|
+
tooLarge: {
|
|
225
|
+
sizeBytes: stat.size,
|
|
226
|
+
maxBytes: MAX_PROMPT_BYTES,
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const content = readFileSync(resolvedPath, 'utf-8');
|
|
231
|
+
return {
|
|
232
|
+
exists: true,
|
|
233
|
+
content,
|
|
234
|
+
promptPreview: makePreview(stripLeadingFrontmatter(content)),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return { exists: false, content: '', promptPreview: '' };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function sanitizeString(value, maxLength) {
|
|
242
|
+
if (typeof value !== 'string')
|
|
243
|
+
return undefined;
|
|
244
|
+
const normalized = value.trim().replace(/\s+/g, ' ');
|
|
245
|
+
return normalized ? normalized.slice(0, maxLength) : undefined;
|
|
246
|
+
}
|
|
247
|
+
function sanitizeStringArray(value) {
|
|
248
|
+
const rawItems = Array.isArray(value)
|
|
249
|
+
? value
|
|
250
|
+
: typeof value === 'string'
|
|
251
|
+
? value.split(',')
|
|
252
|
+
: [];
|
|
253
|
+
const items = rawItems
|
|
254
|
+
.map((item) => sanitizeString(item, 96))
|
|
255
|
+
.filter((item) => Boolean(item));
|
|
256
|
+
return items.length > 0 ? Array.from(new Set(items)).slice(0, 12) : undefined;
|
|
257
|
+
}
|
|
258
|
+
function sanitizeAssistantId(value) {
|
|
259
|
+
if (typeof value !== 'string')
|
|
260
|
+
return undefined;
|
|
261
|
+
const normalized = value.trim().toLowerCase();
|
|
262
|
+
return SAFE_ASSISTANT_ID.test(normalized) ? normalized : undefined;
|
|
263
|
+
}
|
|
264
|
+
function sanitizeMultiline(value) {
|
|
265
|
+
if (typeof value !== 'string')
|
|
266
|
+
return undefined;
|
|
267
|
+
const normalized = value.replace(/\r\n/g, '\n').trim();
|
|
268
|
+
return normalized ? normalized.slice(0, 64_000) : undefined;
|
|
269
|
+
}
|
|
270
|
+
function sanitizeSchemaVersion(value) {
|
|
271
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 1)
|
|
272
|
+
return 1;
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
function stripLeadingFrontmatter(content) {
|
|
276
|
+
const normalized = content.replace(/\r\n/g, '\n');
|
|
277
|
+
if (!normalized.startsWith('---\n'))
|
|
278
|
+
return content.trim();
|
|
279
|
+
const end = normalized.indexOf('\n---', 4);
|
|
280
|
+
if (end === -1)
|
|
281
|
+
return content.trim();
|
|
282
|
+
const afterFence = normalized.slice(end + 4).replace(/^\n+/, '');
|
|
283
|
+
return afterFence.trim();
|
|
284
|
+
}
|
|
285
|
+
function extractPromptTitle(content) {
|
|
286
|
+
const match = content.match(/^#\s+(.+?)\s*$/m);
|
|
287
|
+
return sanitizeString(match?.[1], 100);
|
|
288
|
+
}
|
|
289
|
+
function makePreview(content, maxLength = 180) {
|
|
290
|
+
const normalized = content
|
|
291
|
+
.replace(/^#+\s+/gm, '')
|
|
292
|
+
.replace(/\s+/g, ' ')
|
|
293
|
+
.trim();
|
|
294
|
+
if (normalized.length <= maxLength)
|
|
295
|
+
return normalized;
|
|
296
|
+
return `${normalized.slice(0, maxLength - 1).trimEnd()}…`;
|
|
297
|
+
}
|
|
298
|
+
function titleizeAssistantId(assistantId) {
|
|
299
|
+
return assistantId
|
|
300
|
+
.split('-')
|
|
301
|
+
.filter(Boolean)
|
|
302
|
+
.map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)
|
|
303
|
+
.join(' ') || assistantId;
|
|
304
|
+
}
|
|
305
|
+
function firstNonEmptyString(...values) {
|
|
306
|
+
return values.find((value) => typeof value === 'string' && value.trim().length > 0)?.trim() ?? '';
|
|
307
|
+
}
|
|
308
|
+
function objectBody(body) {
|
|
309
|
+
return body && typeof body === 'object' && !Array.isArray(body)
|
|
310
|
+
? body
|
|
311
|
+
: {};
|
|
312
|
+
}
|
|
313
|
+
function ensureAssistantsRoot(mindRoot) {
|
|
314
|
+
resolveExistingSafe(mindRoot, MINDOS_ASSISTANTS_ROOT);
|
|
315
|
+
const rootPath = resolveSafe(mindRoot, MINDOS_ASSISTANTS_ROOT);
|
|
316
|
+
mkdirSync(rootPath, { recursive: true });
|
|
317
|
+
resolveExistingSafe(mindRoot, MINDOS_ASSISTANTS_ROOT);
|
|
318
|
+
}
|
|
319
|
+
function defaultAssistantPrompt(name, description) {
|
|
320
|
+
return `# ${name}
|
|
321
|
+
|
|
322
|
+
## Role
|
|
323
|
+
|
|
324
|
+
${description || 'Describe what this assistant should help with.'}
|
|
325
|
+
|
|
326
|
+
## Inputs
|
|
327
|
+
|
|
328
|
+
- Add the files, notes, or context this assistant should inspect.
|
|
329
|
+
|
|
330
|
+
## Output
|
|
331
|
+
|
|
332
|
+
Return a concise, reviewable result.
|
|
333
|
+
|
|
334
|
+
## Boundaries
|
|
335
|
+
|
|
336
|
+
- Prefer proposing changes before applying them.
|
|
337
|
+
- Do not read secrets or credentials.
|
|
338
|
+
`;
|
|
339
|
+
}
|
|
340
|
+
function assistantErrorResponse(error) {
|
|
341
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
342
|
+
if (/access denied|outside root|absolute paths|symlink/i.test(message)) {
|
|
343
|
+
return json({ error: 'Access denied' }, { status: 403 });
|
|
344
|
+
}
|
|
345
|
+
return json({ error: message }, { status: 500 });
|
|
346
|
+
}
|
|
347
|
+
function assistantHealthIssues(profile, prompt) {
|
|
348
|
+
const issues = [];
|
|
349
|
+
if (!prompt.exists)
|
|
350
|
+
issues.push({ code: 'missing_prompt' });
|
|
351
|
+
if (!profile.exists)
|
|
352
|
+
issues.push({ code: 'missing_profile' });
|
|
353
|
+
if (profile.error === 'invalid_json')
|
|
354
|
+
issues.push({ code: 'invalid_profile' });
|
|
355
|
+
if (profile.error === 'unreadable')
|
|
356
|
+
issues.push({ code: 'unreadable_profile' });
|
|
357
|
+
if (profile.schemaVersion !== 1) {
|
|
358
|
+
issues.push({ code: 'unsupported_schema', schemaVersion: profile.schemaVersion });
|
|
359
|
+
}
|
|
360
|
+
if (prompt.tooLarge) {
|
|
361
|
+
issues.push({
|
|
362
|
+
code: 'prompt_too_large',
|
|
363
|
+
sizeBytes: prompt.tooLarge.sizeBytes,
|
|
364
|
+
maxBytes: prompt.tooLarge.maxBytes,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
return issues;
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=assistants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistants.js","sourceRoot":"","sources":["../../../src/server/handlers/assistants.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
|