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.
Files changed (40) hide show
  1. package/dist/{chunk-KX7ITO55.js → chunk-4SBIN27G.js} +184 -22
  2. package/dist/{chunk-TTEGHE2E.js → chunk-JVA6DHXD.js} +6 -4
  3. package/dist/{config-PUIS2TQL.js → config-T4357GAE.js} +1 -1
  4. package/dist/index.js +434 -221
  5. package/dist/job-runner-CJ7HM4GZ.js +7 -0
  6. package/package.json +2 -1
  7. package/src/agent/event-hooks.ts +59 -10
  8. package/src/agent/job-runner.ts +52 -40
  9. package/src/agent/memory.ts +124 -0
  10. package/src/agent/processor.ts +62 -87
  11. package/src/agent/scheduler.ts +22 -59
  12. package/src/agent/skill-evaluator.ts +192 -87
  13. package/src/agent/skills.ts +57 -36
  14. package/src/agent/system-prompt.ts +9 -0
  15. package/src/browser/controller.ts +16 -5
  16. package/src/db/types.ts +3 -1
  17. package/src/tools/filesystem.ts +32 -35
  18. package/src/tools/shell.ts +18 -22
  19. package/src/utils/config.ts +15 -9
  20. package/src/utils/constants.ts +98 -0
  21. package/src/utils/errors.ts +37 -0
  22. package/src/utils/schemas.ts +148 -0
  23. package/{src → tests}/agent/event-hooks.test.ts +121 -33
  24. package/{src → tests}/agent/mcp-servers.test.ts +43 -29
  25. package/{src → tests}/agent/memory.test.ts +71 -3
  26. package/{src → tests}/agent/processor.test.ts +59 -55
  27. package/{src → tests}/agent/scheduler.test.ts +1 -1
  28. package/{src → tests}/agent/session.test.ts +20 -10
  29. package/{src → tests}/agent/skills.test.ts +51 -29
  30. package/{src → tests}/credentials/credential-store.test.ts +23 -8
  31. package/{src → tests}/credentials/encryption.test.ts +1 -1
  32. package/{src → tests}/db/supabase.test.ts +4 -4
  33. package/{src → tests}/tools/filesystem.test.ts +6 -15
  34. package/{src → tests}/tools/shell.test.ts +1 -1
  35. package/{src → tests}/utils/config.test.ts +3 -2
  36. package/{src → tests}/utils/rate-limiter.test.ts +1 -1
  37. package/{src → tests}/utils/retry.test.ts +6 -12
  38. package/tsconfig.json +1 -1
  39. package/vitest.config.ts +1 -1
  40. package/dist/job-runner-P2L6MOOX.js +0 -7
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfig
3
- } from "./chunk-TTEGHE2E.js";
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
- "job.get_with_skills",
138
- { job_name: jobName }
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 || 0
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, 1e4) || null
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 || null,
225
- summary: row.summary || null
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: 50
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") || 50
30
+ maxTurns: config.get("maxTurns") || 200,
31
+ taskTimeoutMinutes: config.get("taskTimeoutMinutes") || 10
30
32
  };
31
33
  }
32
34
  function setConfig(key, value) {
@@ -3,7 +3,7 @@ import {
3
3
  getConfig,
4
4
  getConfigPath,
5
5
  setConfig
6
- } from "./chunk-TTEGHE2E.js";
6
+ } from "./chunk-JVA6DHXD.js";
7
7
  export {
8
8
  clearConfig,
9
9
  getConfig,