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