@kynver-app/runtime 0.1.8 → 0.1.10
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/cli.js +39 -17
- package/dist/cli.js.map +3 -3
- package/dist/index.js +47 -17
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
|
-
import { mkdirSync as mkdirSync5 } from "node:fs";
|
|
5
|
-
import path14 from "node:path";
|
|
4
|
+
import { mkdirSync as mkdirSync5, realpathSync } from "node:fs";
|
|
6
5
|
import { fileURLToPath } from "node:url";
|
|
7
6
|
|
|
8
7
|
// src/config.ts
|
|
@@ -153,6 +152,8 @@ function saveApiKey(apiKey) {
|
|
|
153
152
|
saveCredentialsFile({ ...loadCredentialsFile(), apiKey });
|
|
154
153
|
}
|
|
155
154
|
function loadRunnerToken(agentOsId) {
|
|
155
|
+
const envToken = process.env.KYNVER_RUNNER_TOKEN?.trim();
|
|
156
|
+
if (envToken) return envToken;
|
|
156
157
|
const creds = loadCredentialsFile();
|
|
157
158
|
if (!creds.runnerToken) return void 0;
|
|
158
159
|
if (agentOsId && creds.runnerTokenAgentOsId && creds.runnerTokenAgentOsId !== agentOsId) {
|
|
@@ -168,11 +169,15 @@ function saveRunnerToken(agentOsId, token) {
|
|
|
168
169
|
});
|
|
169
170
|
}
|
|
170
171
|
function resolveBaseUrl(argsBaseUrl) {
|
|
171
|
-
const baseUrl = argsBaseUrl
|
|
172
|
+
const baseUrl = resolveConfiguredBaseUrl(argsBaseUrl);
|
|
172
173
|
if (!baseUrl) failConfig("requires --base-url, KYNVER_API_URL, OPENCLAW_CRON_FIRE_BASE_URL, or ~/.kynver/config.json apiBaseUrl");
|
|
173
|
-
return
|
|
174
|
+
return baseUrl;
|
|
175
|
+
}
|
|
176
|
+
function resolveConfiguredBaseUrl(argsBaseUrl) {
|
|
177
|
+
const baseUrl = argsBaseUrl || process.env.KYNVER_API_URL || process.env.OPENCLAW_CRON_FIRE_BASE_URL || loadUserConfig().apiBaseUrl;
|
|
178
|
+
return baseUrl ? trimTrailingSlash(String(baseUrl)) : void 0;
|
|
174
179
|
}
|
|
175
|
-
function
|
|
180
|
+
function resolveConfiguredCallbackSecret(argsSecret, agentOsId) {
|
|
176
181
|
const scoped = argsSecret || loadRunnerToken(agentOsId) || loadRunnerToken(loadUserConfig().agentOsId);
|
|
177
182
|
if (scoped) return String(scoped);
|
|
178
183
|
const globalSecret = process.env.KYNVER_RUNTIME_SECRET || process.env.OPENCLAW_CRON_SECRET;
|
|
@@ -182,8 +187,24 @@ function resolveCallbackSecret(argsSecret, agentOsId) {
|
|
|
182
187
|
);
|
|
183
188
|
return String(globalSecret);
|
|
184
189
|
}
|
|
190
|
+
return void 0;
|
|
191
|
+
}
|
|
192
|
+
async function resolveCallbackSecretWithMint(argsSecret, agentOsId, opts) {
|
|
193
|
+
const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);
|
|
194
|
+
if (configured) return configured;
|
|
195
|
+
const apiKey = loadApiKey();
|
|
196
|
+
const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);
|
|
197
|
+
if (apiKey && agentOsId && baseUrl) {
|
|
198
|
+
try {
|
|
199
|
+
const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });
|
|
200
|
+
saveRunnerToken(agentOsId, token);
|
|
201
|
+
return token;
|
|
202
|
+
} catch (error) {
|
|
203
|
+
failConfig(`runner credential mint failed: ${error.message}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
185
206
|
failConfig(
|
|
186
|
-
"requires --secret, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, or (legacy) KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET"
|
|
207
|
+
"requires --secret, KYNVER_RUNNER_TOKEN, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, KYNVER_API_KEY with an API base URL to mint one, or (legacy) KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET"
|
|
187
208
|
);
|
|
188
209
|
}
|
|
189
210
|
async function fetchRunnerCredential(agentOsId, opts) {
|
|
@@ -359,12 +380,12 @@ var DEFAULT_CRITICAL_FREE_BYTES = 15 * 1024 * 1024 * 1024;
|
|
|
359
380
|
var DEFAULT_MAX_USED_PERCENT = 80;
|
|
360
381
|
var DEFAULT_HARD_MAX_USED_PERCENT = 90;
|
|
361
382
|
function observeRunnerDiskGate(input = {}) {
|
|
362
|
-
const
|
|
383
|
+
const path14 = input.diskPath?.trim() || "/";
|
|
363
384
|
const warnBelowBytes = input.diskFreeWarnBytes ?? DEFAULT_WARN_FREE_BYTES;
|
|
364
385
|
const criticalBelowBytes = input.diskFreeCriticalBytes ?? DEFAULT_CRITICAL_FREE_BYTES;
|
|
365
386
|
const maxUsedPercent = input.diskMaxUsedPercent ?? DEFAULT_MAX_USED_PERCENT;
|
|
366
387
|
const hardMaxUsedPercent = input.diskHardMaxUsedPercent ?? DEFAULT_HARD_MAX_USED_PERCENT;
|
|
367
|
-
const stats = statfsSync(
|
|
388
|
+
const stats = statfsSync(path14);
|
|
368
389
|
const freeBytes = Number(stats.bavail) * Number(stats.bsize);
|
|
369
390
|
const totalBytes = Number(stats.blocks) * Number(stats.bsize);
|
|
370
391
|
const usedPercent = totalBytes > 0 ? (totalBytes - freeBytes) / totalBytes * 100 : 100;
|
|
@@ -384,7 +405,7 @@ function observeRunnerDiskGate(input = {}) {
|
|
|
384
405
|
}
|
|
385
406
|
return {
|
|
386
407
|
ok,
|
|
387
|
-
path:
|
|
408
|
+
path: path14,
|
|
388
409
|
freeBytes,
|
|
389
410
|
totalBytes,
|
|
390
411
|
usedPercent,
|
|
@@ -1057,7 +1078,7 @@ async function dispatchRun(args) {
|
|
|
1057
1078
|
const run = loadRun(String(required(String(args.run || ""), "--run")));
|
|
1058
1079
|
const agentOsId = String(required(String(args.agentOsId || ""), "--agent-os-id"));
|
|
1059
1080
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1060
|
-
const secret =
|
|
1081
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1061
1082
|
const execute = args.execute === true || args.execute === "true";
|
|
1062
1083
|
const dryRun = !execute;
|
|
1063
1084
|
const leaseOwner = `openclaw-harness:${run.id}`;
|
|
@@ -1201,7 +1222,7 @@ async function sweepRun(args) {
|
|
|
1201
1222
|
const run = loadRun(String(required(String(args.run || ""), "--run")));
|
|
1202
1223
|
const agentOsId = String(required(String(args.agentOsId || ""), "--agent-os-id"));
|
|
1203
1224
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1204
|
-
const secret =
|
|
1225
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1205
1226
|
const leaseOwner = `openclaw-harness:${run.id}`;
|
|
1206
1227
|
const releasedLocalOrphans = [];
|
|
1207
1228
|
for (const name of Object.keys(run.workers || {})) {
|
|
@@ -1319,7 +1340,7 @@ async function tryCompleteWorker(args) {
|
|
|
1319
1340
|
return { ok: true, skipped: true, reason: "worker-not-finished" };
|
|
1320
1341
|
}
|
|
1321
1342
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1322
|
-
const secret =
|
|
1343
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1323
1344
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/completion`;
|
|
1324
1345
|
const body = {
|
|
1325
1346
|
source: "openclaw-harness",
|
|
@@ -1476,7 +1497,7 @@ import path12 from "node:path";
|
|
|
1476
1497
|
// src/plan-progress-sync.ts
|
|
1477
1498
|
async function syncPlanProgress(args) {
|
|
1478
1499
|
const base = resolveBaseUrl(args.baseUrl);
|
|
1479
|
-
const secret =
|
|
1500
|
+
const secret = await resolveCallbackSecretWithMint(args.secret, args.agentOsId, { baseUrl: base });
|
|
1480
1501
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(args.agentOsId)}/tasks/${encodeURIComponent(args.taskId)}/plan-progress-sync`;
|
|
1481
1502
|
const res = await postJson(url, secret, {
|
|
1482
1503
|
phase: args.phase,
|
|
@@ -1525,7 +1546,7 @@ async function syncActiveWorkerPlanProgress(runId, args) {
|
|
|
1525
1546
|
// src/workspace-runtime-config.ts
|
|
1526
1547
|
async function fetchWorkspaceRuntimePreferences(agentOsId, args) {
|
|
1527
1548
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1528
|
-
const secret =
|
|
1549
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1529
1550
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runtime`;
|
|
1530
1551
|
try {
|
|
1531
1552
|
const res = await getJson(url, secret);
|
|
@@ -1568,7 +1589,7 @@ async function completeFinishedWorkers(runId, args) {
|
|
|
1568
1589
|
}
|
|
1569
1590
|
async function postOperatorTick(agentOsId, runId, resourceGate, args) {
|
|
1570
1591
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1571
|
-
const secret =
|
|
1592
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1572
1593
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/operator/tick`;
|
|
1573
1594
|
const res = await postJson(url, secret, {
|
|
1574
1595
|
agentOsId,
|
|
@@ -1692,7 +1713,7 @@ async function emitPlanProgress(args) {
|
|
|
1692
1713
|
evidence.push(parseEvidenceArg(rawEvidence));
|
|
1693
1714
|
}
|
|
1694
1715
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1695
|
-
const secret =
|
|
1716
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1696
1717
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/plans/${encodeURIComponent(planId)}/progress-events`;
|
|
1697
1718
|
const cfg = loadUserConfig();
|
|
1698
1719
|
const provider = cfg.workerProvider ? `provider:${cfg.workerProvider}` : void 0;
|
|
@@ -1807,6 +1828,7 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1807
1828
|
} else {
|
|
1808
1829
|
rest = argv;
|
|
1809
1830
|
}
|
|
1831
|
+
if (action && isHelpFlag(action) || rest.some(isHelpFlag)) return usage(0);
|
|
1810
1832
|
const args = parseArgs(rest);
|
|
1811
1833
|
const { runsDir, worktreesDir } = getPaths();
|
|
1812
1834
|
mkdirSync5(runsDir, { recursive: true });
|
|
@@ -1829,7 +1851,7 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1829
1851
|
if (scope === "worker" && action === "complete") return void await completeWorker(args);
|
|
1830
1852
|
unknownCommand(scope, action);
|
|
1831
1853
|
}
|
|
1832
|
-
var isCliEntry = process.argv[1] &&
|
|
1854
|
+
var isCliEntry = process.argv[1] && realpathSync.native(process.argv[1]) === realpathSync.native(fileURLToPath(import.meta.url));
|
|
1833
1855
|
if (isCliEntry) {
|
|
1834
1856
|
void main().catch((error) => {
|
|
1835
1857
|
console.error(error);
|