denchclaw 2.4.5 → 2.4.6

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.
Files changed (118) hide show
  1. package/apps/web/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/apps/web/.next/standalone/apps/web/.next/app-build-manifest.json +94 -94
  3. package/apps/web/.next/standalone/apps/web/.next/app-path-routes-manifest.json +26 -26
  4. package/apps/web/.next/standalone/apps/web/.next/build-manifest.json +2 -2
  5. package/apps/web/.next/standalone/apps/web/.next/cache/config.json +3 -3
  6. package/apps/web/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  7. package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +1 -1
  8. package/apps/web/.next/standalone/apps/web/.next/routes-manifest.json +1 -1
  9. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/cron/route_client-reference-manifest.js +1 -1
  11. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/proxy/route_client-reference-manifest.js +1 -1
  12. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/route_client-reference-manifest.js +1 -1
  13. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/serve/[...path]/route_client-reference-manifest.js +1 -1
  14. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/store/route_client-reference-manifest.js +1 -1
  15. package/apps/web/.next/standalone/apps/web/.next/server/app/api/apps/webhooks/[...path]/route_client-reference-manifest.js +1 -1
  16. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
  17. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +1 -1
  18. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  19. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/runs/route_client-reference-manifest.js +1 -1
  20. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
  21. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
  22. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
  23. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
  24. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
  25. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
  26. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
  27. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
  28. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -1
  29. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -1
  30. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/channels/route_client-reference-manifest.js +1 -1
  31. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/route_client-reference-manifest.js +1 -1
  32. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/chat/stream/route_client-reference-manifest.js +1 -1
  33. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/[id]/route_client-reference-manifest.js +1 -1
  34. package/apps/web/.next/standalone/apps/web/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
  35. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
  36. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
  37. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
  38. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
  39. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  40. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  41. package/apps/web/.next/standalone/apps/web/.next/server/app/api/terminal/port/route_client-reference-manifest.js +1 -1
  42. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
  43. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
  44. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
  45. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
  46. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
  47. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
  48. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
  49. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
  50. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
  51. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
  52. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
  53. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
  54. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
  55. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/execute/route_client-reference-manifest.js +1 -1
  56. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
  57. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +1 -1
  58. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
  59. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/link-preview/route_client-reference-manifest.js +1 -1
  60. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
  61. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
  62. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
  63. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/route_client-reference-manifest.js +1 -1
  64. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/actions/runs/route_client-reference-manifest.js +1 -1
  65. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
  66. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/content/route_client-reference-manifest.js +1 -1
  67. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
  68. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
  69. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
  70. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
  71. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
  72. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route_client-reference-manifest.js +1 -1
  73. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
  74. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
  75. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/route_client-reference-manifest.js +1 -1
  76. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
  77. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
  78. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
  79. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
  80. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
  81. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
  82. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
  83. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
  84. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
  85. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
  86. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
  87. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
  88. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
  89. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
  90. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
  91. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
  92. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
  93. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
  94. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
  95. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
  96. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js +1 -1
  97. package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  98. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  99. package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +26 -26
  100. package/apps/web/.next/standalone/apps/web/.next/server/chunks/6787.js +1 -1
  101. package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +4 -4
  102. package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  103. package/apps/web/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  104. package/apps/web/.next/{static/chunks/app/layout-a597017db7df698d.js → standalone/apps/web/.next/static/chunks/app/layout-3b33b798ff1504e9.js} +1 -1
  105. package/apps/web/.next/{static/chunks/app/page-6702f960a7cc2d6f.js → standalone/apps/web/.next/static/chunks/app/page-c8e88d7669047677.js} +1 -1
  106. package/apps/web/.next/standalone/apps/web/server.js +1 -1
  107. package/apps/web/.next/standalone/package.json +1 -1
  108. package/apps/web/.next/{standalone/apps/web/.next/static/chunks/app/layout-a597017db7df698d.js → static/chunks/app/layout-3b33b798ff1504e9.js} +1 -1
  109. package/apps/web/.next/{standalone/apps/web/.next/static/chunks/app/page-6702f960a7cc2d6f.js → static/chunks/app/page-c8e88d7669047677.js} +1 -1
  110. package/dist/entry.js +1 -1
  111. package/dist/{program-D2RfLoKh.js → program-BDz7WHcZ.js} +188 -1
  112. package/dist/{run-main-giTi_or5.js → run-main-Ddx9Tsa1.js} +1 -1
  113. package/extensions/posthog-analytics/lib/build-env.js +1 -1
  114. package/package.json +1 -1
  115. /package/apps/web/.next/standalone/apps/web/.next/static/{6km2S2lfAi2PQ3TlStEAM → bHQQHboaVXn6uVyBK8na1}/_buildManifest.js +0 -0
  116. /package/apps/web/.next/standalone/apps/web/.next/static/{6km2S2lfAi2PQ3TlStEAM → bHQQHboaVXn6uVyBK8na1}/_ssgManifest.js +0 -0
  117. /package/apps/web/.next/static/{6km2S2lfAi2PQ3TlStEAM → bHQQHboaVXn6uVyBK8na1}/_buildManifest.js +0 -0
  118. /package/apps/web/.next/static/{6km2S2lfAi2PQ3TlStEAM → bHQQHboaVXn6uVyBK8na1}/_ssgManifest.js +0 -0
