@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 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 || process.env.KYNVER_API_URL || process.env.OPENCLAW_CRON_FIRE_BASE_URL || loadUserConfig().apiBaseUrl;
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 trimTrailingSlash(String(baseUrl));
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 resolveCallbackSecret(argsSecret, agentOsId) {
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 path15 = input.diskPath?.trim() || "/";
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(path15);
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: path15,
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 = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
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 = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
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 = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
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 = resolveCallbackSecret(args.secret, args.agentOsId);
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 = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
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 = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
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 = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
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] && path14.resolve(process.argv[1]) === path14.resolve(fileURLToPath(import.meta.url));
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);