assistme 0.3.5 → 0.4.0
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/{chunk-KX7ITO55.js → chunk-4SBIN27G.js} +184 -22
- package/dist/{chunk-TTEGHE2E.js → chunk-JVA6DHXD.js} +6 -4
- package/dist/{config-PUIS2TQL.js → config-T4357GAE.js} +1 -1
- package/dist/index.js +434 -221
- package/dist/job-runner-CJ7HM4GZ.js +7 -0
- package/package.json +2 -1
- package/src/agent/event-hooks.ts +59 -10
- package/src/agent/job-runner.ts +52 -40
- package/src/agent/memory.ts +124 -0
- package/src/agent/processor.ts +62 -87
- package/src/agent/scheduler.ts +22 -59
- package/src/agent/skill-evaluator.ts +192 -87
- package/src/agent/skills.ts +57 -36
- package/src/agent/system-prompt.ts +9 -0
- package/src/browser/controller.ts +16 -5
- package/src/db/types.ts +3 -1
- package/src/tools/filesystem.ts +32 -35
- package/src/tools/shell.ts +18 -22
- package/src/utils/config.ts +15 -9
- package/src/utils/constants.ts +98 -0
- package/src/utils/errors.ts +37 -0
- package/src/utils/schemas.ts +148 -0
- package/{src → tests}/agent/event-hooks.test.ts +121 -33
- package/{src → tests}/agent/mcp-servers.test.ts +43 -29
- package/{src → tests}/agent/memory.test.ts +71 -3
- package/{src → tests}/agent/processor.test.ts +59 -55
- package/{src → tests}/agent/scheduler.test.ts +1 -1
- package/{src → tests}/agent/session.test.ts +20 -10
- package/{src → tests}/agent/skills.test.ts +51 -29
- package/{src → tests}/credentials/credential-store.test.ts +23 -8
- package/{src → tests}/credentials/encryption.test.ts +1 -1
- package/{src → tests}/db/supabase.test.ts +4 -4
- package/{src → tests}/tools/filesystem.test.ts +6 -15
- package/{src → tests}/tools/shell.test.ts +1 -1
- package/{src → tests}/utils/config.test.ts +3 -2
- package/{src → tests}/utils/rate-limiter.test.ts +1 -1
- package/{src → tests}/utils/retry.test.ts +6 -12
- package/tsconfig.json +1 -1
- package/vitest.config.ts +1 -1
- package/dist/job-runner-P2L6MOOX.js +0 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JVA6DHXD.js";
|
|
4
4
|
|
|
5
5
|
// src/db/auth-store.ts
|
|
6
6
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -125,6 +125,139 @@ var log = {
|
|
|
125
125
|
}
|
|
126
126
|
};
|
|
127
127
|
|
|
128
|
+
// src/utils/schemas.ts
|
|
129
|
+
import { z } from "zod";
|
|
130
|
+
function safeParse(schema, data) {
|
|
131
|
+
const result = schema.safeParse(data);
|
|
132
|
+
return result.success ? result.data : null;
|
|
133
|
+
}
|
|
134
|
+
var ConversationMessageSchema = z.object({
|
|
135
|
+
id: z.string(),
|
|
136
|
+
conversation_id: z.string(),
|
|
137
|
+
content: z.string().optional().default(""),
|
|
138
|
+
status: z.string().optional().nullable(),
|
|
139
|
+
metadata: z.record(z.string(), z.unknown()).optional().default({}),
|
|
140
|
+
created_at: z.string().optional()
|
|
141
|
+
});
|
|
142
|
+
var SkillRowSchema = z.object({
|
|
143
|
+
id: z.string(),
|
|
144
|
+
name: z.string(),
|
|
145
|
+
description: z.string().optional().default(""),
|
|
146
|
+
version: z.string().optional().default("1.0.0"),
|
|
147
|
+
user_invocable: z.boolean().optional().default(true),
|
|
148
|
+
disable_model_invocation: z.boolean().optional().default(false),
|
|
149
|
+
keywords: z.array(z.string()).optional().default([]),
|
|
150
|
+
allowed_tools: z.array(z.string()).optional().default([]),
|
|
151
|
+
argument_hint: z.string().optional().default(""),
|
|
152
|
+
metadata: z.unknown().optional().default({}),
|
|
153
|
+
homepage: z.string().optional().default(""),
|
|
154
|
+
content: z.string(),
|
|
155
|
+
source: z.string().optional().default("manual"),
|
|
156
|
+
source_skill_id: z.string().optional().nullable(),
|
|
157
|
+
invocation_count: z.number().optional().default(0)
|
|
158
|
+
});
|
|
159
|
+
var JobRowSchema = z.object({
|
|
160
|
+
job_id: z.string(),
|
|
161
|
+
job_name: z.string(),
|
|
162
|
+
job_description: z.string().optional().default(""),
|
|
163
|
+
skill_id: z.string().optional().nullable(),
|
|
164
|
+
skill_name: z.string().optional().nullable(),
|
|
165
|
+
skill_description: z.string().optional().default(""),
|
|
166
|
+
skill_emoji: z.string().optional().default(""),
|
|
167
|
+
skill_content: z.string().optional().default("")
|
|
168
|
+
});
|
|
169
|
+
var JobListRowSchema = z.object({
|
|
170
|
+
id: z.string(),
|
|
171
|
+
name: z.string(),
|
|
172
|
+
description: z.string().optional().default(""),
|
|
173
|
+
skill_count: z.number().optional().default(0)
|
|
174
|
+
});
|
|
175
|
+
var JobRunRowSchema = z.object({
|
|
176
|
+
run_id: z.string(),
|
|
177
|
+
job_name: z.string(),
|
|
178
|
+
status: z.string(),
|
|
179
|
+
trigger_type: z.string().optional().default("manual"),
|
|
180
|
+
started_at: z.string(),
|
|
181
|
+
completed_at: z.string().optional().nullable(),
|
|
182
|
+
summary: z.string().optional().nullable()
|
|
183
|
+
});
|
|
184
|
+
var SkillCreateResultSchema = z.object({
|
|
185
|
+
out_id: z.string().optional(),
|
|
186
|
+
id: z.string().optional(),
|
|
187
|
+
out_name: z.string().optional(),
|
|
188
|
+
name: z.string().optional()
|
|
189
|
+
}).refine((data) => data.out_id || data.id, {
|
|
190
|
+
message: "Skill create result must have out_id or id"
|
|
191
|
+
});
|
|
192
|
+
var SkillDecisionSchema = z.object({
|
|
193
|
+
action: z.enum(["create", "update", "skip"]),
|
|
194
|
+
name: z.string().optional(),
|
|
195
|
+
description: z.string().optional(),
|
|
196
|
+
instructions: z.string().optional(),
|
|
197
|
+
emoji: z.string().optional(),
|
|
198
|
+
keywords: z.array(z.string()).optional(),
|
|
199
|
+
existing_skill_name: z.string().optional(),
|
|
200
|
+
improved_instructions: z.string().optional(),
|
|
201
|
+
improved_description: z.string().optional(),
|
|
202
|
+
reason: z.string()
|
|
203
|
+
});
|
|
204
|
+
var BrowseSkillRowSchema = z.object({
|
|
205
|
+
id: z.string(),
|
|
206
|
+
name: z.string(),
|
|
207
|
+
description: z.string().optional().default(""),
|
|
208
|
+
emoji: z.string().optional().default(""),
|
|
209
|
+
version: z.string().optional().default("1.0.0"),
|
|
210
|
+
author_name: z.string().optional().default(""),
|
|
211
|
+
category: z.string().optional().default(""),
|
|
212
|
+
install_count: z.number().optional().default(0),
|
|
213
|
+
avg_rating: z.number().optional().nullable(),
|
|
214
|
+
rating_count: z.number().optional().default(0)
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// src/utils/constants.ts
|
|
218
|
+
var MAX_RESPONSE_CONTENT_LENGTH = 5e4;
|
|
219
|
+
var MAX_TOOL_RESULT_LENGTH = 1e4;
|
|
220
|
+
var MAX_SKILL_RECORD_RESULT_LENGTH = 300;
|
|
221
|
+
var MAX_TOOL_INPUT_LOG_LENGTH = 200;
|
|
222
|
+
var MAX_JOB_SUMMARY_LENGTH = 1e4;
|
|
223
|
+
var MAX_HISTORY_RESPONSE_LENGTH = 1500;
|
|
224
|
+
var MAX_HISTORY_ENTRIES = 10;
|
|
225
|
+
var SKILL_DESCRIPTION_BUDGET_CHARS = 16e3;
|
|
226
|
+
var SHELL_TIMEOUT_MS = 3e4;
|
|
227
|
+
var SHELL_MAX_OUTPUT = 5e4;
|
|
228
|
+
var CDP_COMMAND_TIMEOUT_MS = 15e3;
|
|
229
|
+
var WS_CONNECT_TIMEOUT_MS = 5e3;
|
|
230
|
+
var SCHEDULER_INTERVAL_MS = 3e4;
|
|
231
|
+
var FRAME_CONTEXTS_MAX_SIZE = 500;
|
|
232
|
+
var MAX_FILE_SEARCH_RESULTS = 50;
|
|
233
|
+
var MAX_CONTENT_SEARCH_FILES = 200;
|
|
234
|
+
var MAX_CONTENT_SEARCH_RESULTS = 30;
|
|
235
|
+
var SKILL_VALIDATION_MAX_TURNS = 2;
|
|
236
|
+
var MEMORY_DEDUP_SIMILARITY_THRESHOLD = 0.75;
|
|
237
|
+
var MEMORY_COMPRESSION_THRESHOLD = 50;
|
|
238
|
+
var MEMORY_COMPRESSION_TARGET = 30;
|
|
239
|
+
var MAX_BUDGET_USD = 2;
|
|
240
|
+
var MAX_COMPLETE_TASK_RETRIES = 2;
|
|
241
|
+
|
|
242
|
+
// src/utils/errors.ts
|
|
243
|
+
var AppError = class _AppError extends Error {
|
|
244
|
+
constructor(message, code, cause) {
|
|
245
|
+
super(message);
|
|
246
|
+
this.code = code;
|
|
247
|
+
this.cause = cause;
|
|
248
|
+
this.name = "AppError";
|
|
249
|
+
}
|
|
250
|
+
static fromUnknown(err, code = "INTERNAL") {
|
|
251
|
+
if (err instanceof _AppError) return err;
|
|
252
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
253
|
+
return new _AppError(message, code, err);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
function errorMessage(err) {
|
|
257
|
+
if (err instanceof Error) return err.message;
|
|
258
|
+
return String(err);
|
|
259
|
+
}
|
|
260
|
+
|
|
128
261
|
// src/agent/job-runner.ts
|
|
129
262
|
var JobRunner = class {
|
|
130
263
|
/**
|
|
@@ -133,29 +266,29 @@ var JobRunner = class {
|
|
|
133
266
|
*/
|
|
134
267
|
async loadJob(jobName) {
|
|
135
268
|
try {
|
|
136
|
-
const data = await callMcpHandler(
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
)
|
|
140
|
-
if (!data || data.length === 0) {
|
|
269
|
+
const data = await callMcpHandler("job.get_with_skills", {
|
|
270
|
+
job_name: jobName
|
|
271
|
+
});
|
|
272
|
+
if (!data || !Array.isArray(data) || data.length === 0) {
|
|
141
273
|
return null;
|
|
142
274
|
}
|
|
143
|
-
const rows = data;
|
|
275
|
+
const rows = data.map((row) => safeParse(JobRowSchema, row)).filter(Boolean);
|
|
276
|
+
if (rows.length === 0) return null;
|
|
144
277
|
const first = rows[0];
|
|
145
278
|
return {
|
|
146
279
|
jobId: first.job_id,
|
|
147
280
|
jobName: first.job_name,
|
|
148
281
|
jobDescription: first.job_description,
|
|
149
|
-
skills: rows.map((row) => ({
|
|
282
|
+
skills: rows.filter((row) => row.skill_id).map((row) => ({
|
|
150
283
|
skillId: row.skill_id,
|
|
151
|
-
skillName: row.skill_name,
|
|
152
|
-
skillDescription: row.skill_description
|
|
153
|
-
skillEmoji: row.skill_emoji
|
|
154
|
-
skillContent: row.skill_content
|
|
284
|
+
skillName: row.skill_name || "",
|
|
285
|
+
skillDescription: row.skill_description,
|
|
286
|
+
skillEmoji: row.skill_emoji,
|
|
287
|
+
skillContent: row.skill_content
|
|
155
288
|
}))
|
|
156
289
|
};
|
|
157
290
|
} catch (err) {
|
|
158
|
-
log.debug(`Failed to load job "${jobName}": ${err}`);
|
|
291
|
+
log.debug(`Failed to load job "${jobName}": ${errorMessage(err)}`);
|
|
159
292
|
return null;
|
|
160
293
|
}
|
|
161
294
|
}
|
|
@@ -165,14 +298,14 @@ var JobRunner = class {
|
|
|
165
298
|
async listJobs() {
|
|
166
299
|
try {
|
|
167
300
|
const data = await callMcpHandler("job.list");
|
|
168
|
-
return (data || []).map((row) => ({
|
|
301
|
+
return (data || []).map((row) => safeParse(JobListRowSchema, row)).filter(Boolean).map((row) => ({
|
|
169
302
|
id: row.id,
|
|
170
303
|
name: row.name,
|
|
171
304
|
description: row.description,
|
|
172
|
-
skillCount: row.skill_count
|
|
305
|
+
skillCount: row.skill_count
|
|
173
306
|
}));
|
|
174
307
|
} catch (err) {
|
|
175
|
-
log.debug(`Failed to list jobs: ${err}`);
|
|
308
|
+
log.debug(`Failed to list jobs: ${errorMessage(err)}`);
|
|
176
309
|
return [];
|
|
177
310
|
}
|
|
178
311
|
}
|
|
@@ -191,7 +324,7 @@ var JobRunner = class {
|
|
|
191
324
|
});
|
|
192
325
|
return data;
|
|
193
326
|
} catch (err) {
|
|
194
|
-
log.debug(`Job run creation error: ${err}`);
|
|
327
|
+
log.debug(`Job run creation error: ${errorMessage(err)}`);
|
|
195
328
|
return null;
|
|
196
329
|
}
|
|
197
330
|
}
|
|
@@ -203,7 +336,7 @@ var JobRunner = class {
|
|
|
203
336
|
await callMcpHandler("job.complete_run", {
|
|
204
337
|
run_id: runId,
|
|
205
338
|
status,
|
|
206
|
-
summary: summary?.slice(0,
|
|
339
|
+
summary: summary?.slice(0, MAX_JOB_SUMMARY_LENGTH) || null
|
|
207
340
|
});
|
|
208
341
|
}
|
|
209
342
|
/**
|
|
@@ -215,17 +348,17 @@ var JobRunner = class {
|
|
|
215
348
|
job_name: jobName || null,
|
|
216
349
|
limit
|
|
217
350
|
});
|
|
218
|
-
return (data || []).map((row) => ({
|
|
351
|
+
return (data || []).map((row) => safeParse(JobRunRowSchema, row)).filter(Boolean).map((row) => ({
|
|
219
352
|
runId: row.run_id,
|
|
220
353
|
jobName: row.job_name,
|
|
221
354
|
status: row.status,
|
|
222
355
|
triggerType: row.trigger_type,
|
|
223
356
|
startedAt: row.started_at,
|
|
224
|
-
completedAt: row.completed_at
|
|
225
|
-
summary: row.summary
|
|
357
|
+
completedAt: row.completed_at ?? null,
|
|
358
|
+
summary: row.summary ?? null
|
|
226
359
|
}));
|
|
227
360
|
} catch (err) {
|
|
228
|
-
log.debug(`Run history error: ${err}`);
|
|
361
|
+
log.debug(`Run history error: ${errorMessage(err)}`);
|
|
229
362
|
return [];
|
|
230
363
|
}
|
|
231
364
|
}
|
|
@@ -294,5 +427,34 @@ export {
|
|
|
294
427
|
setCorrelationId,
|
|
295
428
|
newCorrelationId,
|
|
296
429
|
log,
|
|
430
|
+
MAX_RESPONSE_CONTENT_LENGTH,
|
|
431
|
+
MAX_TOOL_RESULT_LENGTH,
|
|
432
|
+
MAX_SKILL_RECORD_RESULT_LENGTH,
|
|
433
|
+
MAX_TOOL_INPUT_LOG_LENGTH,
|
|
434
|
+
MAX_HISTORY_RESPONSE_LENGTH,
|
|
435
|
+
MAX_HISTORY_ENTRIES,
|
|
436
|
+
SKILL_DESCRIPTION_BUDGET_CHARS,
|
|
437
|
+
SHELL_TIMEOUT_MS,
|
|
438
|
+
SHELL_MAX_OUTPUT,
|
|
439
|
+
CDP_COMMAND_TIMEOUT_MS,
|
|
440
|
+
WS_CONNECT_TIMEOUT_MS,
|
|
441
|
+
SCHEDULER_INTERVAL_MS,
|
|
442
|
+
FRAME_CONTEXTS_MAX_SIZE,
|
|
443
|
+
MAX_FILE_SEARCH_RESULTS,
|
|
444
|
+
MAX_CONTENT_SEARCH_FILES,
|
|
445
|
+
MAX_CONTENT_SEARCH_RESULTS,
|
|
446
|
+
SKILL_VALIDATION_MAX_TURNS,
|
|
447
|
+
MEMORY_DEDUP_SIMILARITY_THRESHOLD,
|
|
448
|
+
MEMORY_COMPRESSION_THRESHOLD,
|
|
449
|
+
MEMORY_COMPRESSION_TARGET,
|
|
450
|
+
MAX_BUDGET_USD,
|
|
451
|
+
MAX_COMPLETE_TASK_RETRIES,
|
|
452
|
+
AppError,
|
|
453
|
+
errorMessage,
|
|
454
|
+
safeParse,
|
|
455
|
+
SkillRowSchema,
|
|
456
|
+
SkillCreateResultSchema,
|
|
457
|
+
SkillDecisionSchema,
|
|
458
|
+
BrowseSkillRowSchema,
|
|
297
459
|
JobRunner
|
|
298
460
|
};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
// src/utils/config.ts
|
|
2
2
|
import Conf from "conf";
|
|
3
3
|
import { resolve } from "path";
|
|
4
|
-
var SUPABASE_URL_DEFAULT = "https://msgplwbgohpokajtibew.supabase.co";
|
|
5
|
-
var SUPABASE_ANON_KEY_DEFAULT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im1zZ3Bsd2Jnb2hwb2thanRpYmV3Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjE3MTMzNTEsImV4cCI6MjA3NzI4OTM1MX0.YqiluL_mIBWKv5dteIcPAPQ_jRp9rzZlvAXvkQttDjs";
|
|
4
|
+
var SUPABASE_URL_DEFAULT = process.env.ASSISTME_SUPABASE_URL || "https://msgplwbgohpokajtibew.supabase.co";
|
|
5
|
+
var SUPABASE_ANON_KEY_DEFAULT = process.env.ASSISTME_SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im1zZ3Bsd2Jnb2hwb2thanRpYmV3Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjE3MTMzNTEsImV4cCI6MjA3NzI4OTM1MX0.YqiluL_mIBWKv5dteIcPAPQ_jRp9rzZlvAXvkQttDjs";
|
|
6
6
|
var CONFIG_DEFAULTS = {
|
|
7
7
|
supabaseUrl: SUPABASE_URL_DEFAULT,
|
|
8
8
|
supabaseAnonKey: SUPABASE_ANON_KEY_DEFAULT,
|
|
9
9
|
sessionName: "Default",
|
|
10
10
|
model: "claude-sonnet-4-20250514",
|
|
11
|
-
maxTurns:
|
|
11
|
+
maxTurns: 200,
|
|
12
|
+
taskTimeoutMinutes: 10
|
|
12
13
|
};
|
|
13
14
|
var config = new Conf({
|
|
14
15
|
projectName: "assistme",
|
|
@@ -26,7 +27,8 @@ function getConfig() {
|
|
|
26
27
|
workspacePath: resolve(workspacePath),
|
|
27
28
|
sessionName: config.get("sessionName") || "Default",
|
|
28
29
|
model: config.get("model") || "claude-sonnet-4-20250514",
|
|
29
|
-
maxTurns: config.get("maxTurns") ||
|
|
30
|
+
maxTurns: config.get("maxTurns") || 200,
|
|
31
|
+
taskTimeoutMinutes: config.get("taskTimeoutMinutes") || 10
|
|
30
32
|
};
|
|
31
33
|
}
|
|
32
34
|
function setConfig(key, value) {
|