package/dist/entry.js CHANGED
@@ -1147,7 +1147,7 @@ if (!ensureExperimentalWarningSuppressed()) {
1147
1147
  const appliedProfile = applyCliProfileEnv({ profile: parsed.profile ?? void 0 });
1148
1148
  if (appliedProfile.warning) console.warn(`[denchclaw] ${appliedProfile.warning}`);
1149
1149
  process$1.argv = parsed.argv;
1150
- import("./run-main-giTi_or5.js").then(({ runCli }) => runCli(process$1.argv)).then(() => import("./telemetry-DguRjCZq.js").then((n) => n.n).then(({ shutdownTelemetry }) => shutdownTelemetry())).catch((error) => {
1150
+ import("./run-main-Ddx9Tsa1.js").then(({ runCli }) => runCli(process$1.argv)).then(() => import("./telemetry-DguRjCZq.js").then((n) => n.n).then(({ shutdownTelemetry }) => shutdownTelemetry())).catch((error) => {
1151
1151
  console.error("[denchclaw] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
1152
1152
  process$1.exitCode = 1;
1153
1153
  });
@@ -1548,6 +1548,15 @@ const OPENCLAW_CLI_CHECK_CACHE_TTL_MS = 5 * 6e4;
1548
1548
  const OPENCLAW_UPDATE_PROMPT_SUPPRESS_AFTER_INSTALL_MS = 5 * 6e4;
1549
1549
  const OPENCLAW_CLI_CHECK_CACHE_FILE = "openclaw-cli-check.json";
1550
1550
  const OPENCLAW_SETUP_PROGRESS_BAR_WIDTH = 16;
1551
+ const BOOTSTRAP_DEVICE_PAIRING_COMMAND_TIMEOUT_MS = 1e4;
1552
+ const BOOTSTRAP_DEVICE_PAIRING_POLL_DELAY_MS = 500;
1553
+ const READY_WEB_DEVICE_PAIRING_POLL_ATTEMPTS = 1;
1554
+ const UNREADY_WEB_DEVICE_PAIRING_POLL_ATTEMPTS = 4;
1555
+ const BOOTSTRAP_DEVICE_PAIRING_REQUIRED_SCOPES = [
1556
+ "operator.read",
1557
+ "operator.write",
1558
+ "operator.pairing"
1559
+ ];
1551
1560
  function resolveCommandForPlatform(command) {
1552
1561
  if (process$1.platform !== "win32") return command;
1553
1562
  if (path.extname(command)) return command;
@@ -1693,9 +1702,15 @@ function resolveGatewayLaunchAgentLabel(profile) {
1693
1702
  function uniqueStrings(values) {
1694
1703
  return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
1695
1704
  }
1705
+ function toStringArray(value) {
1706
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
1707
+ }
1696
1708
  function asRecord(value) {
1697
1709
  return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
1698
1710
  }
1711
+ function toFiniteNumber(value) {
1712
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
1713
+ }
1699
1714
  function normalizeFilesystemPath(value) {
1700
1715
  try {
1701
1716
  return realpathSync.native(value);
@@ -2056,6 +2071,156 @@ function parseJsonPayload(raw) {
2056
2071
  }
2057
2072
  }
2058
2073
  }
2074
+ function normalizeDeviceListEntry(value) {
2075
+ const record = asRecord(value);
2076
+ if (!record) return;
2077
+ return {
2078
+ requestId: typeof record.requestId === "string" ? record.requestId : typeof record.id === "string" ? record.id : void 0,
2079
+ deviceId: typeof record.deviceId === "string" ? record.deviceId : void 0,
2080
+ clientId: typeof record.clientId === "string" ? record.clientId : void 0,
2081
+ clientMode: typeof record.clientMode === "string" ? record.clientMode : void 0,
2082
+ platform: typeof record.platform === "string" ? record.platform : void 0,
2083
+ role: typeof record.role === "string" ? record.role : void 0,
2084
+ roles: uniqueStrings(toStringArray(record.roles)),
2085
+ scopes: uniqueStrings(toStringArray(record.scopes)),
2086
+ createdAtMs: toFiniteNumber(record.createdAtMs) ?? toFiniteNumber(record.requestedAtMs) ?? toFiniteNumber(record.updatedAtMs)
2087
+ };
2088
+ }
2089
+ function parsePendingDeviceRequests(raw) {
2090
+ const payload = parseJsonPayload(raw);
2091
+ if (!payload) return;
2092
+ if (!Array.isArray(payload.pending)) return [];
2093
+ return payload.pending.map((value) => normalizeDeviceListEntry(value)).filter((value) => Boolean(value));
2094
+ }
2095
+ function resolveDeviceListEntryRoles(entry) {
2096
+ return uniqueStrings([...entry.roles, entry.role ?? ""]);
2097
+ }
2098
+ function hasBootstrapDevicePairingScopes(entry) {
2099
+ const scopes = new Set(entry.scopes);
2100
+ return BOOTSTRAP_DEVICE_PAIRING_REQUIRED_SCOPES.every((scope) => scopes.has(scope));
2101
+ }
2102
+ function scoreBootstrapDevicePairingRequest(entry) {
2103
+ let score = 0;
2104
+ if (resolveDeviceListEntryRoles(entry).includes("operator")) score += 4;
2105
+ if (entry.platform === process$1.platform) score += 4;
2106
+ if (entry.clientId === "cli") score += 3;
2107
+ if (entry.clientMode === "cli") score += 2;
2108
+ if (hasBootstrapDevicePairingScopes(entry)) score += 3;
2109
+ if (entry.scopes.includes("operator.approvals")) score += 1;
2110
+ if (entry.scopes.includes("operator.admin")) score += 1;
2111
+ return score;
2112
+ }
2113
+ function selectBootstrapDevicePairingRequest(pending) {
2114
+ const candidates = pending.filter((entry) => {
2115
+ const roles = resolveDeviceListEntryRoles(entry);
2116
+ return (!entry.platform || entry.platform === process$1.platform) && roles.includes("operator") && hasBootstrapDevicePairingScopes(entry);
2117
+ }).map((entry) => ({
2118
+ entry,
2119
+ score: scoreBootstrapDevicePairingRequest(entry)
2120
+ })).sort((a, b) => b.score - a.score || (b.entry.createdAtMs ?? 0) - (a.entry.createdAtMs ?? 0));
2121
+ if (candidates.length === 0) return {
2122
+ status: "none",
2123
+ detail: "no pending local operator pairing request found"
2124
+ };
2125
+ const top = candidates[0];
2126
+ if (!top?.entry.requestId) return {
2127
+ status: "failed",
2128
+ detail: "pending device request is missing requestId"
2129
+ };
2130
+ const second = candidates[1];
2131
+ if (second && second.score === top.score) return {
2132
+ status: "ambiguous",
2133
+ detail: `found ${candidates.length} equally likely pending operator pairing requests`
2134
+ };
2135
+ return {
2136
+ status: "selected",
2137
+ detail: `selected ${top.entry.requestId}`,
2138
+ request: top.entry
2139
+ };
2140
+ }
2141
+ async function attemptBootstrapDevicePairing(params) {
2142
+ const pollDelayMs = params.pollDelayMs ?? BOOTSTRAP_DEVICE_PAIRING_POLL_DELAY_MS;
2143
+ let lastDetail = "no pending local operator pairing request found";
2144
+ for (let attempt = 0; attempt < params.pollAttempts; attempt += 1) {
2145
+ const listResult = await runOpenClaw(params.openclawCommand, [
2146
+ "--profile",
2147
+ params.profile,
2148
+ "devices",
2149
+ "list",
2150
+ "--json"
2151
+ ], BOOTSTRAP_DEVICE_PAIRING_COMMAND_TIMEOUT_MS).catch((error) => {
2152
+ return {
2153
+ code: 1,
2154
+ stdout: "",
2155
+ stderr: error instanceof Error ? error.message : String(error)
2156
+ };
2157
+ });
2158
+ if (listResult.code !== 0) return {
2159
+ status: "failed",
2160
+ detail: firstNonEmptyLine$1(listResult.stderr, listResult.stdout) ?? "Failed to list device pairing requests."
2161
+ };
2162
+ const pending = parsePendingDeviceRequests([listResult.stdout, listResult.stderr].filter(Boolean).join("\n"));
2163
+ if (!pending) return {
2164
+ status: "failed",
2165
+ detail: "Failed to parse pending device pairing requests."
2166
+ };
2167
+ const selection = selectBootstrapDevicePairingRequest(pending);
2168
+ lastDetail = selection.detail;
2169
+ if (selection.status === "none") {
2170
+ if (attempt < params.pollAttempts - 1) {
2171
+ await sleep(pollDelayMs);
2172
+ continue;
2173
+ }
2174
+ return {
2175
+ status: "none",
2176
+ detail: selection.detail
2177
+ };
2178
+ }
2179
+ if (selection.status === "ambiguous" || selection.status === "failed") return {
2180
+ status: selection.status,
2181
+ detail: selection.detail
2182
+ };
2183
+ const request = selection.request;
2184
+ const requestId = request?.requestId;
2185
+ if (!requestId) return {
2186
+ status: "failed",
2187
+ detail: "selected device pairing request is missing requestId"
2188
+ };
2189
+ const approveResult = await runOpenClaw(params.openclawCommand, [
2190
+ "--profile",
2191
+ params.profile,
2192
+ "devices",
2193
+ "approve",
2194
+ requestId
2195
+ ], BOOTSTRAP_DEVICE_PAIRING_COMMAND_TIMEOUT_MS).catch((error) => {
2196
+ return {
2197
+ code: 1,
2198
+ stdout: "",
2199
+ stderr: error instanceof Error ? error.message : String(error)
2200
+ };
2201
+ });
2202
+ if (approveResult.code === 0) return {
2203
+ status: "approved",
2204
+ requestId,
2205
+ detail: `Approved ${request.deviceId ? `${request.deviceId} (${requestId})` : requestId}.`
2206
+ };
2207
+ const approveDetail = firstNonEmptyLine$1(approveResult.stderr, approveResult.stdout) ?? `Failed to approve ${requestId}.`;
2208
+ if (attempt < params.pollAttempts - 1 && /(superseded|stale|not found|no pending|expired)/iu.test(approveDetail)) {
2209
+ lastDetail = approveDetail;
2210
+ await sleep(pollDelayMs);
2211
+ continue;
2212
+ }
2213
+ return {
2214
+ status: "failed",
2215
+ requestId,
2216
+ detail: approveDetail
2217
+ };
2218
+ }
2219
+ return {
2220
+ status: "none",
2221
+ detail: lastDetail
2222
+ };
2223
+ }
2059
2224
  function resolveOpenClawCliCheckCachePath(stateDir) {
2060
2225
  return path.join(stateDir, "cache", OPENCLAW_CLI_CHECK_CACHE_FILE);
2061
2226
  }
@@ -3027,13 +3192,27 @@ async function bootstrapCommand(opts, runtime = defaultRuntime) {
3027
3192
  const gatewayUrl = `ws://127.0.0.1:${gatewayPort}`;
3028
3193
  const preferredWebPort = parseOptionalPort$1(opts.webPort) ?? DEFAULT_WEB_APP_PORT;
3029
3194
  postOnboardSpinner?.message(`Starting web runtime on port ${preferredWebPort}…`);
3030
- const webRuntimeStatus = await ensureManagedWebRuntime({
3195
+ let webRuntimeStatus = await ensureManagedWebRuntime({
3031
3196
  stateDir,
3032
3197
  packageRoot,
3033
3198
  denchVersion: VERSION,
3034
3199
  port: preferredWebPort,
3035
3200
  gatewayPort
3036
3201
  });
3202
+ postOnboardSpinner?.message("Checking local device pairing…");
3203
+ const devicePairing = await attemptBootstrapDevicePairing({
3204
+ openclawCommand,
3205
+ profile,
3206
+ pollAttempts: webRuntimeStatus.ready ? READY_WEB_DEVICE_PAIRING_POLL_ATTEMPTS : UNREADY_WEB_DEVICE_PAIRING_POLL_ATTEMPTS
3207
+ });
3208
+ if (!webRuntimeStatus.ready && devicePairing.status === "approved") {
3209
+ postOnboardSpinner?.message("Waiting for web runtime after pairing…");
3210
+ const webRuntimeRetry = await waitForWebRuntime(preferredWebPort);
3211
+ webRuntimeStatus = {
3212
+ ready: webRuntimeRetry.ok,
3213
+ reason: webRuntimeRetry.reason
3214
+ };
3215
+ }
3037
3216
  postOnboardSpinner?.stop(webRuntimeStatus.ready ? "Post-onboard setup complete." : "Post-onboard setup complete (web runtime unhealthy).");
3038
3217
  const webReachable = webRuntimeStatus.ready;
3039
3218
  const webUrl = `http://localhost:${preferredWebPort}`;
@@ -3068,6 +3247,14 @@ async function bootstrapCommand(opts, runtime = defaultRuntime) {
3068
3247
  }
3069
3248
  if (!opts.json) {
3070
3249
  if (!webRuntimeStatus.ready) runtime.log(theme.warn(`Managed web runtime check failed: ${webRuntimeStatus.reason}`));
3250
+ if (devicePairing.status === "approved") runtime.log(theme.muted("Approved the pending local OpenClaw device pairing request."));
3251
+ else if (devicePairing.status === "ambiguous") {
3252
+ runtime.log(theme.warn(`Automatic device pairing skipped: ${devicePairing.detail}.`));
3253
+ runtime.log(theme.muted(`Run \`openclaw --profile ${profile} devices list\` and approve the correct request manually.`));
3254
+ } else if (devicePairing.status === "failed") {
3255
+ runtime.log(theme.warn(`Automatic device pairing failed: ${devicePairing.detail}`));
3256
+ runtime.log(theme.muted(`If the Control UI still reports "pairing required", run \`openclaw --profile ${profile} devices list\` and approve the pending request.`));
3257
+ }
3071
3258
  if (installResult.installed) runtime.log(theme.muted("Installed global OpenClaw CLI via npm."));
3072
3259
  if (isProjectLocalOpenClawPath(installResult.shellCommandPath)) {
3073
3260
  runtime.log(theme.warn(`\`openclaw\` currently resolves to a project-local binary (${installResult.shellCommandPath}).`));
@@ -220,7 +220,7 @@ async function runCli(argv = process$1.argv) {
220
220
  process$1.exitCode = await delegateToGlobalOpenClaw(parseArgv);
221
221
  return;
222
222
  }
223
- const { buildProgram } = await import("./program-D2RfLoKh.js");
223
+ const { buildProgram } = await import("./program-BDz7WHcZ.js");
224
224
  await buildProgram().parseAsync(parseArgv);
225
225
  }
226
226
 
@@ -1,3 +1,3 @@
1
1
  export const POSTHOG_KEY = "phc_Nt8s1Ny8062TY9aKT8LWiB4nBuoHNYQXRU9MypWfQCW";
2
- export const DENCHCLAW_VERSION = "2.4.5";
2
+ export const DENCHCLAW_VERSION = "2.4.6";
3
3
  export const OPENCLAW_VERSION = "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "denchclaw",
3
- "version": "2.4.5",
3
+ "version": "2.4.6",
4
4
  "description": "Fully Managed OpenClaw Framework for managing your CRM, Sales Automation and Outreach agents. The only local productivity tool you need.",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/DenchHQ/DenchClaw#readme",