@vibe-lark/larkpal 0.1.86 → 0.1.87
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/account-id-BM1T6029-BzQ_cMoi.mjs +1 -0
- package/dist/activation-context--5yu1dPF-XV0Y0pTy.mjs +1 -0
- package/dist/anthropic-CFZUCb1w.mjs +39 -0
- package/dist/assistant-visible-text-DuFWokAt-BOJV_zwc.mjs +9 -0
- package/dist/azure-openai-responses-BEuiMaF-.mjs +1 -0
- package/dist/boundary-file-read-BSd9MXPy-gnNVhPKT.mjs +1 -0
- package/dist/browser-lifecycle-cleanup-BdNsMhMD-BM97qA_M.mjs +1 -0
- package/dist/build-Bkj0hOS2.mjs +3 -0
- package/dist/bundled-compat-BpaDaAAu-DJtrIX6i.mjs +27 -0
- package/dist/bundled-dir-U738ay4K-BxbzrJOo.mjs +1 -0
- package/dist/call-DimWbpgJ-B4pv55RH.mjs +20 -0
- package/dist/channel-bootstrap.runtime-BVclcGv1-CEZ0-JP9.mjs +1 -0
- package/dist/channel-bootstrap.runtime-Cwcr38m2-Dt6QlQkX.mjs +1 -0
- package/dist/chunk-DHbaKqs-.mjs +1 -0
- package/dist/cli.mjs +7 -92
- package/dist/command-format-LSnUCVVF-Dn4h9IOh.mjs +16 -0
- package/dist/config-Bim2pi8a-03N-28sw.mjs +1 -0
- package/dist/delivery-context.shared-j5hC5qb1-BSLQG47q.mjs +1 -0
- package/dist/diagnostic-ClMwNnUA-BMKvPQJT.mjs +1 -0
- package/dist/dist-J5UB83Ws.mjs +601 -0
- package/dist/dist-coestTs9.mjs +5 -0
- package/dist/env-api-keys-Cuz5irWW.mjs +1 -0
- package/dist/event-stream-B7Ei41Bu.mjs +1 -0
- package/dist/facade-loader-DFzIYYt_-4bzFvy-b.mjs +1 -0
- package/dist/from-Ba69_5cR.mjs +14 -0
- package/dist/gateway-method-policy-C7rf0SeV-CTJcMQCE.mjs +1 -0
- package/dist/github-copilot-headers-BfhryVuU.mjs +1 -0
- package/dist/google-ABo-1guT.mjs +1 -0
- package/dist/google-gemini-cli-CGlN1zUA.mjs +2 -0
- package/dist/google-shared-C60sNhwd.mjs +301 -0
- package/dist/google-vertex-De0nAItu.mjs +1 -0
- package/dist/hash-Dw-N8Y9l.mjs +1 -0
- package/dist/headers-Bpsp70B9.mjs +1 -0
- package/dist/home-dir-C44RaPME-B5iLWwCq.mjs +1 -0
- package/dist/ids-BPsM98Uu-CJBJAeVC.mjs +1 -0
- package/dist/image-2w3cApg7-CrpUMCvm.mjs +3 -0
- package/dist/interactive-init-C5MFL5MW.mjs +8 -0
- package/dist/io-CH2g3vsv-JJtUIa_U.mjs +10 -0
- package/dist/jiti-loader-cache-Bat69wam-DNIteTtO.mjs +9 -0
- package/dist/json-file-BQRNuxmK-hRjIgOXI.mjs +1 -0
- package/dist/json-parse-BESd8UAM.mjs +3 -0
- package/dist/jws-YaZ38F_i.mjs +12 -0
- package/dist/lark-cli-provider-BLMxH6CN.mjs +4 -0
- package/dist/lark-logger-xpMKNNtY.mjs +1 -0
- package/dist/live-smoke-DpURW676.mjs +33 -0
- package/dist/load-context-mb7uvLSn-3xYwSnOZ.mjs +1 -0
- package/dist/loader-708jrx4Y-BbJRXNlQ.mjs +4 -0
- package/dist/main.mjs +153 -74571
- package/dist/manifest-registry-_hxKCS2K-OL8KK_o4.mjs +15 -0
- package/dist/mcp-server.mjs +4 -527
- package/dist/message-channel-Bk_YHfQg-n2Hw2Y0L.mjs +1 -0
- package/dist/message-channel-core-DTA--Gjh-CIh10vfo.mjs +1 -0
- package/dist/message.config.runtime-K-k4XOyq-F_h0Cgkl.mjs +1 -0
- package/dist/message.gateway.runtime-DqHOHRTQ-ge4c5p4s.mjs +1 -0
- package/dist/mistral-DyL3Zo1b.mjs +7 -0
- package/dist/model-auth-env-oyg2Hexc-DJbt9J3o.mjs +1 -0
- package/dist/models-config-BmpSQJQF-BL6S5qAo.mjs +1 -0
- package/dist/models-config.runtime-SOhLEw-f.mjs +1 -0
- package/dist/multipart-parser-B9dwXBqu.mjs +2 -0
- package/dist/oauth-25y2wc7K.mjs +75 -0
- package/dist/openai-C-rgGb7X.mjs +16 -0
- package/dist/openai-codex-responses-BbyAPsP1.mjs +7 -0
- package/dist/openai-completions-Bu5qvQzb.mjs +5 -0
- package/dist/openai-responses-pIdwQBc4.mjs +1 -0
- package/dist/openai-responses-shared-DqW1JSux.mjs +10 -0
- package/dist/paths-D6msg0S1-BO4XgM1u.mjs +1 -0
- package/dist/paths-D92DjaZ--DdtJ-zYp.mjs +1 -0
- package/dist/pi-model-discovery-Bd0TWzo8-DvSM0eWu.mjs +1 -0
- package/dist/pi-model-discovery-runtime-PrjWOmsV.mjs +1 -0
- package/dist/pi-tools.before-tool-call.runtime-Bn7uqKie-WPxU5oNX.mjs +2 -0
- package/dist/plugin-auto-enable-DdH3n9V8-Dr_bUXkG.mjs +1 -0
- package/dist/process-scoped-map-B2cWkYET-Co-i-MXA.mjs +1 -0
- package/dist/provider-discovery.runtime-DY0VWQ81.mjs +1 -0
- package/dist/provider-model-compat-CFqcq0it-BUwZENrz.mjs +1 -0
- package/dist/provider-runtime-C8rljsNs-BDvu6FW3.mjs +1 -0
- package/dist/provider-runtime-CT50mNIX-DImw7ZZu.mjs +79 -0
- package/dist/provider-stream-COLujAAo-Dpq1DSIk.mjs +248 -0
- package/dist/providers.runtime-Ba7tOlq7-B4t6ywCr.mjs +1 -0
- package/dist/public-surface-loader-BVl0NQAE-TfJ3izj1.mjs +1 -0
- package/dist/resolve-C33B7eeu-DZM_z6Wr.mjs +1 -0
- package/dist/runtime-Cym-fqI8-1GOIuRRQ.mjs +1 -0
- package/dist/runtime-channel-state-CohMybAh-BBzhl07Q.mjs +1 -0
- package/dist/runtime-snapshot-C54O1-gI-DxusscPf.mjs +1 -0
- package/dist/runtime-state-IBOIXKOx-Cw1GA1td.mjs +1 -0
- package/dist/runtime-web-tools-fallback.runtime-Ca-qn1mj-BsYE2gOd.mjs +1 -0
- package/dist/runtime-web-tools-manifest.runtime-BgxQTjmq-P6MKP9gQ.mjs +1 -0
- package/dist/runtime-web-tools-public-artifacts.runtime-D9qcoWIX-5VoyjouO.mjs +1 -0
- package/dist/session-archive.runtime-B52_5vs4-cU2tYbBz.mjs +1 -0
- package/dist/session-key-Cn2QoOyX-QZeYmbxd.mjs +1 -0
- package/dist/session-transcript-files.fs-DEeFXruQ-CXIAFSsr.mjs +1 -0
- package/dist/src-CCDx_C-U.mjs +3 -0
- package/dist/src-DACmA9V6.mjs +5 -0
- package/dist/subagent-announce-L5WsQatW--rMn240x.mjs +2 -0
- package/dist/subagent-announce.registry.runtime-DiqZyeTs-DNfNHsls.mjs +1 -0
- package/dist/subagent-registry-steer-runtime-DFgZFC0j-XYS1_qwl.mjs +1 -0
- package/dist/subagent-system-prompt-C1qnN--K-CsU4f97T.mjs +23 -0
- package/dist/target-parsing-loaded-DKkb6jJY-B830OA1a.mjs +12 -0
- package/dist/task-registry-delivery-runtime-Dd1CUkZF-B2Hj2k8C.mjs +16 -0
- package/dist/task-registry-delivery-runtime-ragbeVx5-Bdvo2Q5u.mjs +1 -0
- package/dist/thinking-Bh-7MqXz-uApNUe6g.mjs +1 -0
- package/dist/transcript-E_-ISOkD-VTwb782D.mjs +5 -0
- package/dist/transcript.runtime-BqhvZZdl-B4E0TiX5.mjs +1 -0
- package/dist/transform-messages-BTA3xbAI.mjs +1 -0
- package/dist/web-provider-public-artifacts-BlpRwIUS-DbVhDOrY.mjs +1 -0
- package/dist/web-search-providers.runtime--0aUtC3b-Bjh4Bmrz.mjs +1 -0
- package/package.json +2 -3
- package/dist/account-id-BM1T6029-DYjVxojW.mjs +0 -46
- package/dist/activation-context--5yu1dPF-Bwsn3moT.mjs +0 -172
- package/dist/anthropic-TH8ERTXK.mjs +0 -5962
- package/dist/assistant-visible-text-DuFWokAt-CsbII5KS.mjs +0 -596
- package/dist/azure-openai-responses-Bt_Ag9Er.mjs +0 -166
- package/dist/boundary-file-read-BSd9MXPy--KThL5e6.mjs +0 -594
- package/dist/browser-lifecycle-cleanup-BdNsMhMD-O3tnAM4i.mjs +0 -60
- package/dist/build-DgTrEpge.mjs +0 -3333
- package/dist/bundled-compat-BpaDaAAu-D7oazKjD.mjs +0 -5216
- package/dist/bundled-dir-U738ay4K-DXK0q_TV.mjs +0 -258
- package/dist/call-DimWbpgJ-ColD4W-y.mjs +0 -9993
- package/dist/channel-bootstrap.runtime-BVclcGv1-DJv_Z-Kr.mjs +0 -2
- package/dist/channel-bootstrap.runtime-Cwcr38m2-VRfVCR-i.mjs +0 -33
- package/dist/chunk-D6SyT4dJ.mjs +0 -36
- package/dist/command-format-LSnUCVVF-BQ2SMKka.mjs +0 -685
- package/dist/config-Bim2pi8a-BQUdfiEi.mjs +0 -9
- package/dist/delivery-context.shared-j5hC5qb1-CI83RXXZ.mjs +0 -72
- package/dist/diagnostic-ClMwNnUA-D6nUtLnb.mjs +0 -140
- package/dist/dist-CEGw8-2W.mjs +0 -429
- package/dist/dist-DD2aJ2UL.mjs +0 -125135
- package/dist/env-api-keys-BVvSg7T2.mjs +0 -68
- package/dist/event-stream-xaQWmyas.mjs +0 -15226
- package/dist/facade-loader-DFzIYYt_-CIr4HKtE.mjs +0 -194
- package/dist/from-DF7cl2wz.mjs +0 -3842
- package/dist/gateway-method-policy-C7rf0SeV-CJQMEYIE.mjs +0 -28
- package/dist/github-copilot-headers-DjqWtUoP.mjs +0 -22
- package/dist/google-C2pVrgBZ.mjs +0 -336
- package/dist/google-gemini-cli-BBxgS5Ho.mjs +0 -623
- package/dist/google-shared-BsWgwEk1.mjs +0 -22791
- package/dist/google-vertex-BsVLJrrC.mjs +0 -358
- package/dist/hash-DAFtW_W7.mjs +0 -16
- package/dist/headers-R3HdCbAE.mjs +0 -8
- package/dist/home-dir-C44RaPME-CBRS4HLP.mjs +0 -93
- package/dist/ids-BPsM98Uu-CwuxvUai.mjs +0 -77
- package/dist/image-2w3cApg7-CxpHvoB5.mjs +0 -207
- package/dist/interactive-init-BXQBalNr.mjs +0 -450
- package/dist/io-CH2g3vsv-BOGlLlB8.mjs +0 -26218
- package/dist/jiti-loader-cache-Bat69wam-D6hCxboy.mjs +0 -5049
- package/dist/json-file-BQRNuxmK-DhJM5NsG.mjs +0 -108
- package/dist/json-parse-v_HIJjjI.mjs +0 -381
- package/dist/jws-GFcTvvVT.mjs +0 -2291
- package/dist/lark-cli-provider-BARgbbmo.mjs +0 -554
- package/dist/lark-logger-D7_pEVQc.mjs +0 -143
- package/dist/live-smoke-BhkBOcH9.mjs +0 -7135
- package/dist/load-context-mb7uvLSn-B10MAi3I.mjs +0 -29
- package/dist/loader-708jrx4Y-BOswuvpe.mjs +0 -5053
- package/dist/manifest-registry-_hxKCS2K-CZdeyN0f.mjs +0 -3512
- package/dist/message-channel-Bk_YHfQg-AeNrPPpp.mjs +0 -50
- package/dist/message-channel-core-DTA--Gjh-CY4Tkb7N.mjs +0 -29
- package/dist/message.config.runtime-K-k4XOyq-DZTmXomP.mjs +0 -2
- package/dist/message.gateway.runtime-DqHOHRTQ-DH4ml0YF.mjs +0 -2
- package/dist/mistral-CaR4DiLu.mjs +0 -28657
- package/dist/model-auth-env-oyg2Hexc-DU_rOUU5.mjs +0 -1306
- package/dist/models-config-BmpSQJQF-Gfvh1n3A.mjs +0 -1282
- package/dist/models-config.runtime-BsU_22xk.mjs +0 -2
- package/dist/multipart-parser-DedmaB5g.mjs +0 -294
- package/dist/oauth-DOJeGfcE.mjs +0 -6392
- package/dist/openai-BDtIh3Ja.mjs +0 -6693
- package/dist/openai-codex-responses-C5EORu31.mjs +0 -664
- package/dist/openai-completions-CR_cS6gX.mjs +0 -669
- package/dist/openai-responses-oGxwZyuC.mjs +0 -184
- package/dist/openai-responses-shared-BixMSDZE.mjs +0 -398
- package/dist/paths-D6msg0S1-C2lYuisN.mjs +0 -189
- package/dist/paths-D92DjaZ--CTOESW2b.mjs +0 -192
- package/dist/pi-model-discovery-Bd0TWzo8-BFsJmeMb.mjs +0 -227
- package/dist/pi-model-discovery-runtime-CCCZxkd8.mjs +0 -2
- package/dist/pi-tools.before-tool-call.runtime-Bn7uqKie-C5ewk8kK.mjs +0 -399
- package/dist/plugin-auto-enable-DdH3n9V8-DsA1isaF.mjs +0 -1456
- package/dist/process-scoped-map-B2cWkYET-CXwUZ8CZ.mjs +0 -61
- package/dist/provider-discovery.runtime-BPzz1PFj.mjs +0 -58
- package/dist/provider-model-compat-CFqcq0it-BDDuBI3A.mjs +0 -118
- package/dist/provider-runtime-C8rljsNs-CIT93zoy.mjs +0 -2
- package/dist/provider-runtime-CT50mNIX-BwEV6GyO.mjs +0 -573
- package/dist/provider-stream-COLujAAo-CbJPDngm.mjs +0 -35449
- package/dist/providers.runtime-Ba7tOlq7-CXkhkzU9.mjs +0 -219
- package/dist/public-surface-loader-BVl0NQAE-C0piXtsT.mjs +0 -117
- package/dist/resolve-C33B7eeu-BNvYTl6k.mjs +0 -1041
- package/dist/runtime-Cym-fqI8-DaSDMH-a.mjs +0 -120
- package/dist/runtime-channel-state-CohMybAh-hXR6y5Gx.mjs +0 -19
- package/dist/runtime-snapshot-C54O1-gI-40cbyi7P.mjs +0 -677
- package/dist/runtime-state-IBOIXKOx-Bf9tcLvc.mjs +0 -10
- package/dist/runtime-web-tools-fallback.runtime-Ca-qn1mj-BCVImm7a.mjs +0 -39
- package/dist/runtime-web-tools-manifest.runtime-BgxQTjmq-Cb4nJkRT.mjs +0 -2
- package/dist/runtime-web-tools-public-artifacts.runtime-D9qcoWIX-BrQdXzOQ.mjs +0 -2
- package/dist/session-archive.runtime-B52_5vs4-BG-_IwNJ.mjs +0 -2
- package/dist/session-key-Cn2QoOyX-CuHbJMgR.mjs +0 -82
- package/dist/session-transcript-files.fs-DEeFXruQ-B1PF6nLy.mjs +0 -147
- package/dist/src-BgCX0MLG.mjs +0 -813
- package/dist/src-DYbqlAqf.mjs +0 -1177
- package/dist/subagent-announce-L5WsQatW-CQWI9GMd.mjs +0 -344
- package/dist/subagent-announce.registry.runtime-DiqZyeTs-BKuniyi3.mjs +0 -28
- package/dist/subagent-registry-steer-runtime-DFgZFC0j-BhBz0roy.mjs +0 -211
- package/dist/subagent-system-prompt-C1qnN--K-DpnTFP47.mjs +0 -3061
- package/dist/target-parsing-loaded-DKkb6jJY-BMD4CkpS.mjs +0 -1002
- package/dist/task-registry-delivery-runtime-Dd1CUkZF-C8U40a3O.mjs +0 -2950
- package/dist/task-registry-delivery-runtime-ragbeVx5-CNbFAkjD.mjs +0 -2
- package/dist/thinking-Bh-7MqXz-D3woGbO7.mjs +0 -2
- package/dist/transcript-E_-ISOkD-DWCfZP2p.mjs +0 -2019
- package/dist/transcript.runtime-BqhvZZdl-BPy42vBP.mjs +0 -2
- package/dist/transform-messages-DbhIzTxq.mjs +0 -207
- package/dist/web-provider-public-artifacts-BlpRwIUS-CGPSV4W2.mjs +0 -295
- package/dist/web-search-providers.runtime--0aUtC3b-DyuhC95V.mjs +0 -200
|
@@ -1,685 +0,0 @@
|
|
|
1
|
-
import { o as normalizeLowercaseStringOrEmpty, s as normalizeOptionalLowercaseString } from "./home-dir-C44RaPME-CBRS4HLP.mjs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
//#region node_modules/.pnpm/openclaw@2026.4.22_@napi-rs+canvas@0.1.99/node_modules/openclaw/dist/sanitize-user-facing-text-BRKECHXc.js
|
|
4
|
-
const ERROR_PAYLOAD_PREFIX_RE = /^(?:error|(?:[a-z][\w-]*\s+)?api\s*error|apierror|openai\s*error|anthropic\s*error|gateway\s*error|codex\s*error)(?:\s+\d{3})?[:\s-]+/i;
|
|
5
|
-
const HTTP_STATUS_DELIMITER_RE = /(?:\s*:\s*|\s+)/;
|
|
6
|
-
const HTTP_STATUS_PREFIX_RE = new RegExp(`^(?:http\\s*)?(\\d{3})${HTTP_STATUS_DELIMITER_RE.source}(.+)$`, "i");
|
|
7
|
-
const HTTP_STATUS_CODE_PREFIX_RE = new RegExp(`^(?:http\\s*)?(\\d{3})(?:${HTTP_STATUS_DELIMITER_RE.source}([\\s\\S]+))?$`, "i");
|
|
8
|
-
const HTML_ERROR_PREFIX_RE = /^\s*(?:<!doctype\s+html\b|<html\b)/i;
|
|
9
|
-
const HTML_CLOSE_RE = /<\/html>/i;
|
|
10
|
-
const CLOUDFLARE_HTML_ERROR_CODES = new Set([
|
|
11
|
-
521,
|
|
12
|
-
522,
|
|
13
|
-
523,
|
|
14
|
-
524,
|
|
15
|
-
525,
|
|
16
|
-
526,
|
|
17
|
-
530
|
|
18
|
-
]);
|
|
19
|
-
const STANDALONE_HTML_ERROR_HINT_RE = /\bcloudflare\b|cdn-cgi\/challenge-platform|challenge-error-text|enable javascript and cookies to continue|access denied|forbidden|service unavailable|bad gateway|web server is down|captcha|attention required/i;
|
|
20
|
-
function isErrorPayloadObject(payload) {
|
|
21
|
-
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
|
|
22
|
-
const record = payload;
|
|
23
|
-
if (record.type === "error") return true;
|
|
24
|
-
if (typeof record.request_id === "string" || typeof record.requestId === "string") return true;
|
|
25
|
-
if ("error" in record) {
|
|
26
|
-
const err = record.error;
|
|
27
|
-
if (err && typeof err === "object" && !Array.isArray(err)) {
|
|
28
|
-
const errRecord = err;
|
|
29
|
-
if (typeof errRecord.message === "string" || typeof errRecord.type === "string" || typeof errRecord.code === "string") return true;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
function parseApiErrorPayload(raw) {
|
|
35
|
-
if (!raw) return null;
|
|
36
|
-
const trimmed = raw.trim();
|
|
37
|
-
if (!trimmed) return null;
|
|
38
|
-
const candidates = [trimmed];
|
|
39
|
-
if (ERROR_PAYLOAD_PREFIX_RE.test(trimmed)) candidates.push(trimmed.replace(ERROR_PAYLOAD_PREFIX_RE, "").trim());
|
|
40
|
-
for (const candidate of candidates) {
|
|
41
|
-
if (!candidate.startsWith("{") || !candidate.endsWith("}")) continue;
|
|
42
|
-
try {
|
|
43
|
-
const parsed = JSON.parse(candidate);
|
|
44
|
-
if (isErrorPayloadObject(parsed)) return parsed;
|
|
45
|
-
} catch {}
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
function extractLeadingHttpStatus(raw) {
|
|
50
|
-
const match = raw.match(HTTP_STATUS_CODE_PREFIX_RE);
|
|
51
|
-
if (!match) return null;
|
|
52
|
-
const code = Number(match[1]);
|
|
53
|
-
if (!Number.isFinite(code)) return null;
|
|
54
|
-
return {
|
|
55
|
-
code,
|
|
56
|
-
rest: (match[2] ?? "").trim()
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
function isCloudflareOrHtmlErrorPage(raw) {
|
|
60
|
-
const trimmed = raw.trim();
|
|
61
|
-
if (!trimmed) return false;
|
|
62
|
-
if (HTML_ERROR_PREFIX_RE.test(trimmed) && HTML_CLOSE_RE.test(trimmed) && STANDALONE_HTML_ERROR_HINT_RE.test(trimmed)) return true;
|
|
63
|
-
const status = extractLeadingHttpStatus(trimmed);
|
|
64
|
-
if (!status || status.code < 500) return false;
|
|
65
|
-
if (CLOUDFLARE_HTML_ERROR_CODES.has(status.code)) return true;
|
|
66
|
-
return status.code < 600 && HTML_ERROR_PREFIX_RE.test(status.rest) && HTML_CLOSE_RE.test(status.rest);
|
|
67
|
-
}
|
|
68
|
-
function parseApiErrorInfo(raw) {
|
|
69
|
-
if (!raw) return null;
|
|
70
|
-
const trimmed = raw.trim();
|
|
71
|
-
if (!trimmed) return null;
|
|
72
|
-
let httpCode;
|
|
73
|
-
let candidate = trimmed;
|
|
74
|
-
const httpPrefixMatch = candidate.match(/^(\d{3})\s+(.+)$/s);
|
|
75
|
-
if (httpPrefixMatch) {
|
|
76
|
-
httpCode = httpPrefixMatch[1];
|
|
77
|
-
candidate = httpPrefixMatch[2].trim();
|
|
78
|
-
}
|
|
79
|
-
const payload = parseApiErrorPayload(candidate);
|
|
80
|
-
if (!payload) return null;
|
|
81
|
-
const requestId = typeof payload.request_id === "string" ? payload.request_id : typeof payload.requestId === "string" ? payload.requestId : void 0;
|
|
82
|
-
const topType = typeof payload.type === "string" ? payload.type : void 0;
|
|
83
|
-
const topMessage = typeof payload.message === "string" ? payload.message : void 0;
|
|
84
|
-
let errType;
|
|
85
|
-
let errMessage;
|
|
86
|
-
if (payload.error && typeof payload.error === "object" && !Array.isArray(payload.error)) {
|
|
87
|
-
const err = payload.error;
|
|
88
|
-
if (typeof err.type === "string") errType = err.type;
|
|
89
|
-
if (typeof err.code === "string" && !errType) errType = err.code;
|
|
90
|
-
if (typeof err.message === "string") errMessage = err.message;
|
|
91
|
-
}
|
|
92
|
-
return {
|
|
93
|
-
httpCode,
|
|
94
|
-
type: errType ?? topType,
|
|
95
|
-
message: errMessage ?? topMessage,
|
|
96
|
-
requestId
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
function formatRawAssistantErrorForUi(raw) {
|
|
100
|
-
const trimmed = (raw ?? "").trim();
|
|
101
|
-
if (!trimmed) return "LLM request failed with an unknown error.";
|
|
102
|
-
const leadingStatus = extractLeadingHttpStatus(trimmed);
|
|
103
|
-
const isHtmlChallenge = isCloudflareOrHtmlErrorPage(trimmed);
|
|
104
|
-
if (leadingStatus && isHtmlChallenge) return `The AI service is temporarily unavailable (HTTP ${leadingStatus.code}). Please try again in a moment.`;
|
|
105
|
-
if (isHtmlChallenge) return "The provider returned an HTML error page instead of an API response. This usually means a CDN or gateway (e.g. Cloudflare) blocked the request. Retry in a moment or check provider status.";
|
|
106
|
-
const httpMatch = trimmed.match(HTTP_STATUS_PREFIX_RE);
|
|
107
|
-
if (httpMatch) {
|
|
108
|
-
const rest = httpMatch[2].trim();
|
|
109
|
-
if (!rest.startsWith("{")) return `HTTP ${httpMatch[1]}: ${rest}`;
|
|
110
|
-
}
|
|
111
|
-
const info = parseApiErrorInfo(trimmed);
|
|
112
|
-
if (info?.message) return `${info.httpCode ? `HTTP ${info.httpCode}` : "LLM error"}${info.type ? ` ${info.type}` : ""}: ${info.message}`;
|
|
113
|
-
return trimmed.length > 600 ? `${trimmed.slice(0, 600)}…` : trimmed;
|
|
114
|
-
}
|
|
115
|
-
const EXEC_DENIED_RE = /^exec denied \(([^)]*)\):(?:\s*([\s\S]*))?$/i;
|
|
116
|
-
const EXEC_FINISHED_RE = /^exec finished \(([^)]*)\)(?:\n([\s\S]*))?$/i;
|
|
117
|
-
const EXEC_COMPLETED_RE = /^exec completed:\s*([\s\S]*)$/i;
|
|
118
|
-
function parseExecApprovalResultText(resultText) {
|
|
119
|
-
const raw = resultText.trim();
|
|
120
|
-
if (!raw) return {
|
|
121
|
-
kind: "other",
|
|
122
|
-
raw
|
|
123
|
-
};
|
|
124
|
-
const deniedMatch = EXEC_DENIED_RE.exec(raw);
|
|
125
|
-
if (deniedMatch) return {
|
|
126
|
-
kind: "denied",
|
|
127
|
-
raw,
|
|
128
|
-
metadata: deniedMatch[1]?.trim() ?? "",
|
|
129
|
-
body: deniedMatch[2]?.trim() ?? ""
|
|
130
|
-
};
|
|
131
|
-
const finishedMatch = EXEC_FINISHED_RE.exec(raw);
|
|
132
|
-
if (finishedMatch) return {
|
|
133
|
-
kind: "finished",
|
|
134
|
-
raw,
|
|
135
|
-
metadata: finishedMatch[1]?.trim() ?? "",
|
|
136
|
-
body: finishedMatch[2]?.trim() ?? ""
|
|
137
|
-
};
|
|
138
|
-
const completedMatch = EXEC_COMPLETED_RE.exec(raw);
|
|
139
|
-
if (completedMatch) return {
|
|
140
|
-
kind: "completed",
|
|
141
|
-
raw,
|
|
142
|
-
body: completedMatch[1]?.trim() ?? ""
|
|
143
|
-
};
|
|
144
|
-
return {
|
|
145
|
-
kind: "other",
|
|
146
|
-
raw
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
function formatExecDeniedUserMessage(resultText) {
|
|
150
|
-
const parsed = parseExecApprovalResultText(resultText);
|
|
151
|
-
if (parsed.kind !== "denied") return null;
|
|
152
|
-
const metadata = normalizeLowercaseStringOrEmpty(parsed.metadata);
|
|
153
|
-
if (metadata.includes("approval-timeout")) return "Command did not run: approval timed out.";
|
|
154
|
-
if (metadata.includes("user-denied")) return "Command did not run: approval was denied.";
|
|
155
|
-
if (metadata.includes("allowlist-miss")) return "Command did not run: approval is required.";
|
|
156
|
-
if (metadata.includes("approval-request-failed")) return "Command did not run: approval request failed.";
|
|
157
|
-
if (metadata.includes("spawn-failed") || metadata.includes("invoke-failed")) return "Command did not run.";
|
|
158
|
-
return "Command did not run.";
|
|
159
|
-
}
|
|
160
|
-
const HIGH_CONFIDENCE_AUTH_PERMANENT_PATTERNS = [
|
|
161
|
-
/api[_ ]?key[_ ]?(?:revoked|deactivated|deleted)/i,
|
|
162
|
-
"key has been disabled",
|
|
163
|
-
"key has been revoked",
|
|
164
|
-
"account has been deactivated",
|
|
165
|
-
"not allowed for this organization"
|
|
166
|
-
];
|
|
167
|
-
const AMBIGUOUS_AUTH_ERROR_PATTERNS = [
|
|
168
|
-
/invalid[_ ]?api[_ ]?key/,
|
|
169
|
-
/could not (?:authenticate|validate).*(?:api[_ ]?key|credentials)/i,
|
|
170
|
-
"permission_error"
|
|
171
|
-
];
|
|
172
|
-
const COMMON_AUTH_ERROR_PATTERNS = [
|
|
173
|
-
"incorrect api key",
|
|
174
|
-
"invalid token",
|
|
175
|
-
"authentication",
|
|
176
|
-
"re-authenticate",
|
|
177
|
-
"oauth token refresh failed",
|
|
178
|
-
"unauthorized",
|
|
179
|
-
"forbidden",
|
|
180
|
-
"access denied",
|
|
181
|
-
"insufficient permissions",
|
|
182
|
-
"insufficient permission",
|
|
183
|
-
/missing scopes?:/i,
|
|
184
|
-
"expired",
|
|
185
|
-
"token has expired",
|
|
186
|
-
/\b401\b/,
|
|
187
|
-
/\b403\b/,
|
|
188
|
-
"no credentials found",
|
|
189
|
-
"no api key found",
|
|
190
|
-
/\bfailed to (?:extract|parse|validate|decode)\b.*\btoken\b/
|
|
191
|
-
];
|
|
192
|
-
const ZAI_BILLING_CODE_1311_RE = /"code"\s*:\s*1311\b/;
|
|
193
|
-
const ZAI_AUTH_ERROR_PATTERNS = [/"code"\s*:\s*1113\b/];
|
|
194
|
-
const ERROR_PATTERNS = {
|
|
195
|
-
rateLimit: [
|
|
196
|
-
/rate[_ ]limit|too many requests|429/,
|
|
197
|
-
/too many (?:concurrent )?requests/i,
|
|
198
|
-
/throttling(?:exception)?/i,
|
|
199
|
-
"model_cooldown",
|
|
200
|
-
"exceeded your current quota",
|
|
201
|
-
"resource has been exhausted",
|
|
202
|
-
"quota exceeded",
|
|
203
|
-
"resource_exhausted",
|
|
204
|
-
"throttlingexception",
|
|
205
|
-
"throttling_exception",
|
|
206
|
-
"throttled",
|
|
207
|
-
"throttling",
|
|
208
|
-
"usage limit",
|
|
209
|
-
/\btpm\b/i,
|
|
210
|
-
"tokens per minute",
|
|
211
|
-
"tokens per day"
|
|
212
|
-
],
|
|
213
|
-
overloaded: [
|
|
214
|
-
/overloaded_error|"type"\s*:\s*"overloaded_error"/i,
|
|
215
|
-
"overloaded",
|
|
216
|
-
/service[_ ]unavailable.*(?:overload|capacity|high[_ ]demand)|(?:overload|capacity|high[_ ]demand).*service[_ ]unavailable/i,
|
|
217
|
-
"high demand"
|
|
218
|
-
],
|
|
219
|
-
serverError: [
|
|
220
|
-
"an error occurred while processing",
|
|
221
|
-
"internal server error",
|
|
222
|
-
"internal_error",
|
|
223
|
-
"server_error",
|
|
224
|
-
"service temporarily unavailable",
|
|
225
|
-
"service_unavailable",
|
|
226
|
-
"bad gateway",
|
|
227
|
-
"gateway timeout",
|
|
228
|
-
"upstream error",
|
|
229
|
-
"upstream connect error",
|
|
230
|
-
"connection reset"
|
|
231
|
-
],
|
|
232
|
-
timeout: [
|
|
233
|
-
"timeout",
|
|
234
|
-
"timed out",
|
|
235
|
-
"service unavailable",
|
|
236
|
-
"deadline exceeded",
|
|
237
|
-
"context deadline exceeded",
|
|
238
|
-
/^(?=[\s\S]*\bgot status:\s*internal\b)(?=[\s\S]*\bcode["']?\s*[:=]\s*500\b)/i,
|
|
239
|
-
/^(?=[\s\S]*["']status["']\s*:\s*["']internal["'])(?=[\s\S]*["']code["']\s*:\s*500\b)/i,
|
|
240
|
-
"connection error",
|
|
241
|
-
"network error",
|
|
242
|
-
"network request failed",
|
|
243
|
-
"fetch failed",
|
|
244
|
-
"socket hang up",
|
|
245
|
-
/\beconn(?:refused|reset|aborted)\b/i,
|
|
246
|
-
/\benetunreach\b/i,
|
|
247
|
-
/\behostunreach\b/i,
|
|
248
|
-
/\behostdown\b/i,
|
|
249
|
-
/\benetreset\b/i,
|
|
250
|
-
/\betimedout\b/i,
|
|
251
|
-
/\besockettimedout\b/i,
|
|
252
|
-
/\bepipe\b/i,
|
|
253
|
-
/\benotfound\b/i,
|
|
254
|
-
/\beai_again\b/i,
|
|
255
|
-
/without sending (?:any )?chunks?/i,
|
|
256
|
-
/\bstop reason:\s*(?:abort|error|malformed_response|network_error)\b/i,
|
|
257
|
-
/\breason:\s*(?:abort|error|malformed_response|network_error)\b/i,
|
|
258
|
-
/\bunhandled stop reason:\s*(?:abort|error|malformed_response|network_error)\b/i,
|
|
259
|
-
/\bfinish_reason:\s*(?:abort|error|malformed_response|network_error)\b/i,
|
|
260
|
-
/\boperation was aborted\b/i,
|
|
261
|
-
/\bstream (?:was )?(?:closed|aborted)\b/i
|
|
262
|
-
],
|
|
263
|
-
billing: [
|
|
264
|
-
/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment/i,
|
|
265
|
-
"payment required",
|
|
266
|
-
"insufficient credits",
|
|
267
|
-
/insufficient[_ ]quota/i,
|
|
268
|
-
"credit balance",
|
|
269
|
-
"plans & billing",
|
|
270
|
-
"insufficient balance",
|
|
271
|
-
"insufficient usd or diem balance",
|
|
272
|
-
/requires?\s+more\s+credits/i,
|
|
273
|
-
/out of extra usage/i,
|
|
274
|
-
/draw from your extra usage/i,
|
|
275
|
-
/extra usage is required(?: for long context requests)?/i,
|
|
276
|
-
ZAI_BILLING_CODE_1311_RE
|
|
277
|
-
],
|
|
278
|
-
authPermanent: HIGH_CONFIDENCE_AUTH_PERMANENT_PATTERNS,
|
|
279
|
-
auth: [
|
|
280
|
-
...AMBIGUOUS_AUTH_ERROR_PATTERNS,
|
|
281
|
-
...COMMON_AUTH_ERROR_PATTERNS,
|
|
282
|
-
...ZAI_AUTH_ERROR_PATTERNS
|
|
283
|
-
],
|
|
284
|
-
format: [
|
|
285
|
-
"string should match pattern",
|
|
286
|
-
"tool_use.id",
|
|
287
|
-
"tool_use_id",
|
|
288
|
-
"messages.1.content.1.tool_use.id",
|
|
289
|
-
"invalid request format",
|
|
290
|
-
/tool call id was.*must be/i
|
|
291
|
-
]
|
|
292
|
-
};
|
|
293
|
-
const BILLING_ERROR_HEAD_RE = /^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i;
|
|
294
|
-
const BILLING_ERROR_HARD_402_RE = /["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i;
|
|
295
|
-
const BILLING_ERROR_MAX_LENGTH = 512;
|
|
296
|
-
function matchesErrorPatterns(raw, patterns) {
|
|
297
|
-
if (!raw) return false;
|
|
298
|
-
const value = normalizeLowercaseStringOrEmpty(raw);
|
|
299
|
-
return patterns.some((pattern) => pattern instanceof RegExp ? pattern.test(value) : value.includes(pattern));
|
|
300
|
-
}
|
|
301
|
-
function isRateLimitErrorMessage(raw) {
|
|
302
|
-
return matchesErrorPatterns(raw, ERROR_PATTERNS.rateLimit);
|
|
303
|
-
}
|
|
304
|
-
function isTimeoutErrorMessage(raw) {
|
|
305
|
-
return matchesErrorPatterns(raw, ERROR_PATTERNS.timeout);
|
|
306
|
-
}
|
|
307
|
-
function isBillingErrorMessage(raw) {
|
|
308
|
-
const value = normalizeLowercaseStringOrEmpty(raw);
|
|
309
|
-
if (!value) return false;
|
|
310
|
-
if (raw.length > BILLING_ERROR_MAX_LENGTH) return BILLING_ERROR_HARD_402_RE.test(value) || ZAI_BILLING_CODE_1311_RE.test(value);
|
|
311
|
-
if (matchesErrorPatterns(value, ERROR_PATTERNS.billing)) return true;
|
|
312
|
-
if (!BILLING_ERROR_HEAD_RE.test(raw)) return false;
|
|
313
|
-
return value.includes("upgrade") || value.includes("credits") || value.includes("payment") || value.includes("purchase") || value.includes("subscription") || value.includes("plan");
|
|
314
|
-
}
|
|
315
|
-
function isOverloadedErrorMessage(raw) {
|
|
316
|
-
return matchesErrorPatterns(raw, ERROR_PATTERNS.overloaded);
|
|
317
|
-
}
|
|
318
|
-
function coerceChatContentText(value) {
|
|
319
|
-
if (typeof value === "string") return value;
|
|
320
|
-
if (value == null) return "";
|
|
321
|
-
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint" || typeof value === "symbol") return String(value);
|
|
322
|
-
if (typeof value === "object") try {
|
|
323
|
-
return JSON.stringify(value) ?? "";
|
|
324
|
-
} catch {
|
|
325
|
-
return "";
|
|
326
|
-
}
|
|
327
|
-
return "";
|
|
328
|
-
}
|
|
329
|
-
function extractTextFromChatContent(content, opts) {
|
|
330
|
-
const normalizeText = opts?.normalizeText ?? ((text) => text.replace(/\s+/g, " ").trim());
|
|
331
|
-
const joinWith = opts?.joinWith ?? " ";
|
|
332
|
-
const sanitize = (text) => {
|
|
333
|
-
const raw = coerceChatContentText(text);
|
|
334
|
-
return coerceChatContentText(opts?.sanitizeText ? opts.sanitizeText(raw) : raw);
|
|
335
|
-
};
|
|
336
|
-
const normalize = (text) => coerceChatContentText(normalizeText(coerceChatContentText(text)));
|
|
337
|
-
if (typeof content === "string") {
|
|
338
|
-
const normalized = normalize(sanitize(content));
|
|
339
|
-
return normalized ? normalized : null;
|
|
340
|
-
}
|
|
341
|
-
if (!Array.isArray(content)) return null;
|
|
342
|
-
const chunks = [];
|
|
343
|
-
for (const block of content) {
|
|
344
|
-
if (!block || typeof block !== "object") continue;
|
|
345
|
-
if (block.type !== "text") continue;
|
|
346
|
-
const text = block.text;
|
|
347
|
-
const value = sanitize(text);
|
|
348
|
-
if (value.trim()) chunks.push(value);
|
|
349
|
-
}
|
|
350
|
-
const joined = normalize(chunks.join(joinWith));
|
|
351
|
-
return joined ? joined : null;
|
|
352
|
-
}
|
|
353
|
-
const INTERNAL_RUNTIME_CONTEXT_BEGIN = "<<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>>";
|
|
354
|
-
const INTERNAL_RUNTIME_CONTEXT_END = "<<<END_OPENCLAW_INTERNAL_CONTEXT>>>";
|
|
355
|
-
const ESCAPED_INTERNAL_RUNTIME_CONTEXT_BEGIN = "[[OPENCLAW_INTERNAL_CONTEXT_BEGIN]]";
|
|
356
|
-
const ESCAPED_INTERNAL_RUNTIME_CONTEXT_END = "[[OPENCLAW_INTERNAL_CONTEXT_END]]";
|
|
357
|
-
const LEGACY_INTERNAL_CONTEXT_HEADER = [
|
|
358
|
-
"OpenClaw runtime context (internal):",
|
|
359
|
-
"This context is runtime-generated, not user-authored. Keep internal details private.",
|
|
360
|
-
""
|
|
361
|
-
].join("\n") + "\n";
|
|
362
|
-
const LEGACY_INTERNAL_EVENT_MARKER = "[Internal task completion event]";
|
|
363
|
-
const LEGACY_INTERNAL_EVENT_SEPARATOR = "\n\n---\n\n";
|
|
364
|
-
const LEGACY_UNTRUSTED_RESULT_BEGIN = "<<<BEGIN_UNTRUSTED_CHILD_RESULT>>>";
|
|
365
|
-
const LEGACY_UNTRUSTED_RESULT_END = "<<<END_UNTRUSTED_CHILD_RESULT>>>";
|
|
366
|
-
function escapeInternalRuntimeContextDelimiters(value) {
|
|
367
|
-
return value.replaceAll(INTERNAL_RUNTIME_CONTEXT_BEGIN, ESCAPED_INTERNAL_RUNTIME_CONTEXT_BEGIN).replaceAll(INTERNAL_RUNTIME_CONTEXT_END, ESCAPED_INTERNAL_RUNTIME_CONTEXT_END);
|
|
368
|
-
}
|
|
369
|
-
function escapeRegExp(value) {
|
|
370
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
371
|
-
}
|
|
372
|
-
function findDelimitedTokenIndex(text, token, from) {
|
|
373
|
-
const tokenRe = new RegExp(`(?:^|\\r?\\n)${escapeRegExp(token)}(?=\\r?\\n|$)`, "g");
|
|
374
|
-
tokenRe.lastIndex = Math.max(0, from);
|
|
375
|
-
const match = tokenRe.exec(text);
|
|
376
|
-
if (!match) return -1;
|
|
377
|
-
const prefixLength = match[0].length - token.length;
|
|
378
|
-
return match.index + prefixLength;
|
|
379
|
-
}
|
|
380
|
-
function stripDelimitedBlock(text, begin, end) {
|
|
381
|
-
let next = text;
|
|
382
|
-
for (;;) {
|
|
383
|
-
const start = findDelimitedTokenIndex(next, begin, 0);
|
|
384
|
-
if (start === -1) return next;
|
|
385
|
-
let cursor = start + begin.length;
|
|
386
|
-
let depth = 1;
|
|
387
|
-
let finish = -1;
|
|
388
|
-
while (depth > 0) {
|
|
389
|
-
const nextBegin = findDelimitedTokenIndex(next, begin, cursor);
|
|
390
|
-
const nextEnd = findDelimitedTokenIndex(next, end, cursor);
|
|
391
|
-
if (nextEnd === -1) break;
|
|
392
|
-
if (nextBegin !== -1 && nextBegin < nextEnd) {
|
|
393
|
-
depth += 1;
|
|
394
|
-
cursor = nextBegin + begin.length;
|
|
395
|
-
continue;
|
|
396
|
-
}
|
|
397
|
-
depth -= 1;
|
|
398
|
-
finish = nextEnd;
|
|
399
|
-
cursor = nextEnd + end.length;
|
|
400
|
-
}
|
|
401
|
-
const before = next.slice(0, start).trimEnd();
|
|
402
|
-
if (finish === -1 || depth !== 0) return before;
|
|
403
|
-
const after = next.slice(finish + end.length).trimStart();
|
|
404
|
-
next = before && after ? `${before}\n\n${after}` : `${before}${after}`;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
function findLegacyInternalEventEnd(text, start) {
|
|
408
|
-
if (!text.startsWith(LEGACY_INTERNAL_EVENT_MARKER, start)) return null;
|
|
409
|
-
const resultBegin = text.indexOf(LEGACY_UNTRUSTED_RESULT_BEGIN, start + 32);
|
|
410
|
-
if (resultBegin === -1) return null;
|
|
411
|
-
const resultEnd = text.indexOf(LEGACY_UNTRUSTED_RESULT_END, resultBegin + 34);
|
|
412
|
-
if (resultEnd === -1) return null;
|
|
413
|
-
const actionIndex = text.indexOf("\n\nAction:\n", resultEnd + 32);
|
|
414
|
-
if (actionIndex === -1) return null;
|
|
415
|
-
const afterAction = actionIndex + 10;
|
|
416
|
-
const nextEvent = text.indexOf(`${LEGACY_INTERNAL_EVENT_SEPARATOR}${LEGACY_INTERNAL_EVENT_MARKER}`, afterAction);
|
|
417
|
-
if (nextEvent !== -1) return nextEvent;
|
|
418
|
-
const nextParagraph = text.indexOf("\n\n", afterAction);
|
|
419
|
-
return nextParagraph === -1 ? text.length : nextParagraph;
|
|
420
|
-
}
|
|
421
|
-
function stripLegacyInternalRuntimeContext(text) {
|
|
422
|
-
let next = text;
|
|
423
|
-
let searchFrom = 0;
|
|
424
|
-
for (;;) {
|
|
425
|
-
const headerStart = next.indexOf(LEGACY_INTERNAL_CONTEXT_HEADER, searchFrom);
|
|
426
|
-
if (headerStart === -1) return next;
|
|
427
|
-
const eventStart = headerStart + LEGACY_INTERNAL_CONTEXT_HEADER.length;
|
|
428
|
-
if (!next.startsWith(LEGACY_INTERNAL_EVENT_MARKER, eventStart)) {
|
|
429
|
-
searchFrom = eventStart;
|
|
430
|
-
continue;
|
|
431
|
-
}
|
|
432
|
-
let blockEnd = findLegacyInternalEventEnd(next, eventStart);
|
|
433
|
-
if (blockEnd == null) {
|
|
434
|
-
const nextParagraph = next.indexOf("\n\n", eventStart + 32);
|
|
435
|
-
blockEnd = nextParagraph === -1 ? next.length : nextParagraph;
|
|
436
|
-
} else while (next.startsWith(`${LEGACY_INTERNAL_EVENT_SEPARATOR}${LEGACY_INTERNAL_EVENT_MARKER}`, blockEnd)) {
|
|
437
|
-
const nextEventStart = blockEnd + 7;
|
|
438
|
-
const nextEventEnd = findLegacyInternalEventEnd(next, nextEventStart);
|
|
439
|
-
if (nextEventEnd == null) break;
|
|
440
|
-
blockEnd = nextEventEnd;
|
|
441
|
-
}
|
|
442
|
-
const before = next.slice(0, headerStart).trimEnd();
|
|
443
|
-
const after = next.slice(blockEnd).trimStart();
|
|
444
|
-
next = before && after ? `${before}\n\n${after}` : `${before}${after}`;
|
|
445
|
-
searchFrom = Math.max(0, before.length - 1);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
function stripInternalRuntimeContext(text) {
|
|
449
|
-
if (!text) return text;
|
|
450
|
-
return stripLegacyInternalRuntimeContext(stripDelimitedBlock(text, INTERNAL_RUNTIME_CONTEXT_BEGIN, INTERNAL_RUNTIME_CONTEXT_END));
|
|
451
|
-
}
|
|
452
|
-
function stableStringify(value) {
|
|
453
|
-
if (value === null || typeof value !== "object") return JSON.stringify(value) ?? "null";
|
|
454
|
-
if (Array.isArray(value)) return `[${value.map((entry) => stableStringify(entry)).join(",")}]`;
|
|
455
|
-
const record = value;
|
|
456
|
-
return `{${Object.keys(record).toSorted().map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(",")}}`;
|
|
457
|
-
}
|
|
458
|
-
function formatBillingErrorMessage(provider, model) {
|
|
459
|
-
const providerName = provider?.trim();
|
|
460
|
-
const modelName = model?.trim();
|
|
461
|
-
const providerLabel = providerName && modelName ? `${providerName} (${modelName})` : providerName || void 0;
|
|
462
|
-
if (providerLabel) return `⚠️ ${providerLabel} returned a billing error — your API key has run out of credits or has an insufficient balance. Check your ${providerName} billing dashboard and top up or switch to a different API key.`;
|
|
463
|
-
return "⚠️ API provider returned a billing error — your API key has run out of credits or has an insufficient balance. Check your provider's billing dashboard and top up or switch to a different API key.";
|
|
464
|
-
}
|
|
465
|
-
const BILLING_ERROR_USER_MESSAGE = formatBillingErrorMessage();
|
|
466
|
-
const RATE_LIMIT_ERROR_USER_MESSAGE = "⚠️ API rate limit reached. Please try again later.";
|
|
467
|
-
const OVERLOADED_ERROR_USER_MESSAGE = "The AI service is temporarily overloaded. Please try again in a moment.";
|
|
468
|
-
const FINAL_TAG_RE = /<\s*\/?\s*final\s*>/gi;
|
|
469
|
-
const ERROR_PREFIX_RE = /^(?:error|(?:[a-z][\w-]*\s+)?api\s*error|openai\s*error|anthropic\s*error|gateway\s*error|codex\s*error|request failed|failed|exception)(?:\s+\d{3})?[:\s-]+/i;
|
|
470
|
-
const CONTEXT_OVERFLOW_ERROR_HEAD_RE = /^(?:context overflow:|request_too_large\b|request size exceeds\b|request exceeds the maximum size\b|context length exceeded\b|maximum context length\b|prompt is too long\b|exceeds model context window\b)/i;
|
|
471
|
-
const HTTP_ERROR_HINTS = [
|
|
472
|
-
"error",
|
|
473
|
-
"bad request",
|
|
474
|
-
"not found",
|
|
475
|
-
"unauthorized",
|
|
476
|
-
"forbidden",
|
|
477
|
-
"internal server",
|
|
478
|
-
"service unavailable",
|
|
479
|
-
"gateway",
|
|
480
|
-
"rate limit",
|
|
481
|
-
"overloaded",
|
|
482
|
-
"timeout",
|
|
483
|
-
"timed out",
|
|
484
|
-
"invalid",
|
|
485
|
-
"too many requests",
|
|
486
|
-
"permission"
|
|
487
|
-
];
|
|
488
|
-
const RATE_LIMIT_SPECIFIC_HINT_RE = /\bmin(ute)?s?\b|\bhours?\b|\bseconds?\b|\btry again in\b|\breset\b|\bplan\b|\bquota\b/i;
|
|
489
|
-
const NON_ERROR_PROVIDER_PAYLOAD_MAX_LENGTH = 16384;
|
|
490
|
-
const NON_ERROR_PROVIDER_PAYLOAD_PREFIX_RE = /^codex\s*error(?:\s+\d{3})?[:\s-]+/i;
|
|
491
|
-
function extractProviderRateLimitMessage(raw) {
|
|
492
|
-
const withoutPrefix = raw.replace(ERROR_PREFIX_RE, "").trim();
|
|
493
|
-
const candidate = (parseApiErrorInfo(raw) ?? parseApiErrorInfo(withoutPrefix))?.message ?? (extractLeadingHttpStatus(withoutPrefix)?.rest || withoutPrefix);
|
|
494
|
-
if (!candidate || !RATE_LIMIT_SPECIFIC_HINT_RE.test(candidate)) return;
|
|
495
|
-
if (isCloudflareOrHtmlErrorPage(withoutPrefix)) return;
|
|
496
|
-
const trimmed = candidate.trim();
|
|
497
|
-
if (trimmed.length > 300 || trimmed.startsWith("{") || /^(?:<!doctype\s+html\b|<html\b)/i.test(trimmed)) return;
|
|
498
|
-
return `⚠️ ${trimmed}`;
|
|
499
|
-
}
|
|
500
|
-
function formatRateLimitOrOverloadedErrorCopy(raw) {
|
|
501
|
-
if (isRateLimitErrorMessage(raw)) return extractProviderRateLimitMessage(raw) ?? RATE_LIMIT_ERROR_USER_MESSAGE;
|
|
502
|
-
if (isOverloadedErrorMessage(raw)) return OVERLOADED_ERROR_USER_MESSAGE;
|
|
503
|
-
}
|
|
504
|
-
function formatTransportErrorCopy(raw) {
|
|
505
|
-
if (!raw) return;
|
|
506
|
-
if (isCloudflareOrHtmlErrorPage(raw)) return;
|
|
507
|
-
const lower = normalizeLowercaseStringOrEmpty(raw);
|
|
508
|
-
if (/\beconnrefused\b/i.test(raw) || lower.includes("connection refused") || lower.includes("actively refused")) return "LLM request failed: connection refused by the provider endpoint.";
|
|
509
|
-
if (/\beconnreset\b|\beconnaborted\b|\benetreset\b|\bepipe\b/i.test(raw) || lower.includes("socket hang up") || lower.includes("connection reset") || lower.includes("connection aborted")) return "LLM request failed: network connection was interrupted.";
|
|
510
|
-
if (/\benotfound\b|\beai_again\b/i.test(raw) || lower.includes("getaddrinfo") || lower.includes("no such host") || lower.includes("dns")) return "LLM request failed: DNS lookup for the provider endpoint failed.";
|
|
511
|
-
if (/\benetunreach\b|\behostunreach\b|\behostdown\b/i.test(raw) || lower.includes("network is unreachable") || lower.includes("host is unreachable")) return "LLM request failed: the provider endpoint is unreachable from this host.";
|
|
512
|
-
if (lower.includes("fetch failed") || lower.includes("connection error") || lower.includes("network request failed")) return "LLM request failed: network connection error.";
|
|
513
|
-
}
|
|
514
|
-
function formatDiskSpaceErrorCopy(raw) {
|
|
515
|
-
if (!raw) return;
|
|
516
|
-
const lower = normalizeLowercaseStringOrEmpty(raw);
|
|
517
|
-
if (/\benospc\b/i.test(raw) || lower.includes("no space left on device") || lower.includes("disk full")) return "OpenClaw could not write local session data because the disk is full. Free some disk space and try again.";
|
|
518
|
-
}
|
|
519
|
-
function isReasoningConstraintErrorMessage(raw) {
|
|
520
|
-
if (!raw) return false;
|
|
521
|
-
const lower = normalizeLowercaseStringOrEmpty(raw);
|
|
522
|
-
return lower.includes("reasoning is mandatory") || lower.includes("reasoning is required") || lower.includes("requires reasoning") || lower.includes("reasoning") && lower.includes("cannot be disabled");
|
|
523
|
-
}
|
|
524
|
-
function isInvalidStreamingEventOrderError(raw) {
|
|
525
|
-
if (!raw) return false;
|
|
526
|
-
const lower = normalizeLowercaseStringOrEmpty(raw);
|
|
527
|
-
return lower.includes("unexpected event order") && lower.includes("message_start") && lower.includes("message_stop");
|
|
528
|
-
}
|
|
529
|
-
function hasRateLimitTpmHint(raw) {
|
|
530
|
-
const lower = normalizeLowercaseStringOrEmpty(raw);
|
|
531
|
-
return /\btpm\b/i.test(lower) || lower.includes("tokens per minute");
|
|
532
|
-
}
|
|
533
|
-
function looksLikeGenericContextOverflowError(raw) {
|
|
534
|
-
if (!raw) return false;
|
|
535
|
-
const lower = normalizeLowercaseStringOrEmpty(raw);
|
|
536
|
-
const hasRequestSizeExceeds = lower.includes("request size exceeds");
|
|
537
|
-
const hasContextWindow = lower.includes("context window") || lower.includes("context length") || lower.includes("maximum context length");
|
|
538
|
-
return lower.includes("request_too_large") || lower.includes("invalid_argument") && lower.includes("maximum number of tokens") || lower.includes("request exceeds the maximum size") || lower.includes("context length exceeded") || lower.includes("maximum context length") || lower.includes("prompt is too long") || lower.includes("prompt too long") || lower.includes("exceeds model context window") || lower.includes("model token limit") || lower.includes("input exceeds") && lower.includes("maximum number of tokens") || hasRequestSizeExceeds && hasContextWindow || lower.includes("context overflow:") || lower.includes("exceed context limit") || lower.includes("exceeds the model's maximum context") || lower.includes("max_tokens") && lower.includes("exceed") && lower.includes("context") || lower.includes("input length") && lower.includes("exceed") && lower.includes("context") || lower.includes("413") && lower.includes("too large") || lower.includes("context_window_exceeded") || raw.includes("上下文过长") || raw.includes("上下文超出") || raw.includes("上下文长度超") || raw.includes("超出最大上下文") || raw.includes("请压缩上下文");
|
|
539
|
-
}
|
|
540
|
-
function shouldRewriteContextOverflowText(raw) {
|
|
541
|
-
if (hasRateLimitTpmHint(raw) || isReasoningConstraintErrorMessage(raw)) return false;
|
|
542
|
-
if (!looksLikeGenericContextOverflowError(raw)) return false;
|
|
543
|
-
return isRawApiErrorPayload(raw) || isLikelyHttpErrorText(raw) || ERROR_PREFIX_RE.test(raw) || CONTEXT_OVERFLOW_ERROR_HEAD_RE.test(raw);
|
|
544
|
-
}
|
|
545
|
-
function getApiErrorPayloadFingerprint(raw) {
|
|
546
|
-
if (!raw) return null;
|
|
547
|
-
const payload = parseApiErrorPayload(raw);
|
|
548
|
-
if (!payload) return null;
|
|
549
|
-
return stableStringify(payload);
|
|
550
|
-
}
|
|
551
|
-
function isRawApiErrorPayload(raw) {
|
|
552
|
-
return getApiErrorPayloadFingerprint(raw) !== null;
|
|
553
|
-
}
|
|
554
|
-
function isLikelyProviderErrorType(type) {
|
|
555
|
-
const normalized = normalizeOptionalLowercaseString(type);
|
|
556
|
-
if (!normalized) return false;
|
|
557
|
-
return normalized.endsWith("_error");
|
|
558
|
-
}
|
|
559
|
-
function shouldRewriteRawPayloadWithoutErrorContext(raw) {
|
|
560
|
-
if (raw.length > NON_ERROR_PROVIDER_PAYLOAD_MAX_LENGTH) return false;
|
|
561
|
-
if (!NON_ERROR_PROVIDER_PAYLOAD_PREFIX_RE.test(raw)) return false;
|
|
562
|
-
const info = parseApiErrorInfo(raw);
|
|
563
|
-
if (!info) return false;
|
|
564
|
-
if (isLikelyProviderErrorType(info.type)) return true;
|
|
565
|
-
if (info.httpCode) {
|
|
566
|
-
const parsedCode = Number(info.httpCode);
|
|
567
|
-
if (Number.isFinite(parsedCode) && parsedCode >= 400) return true;
|
|
568
|
-
}
|
|
569
|
-
return false;
|
|
570
|
-
}
|
|
571
|
-
function stripFinalTagsFromText(text) {
|
|
572
|
-
const normalized = coerceChatContentText(text);
|
|
573
|
-
if (!normalized) return normalized;
|
|
574
|
-
return normalized.replace(FINAL_TAG_RE, "");
|
|
575
|
-
}
|
|
576
|
-
function collapseConsecutiveDuplicateBlocks(text) {
|
|
577
|
-
const trimmed = text.trim();
|
|
578
|
-
if (!trimmed) return text;
|
|
579
|
-
const blocks = trimmed.split(/\n{2,}/);
|
|
580
|
-
if (blocks.length < 2) return text;
|
|
581
|
-
const normalizeBlock = (value) => value.trim().replace(/\s+/g, " ");
|
|
582
|
-
const result = [];
|
|
583
|
-
let lastNormalized = null;
|
|
584
|
-
for (const block of blocks) {
|
|
585
|
-
const normalized = normalizeBlock(block);
|
|
586
|
-
if (lastNormalized && normalized === lastNormalized) continue;
|
|
587
|
-
result.push(block.trim());
|
|
588
|
-
lastNormalized = normalized;
|
|
589
|
-
}
|
|
590
|
-
if (result.length === blocks.length) return text;
|
|
591
|
-
return result.join("\n\n");
|
|
592
|
-
}
|
|
593
|
-
function isLikelyHttpErrorText(raw) {
|
|
594
|
-
if (isCloudflareOrHtmlErrorPage(raw)) return true;
|
|
595
|
-
const status = extractLeadingHttpStatus(raw);
|
|
596
|
-
if (!status) return false;
|
|
597
|
-
if (status.code < 400) return false;
|
|
598
|
-
const message = normalizeLowercaseStringOrEmpty(status.rest);
|
|
599
|
-
return HTTP_ERROR_HINTS.some((hint) => message.includes(hint));
|
|
600
|
-
}
|
|
601
|
-
function sanitizeUserFacingText(text, opts) {
|
|
602
|
-
const raw = coerceChatContentText(text);
|
|
603
|
-
if (!raw) return raw;
|
|
604
|
-
const errorContext = opts?.errorContext ?? false;
|
|
605
|
-
const stripped = stripInternalRuntimeContext(stripFinalTagsFromText(raw));
|
|
606
|
-
const trimmed = stripped.trim();
|
|
607
|
-
if (!trimmed) return "";
|
|
608
|
-
if (!errorContext && shouldRewriteRawPayloadWithoutErrorContext(trimmed)) return formatRawAssistantErrorForUi(trimmed);
|
|
609
|
-
if (errorContext) {
|
|
610
|
-
const execDeniedMessage = formatExecDeniedUserMessage(trimmed);
|
|
611
|
-
if (execDeniedMessage) return execDeniedMessage;
|
|
612
|
-
const diskSpaceCopy = formatDiskSpaceErrorCopy(trimmed);
|
|
613
|
-
if (diskSpaceCopy) return diskSpaceCopy;
|
|
614
|
-
if (/incorrect role information|roles must alternate/i.test(trimmed)) return "Message ordering conflict - please try again. If this persists, use /new to start a fresh session.";
|
|
615
|
-
if (shouldRewriteContextOverflowText(trimmed)) return "Context overflow: prompt too large for the model. Try /reset (or /new) to start a fresh session, or use a larger-context model.";
|
|
616
|
-
if (isBillingErrorMessage(trimmed)) return BILLING_ERROR_USER_MESSAGE;
|
|
617
|
-
if (isInvalidStreamingEventOrderError(trimmed)) return "LLM request failed: provider returned an invalid streaming response. Please try again.";
|
|
618
|
-
if (isRawApiErrorPayload(trimmed) || isLikelyHttpErrorText(trimmed)) return formatRawAssistantErrorForUi(trimmed);
|
|
619
|
-
if (ERROR_PREFIX_RE.test(trimmed)) {
|
|
620
|
-
const prefixedCopy = formatRateLimitOrOverloadedErrorCopy(trimmed);
|
|
621
|
-
if (prefixedCopy) return prefixedCopy;
|
|
622
|
-
const transportCopy = formatTransportErrorCopy(trimmed);
|
|
623
|
-
if (transportCopy) return transportCopy;
|
|
624
|
-
if (isTimeoutErrorMessage(trimmed)) return "LLM request timed out.";
|
|
625
|
-
return formatRawAssistantErrorForUi(trimmed);
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
return collapseConsecutiveDuplicateBlocks(stripped.replace(/^(?:[ \t]*\r?\n)+/, ""));
|
|
629
|
-
}
|
|
630
|
-
//#endregion
|
|
631
|
-
//#region node_modules/.pnpm/openclaw@2026.4.22_@napi-rs+canvas@0.1.99/node_modules/openclaw/dist/profile-utils-BW2L9jUl.js
|
|
632
|
-
const PROFILE_NAME_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;
|
|
633
|
-
function isValidProfileName(value) {
|
|
634
|
-
if (!value) return false;
|
|
635
|
-
return PROFILE_NAME_RE.test(value);
|
|
636
|
-
}
|
|
637
|
-
function normalizeProfileName(raw) {
|
|
638
|
-
const profile = raw?.trim();
|
|
639
|
-
if (!profile) return null;
|
|
640
|
-
if (normalizeLowercaseStringOrEmpty(profile) === "default") return null;
|
|
641
|
-
if (!isValidProfileName(profile)) return null;
|
|
642
|
-
return profile;
|
|
643
|
-
}
|
|
644
|
-
//#endregion
|
|
645
|
-
//#region node_modules/.pnpm/openclaw@2026.4.22_@napi-rs+canvas@0.1.99/node_modules/openclaw/dist/cli-name-Cga4Kejh.js
|
|
646
|
-
const DEFAULT_CLI_NAME = "openclaw";
|
|
647
|
-
const KNOWN_CLI_NAMES = new Set([DEFAULT_CLI_NAME]);
|
|
648
|
-
const CLI_PREFIX_RE$1 = /^(?:((?:pnpm|npm|bunx|npx)\s+))?(openclaw)\b/;
|
|
649
|
-
function resolveCliName(argv = process.argv) {
|
|
650
|
-
const argv1 = argv[1];
|
|
651
|
-
if (!argv1) return DEFAULT_CLI_NAME;
|
|
652
|
-
const base = path.basename(argv1).trim();
|
|
653
|
-
if (KNOWN_CLI_NAMES.has(base)) return base;
|
|
654
|
-
return DEFAULT_CLI_NAME;
|
|
655
|
-
}
|
|
656
|
-
function replaceCliName(command, cliName = resolveCliName()) {
|
|
657
|
-
if (!command.trim()) return command;
|
|
658
|
-
if (!CLI_PREFIX_RE$1.test(command)) return command;
|
|
659
|
-
return command.replace(CLI_PREFIX_RE$1, (_match, runner) => {
|
|
660
|
-
return `${runner ?? ""}${cliName}`;
|
|
661
|
-
});
|
|
662
|
-
}
|
|
663
|
-
//#endregion
|
|
664
|
-
//#region node_modules/.pnpm/openclaw@2026.4.22_@napi-rs+canvas@0.1.99/node_modules/openclaw/dist/command-format-LSnUCVVF.js
|
|
665
|
-
const CLI_PREFIX_RE = /^(?:pnpm|npm|bunx|npx)\s+openclaw\b|^openclaw\b/;
|
|
666
|
-
const CONTAINER_FLAG_RE = /(?:^|\s)--container(?:\s|=|$)/;
|
|
667
|
-
const PROFILE_FLAG_RE = /(?:^|\s)--profile(?:\s|=|$)/;
|
|
668
|
-
const DEV_FLAG_RE = /(?:^|\s)--dev(?:\s|$)/;
|
|
669
|
-
const UPDATE_COMMAND_RE = /^(?:pnpm|npm|bunx|npx)\s+openclaw\b.*(?:^|\s)update(?:\s|$)|^openclaw\b.*(?:^|\s)update(?:\s|$)/;
|
|
670
|
-
const CONTAINER_HINT_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$/;
|
|
671
|
-
function formatCliCommand(command, env = process.env) {
|
|
672
|
-
const normalizedCommand = replaceCliName(command, resolveCliName());
|
|
673
|
-
const rawContainer = env.OPENCLAW_CONTAINER_HINT?.trim();
|
|
674
|
-
const container = rawContainer && CONTAINER_HINT_RE.test(rawContainer) ? rawContainer : void 0;
|
|
675
|
-
const profile = normalizeProfileName(env.OPENCLAW_PROFILE);
|
|
676
|
-
if (!container && !profile) return normalizedCommand;
|
|
677
|
-
if (!CLI_PREFIX_RE.test(normalizedCommand)) return normalizedCommand;
|
|
678
|
-
const additions = [];
|
|
679
|
-
if (container && !CONTAINER_FLAG_RE.test(normalizedCommand) && !UPDATE_COMMAND_RE.test(normalizedCommand)) additions.push(`--container ${container}`);
|
|
680
|
-
if (!container && profile && !PROFILE_FLAG_RE.test(normalizedCommand) && !DEV_FLAG_RE.test(normalizedCommand)) additions.push(`--profile ${profile}`);
|
|
681
|
-
if (additions.length === 0) return normalizedCommand;
|
|
682
|
-
return normalizedCommand.replace(CLI_PREFIX_RE, (match) => `${match} ${additions.join(" ")}`);
|
|
683
|
-
}
|
|
684
|
-
//#endregion
|
|
685
|
-
export { extractTextFromChatContent as a, escapeInternalRuntimeContextDelimiters as i, INTERNAL_RUNTIME_CONTEXT_BEGIN as n, sanitizeUserFacingText as o, INTERNAL_RUNTIME_CONTEXT_END as r, formatCliCommand as t };
|