assistme 0.3.4 → 0.3.6
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-4YWS463E.js} +174 -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 +513 -164
- package/dist/job-runner-JT3JWZBV.js +7 -0
- package/package.json +2 -1
- package/src/agent/event-hooks.ts +16 -8
- package/src/agent/job-runner.ts +52 -40
- package/src/agent/processor.ts +24 -27
- package/src/agent/scheduler.ts +22 -59
- package/src/agent/skill-evaluator.ts +45 -52
- package/src/agent/skills.ts +57 -36
- package/src/browser/controller.ts +434 -13
- package/src/mcp/browser-server.ts +1 -1
- package/src/tools/filesystem.ts +32 -35
- package/src/tools/shell.ts +18 -22
- package/src/utils/config.test.ts +1 -1
- package/src/utils/config.ts +15 -9
- package/src/utils/constants.ts +77 -0
- package/src/utils/errors.ts +37 -0
- package/src/utils/schemas.ts +115 -0
- 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,134 @@ 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 MAX_COMPLETE_TASK_RETRIES = 2;
|
|
236
|
+
|
|
237
|
+
// src/utils/errors.ts
|
|
238
|
+
var AppError = class _AppError extends Error {
|
|
239
|
+
constructor(message, code, cause) {
|
|
240
|
+
super(message);
|
|
241
|
+
this.code = code;
|
|
242
|
+
this.cause = cause;
|
|
243
|
+
this.name = "AppError";
|
|
244
|
+
}
|
|
245
|
+
static fromUnknown(err, code = "INTERNAL") {
|
|
246
|
+
if (err instanceof _AppError) return err;
|
|
247
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
248
|
+
return new _AppError(message, code, err);
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
function errorMessage(err) {
|
|
252
|
+
if (err instanceof Error) return err.message;
|
|
253
|
+
return String(err);
|
|
254
|
+
}
|
|
255
|
+
|
|
128
256
|
// src/agent/job-runner.ts
|
|
129
257
|
var JobRunner = class {
|
|
130
258
|
/**
|
|
@@ -133,29 +261,29 @@ var JobRunner = class {
|
|
|
133
261
|
*/
|
|
134
262
|
async loadJob(jobName) {
|
|
135
263
|
try {
|
|
136
|
-
const data = await callMcpHandler(
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
)
|
|
140
|
-
if (!data || data.length === 0) {
|
|
264
|
+
const data = await callMcpHandler("job.get_with_skills", {
|
|
265
|
+
job_name: jobName
|
|
266
|
+
});
|
|
267
|
+
if (!data || !Array.isArray(data) || data.length === 0) {
|
|
141
268
|
return null;
|
|
142
269
|
}
|
|
143
|
-
const rows = data;
|
|
270
|
+
const rows = data.map((row) => safeParse(JobRowSchema, row)).filter(Boolean);
|
|
271
|
+
if (rows.length === 0) return null;
|
|
144
272
|
const first = rows[0];
|
|
145
273
|
return {
|
|
146
274
|
jobId: first.job_id,
|
|
147
275
|
jobName: first.job_name,
|
|
148
276
|
jobDescription: first.job_description,
|
|
149
|
-
skills: rows.map((row) => ({
|
|
277
|
+
skills: rows.filter((row) => row.skill_id).map((row) => ({
|
|
150
278
|
skillId: row.skill_id,
|
|
151
|
-
skillName: row.skill_name,
|
|
152
|
-
skillDescription: row.skill_description
|
|
153
|
-
skillEmoji: row.skill_emoji
|
|
154
|
-
skillContent: row.skill_content
|
|
279
|
+
skillName: row.skill_name || "",
|
|
280
|
+
skillDescription: row.skill_description,
|
|
281
|
+
skillEmoji: row.skill_emoji,
|
|
282
|
+
skillContent: row.skill_content
|
|
155
283
|
}))
|
|
156
284
|
};
|
|
157
285
|
} catch (err) {
|
|
158
|
-
log.debug(`Failed to load job "${jobName}": ${err}`);
|
|
286
|
+
log.debug(`Failed to load job "${jobName}": ${errorMessage(err)}`);
|
|
159
287
|
return null;
|
|
160
288
|
}
|
|
161
289
|
}
|
|
@@ -165,14 +293,14 @@ var JobRunner = class {
|
|
|
165
293
|
async listJobs() {
|
|
166
294
|
try {
|
|
167
295
|
const data = await callMcpHandler("job.list");
|
|
168
|
-
return (data || []).map((row) => ({
|
|
296
|
+
return (data || []).map((row) => safeParse(JobListRowSchema, row)).filter(Boolean).map((row) => ({
|
|
169
297
|
id: row.id,
|
|
170
298
|
name: row.name,
|
|
171
299
|
description: row.description,
|
|
172
|
-
skillCount: row.skill_count
|
|
300
|
+
skillCount: row.skill_count
|
|
173
301
|
}));
|
|
174
302
|
} catch (err) {
|
|
175
|
-
log.debug(`Failed to list jobs: ${err}`);
|
|
303
|
+
log.debug(`Failed to list jobs: ${errorMessage(err)}`);
|
|
176
304
|
return [];
|
|
177
305
|
}
|
|
178
306
|
}
|
|
@@ -191,7 +319,7 @@ var JobRunner = class {
|
|
|
191
319
|
});
|
|
192
320
|
return data;
|
|
193
321
|
} catch (err) {
|
|
194
|
-
log.debug(`Job run creation error: ${err}`);
|
|
322
|
+
log.debug(`Job run creation error: ${errorMessage(err)}`);
|
|
195
323
|
return null;
|
|
196
324
|
}
|
|
197
325
|
}
|
|
@@ -203,7 +331,7 @@ var JobRunner = class {
|
|
|
203
331
|
await callMcpHandler("job.complete_run", {
|
|
204
332
|
run_id: runId,
|
|
205
333
|
status,
|
|
206
|
-
summary: summary?.slice(0,
|
|
334
|
+
summary: summary?.slice(0, MAX_JOB_SUMMARY_LENGTH) || null
|
|
207
335
|
});
|
|
208
336
|
}
|
|
209
337
|
/**
|
|
@@ -215,17 +343,17 @@ var JobRunner = class {
|
|
|
215
343
|
job_name: jobName || null,
|
|
216
344
|
limit
|
|
217
345
|
});
|
|
218
|
-
return (data || []).map((row) => ({
|
|
346
|
+
return (data || []).map((row) => safeParse(JobRunRowSchema, row)).filter(Boolean).map((row) => ({
|
|
219
347
|
runId: row.run_id,
|
|
220
348
|
jobName: row.job_name,
|
|
221
349
|
status: row.status,
|
|
222
350
|
triggerType: row.trigger_type,
|
|
223
351
|
startedAt: row.started_at,
|
|
224
|
-
completedAt: row.completed_at
|
|
225
|
-
summary: row.summary
|
|
352
|
+
completedAt: row.completed_at ?? null,
|
|
353
|
+
summary: row.summary ?? null
|
|
226
354
|
}));
|
|
227
355
|
} catch (err) {
|
|
228
|
-
log.debug(`Run history error: ${err}`);
|
|
356
|
+
log.debug(`Run history error: ${errorMessage(err)}`);
|
|
229
357
|
return [];
|
|
230
358
|
}
|
|
231
359
|
}
|
|
@@ -294,5 +422,29 @@ export {
|
|
|
294
422
|
setCorrelationId,
|
|
295
423
|
newCorrelationId,
|
|
296
424
|
log,
|
|
425
|
+
MAX_RESPONSE_CONTENT_LENGTH,
|
|
426
|
+
MAX_TOOL_RESULT_LENGTH,
|
|
427
|
+
MAX_SKILL_RECORD_RESULT_LENGTH,
|
|
428
|
+
MAX_TOOL_INPUT_LOG_LENGTH,
|
|
429
|
+
MAX_HISTORY_RESPONSE_LENGTH,
|
|
430
|
+
MAX_HISTORY_ENTRIES,
|
|
431
|
+
SKILL_DESCRIPTION_BUDGET_CHARS,
|
|
432
|
+
SHELL_TIMEOUT_MS,
|
|
433
|
+
SHELL_MAX_OUTPUT,
|
|
434
|
+
CDP_COMMAND_TIMEOUT_MS,
|
|
435
|
+
WS_CONNECT_TIMEOUT_MS,
|
|
436
|
+
SCHEDULER_INTERVAL_MS,
|
|
437
|
+
FRAME_CONTEXTS_MAX_SIZE,
|
|
438
|
+
MAX_FILE_SEARCH_RESULTS,
|
|
439
|
+
MAX_CONTENT_SEARCH_FILES,
|
|
440
|
+
MAX_CONTENT_SEARCH_RESULTS,
|
|
441
|
+
MAX_COMPLETE_TASK_RETRIES,
|
|
442
|
+
AppError,
|
|
443
|
+
errorMessage,
|
|
444
|
+
safeParse,
|
|
445
|
+
SkillRowSchema,
|
|
446
|
+
SkillCreateResultSchema,
|
|
447
|
+
SkillDecisionSchema,
|
|
448
|
+
BrowseSkillRowSchema,
|
|
297
449
|
JobRunner
|
|
298
450
|
};
|
|
@@ -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) {
|