@kynver-app/runtime 0.1.103 → 0.1.105
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/cleanup-completion-blocker.d.ts +10 -0
- package/dist/cleanup-guards.d.ts +1 -6
- package/dist/cleanup-worktree-salvage.d.ts +7 -0
- package/dist/cli.js +166 -59
- package/dist/cli.js.map +4 -4
- package/dist/index.js +166 -59
- package/dist/index.js.map +4 -4
- package/dist/server/cleanup.d.ts +3 -0
- package/dist/server/cleanup.js +3511 -0
- package/dist/server/cleanup.js.map +7 -0
- package/dist/server/default-repo.d.ts +1 -0
- package/dist/server/default-repo.js +228 -0
- package/dist/server/default-repo.js.map +7 -0
- package/dist/server/harness-notice.d.ts +2 -0
- package/dist/server/harness-notice.js +287 -0
- package/dist/server/harness-notice.js.map +7 -0
- package/dist/server/heavy-verification.d.ts +2 -0
- package/dist/server/heavy-verification.js +223 -0
- package/dist/server/heavy-verification.js.map +7 -0
- package/dist/server/landing.d.ts +1 -0
- package/dist/server/landing.js +44 -0
- package/dist/server/landing.js.map +7 -0
- package/dist/server/memory-cost-enforce.d.ts +1 -0
- package/dist/server/memory-cost-enforce.js +470 -0
- package/dist/server/memory-cost-enforce.js.map +7 -0
- package/dist/server/memory-cost.d.ts +1 -0
- package/dist/server/memory-cost.js +184 -0
- package/dist/server/memory-cost.js.map +7 -0
- package/dist/server/monitor.d.ts +3 -0
- package/dist/server/monitor.js +1577 -0
- package/dist/server/monitor.js.map +7 -0
- package/dist/server/orchestration.d.ts +10 -0
- package/dist/server/orchestration.js +444 -0
- package/dist/server/orchestration.js.map +7 -0
- package/dist/server/pr-evidence.d.ts +2 -0
- package/dist/server/pr-evidence.js +163 -0
- package/dist/server/pr-evidence.js.map +7 -0
- package/dist/server/repo-search.d.ts +1 -0
- package/dist/server/repo-search.js +224 -0
- package/dist/server/repo-search.js.map +7 -0
- package/dist/server/worker-policy.d.ts +2 -0
- package/dist/server/worker-policy.js +177 -0
- package/dist/server/worker-policy.js.map +7 -0
- package/dist/status.d.ts +4 -0
- package/package.json +63 -3
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// src/worker-env.ts
|
|
2
|
+
var FORBIDDEN_WORKER_ENV_KEYS = [
|
|
3
|
+
"ANTHROPIC_API_KEY",
|
|
4
|
+
"ANALYST_API_KEY",
|
|
5
|
+
"RECRUITER_API_KEY",
|
|
6
|
+
"AUTH_SECRET",
|
|
7
|
+
"NEXTAUTH_SECRET",
|
|
8
|
+
"DATABASE_URL",
|
|
9
|
+
"PRODUCTION_DATABASE_URL",
|
|
10
|
+
"KYNVER_PRODUCTION_DATABASE_URL",
|
|
11
|
+
"REDIS_URL",
|
|
12
|
+
"GOOGLE_CLIENT_SECRET",
|
|
13
|
+
"GITHUB_CLIENT_SECRET",
|
|
14
|
+
"KYNVER_API_KEY",
|
|
15
|
+
"KYNVER_SERVICE_SECRET",
|
|
16
|
+
"KYNVER_RUNTIME_SECRET",
|
|
17
|
+
"KYNVER_CRON_SECRET",
|
|
18
|
+
"OPENCLAW_CRON_SECRET",
|
|
19
|
+
"QSTASH_TOKEN",
|
|
20
|
+
"QSTASH_CURRENT_SIGNING_KEY",
|
|
21
|
+
"QSTASH_NEXT_SIGNING_KEY",
|
|
22
|
+
"TOOL_SECRETS_KEK",
|
|
23
|
+
"TOOL_EXECUTOR_DISPATCH_SECRET",
|
|
24
|
+
"CLOUDFLARE_API_TOKEN",
|
|
25
|
+
"STRIPE_SECRET_KEY",
|
|
26
|
+
"STRIPE_WEBHOOK_SECRET",
|
|
27
|
+
"STRIPE_IDENTITY_WEBHOOK_SECRET",
|
|
28
|
+
"VOYAGE_API_KEY",
|
|
29
|
+
"PERPLEXITY_API_KEY",
|
|
30
|
+
"FRED_API_KEY",
|
|
31
|
+
"FMP_API_KEY",
|
|
32
|
+
"CURSOR_API_KEY"
|
|
33
|
+
];
|
|
34
|
+
var FORBIDDEN_KEY_SET = new Set(FORBIDDEN_WORKER_ENV_KEYS);
|
|
35
|
+
|
|
36
|
+
// src/memory-cost-package-version-guard.ts
|
|
37
|
+
var MEMORY_COST_PACKAGE_MIN_VERSIONS = {
|
|
38
|
+
"@kynver-app/runtime": "0.1.83",
|
|
39
|
+
"@kynver-app/openclaw-agent-os": "0.1.43",
|
|
40
|
+
"@kynver-app/mcp-agent-os": "0.3.34"
|
|
41
|
+
};
|
|
42
|
+
var MEMORY_COST_MANAGED_PACKAGES = Object.keys(
|
|
43
|
+
MEMORY_COST_PACKAGE_MIN_VERSIONS
|
|
44
|
+
);
|
|
45
|
+
var DISPLAY_NAMES = {
|
|
46
|
+
"@kynver-app/runtime": "Kynver runtime",
|
|
47
|
+
"@kynver-app/openclaw-agent-os": "OpenClaw AgentOS plugin",
|
|
48
|
+
"@kynver-app/mcp-agent-os": "AgentOS MCP server"
|
|
49
|
+
};
|
|
50
|
+
function parseSemverParts(version) {
|
|
51
|
+
const core = version.trim().split("-")[0]?.split("+")[0];
|
|
52
|
+
if (!core) return null;
|
|
53
|
+
const parts = core.split(".");
|
|
54
|
+
if (parts.length < 1 || parts.length > 3) return null;
|
|
55
|
+
const nums = parts.map((p) => Number.parseInt(p, 10));
|
|
56
|
+
if (nums.some((n) => !Number.isFinite(n) || n < 0)) return null;
|
|
57
|
+
while (nums.length < 3) nums.push(0);
|
|
58
|
+
return [nums[0], nums[1], nums[2]];
|
|
59
|
+
}
|
|
60
|
+
function compareSemver(a, b) {
|
|
61
|
+
const pa = parseSemverParts(a);
|
|
62
|
+
const pb = parseSemverParts(b);
|
|
63
|
+
if (!pa || !pb) return 0;
|
|
64
|
+
for (let i = 0; i < 3; i += 1) {
|
|
65
|
+
if (pa[i] > pb[i]) return 1;
|
|
66
|
+
if (pa[i] < pb[i]) return -1;
|
|
67
|
+
}
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
function semverAtLeast(version, minimum) {
|
|
71
|
+
return compareSemver(version, minimum) >= 0;
|
|
72
|
+
}
|
|
73
|
+
function maxSemver(versions) {
|
|
74
|
+
let best = null;
|
|
75
|
+
for (const version of versions) {
|
|
76
|
+
if (!best || compareSemver(version, best) > 0) best = version;
|
|
77
|
+
}
|
|
78
|
+
return best;
|
|
79
|
+
}
|
|
80
|
+
function repoSourceCommands(packageName) {
|
|
81
|
+
if (packageName === "@kynver-app/runtime") {
|
|
82
|
+
return ["npm run kynver:build", "npm run kynver"];
|
|
83
|
+
}
|
|
84
|
+
return [`npm run build -w ${packageName}`];
|
|
85
|
+
}
|
|
86
|
+
function buildRemediation(input) {
|
|
87
|
+
const { packageName, minimumVersion, effectiveVersion, effectiveSource, repoVersion } = input;
|
|
88
|
+
const lines = [];
|
|
89
|
+
if (repoVersion && semverAtLeast(repoVersion, minimumVersion)) {
|
|
90
|
+
lines.push(
|
|
91
|
+
`Use the monorepo checkout (${repoVersion}) instead of a stale npm install: ${repoSourceCommands(packageName).join("; ")}.`
|
|
92
|
+
);
|
|
93
|
+
lines.push("Do not publish npm packages or wait on an operator release.");
|
|
94
|
+
return lines;
|
|
95
|
+
}
|
|
96
|
+
if (effectiveVersion) {
|
|
97
|
+
lines.push(
|
|
98
|
+
`Upgrade ${packageName} from ${effectiveVersion} to >= ${minimumVersion} (npm install -g ${packageName}@latest or align OpenClaw npm prefix).`
|
|
99
|
+
);
|
|
100
|
+
} else {
|
|
101
|
+
lines.push(`Install ${packageName} >= ${minimumVersion} before running memory-heavy AgentOS paths.`);
|
|
102
|
+
}
|
|
103
|
+
if (packageName === "@kynver-app/runtime") {
|
|
104
|
+
lines.push("Repo-source alternative: npm run kynver:build && npm run kynver");
|
|
105
|
+
}
|
|
106
|
+
if (effectiveSource === "installed" && repoVersion) {
|
|
107
|
+
lines.push(`Repo checkout reports ${repoVersion}; rebuild/link repo source if you develop from the monorepo.`);
|
|
108
|
+
}
|
|
109
|
+
return lines;
|
|
110
|
+
}
|
|
111
|
+
function pickEffectiveCandidate(candidates) {
|
|
112
|
+
if (candidates.length === 0) return { version: null, source: "unknown" };
|
|
113
|
+
const best = maxSemver(candidates.map((candidate) => candidate.version));
|
|
114
|
+
if (!best) return { version: null, source: "unknown" };
|
|
115
|
+
const winner = candidates.find((candidate) => candidate.version === best) ?? candidates[0];
|
|
116
|
+
return { version: winner.version, source: winner.source };
|
|
117
|
+
}
|
|
118
|
+
function evaluateMemoryCostPackageVersionGuard(input = {}) {
|
|
119
|
+
const normalize = (value, fallbackSource) => {
|
|
120
|
+
if (!value) return null;
|
|
121
|
+
if (typeof value === "string") return { version: value, source: fallbackSource };
|
|
122
|
+
return value;
|
|
123
|
+
};
|
|
124
|
+
const packages = MEMORY_COST_MANAGED_PACKAGES.map((packageName) => {
|
|
125
|
+
const minimumVersion = MEMORY_COST_PACKAGE_MIN_VERSIONS[packageName];
|
|
126
|
+
const candidates = [];
|
|
127
|
+
const installed = normalize(input.installed?.[packageName], "installed");
|
|
128
|
+
const repo = normalize(input.repo?.[packageName], "repo");
|
|
129
|
+
const self = normalize(input.self?.[packageName], "self");
|
|
130
|
+
if (installed) candidates.push(installed);
|
|
131
|
+
if (repo) candidates.push(repo);
|
|
132
|
+
if (self) candidates.push(self);
|
|
133
|
+
const { version: effectiveVersion, source: effectiveSource } = pickEffectiveCandidate(candidates);
|
|
134
|
+
const repoVersion = repo?.version ?? null;
|
|
135
|
+
const ok2 = effectiveVersion ? semverAtLeast(effectiveVersion, minimumVersion) : false;
|
|
136
|
+
const remediation = ok2 ? [] : buildRemediation({
|
|
137
|
+
packageName,
|
|
138
|
+
minimumVersion,
|
|
139
|
+
effectiveVersion,
|
|
140
|
+
effectiveSource,
|
|
141
|
+
repoVersion
|
|
142
|
+
});
|
|
143
|
+
const summary2 = ok2 ? `${DISPLAY_NAMES[packageName]} ${effectiveVersion} meets memory-cost minimum ${minimumVersion} (${effectiveSource}).` : `${DISPLAY_NAMES[packageName]} is below memory-cost minimum ${minimumVersion}` + (effectiveVersion ? ` (effective ${effectiveVersion} via ${effectiveSource})` : " (no version detected)") + ".";
|
|
144
|
+
return {
|
|
145
|
+
packageName,
|
|
146
|
+
displayName: DISPLAY_NAMES[packageName],
|
|
147
|
+
minimumVersion,
|
|
148
|
+
effectiveVersion,
|
|
149
|
+
effectiveSource,
|
|
150
|
+
ok: ok2,
|
|
151
|
+
summary: summary2,
|
|
152
|
+
remediation
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
const violations = packages.filter((row) => !row.ok);
|
|
156
|
+
const ok = violations.length === 0;
|
|
157
|
+
const summary = ok ? "All managed AgentOS packages meet memory-cost minimum versions." : `Memory-cost package guard blocked ${violations.length} stale package(s): ${violations.map((row) => `${row.packageName} < ${row.minimumVersion}`).join("; ")}.`;
|
|
158
|
+
return { ok, summary, packages };
|
|
159
|
+
}
|
|
160
|
+
var MemoryCostPackageVersionGuardError = class extends Error {
|
|
161
|
+
result;
|
|
162
|
+
constructor(result) {
|
|
163
|
+
const lines = [
|
|
164
|
+
result.summary,
|
|
165
|
+
...result.packages.filter((row) => !row.ok).flatMap((row) => [`- ${row.summary}`, ...row.remediation.map((line) => ` \u2192 ${line}`)])
|
|
166
|
+
];
|
|
167
|
+
super(lines.join("\n"));
|
|
168
|
+
this.name = "MemoryCostPackageVersionGuardError";
|
|
169
|
+
this.result = result;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
function assertMemoryCostPackageVersionGuard(input = {}) {
|
|
173
|
+
const result = evaluateMemoryCostPackageVersionGuard(input);
|
|
174
|
+
if (!result.ok) throw new MemoryCostPackageVersionGuardError(result);
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
export {
|
|
178
|
+
MEMORY_COST_PACKAGE_MIN_VERSIONS,
|
|
179
|
+
MemoryCostPackageVersionGuardError,
|
|
180
|
+
assertMemoryCostPackageVersionGuard,
|
|
181
|
+
compareSemver,
|
|
182
|
+
evaluateMemoryCostPackageVersionGuard
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=memory-cost.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/worker-env.ts", "../../src/memory-cost-package-version-guard.ts"],
|
|
4
|
+
"sourcesContent": ["/**\r\n * Worker spawn env scrub \u2014 harness workers must not inherit host deployment secrets.\r\n */\r\n\r\n/** Exact env keys that must never reach a worker child process. */\r\nexport const FORBIDDEN_WORKER_ENV_KEYS = [\r\n \"ANTHROPIC_API_KEY\",\r\n \"ANALYST_API_KEY\",\r\n \"RECRUITER_API_KEY\",\r\n \"AUTH_SECRET\",\r\n \"NEXTAUTH_SECRET\",\r\n \"DATABASE_URL\",\r\n \"PRODUCTION_DATABASE_URL\",\r\n \"KYNVER_PRODUCTION_DATABASE_URL\",\r\n \"REDIS_URL\",\r\n \"GOOGLE_CLIENT_SECRET\",\r\n \"GITHUB_CLIENT_SECRET\",\r\n \"KYNVER_API_KEY\",\r\n \"KYNVER_SERVICE_SECRET\",\r\n \"KYNVER_RUNTIME_SECRET\",\r\n \"KYNVER_CRON_SECRET\",\r\n \"OPENCLAW_CRON_SECRET\",\r\n \"QSTASH_TOKEN\",\r\n \"QSTASH_CURRENT_SIGNING_KEY\",\r\n \"QSTASH_NEXT_SIGNING_KEY\",\r\n \"TOOL_SECRETS_KEK\",\r\n \"TOOL_EXECUTOR_DISPATCH_SECRET\",\r\n \"CLOUDFLARE_API_TOKEN\",\r\n \"STRIPE_SECRET_KEY\",\r\n \"STRIPE_WEBHOOK_SECRET\",\r\n \"STRIPE_IDENTITY_WEBHOOK_SECRET\",\r\n \"VOYAGE_API_KEY\",\r\n \"PERPLEXITY_API_KEY\",\r\n \"FRED_API_KEY\",\r\n \"FMP_API_KEY\",\r\n \"CURSOR_API_KEY\",\r\n] as const;\r\n\r\nconst FORBIDDEN_KEY_SET = new Set<string>(FORBIDDEN_WORKER_ENV_KEYS);\r\n\r\n/** Keys matching these suffixes are stripped (case-sensitive). */\r\nconst FORBIDDEN_SUFFIXES = [\"_SECRET\", \"_API_KEY\"] as const;\r\n\r\nexport function isForbiddenWorkerEnvKey(key: string): boolean {\r\n if (FORBIDDEN_KEY_SET.has(key)) return true;\r\n return FORBIDDEN_SUFFIXES.some((suffix) => key.endsWith(suffix));\r\n}\r\n\r\nexport function listForbiddenWorkerEnvKeys(env: NodeJS.ProcessEnv): string[] {\r\n return Object.keys(env).filter(isForbiddenWorkerEnvKey).sort();\r\n}\r\n\r\nexport function scrubWorkerEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n const next = { ...env };\r\n for (const key of Object.keys(next)) {\r\n if (isForbiddenWorkerEnvKey(key)) delete next[key];\r\n }\r\n return next;\r\n}\r\n\r\nexport interface WorkerEnvAudit {\r\n forbiddenPresent: string[];\r\n safe: boolean;\r\n}\r\n\r\nexport function auditWorkerEnv(env: NodeJS.ProcessEnv): WorkerEnvAudit {\r\n const forbiddenPresent = listForbiddenWorkerEnvKeys(env);\r\n return { forbiddenPresent, safe: forbiddenPresent.length === 0 };\r\n}\r\n\r\n/** @deprecated Use {@link scrubWorkerEnv} \u2014 kept for existing imports from git.ts */\r\nexport function scrubClaudeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n return scrubWorkerEnv(env);\r\n}\r\n", "import { existsSync, readFileSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport { discoverDefaultRepo } from \"./default-repo-discovery.js\";\r\n\r\n/** Minimum versions that ship MARM memory cost controls (PR #1159). */\r\nexport const MEMORY_COST_PACKAGE_MIN_VERSIONS = {\r\n \"@kynver-app/runtime\": \"0.1.83\",\r\n \"@kynver-app/openclaw-agent-os\": \"0.1.43\",\r\n \"@kynver-app/mcp-agent-os\": \"0.3.34\",\r\n} as const;\r\n\r\nexport type MemoryCostManagedPackageName = keyof typeof MEMORY_COST_PACKAGE_MIN_VERSIONS;\r\n\r\nexport const MEMORY_COST_MANAGED_PACKAGES = Object.keys(\r\n MEMORY_COST_PACKAGE_MIN_VERSIONS,\r\n) as MemoryCostManagedPackageName[];\r\n\r\nexport type MemoryCostVersionSource = \"self\" | \"installed\" | \"repo\" | \"unknown\";\r\n\r\nexport interface MemoryCostPackageVersionCandidate {\r\n version: string;\r\n source: MemoryCostVersionSource;\r\n path?: string;\r\n}\r\n\r\nexport interface MemoryCostPackageGuardRow {\r\n packageName: MemoryCostManagedPackageName;\r\n displayName: string;\r\n minimumVersion: string;\r\n effectiveVersion: string | null;\r\n effectiveSource: MemoryCostVersionSource;\r\n ok: boolean;\r\n summary: string;\r\n remediation: string[];\r\n}\r\n\r\nexport interface MemoryCostPackageGuardResult {\r\n ok: boolean;\r\n summary: string;\r\n packages: MemoryCostPackageGuardRow[];\r\n}\r\n\r\nconst DISPLAY_NAMES: Record<MemoryCostManagedPackageName, string> = {\r\n \"@kynver-app/runtime\": \"Kynver runtime\",\r\n \"@kynver-app/openclaw-agent-os\": \"OpenClaw AgentOS plugin\",\r\n \"@kynver-app/mcp-agent-os\": \"AgentOS MCP server\",\r\n};\r\n\r\nconst REPO_PACKAGE_JSON_RELATIVE: Record<MemoryCostManagedPackageName, string> = {\r\n \"@kynver-app/runtime\": \"packages/kynver-runtime/package.json\",\r\n \"@kynver-app/openclaw-agent-os\": \"packages/kynver-openclaw-agent-os/package.json\",\r\n \"@kynver-app/mcp-agent-os\": \"packages/kynver-mcp-agent-os/package.json\",\r\n};\r\n\r\n/** Parse `major.minor.patch`; pre-release/build suffixes are ignored. */\r\nexport function parseSemverParts(version: string): [number, number, number] | null {\r\n const core = version.trim().split(\"-\")[0]?.split(\"+\")[0];\r\n if (!core) return null;\r\n const parts = core.split(\".\");\r\n if (parts.length < 1 || parts.length > 3) return null;\r\n const nums = parts.map((p) => Number.parseInt(p, 10));\r\n if (nums.some((n) => !Number.isFinite(n) || n < 0)) return null;\r\n while (nums.length < 3) nums.push(0);\r\n return [nums[0]!, nums[1]!, nums[2]!];\r\n}\r\n\r\n/** Returns 1 if a > b, -1 if a < b, 0 if equal or either unparsable. */\r\nexport function compareSemver(a: string, b: string): number {\r\n const pa = parseSemverParts(a);\r\n const pb = parseSemverParts(b);\r\n if (!pa || !pb) return 0;\r\n for (let i = 0; i < 3; i += 1) {\r\n if (pa[i]! > pb[i]!) return 1;\r\n if (pa[i]! < pb[i]!) return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport function semverAtLeast(version: string, minimum: string): boolean {\r\n return compareSemver(version, minimum) >= 0;\r\n}\r\n\r\nfunction maxSemver(versions: readonly string[]): string | null {\r\n let best: string | null = null;\r\n for (const version of versions) {\r\n if (!best || compareSemver(version, best) > 0) best = version;\r\n }\r\n return best;\r\n}\r\n\r\nfunction readPackageJsonVersion(packageJsonPath: string): string | null {\r\n try {\r\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version?: unknown };\r\n return typeof parsed.version === \"string\" && parsed.version.trim() ? parsed.version.trim() : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction resolveRepoRoot(cwd: string, explicitRepoRoot?: string): string | null {\r\n const candidates = [explicitRepoRoot, process.env.KYNVER_REPO, cwd].filter(\r\n (value): value is string => Boolean(value?.trim()),\r\n );\r\n for (const candidate of candidates) {\r\n const resolved = path.resolve(candidate);\r\n if (\r\n existsSync(path.join(resolved, \"packages/kynver-runtime/package.json\")) &&\r\n existsSync(path.join(resolved, \"package.json\"))\r\n ) {\r\n return resolved;\r\n }\r\n }\r\n const discovered = discoverDefaultRepo({ cwd });\r\n return discovered?.repo ?? null;\r\n}\r\n\r\nexport function probeRepoPackageVersions(input: {\r\n cwd?: string;\r\n repoRoot?: string;\r\n} = {}): Partial<Record<MemoryCostManagedPackageName, MemoryCostPackageVersionCandidate>> {\r\n const cwd = input.cwd ?? process.cwd();\r\n const repoRoot = resolveRepoRoot(cwd, input.repoRoot);\r\n if (!repoRoot) return {};\r\n\r\n const out: Partial<Record<MemoryCostManagedPackageName, MemoryCostPackageVersionCandidate>> = {};\r\n for (const packageName of MEMORY_COST_MANAGED_PACKAGES) {\r\n const packageJsonPath = path.join(repoRoot, REPO_PACKAGE_JSON_RELATIVE[packageName]);\r\n const version = readPackageJsonVersion(packageJsonPath);\r\n if (!version) continue;\r\n out[packageName] = { version, source: \"repo\", path: packageJsonPath };\r\n }\r\n return out;\r\n}\r\n\r\nfunction repoSourceCommands(packageName: MemoryCostManagedPackageName): string[] {\r\n if (packageName === \"@kynver-app/runtime\") {\r\n return [\"npm run kynver:build\", \"npm run kynver\"];\r\n }\r\n return [`npm run build -w ${packageName}`];\r\n}\r\n\r\nfunction buildRemediation(input: {\r\n packageName: MemoryCostManagedPackageName;\r\n minimumVersion: string;\r\n effectiveVersion: string | null;\r\n effectiveSource: MemoryCostVersionSource;\r\n repoVersion: string | null;\r\n}): string[] {\r\n const { packageName, minimumVersion, effectiveVersion, effectiveSource, repoVersion } = input;\r\n const lines: string[] = [];\r\n if (repoVersion && semverAtLeast(repoVersion, minimumVersion)) {\r\n lines.push(\r\n `Use the monorepo checkout (${repoVersion}) instead of a stale npm install: ${repoSourceCommands(packageName).join(\"; \")}.`,\r\n );\r\n lines.push(\"Do not publish npm packages or wait on an operator release.\");\r\n return lines;\r\n }\r\n if (effectiveVersion) {\r\n lines.push(\r\n `Upgrade ${packageName} from ${effectiveVersion} to >= ${minimumVersion} (npm install -g ${packageName}@latest or align OpenClaw npm prefix).`,\r\n );\r\n } else {\r\n lines.push(`Install ${packageName} >= ${minimumVersion} before running memory-heavy AgentOS paths.`);\r\n }\r\n if (packageName === \"@kynver-app/runtime\") {\r\n lines.push(\"Repo-source alternative: npm run kynver:build && npm run kynver\");\r\n }\r\n if (effectiveSource === \"installed\" && repoVersion) {\r\n lines.push(`Repo checkout reports ${repoVersion}; rebuild/link repo source if you develop from the monorepo.`);\r\n }\r\n return lines;\r\n}\r\n\r\nfunction pickEffectiveCandidate(\r\n candidates: MemoryCostPackageVersionCandidate[],\r\n): { version: string | null; source: MemoryCostVersionSource } {\r\n if (candidates.length === 0) return { version: null, source: \"unknown\" };\r\n const best = maxSemver(candidates.map((candidate) => candidate.version));\r\n if (!best) return { version: null, source: \"unknown\" };\r\n const winner = candidates.find((candidate) => candidate.version === best) ?? candidates[0]!;\r\n return { version: winner.version, source: winner.source };\r\n}\r\n\r\nexport function evaluateMemoryCostPackageVersionGuard(input: {\r\n installed?: Partial<Record<MemoryCostManagedPackageName, string | MemoryCostPackageVersionCandidate>>;\r\n repo?: Partial<Record<MemoryCostManagedPackageName, string | MemoryCostPackageVersionCandidate>>;\r\n self?: Partial<Record<MemoryCostManagedPackageName, string | MemoryCostPackageVersionCandidate>>;\r\n} = {}): MemoryCostPackageGuardResult {\r\n const normalize = (\r\n value: string | MemoryCostPackageVersionCandidate | undefined,\r\n fallbackSource: MemoryCostVersionSource,\r\n ): MemoryCostPackageVersionCandidate | null => {\r\n if (!value) return null;\r\n if (typeof value === \"string\") return { version: value, source: fallbackSource };\r\n return value;\r\n };\r\n\r\n const packages = MEMORY_COST_MANAGED_PACKAGES.map((packageName): MemoryCostPackageGuardRow => {\r\n const minimumVersion = MEMORY_COST_PACKAGE_MIN_VERSIONS[packageName];\r\n const candidates: MemoryCostPackageVersionCandidate[] = [];\r\n const installed = normalize(input.installed?.[packageName], \"installed\");\r\n const repo = normalize(input.repo?.[packageName], \"repo\");\r\n const self = normalize(input.self?.[packageName], \"self\");\r\n if (installed) candidates.push(installed);\r\n if (repo) candidates.push(repo);\r\n if (self) candidates.push(self);\r\n\r\n const { version: effectiveVersion, source: effectiveSource } = pickEffectiveCandidate(candidates);\r\n const repoVersion = repo?.version ?? null;\r\n const ok = effectiveVersion ? semverAtLeast(effectiveVersion, minimumVersion) : false;\r\n const remediation = ok\r\n ? []\r\n : buildRemediation({\r\n packageName,\r\n minimumVersion,\r\n effectiveVersion,\r\n effectiveSource,\r\n repoVersion,\r\n });\r\n\r\n const summary = ok\r\n ? `${DISPLAY_NAMES[packageName]} ${effectiveVersion} meets memory-cost minimum ${minimumVersion} (${effectiveSource}).`\r\n : `${DISPLAY_NAMES[packageName]} is below memory-cost minimum ${minimumVersion}` +\r\n (effectiveVersion ? ` (effective ${effectiveVersion} via ${effectiveSource})` : \" (no version detected)\") +\r\n \".\";\r\n\r\n return {\r\n packageName,\r\n displayName: DISPLAY_NAMES[packageName],\r\n minimumVersion,\r\n effectiveVersion,\r\n effectiveSource,\r\n ok,\r\n summary,\r\n remediation,\r\n };\r\n });\r\n\r\n const violations = packages.filter((row) => !row.ok);\r\n const ok = violations.length === 0;\r\n const summary = ok\r\n ? \"All managed AgentOS packages meet memory-cost minimum versions.\"\r\n : `Memory-cost package guard blocked ${violations.length} stale package(s): ${violations\r\n .map((row) => `${row.packageName} < ${row.minimumVersion}`)\r\n .join(\"; \")}.`;\r\n\r\n return { ok, summary, packages };\r\n}\r\n\r\nexport class MemoryCostPackageVersionGuardError extends Error {\r\n readonly result: MemoryCostPackageGuardResult;\r\n\r\n constructor(result: MemoryCostPackageGuardResult) {\r\n const lines = [\r\n result.summary,\r\n ...result.packages\r\n .filter((row) => !row.ok)\r\n .flatMap((row) => [`- ${row.summary}`, ...row.remediation.map((line) => ` \u2192 ${line}`)]),\r\n ];\r\n super(lines.join(\"\\n\"));\r\n this.name = \"MemoryCostPackageVersionGuardError\";\r\n this.result = result;\r\n }\r\n}\r\n\r\nexport function assertMemoryCostPackageVersionGuard(\r\n input: Parameters<typeof evaluateMemoryCostPackageVersionGuard>[0] = {},\r\n): MemoryCostPackageGuardResult {\r\n const result = evaluateMemoryCostPackageVersionGuard(input);\r\n if (!result.ok) throw new MemoryCostPackageVersionGuardError(result);\r\n return result;\r\n}\r\n\r\nexport function formatMemoryCostPackageGuardError(result: MemoryCostPackageGuardResult): string {\r\n return new MemoryCostPackageVersionGuardError(result).message;\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ok", "summary"]
|
|
7
|
+
}
|