@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/index.js
CHANGED
|
@@ -146,6 +146,8 @@ function saveApiKey(apiKey) {
|
|
|
146
146
|
saveCredentialsFile({ ...loadCredentialsFile(), apiKey });
|
|
147
147
|
}
|
|
148
148
|
function loadRunnerToken(agentOsId) {
|
|
149
|
+
const envToken = process.env.KYNVER_RUNNER_TOKEN?.trim();
|
|
150
|
+
if (envToken) return envToken;
|
|
149
151
|
const creds = loadCredentialsFile();
|
|
150
152
|
if (!creds.runnerToken) return void 0;
|
|
151
153
|
if (agentOsId && creds.runnerTokenAgentOsId && creds.runnerTokenAgentOsId !== agentOsId) {
|
|
@@ -161,11 +163,15 @@ function saveRunnerToken(agentOsId, token) {
|
|
|
161
163
|
});
|
|
162
164
|
}
|
|
163
165
|
function resolveBaseUrl(argsBaseUrl) {
|
|
164
|
-
const baseUrl = argsBaseUrl
|
|
166
|
+
const baseUrl = resolveConfiguredBaseUrl(argsBaseUrl);
|
|
165
167
|
if (!baseUrl) failConfig("requires --base-url, KYNVER_API_URL, OPENCLAW_CRON_FIRE_BASE_URL, or ~/.kynver/config.json apiBaseUrl");
|
|
166
|
-
return
|
|
168
|
+
return baseUrl;
|
|
167
169
|
}
|
|
168
|
-
function
|
|
170
|
+
function resolveConfiguredBaseUrl(argsBaseUrl) {
|
|
171
|
+
const baseUrl = argsBaseUrl || process.env.KYNVER_API_URL || process.env.OPENCLAW_CRON_FIRE_BASE_URL || loadUserConfig().apiBaseUrl;
|
|
172
|
+
return baseUrl ? trimTrailingSlash(String(baseUrl)) : void 0;
|
|
173
|
+
}
|
|
174
|
+
function resolveConfiguredCallbackSecret(argsSecret, agentOsId) {
|
|
169
175
|
const scoped = argsSecret || loadRunnerToken(agentOsId) || loadRunnerToken(loadUserConfig().agentOsId);
|
|
170
176
|
if (scoped) return String(scoped);
|
|
171
177
|
const globalSecret = process.env.KYNVER_RUNTIME_SECRET || process.env.OPENCLAW_CRON_SECRET;
|
|
@@ -175,8 +181,31 @@ function resolveCallbackSecret(argsSecret, agentOsId) {
|
|
|
175
181
|
);
|
|
176
182
|
return String(globalSecret);
|
|
177
183
|
}
|
|
184
|
+
return void 0;
|
|
185
|
+
}
|
|
186
|
+
function resolveCallbackSecret(argsSecret, agentOsId) {
|
|
187
|
+
const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);
|
|
188
|
+
if (configured) return configured;
|
|
189
|
+
failConfig(
|
|
190
|
+
"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"
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
async function resolveCallbackSecretWithMint(argsSecret, agentOsId, opts) {
|
|
194
|
+
const configured = resolveConfiguredCallbackSecret(argsSecret, agentOsId);
|
|
195
|
+
if (configured) return configured;
|
|
196
|
+
const apiKey = loadApiKey();
|
|
197
|
+
const baseUrl = resolveConfiguredBaseUrl(opts?.baseUrl);
|
|
198
|
+
if (apiKey && agentOsId && baseUrl) {
|
|
199
|
+
try {
|
|
200
|
+
const token = await fetchRunnerCredential(agentOsId, { baseUrl, apiKey });
|
|
201
|
+
saveRunnerToken(agentOsId, token);
|
|
202
|
+
return token;
|
|
203
|
+
} catch (error) {
|
|
204
|
+
failConfig(`runner credential mint failed: ${error.message}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
178
207
|
failConfig(
|
|
179
|
-
"requires --secret, a scoped runner token (`kynver runner credential`), ~/.kynver/credentials runnerToken, or (legacy) KYNVER_RUNTIME_SECRET / OPENCLAW_CRON_SECRET"
|
|
208
|
+
"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"
|
|
180
209
|
);
|
|
181
210
|
}
|
|
182
211
|
async function fetchRunnerCredential(agentOsId, opts) {
|
|
@@ -352,12 +381,12 @@ var DEFAULT_CRITICAL_FREE_BYTES = 15 * 1024 * 1024 * 1024;
|
|
|
352
381
|
var DEFAULT_MAX_USED_PERCENT = 80;
|
|
353
382
|
var DEFAULT_HARD_MAX_USED_PERCENT = 90;
|
|
354
383
|
function observeRunnerDiskGate(input = {}) {
|
|
355
|
-
const
|
|
384
|
+
const path14 = input.diskPath?.trim() || "/";
|
|
356
385
|
const warnBelowBytes = input.diskFreeWarnBytes ?? DEFAULT_WARN_FREE_BYTES;
|
|
357
386
|
const criticalBelowBytes = input.diskFreeCriticalBytes ?? DEFAULT_CRITICAL_FREE_BYTES;
|
|
358
387
|
const maxUsedPercent = input.diskMaxUsedPercent ?? DEFAULT_MAX_USED_PERCENT;
|
|
359
388
|
const hardMaxUsedPercent = input.diskHardMaxUsedPercent ?? DEFAULT_HARD_MAX_USED_PERCENT;
|
|
360
|
-
const stats = statfsSync(
|
|
389
|
+
const stats = statfsSync(path14);
|
|
361
390
|
const freeBytes = Number(stats.bavail) * Number(stats.bsize);
|
|
362
391
|
const totalBytes = Number(stats.blocks) * Number(stats.bsize);
|
|
363
392
|
const usedPercent = totalBytes > 0 ? (totalBytes - freeBytes) / totalBytes * 100 : 100;
|
|
@@ -377,7 +406,7 @@ function observeRunnerDiskGate(input = {}) {
|
|
|
377
406
|
}
|
|
378
407
|
return {
|
|
379
408
|
ok,
|
|
380
|
-
path:
|
|
409
|
+
path: path14,
|
|
381
410
|
freeBytes,
|
|
382
411
|
totalBytes,
|
|
383
412
|
usedPercent,
|
|
@@ -1050,7 +1079,7 @@ async function dispatchRun(args) {
|
|
|
1050
1079
|
const run = loadRun(String(required(String(args.run || ""), "--run")));
|
|
1051
1080
|
const agentOsId = String(required(String(args.agentOsId || ""), "--agent-os-id"));
|
|
1052
1081
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1053
|
-
const secret =
|
|
1082
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1054
1083
|
const execute = args.execute === true || args.execute === "true";
|
|
1055
1084
|
const dryRun = !execute;
|
|
1056
1085
|
const leaseOwner = `openclaw-harness:${run.id}`;
|
|
@@ -1278,7 +1307,7 @@ async function sweepRun(args) {
|
|
|
1278
1307
|
const run = loadRun(String(required(String(args.run || ""), "--run")));
|
|
1279
1308
|
const agentOsId = String(required(String(args.agentOsId || ""), "--agent-os-id"));
|
|
1280
1309
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1281
|
-
const secret =
|
|
1310
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1282
1311
|
const leaseOwner = `openclaw-harness:${run.id}`;
|
|
1283
1312
|
const releasedLocalOrphans = [];
|
|
1284
1313
|
for (const name of Object.keys(run.workers || {})) {
|
|
@@ -1339,7 +1368,7 @@ async function tryCompleteWorker(args) {
|
|
|
1339
1368
|
return { ok: true, skipped: true, reason: "worker-not-finished" };
|
|
1340
1369
|
}
|
|
1341
1370
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1342
|
-
const secret =
|
|
1371
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1343
1372
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/harness/completion`;
|
|
1344
1373
|
const body = {
|
|
1345
1374
|
source: "openclaw-harness",
|
|
@@ -1488,8 +1517,7 @@ function stopWorker(args) {
|
|
|
1488
1517
|
}
|
|
1489
1518
|
|
|
1490
1519
|
// src/cli.ts
|
|
1491
|
-
import { mkdirSync as mkdirSync5 } from "node:fs";
|
|
1492
|
-
import path14 from "node:path";
|
|
1520
|
+
import { mkdirSync as mkdirSync5, realpathSync } from "node:fs";
|
|
1493
1521
|
import { fileURLToPath } from "node:url";
|
|
1494
1522
|
|
|
1495
1523
|
// src/pipeline-tick.ts
|
|
@@ -1501,7 +1529,7 @@ import path12 from "node:path";
|
|
|
1501
1529
|
// src/plan-progress-sync.ts
|
|
1502
1530
|
async function syncPlanProgress(args) {
|
|
1503
1531
|
const base = resolveBaseUrl(args.baseUrl);
|
|
1504
|
-
const secret =
|
|
1532
|
+
const secret = await resolveCallbackSecretWithMint(args.secret, args.agentOsId, { baseUrl: base });
|
|
1505
1533
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(args.agentOsId)}/tasks/${encodeURIComponent(args.taskId)}/plan-progress-sync`;
|
|
1506
1534
|
const res = await postJson(url, secret, {
|
|
1507
1535
|
phase: args.phase,
|
|
@@ -1550,7 +1578,7 @@ async function syncActiveWorkerPlanProgress(runId, args) {
|
|
|
1550
1578
|
// src/workspace-runtime-config.ts
|
|
1551
1579
|
async function fetchWorkspaceRuntimePreferences(agentOsId, args) {
|
|
1552
1580
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1553
|
-
const secret =
|
|
1581
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1554
1582
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runtime`;
|
|
1555
1583
|
try {
|
|
1556
1584
|
const res = await getJson(url, secret);
|
|
@@ -1593,7 +1621,7 @@ async function completeFinishedWorkers(runId, args) {
|
|
|
1593
1621
|
}
|
|
1594
1622
|
async function postOperatorTick(agentOsId, runId, resourceGate, args) {
|
|
1595
1623
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1596
|
-
const secret =
|
|
1624
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1597
1625
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/operator/tick`;
|
|
1598
1626
|
const res = await postJson(url, secret, {
|
|
1599
1627
|
agentOsId,
|
|
@@ -1717,7 +1745,7 @@ async function emitPlanProgress(args) {
|
|
|
1717
1745
|
evidence.push(parseEvidenceArg(rawEvidence));
|
|
1718
1746
|
}
|
|
1719
1747
|
const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
|
|
1720
|
-
const secret =
|
|
1748
|
+
const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
|
|
1721
1749
|
const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/plans/${encodeURIComponent(planId)}/progress-events`;
|
|
1722
1750
|
const cfg = loadUserConfig();
|
|
1723
1751
|
const provider = cfg.workerProvider ? `provider:${cfg.workerProvider}` : void 0;
|
|
@@ -1832,6 +1860,7 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1832
1860
|
} else {
|
|
1833
1861
|
rest = argv;
|
|
1834
1862
|
}
|
|
1863
|
+
if (action && isHelpFlag(action) || rest.some(isHelpFlag)) return usage(0);
|
|
1835
1864
|
const args = parseArgs(rest);
|
|
1836
1865
|
const { runsDir, worktreesDir } = getPaths();
|
|
1837
1866
|
mkdirSync5(runsDir, { recursive: true });
|
|
@@ -1854,7 +1883,7 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1854
1883
|
if (scope === "worker" && action === "complete") return void await completeWorker(args);
|
|
1855
1884
|
unknownCommand(scope, action);
|
|
1856
1885
|
}
|
|
1857
|
-
var isCliEntry = process.argv[1] &&
|
|
1886
|
+
var isCliEntry = process.argv[1] && realpathSync.native(process.argv[1]) === realpathSync.native(fileURLToPath(import.meta.url));
|
|
1858
1887
|
if (isCliEntry) {
|
|
1859
1888
|
void main().catch((error) => {
|
|
1860
1889
|
console.error(error);
|
|
@@ -1884,6 +1913,7 @@ export {
|
|
|
1884
1913
|
redactHarness,
|
|
1885
1914
|
resolveBaseUrl,
|
|
1886
1915
|
resolveCallbackSecret,
|
|
1916
|
+
resolveCallbackSecretWithMint,
|
|
1887
1917
|
resolveHarnessRoot,
|
|
1888
1918
|
runDaemon,
|
|
1889
1919
|
runStatus,
|