@kynver-app/runtime 0.1.7 → 0.1.9

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) {
@@ -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",
@@ -1501,7 +1530,7 @@ import path12 from "node:path";
1501
1530
  // src/plan-progress-sync.ts
1502
1531
  async function syncPlanProgress(args) {
1503
1532
  const base = resolveBaseUrl(args.baseUrl);
1504
- const secret = resolveCallbackSecret(args.secret);
1533
+ const secret = await resolveCallbackSecretWithMint(args.secret, args.agentOsId, { baseUrl: base });
1505
1534
  const url = `${base}/api/agent-os/by-id/${encodeURIComponent(args.agentOsId)}/tasks/${encodeURIComponent(args.taskId)}/plan-progress-sync`;
1506
1535
  const res = await postJson(url, secret, {
1507
1536
  phase: args.phase,
@@ -1525,17 +1554,24 @@ async function syncActiveWorkerPlanProgress(runId, args) {
1525
1554
  );
1526
1555
  if (!worker?.dispatched || !worker.taskId) continue;
1527
1556
  const status = computeWorkerStatus(worker);
1528
- if (status.heartbeatBlocker) {
1529
- const res = await syncPlanProgress({
1530
- agentOsId,
1531
- taskId: worker.taskId,
1532
- phase: "heartbeat_blocker",
1533
- blocker: status.heartbeatBlocker,
1534
- baseUrl: args.baseUrl ? String(args.baseUrl) : void 0,
1535
- secret: args.secret ? String(args.secret) : void 0
1536
- });
1537
- outcomes.push({ worker: name, phase: "heartbeat_blocker", ok: res.ok });
1557
+ if (!status.heartbeatBlocker) continue;
1558
+ if (worker.lastSyncedHeartbeatBlocker === status.heartbeatBlocker) {
1559
+ outcomes.push({ worker: name, phase: "heartbeat_blocker", ok: true, skipped: true });
1560
+ continue;
1561
+ }
1562
+ const res = await syncPlanProgress({
1563
+ agentOsId,
1564
+ taskId: worker.taskId,
1565
+ phase: "heartbeat_blocker",
1566
+ blocker: status.heartbeatBlocker,
1567
+ baseUrl: args.baseUrl ? String(args.baseUrl) : void 0,
1568
+ secret: args.secret ? String(args.secret) : void 0
1569
+ });
1570
+ if (res.ok) {
1571
+ worker.lastSyncedHeartbeatBlocker = status.heartbeatBlocker;
1572
+ saveWorker(run.id, worker);
1538
1573
  }
1574
+ outcomes.push({ worker: name, phase: "heartbeat_blocker", ok: res.ok });
1539
1575
  }
1540
1576
  return outcomes;
1541
1577
  }
@@ -1543,7 +1579,7 @@ async function syncActiveWorkerPlanProgress(runId, args) {
1543
1579
  // src/workspace-runtime-config.ts
1544
1580
  async function fetchWorkspaceRuntimePreferences(agentOsId, args) {
1545
1581
  const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
1546
- const secret = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
1582
+ const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
1547
1583
  const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/runtime`;
1548
1584
  try {
1549
1585
  const res = await getJson(url, secret);
@@ -1586,7 +1622,7 @@ async function completeFinishedWorkers(runId, args) {
1586
1622
  }
1587
1623
  async function postOperatorTick(agentOsId, runId, resourceGate, args) {
1588
1624
  const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
1589
- const secret = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
1625
+ const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
1590
1626
  const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/operator/tick`;
1591
1627
  const res = await postJson(url, secret, {
1592
1628
  agentOsId,
@@ -1710,7 +1746,7 @@ async function emitPlanProgress(args) {
1710
1746
  evidence.push(parseEvidenceArg(rawEvidence));
1711
1747
  }
1712
1748
  const base = resolveBaseUrl(args.baseUrl ? String(args.baseUrl) : void 0);
1713
- const secret = resolveCallbackSecret(args.secret ? String(args.secret) : void 0, agentOsId);
1749
+ const secret = await resolveCallbackSecretWithMint(args.secret ? String(args.secret) : void 0, agentOsId, { baseUrl: base });
1714
1750
  const url = `${base}/api/agent-os/by-id/${encodeURIComponent(agentOsId)}/plans/${encodeURIComponent(planId)}/progress-events`;
1715
1751
  const cfg = loadUserConfig();
1716
1752
  const provider = cfg.workerProvider ? `provider:${cfg.workerProvider}` : void 0;
@@ -1877,6 +1913,7 @@ export {
1877
1913
  redactHarness,
1878
1914
  resolveBaseUrl,
1879
1915
  resolveCallbackSecret,
1916
+ resolveCallbackSecretWithMint,
1880
1917
  resolveHarnessRoot,
1881
1918
  runDaemon,
1882
1919
  runStatus,