@happyvertical/smrt-agents 0.31.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.
- package/dist/agent.d.ts.map +1 -1
- package/dist/chunks/{manifest-utils-DLXfTOq0.js → manifest-utils-CMeEKwgq.js} +6 -4
- package/dist/chunks/manifest-utils-CMeEKwgq.js.map +1 -0
- package/dist/index.js +30 -85
- package/dist/index.js.map +1 -1
- package/dist/interests.d.ts +14 -2
- package/dist/interests.d.ts.map +1 -1
- package/dist/manifest.json +2 -54
- package/dist/schedule.d.ts +17 -29
- package/dist/schedule.d.ts.map +1 -1
- package/dist/server/manifest-utils.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/smrt-knowledge.json +5 -10
- package/dist/svelte/components/AgentRunHistory.svelte +10 -0
- package/dist/svelte/components/AgentRunHistory.svelte.d.ts.map +1 -1
- package/dist/svelte/components/AgentScheduleList.svelte +18 -8
- package/dist/svelte/components/AgentScheduleList.svelte.d.ts.map +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +6 -2
- package/dist/ui.js.map +1 -1
- package/dist/vite-plugin.js +1 -1
- package/package.json +9 -9
- package/dist/chunks/manifest-utils-DLXfTOq0.js.map +0 -1
package/dist/agent.d.ts.map
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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);
|