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.
@@ -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,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
- "job.get_with_skills",
138
- { job_name: jobName }
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 || 0
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, 1e4) || null
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 || null,
225
- summary: row.summary || null
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: 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,