@happyvertical/smrt-agents 0.30.0 → 0.31.1

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 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { readFileSync, existsSync } from "node:fs";
2
2
  import { createRequire } from "node:module";
3
3
  import { resolve } from "node:path";
4
+ import { createLogger } from "@happyvertical/logger";
4
5
  import { AgentUIRegistry } from "../ui.js";
6
+ const logger = createLogger({ level: "info" });
5
7
  function extractAgentManifest(manifest, agentClass) {
6
8
  for (const obj of Object.values(manifest.objects)) {
7
9
  if (obj.className === agentClass && obj.agent) {
@@ -27,7 +29,7 @@ function loadManifestsFromPackages(packages, projectRoot) {
27
29
  }
28
30
  }
29
31
  } catch {
30
- console.warn(
32
+ logger.warn(
31
33
  `[smrt-agents/server] Could not load manifest for ${pkg} — skipping`
32
34
  );
33
35
  }
@@ -46,14 +48,14 @@ function loadManifestsFromConfig(configPath, projectRoot) {
46
48
  const root = projectRoot || process.cwd();
47
49
  const resolvedConfigPath = configPath || resolve(root, "smrt.config.js");
48
50
  if (!existsSync(resolvedConfigPath)) {
49
- console.warn(
51
+ logger.warn(
50
52
  `[smrt-agents/server] Config file not found: ${resolvedConfigPath}`
51
53
  );
52
54
  return /* @__PURE__ */ new Map();
53
55
  }
54
56
  const packages = extractAgentPackagesFromConfig(resolvedConfigPath);
55
57
  if (packages.length === 0) {
56
- console.warn(
58
+ logger.warn(
57
59
  `[smrt-agents/server] No agents found in config: ${resolvedConfigPath}`
58
60
  );
59
61
  return /* @__PURE__ */ new Map();
@@ -66,4 +68,4 @@ export {
66
68
  extractAgentPackagesFromConfig as e,
67
69
  loadManifestsFromConfig as l
68
70
  };
69
- //# sourceMappingURL=manifest-utils-DLXfTOq0.js.map
71
+ //# sourceMappingURL=manifest-utils-CMeEKwgq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-utils-CMeEKwgq.js","sources":["../../src/server/manifest-utils.ts"],"sourcesContent":["/**\n * Server-side manifest utilities for SMRT agents\n *\n * Provides functions to extract and register agent manifests on the server,\n * where the Vite virtual module (`virtual:smrt-agent-registrations`) doesn't run.\n *\n * @module @happyvertical/smrt-agents/server\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { resolve } from 'node:path';\nimport { createLogger } from '@happyvertical/logger';\nimport { type AgentManifestInfo, AgentUIRegistry } from '../ui.js';\n\nconst logger = createLogger({ level: 'info' });\n\n/**\n * Shape of a package manifest's `objects` entry\n */\ninterface ManifestObject {\n className: string;\n agent?: AgentManifestInfo;\n [key: string]: unknown;\n}\n\n/**\n * Shape of a package manifest JSON file\n */\nexport interface PackageManifest {\n objects: Record<string, ManifestObject>;\n [key: string]: unknown;\n}\n\n/**\n * Extract the AgentManifestInfo from a package manifest by class name.\n *\n * Iterates `manifest.objects` looking for the entry whose `className` matches\n * and has an `agent` metadata block.\n *\n * @param manifest - Parsed manifest JSON from a package\n * @param agentClass - Agent class name to search for (e.g., 'Praeco')\n * @returns The agent manifest info, or null if not found\n */\nexport function extractAgentManifest(\n manifest: PackageManifest,\n agentClass: string,\n): AgentManifestInfo | null {\n for (const obj of Object.values(manifest.objects)) {\n if (obj.className === agentClass && obj.agent) {\n return obj.agent;\n }\n }\n return null;\n}\n\n/**\n * Load and register agent manifests from a list of package names.\n *\n * For each package, resolves its `<package>/manifest` export via `createRequire`,\n * reads the manifest JSON, extracts the agent class and metadata, and registers\n * with `AgentUIRegistry`.\n *\n * @param packages - Array of package names (e.g., ['@happyvertical/praeco'])\n * @param projectRoot - Absolute path to the project root (for require resolution)\n * @returns Map of agentClass -> AgentManifestInfo for successfully loaded agents\n */\nexport function loadManifestsFromPackages(\n packages: string[],\n projectRoot: string,\n): Map<string, AgentManifestInfo> {\n const result = new Map<string, AgentManifestInfo>();\n const localRequire = createRequire(resolve(projectRoot, 'package.json'));\n\n for (const pkg of packages) {\n try {\n const manifestPath = localRequire.resolve(`${pkg}/manifest`);\n const manifestContent = readFileSync(manifestPath, 'utf-8');\n const manifest: PackageManifest = JSON.parse(manifestContent);\n\n // Find the agent object (one with agent metadata)\n for (const obj of Object.values(manifest.objects)) {\n if (obj.agent) {\n const agentClass = obj.className;\n AgentUIRegistry.registerManifest(agentClass, obj.agent);\n result.set(agentClass, obj.agent);\n break;\n }\n }\n } catch {\n logger.warn(\n `[smrt-agents/server] Could not load manifest for ${pkg} — skipping`,\n );\n }\n }\n\n return result;\n}\n\n/**\n * Extract agent package names from a smrt.config.js file.\n *\n * Reads the file, finds the `agents: [...]` array, strips comments,\n * and extracts quoted package names. Same logic as the Vite plugin.\n *\n * @param configPath - Absolute path to smrt.config.js\n * @returns Array of package name strings\n */\nexport function extractAgentPackagesFromConfig(configPath: string): string[] {\n const configContent = readFileSync(configPath, 'utf-8');\n const agentMatches = configContent.match(/agents\\s*:\\s*\\[([^\\]]*)\\]/s);\n if (!agentMatches) return [];\n\n const agentsBlock = agentMatches[1];\n const withoutComments = agentsBlock.replace(/\\/\\/.*$/gm, '');\n return [...withoutComments.matchAll(/['\"]([^'\"]+)['\"]/g)].map((m) => m[1]);\n}\n\n/**\n * Load and register agent manifests by reading smrt.config.js.\n *\n * One-call setup: reads the config file to discover agent packages,\n * then loads and registers manifests for each. Idempotent — safe to\n * call from multiple server load functions.\n *\n * @param configPath - Path to smrt.config.js (default: `<projectRoot>/smrt.config.js`)\n * @param projectRoot - Project root for require resolution (default: `process.cwd()`)\n * @returns Map of agentClass -> AgentManifestInfo\n */\nexport function loadManifestsFromConfig(\n configPath?: string,\n projectRoot?: string,\n): Map<string, AgentManifestInfo> {\n const root = projectRoot || process.cwd();\n const resolvedConfigPath = configPath || resolve(root, 'smrt.config.js');\n\n if (!existsSync(resolvedConfigPath)) {\n logger.warn(\n `[smrt-agents/server] Config file not found: ${resolvedConfigPath}`,\n );\n return new Map();\n }\n\n const packages = extractAgentPackagesFromConfig(resolvedConfigPath);\n if (packages.length === 0) {\n logger.warn(\n `[smrt-agents/server] No agents found in config: ${resolvedConfigPath}`,\n );\n return new Map();\n }\n\n return loadManifestsFromPackages(packages, root);\n}\n"],"names":[],"mappings":";;;;;AAeA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AA6BtC,SAAS,qBACd,UACA,YAC0B;AAC1B,aAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACjD,QAAI,IAAI,cAAc,cAAc,IAAI,OAAO;AAC7C,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAaO,SAAS,0BACd,UACA,aACgC;AAChC,QAAM,6BAAa,IAAA;AACnB,QAAM,eAAe,cAAc,QAAQ,aAAa,cAAc,CAAC;AAEvE,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,YAAM,eAAe,aAAa,QAAQ,GAAG,GAAG,WAAW;AAC3D,YAAM,kBAAkB,aAAa,cAAc,OAAO;AAC1D,YAAM,WAA4B,KAAK,MAAM,eAAe;AAG5D,iBAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACjD,YAAI,IAAI,OAAO;AACb,gBAAM,aAAa,IAAI;AACvB,0BAAgB,iBAAiB,YAAY,IAAI,KAAK;AACtD,iBAAO,IAAI,YAAY,IAAI,KAAK;AAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL,oDAAoD,GAAG;AAAA,MAAA;AAAA,IAE3D;AAAA,EACF;AAEA,SAAO;AACT;AAWO,SAAS,+BAA+B,YAA8B;AAC3E,QAAM,gBAAgB,aAAa,YAAY,OAAO;AACtD,QAAM,eAAe,cAAc,MAAM,4BAA4B;AACrE,MAAI,CAAC,aAAc,QAAO,CAAA;AAE1B,QAAM,cAAc,aAAa,CAAC;AAClC,QAAM,kBAAkB,YAAY,QAAQ,aAAa,EAAE;AAC3D,SAAO,CAAC,GAAG,gBAAgB,SAAS,mBAAmB,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3E;AAaO,SAAS,wBACd,YACA,aACgC;AAChC,QAAM,OAAO,eAAe,QAAQ,IAAA;AACpC,QAAM,qBAAqB,cAAc,QAAQ,MAAM,gBAAgB;AAEvE,MAAI,CAAC,WAAW,kBAAkB,GAAG;AACnC,WAAO;AAAA,MACL,+CAA+C,kBAAkB;AAAA,IAAA;AAEnE,+BAAW,IAAA;AAAA,EACb;AAEA,QAAM,WAAW,+BAA+B,kBAAkB;AAClE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,MACL,mDAAmD,kBAAkB;AAAA,IAAA;AAEvE,+BAAW,IAAA;AAAA,EACb;AAEA,SAAO,0BAA0B,UAAU,IAAI;AACjD;"}
package/dist/index.js CHANGED
@@ -771,7 +771,20 @@ let Agent = class extends SmrtObject {
771
771
  let sql = `SELECT * FROM ${collection.tableName} WHERE ${whereClause}`;
772
772
  if (filter.sort) {
773
773
  const sorts = Array.isArray(filter.sort) ? filter.sort : [filter.sort];
774
- sql += ` ORDER BY ${sorts.join(", ")}`;
774
+ const orderBy = sorts.map((item) => {
775
+ const [field2, direction = "ASC"] = item.trim().split(/\s+/);
776
+ if (!/^[a-zA-Z0-9_]+$/.test(field2)) {
777
+ throw new Error(`Invalid field name for ordering: ${field2}`);
778
+ }
779
+ const normalizedDirection = direction.toUpperCase();
780
+ if (normalizedDirection !== "ASC" && normalizedDirection !== "DESC") {
781
+ throw new Error(
782
+ `Invalid sort direction: ${direction}. Must be ASC or DESC.`
783
+ );
784
+ }
785
+ return `${field2} ${normalizedDirection}`;
786
+ }).join(", ");
787
+ sql += ` ORDER BY ${orderBy}`;
775
788
  }
776
789
  if (filter.limit) {
777
790
  sql += ` LIMIT ?`;
@@ -915,47 +928,6 @@ let AgentSchedule = class extends SmrtObject {
915
928
  }
916
929
  await this.save();
917
930
  }
918
- /**
919
- * Record a successful run
920
- */
921
- async recordSuccess() {
922
- this.lastRun = /* @__PURE__ */ new Date();
923
- this.lastStatus = "success";
924
- this.lastError = null;
925
- this.runCount++;
926
- this.successCount++;
927
- this.runningCount = Math.max(0, this.runningCount - 1);
928
- this.calculateNextRun();
929
- await this.save();
930
- }
931
- /**
932
- * Record a failed run
933
- */
934
- async recordFailure(error) {
935
- this.lastRun = /* @__PURE__ */ new Date();
936
- this.lastStatus = "failed";
937
- this.lastError = error;
938
- this.runCount++;
939
- this.failureCount++;
940
- this.runningCount = Math.max(0, this.runningCount - 1);
941
- this.calculateNextRun();
942
- await this.save();
943
- }
944
- /**
945
- * Check if the schedule is due to run
946
- */
947
- isDue() {
948
- if (!this.enabled || this.status !== "active") {
949
- return false;
950
- }
951
- if (!this.nextRun) {
952
- return false;
953
- }
954
- if (this.runningCount >= this.maxConcurrent) {
955
- return false;
956
- }
957
- return /* @__PURE__ */ new Date() >= this.nextRun;
958
- }
959
931
  /**
960
932
  * Calculate the next run time based on cron expression
961
933
  */
@@ -1107,22 +1079,6 @@ class AgentScheduleCollection extends SmrtCollection {
1107
1079
  limit: options.limit
1108
1080
  });
1109
1081
  }
1110
- /**
1111
- * List schedules that are due to run
1112
- */
1113
- async listDue(options = {}) {
1114
- const now = (/* @__PURE__ */ new Date()).toISOString();
1115
- return this.query(
1116
- `SELECT * FROM _smrt_agent_schedules
1117
- WHERE enabled = 1
1118
- AND status = 'active'
1119
- AND next_run <= ?
1120
- AND running_count < max_concurrent
1121
- ORDER BY next_run ASC
1122
- LIMIT ?`,
1123
- [now, options.limit || 100]
1124
- );
1125
- }
1126
1082
  /**
1127
1083
  * List schedules for a specific agent type
1128
1084
  */
@@ -1138,32 +1094,6 @@ class AgentScheduleCollection extends SmrtCollection {
1138
1094
  limit: options.limit
1139
1095
  });
1140
1096
  }
1141
- /**
1142
- * Get schedule statistics
1143
- */
1144
- async stats() {
1145
- const now = (/* @__PURE__ */ new Date()).toISOString();
1146
- const result = await this._db.query(
1147
- `SELECT
1148
- COUNT(*) as total,
1149
- SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,
1150
- SUM(CASE WHEN status = 'paused' THEN 1 ELSE 0 END) as paused,
1151
- SUM(CASE WHEN status = 'disabled' THEN 1 ELSE 0 END) as disabled,
1152
- SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) as error,
1153
- SUM(CASE WHEN enabled = 1 AND status = 'active' AND next_run <= ? THEN 1 ELSE 0 END) as due_now
1154
- FROM _smrt_agent_schedules`,
1155
- [now]
1156
- );
1157
- const row = result.rows[0] || {};
1158
- return {
1159
- total: row.total ?? 0,
1160
- active: row.active ?? 0,
1161
- paused: row.paused ?? 0,
1162
- disabled: row.disabled ?? 0,
1163
- error: row.error ?? 0,
1164
- dueNow: row.due_now ?? 0
1165
- };
1166
- }
1167
1097
  }
1168
1098
  function getNextCronDate(cron, _timezone = "UTC") {
1169
1099
  const parts = cron.trim().split(/\s+/);
@@ -1178,9 +1108,24 @@ function getNextCronDate(cron, _timezone = "UTC") {
1178
1108
  candidate.setSeconds(0);
1179
1109
  candidate.setMilliseconds(0);
1180
1110
  candidate.setMinutes(candidate.getMinutes() + 1);
1111
+ const dayIsWildcard = dayExpr === "*";
1112
+ const dowIsWildcard = dowExpr === "*";
1181
1113
  const maxIterations = 525600;
1182
1114
  for (let i = 0; i < maxIterations; i++) {
1183
- if (matchesCronField(candidate.getMonth() + 1, monthExpr) && matchesCronField(candidate.getDate(), dayExpr) && matchesCronField(candidate.getDay(), dowExpr) && matchesCronField(candidate.getHours(), hourExpr) && matchesCronField(candidate.getMinutes(), minuteExpr)) {
1115
+ const dayMatches = matchesCronField(candidate.getDate(), dayExpr);
1116
+ const dow = candidate.getDay();
1117
+ const dowMatches = matchesCronField(dow, dowExpr) || dow === 0 && matchesCronField(7, dowExpr);
1118
+ let dayOfMonthOrWeekMatches;
1119
+ if (!dayIsWildcard && !dowIsWildcard) {
1120
+ dayOfMonthOrWeekMatches = dayMatches || dowMatches;
1121
+ } else if (!dayIsWildcard) {
1122
+ dayOfMonthOrWeekMatches = dayMatches;
1123
+ } else if (!dowIsWildcard) {
1124
+ dayOfMonthOrWeekMatches = dowMatches;
1125
+ } else {
1126
+ dayOfMonthOrWeekMatches = true;
1127
+ }
1128
+ if (matchesCronField(candidate.getMonth() + 1, monthExpr) && dayOfMonthOrWeekMatches && matchesCronField(candidate.getHours(), hourExpr) && matchesCronField(candidate.getMinutes(), minuteExpr)) {
1184
1129
  return candidate;
1185
1130
  }
1186
1131
  candidate.setMinutes(candidate.getMinutes() + 1);