@openclaw/ai 2026.7.2-beta.4 → 2026.7.2-beta.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 (68) hide show
  1. package/dist/{anthropic-CrUDIBpM.mjs → anthropic-CH4UUnZr.mjs} +26 -441
  2. package/dist/{anthropic-BoTnz8cv.d.mts → anthropic-SrGtwsJu.d.mts} +27 -1
  3. package/dist/anthropic-usage-DWU-x8MI.mjs +459 -0
  4. package/dist/{api-registry-BMphkFf1.d.mts → api-registry-DlMgPR39.d.mts} +1 -1
  5. package/dist/{azure-openai-responses-CbrpVeEv.mjs → azure-openai-responses-CImcwB83.mjs} +4 -4
  6. package/dist/cache-retention-0x979a5V.mjs +12 -0
  7. package/dist/deferred-event-buffer-DAvyP7qA.mjs +19 -0
  8. package/dist/error-coercion-DgxlWC0n.mjs +15 -0
  9. package/dist/{event-stream-Douf9dob.d.mts → event-stream-YjaPW20U.d.mts} +1 -1
  10. package/dist/event-stream.d.mts +1 -1
  11. package/dist/{github-copilot-headers-BsH5cqGj.mjs → github-copilot-headers-NCJtz9i0.mjs} +1 -12
  12. package/dist/{google-Cs62KA7t.mjs → google-CtSg0iTS.mjs} +3 -3
  13. package/dist/{google-shared-CMLI-tCZ.mjs → google-shared-DNBz5rcD.mjs} +7 -4
  14. package/dist/{google-vertex-B4SD3U0f.mjs → google-vertex-31f1uS9L.mjs} +3 -3
  15. package/dist/{host-WvWBo4h8.d.mts → host-B9GUmcra.d.mts} +2 -2
  16. package/dist/host-Dog2WQiR.mjs +369 -0
  17. package/dist/index.d.mts +7 -7
  18. package/dist/index.mjs +3 -3
  19. package/dist/internal/anthropic.d.mts +16 -62
  20. package/dist/internal/anthropic.mjs +5 -4
  21. package/dist/internal/openai.d.mts +260 -2
  22. package/dist/internal/openai.mjs +7 -5
  23. package/dist/internal/runtime.d.mts +8 -32
  24. package/dist/internal/runtime.mjs +7 -6
  25. package/dist/internal/shared.d.mts +14 -9
  26. package/dist/internal/shared.mjs +6 -2
  27. package/dist/{llm-request-activity-CehVkZP-.mjs → llm-request-activity-BjtkplhG.mjs} +1 -19
  28. package/dist/{mistral-D5Ps7Led.mjs → mistral-CWmpvWYh.mjs} +7 -4
  29. package/dist/number-coercion-DvG7SNMg.mjs +129 -0
  30. package/dist/{openai-chatgpt-responses-h0o5yV8Y.mjs → openai-chatgpt-responses-B84Ibtrd.mjs} +33 -29
  31. package/dist/{openai-completions-exO8NFQf.mjs → openai-completions-DsOxhOD1.mjs} +28 -482
  32. package/dist/openai-completions-compat-DBWjXoMZ.d.mts +43 -0
  33. package/dist/openai-prompt-cache-2uo_1OR1.d.mts +7 -0
  34. package/dist/openai-prompt-cache-mZTCdRPo.mjs +12 -0
  35. package/dist/openai-reasoning-compat-YgeLncHw.mjs +396 -0
  36. package/dist/{openai-responses-BHpmtUKo.mjs → openai-responses-BT7A3sLu.mjs} +7 -5
  37. package/dist/openai-responses-shared-pXl6Wd8S.mjs +392 -0
  38. package/dist/{openai-responses-shared-CzCurmY1.mjs → openai-responses-stream-internal-Cw5txaGW.mjs} +1609 -1037
  39. package/dist/{openai-tool-projection-ITOU9bG1.mjs → openai-tool-projection-OhX64DoP.mjs} +26 -11
  40. package/dist/prompt-cache-stability-Cwcjv_fx.d.mts +13 -0
  41. package/dist/{provider-error-C4VvV_3t.mjs → provider-error-CAEvRjry.mjs} +8 -2
  42. package/dist/provider-options-D8bB3z9b.d.mts +144 -0
  43. package/dist/providers.d.mts +3 -2
  44. package/dist/providers.mjs +10 -9
  45. package/dist/reasoning-tag-text-partitioner-CGDyLWUR.mjs +12209 -0
  46. package/dist/simple-options-9lhRrN73.mjs +50 -0
  47. package/dist/{src-CXno1H5g.mjs → src-QkygScBs.mjs} +23 -4
  48. package/dist/stream-first-event-timeout-BBys9hSb.mjs +86 -0
  49. package/dist/stream-first-event-timeout-DvDeSucC.d.mts +29 -0
  50. package/dist/tls-certificate-errors-DXSpluKI.mjs +93 -0
  51. package/dist/tool-result-text-CTpIRbYd.mjs +225 -0
  52. package/dist/transform-messages-C8mBqZxF.mjs +2 -0
  53. package/dist/transport-stream-shared-D81p90xq.mjs +297 -0
  54. package/dist/transports.d.mts +115 -132
  55. package/dist/transports.mjs +400 -1991
  56. package/dist/{types-AFwwWium.d.mts → types-bzp5k29J.d.mts} +7 -0
  57. package/dist/types.d.mts +5 -5
  58. package/dist/types.mjs +2 -2
  59. package/dist/{validation-sxvxC8J-.d.mts → validation-B-j7cOYp.d.mts} +1 -1
  60. package/dist/validation.d.mts +1 -1
  61. package/package.json +4 -5
  62. package/dist/host-XYGZcgO8.mjs +0 -98
  63. package/dist/model-utils-1GiZ2_rr.mjs +0 -64
  64. package/dist/openai-CoGicoDt.d.mts +0 -332
  65. package/dist/reasoning-tag-text-partitioner-BlVe67g6.mjs +0 -400
  66. package/dist/stream-first-event-timeout-DP4xEyBY.mjs +0 -150
  67. package/dist/system-prompt-cache-boundary-CbHeV4_l.mjs +0 -526
  68. package/npm-shrinkwrap.json +0 -638
@@ -0,0 +1,50 @@
1
+ //#region packages/ai/src/providers/simple-options.ts
2
+ function buildBaseOptions(model, options, apiKey) {
3
+ const firstEventOptions = options;
4
+ return {
5
+ temperature: options?.temperature,
6
+ maxTokens: options?.maxTokens,
7
+ stop: options?.stop,
8
+ signal: options?.signal,
9
+ apiKey: apiKey || options?.apiKey,
10
+ transport: options?.transport,
11
+ cacheRetention: options?.cacheRetention,
12
+ sessionId: options?.sessionId,
13
+ promptCacheKey: options?.promptCacheKey,
14
+ headers: options?.headers,
15
+ onPayload: options?.onPayload,
16
+ onResponse: options?.onResponse,
17
+ timeoutMs: options?.timeoutMs,
18
+ firstEventTimeoutMs: firstEventOptions?.firstEventTimeoutMs,
19
+ onFirstEventTimeout: firstEventOptions?.onFirstEventTimeout,
20
+ maxRetries: options?.maxRetries,
21
+ maxRetryDelayMs: options?.maxRetryDelayMs,
22
+ metadata: options?.metadata
23
+ };
24
+ }
25
+ function clampMaxTokensToModel(model, requestedMaxTokens) {
26
+ return requestedMaxTokens === void 0 ? void 0 : Math.max(1, Math.min(requestedMaxTokens, model.maxTokens));
27
+ }
28
+ function clampReasoning(effort) {
29
+ return effort === "xhigh" ? "high" : effort;
30
+ }
31
+ function adjustMaxTokensForThinking(baseMaxTokens, modelMaxTokens, reasoningLevel, customBudgets) {
32
+ const budgets = {
33
+ minimal: 1024,
34
+ low: 2048,
35
+ medium: 8192,
36
+ high: 16384,
37
+ max: 32768,
38
+ ...customBudgets
39
+ };
40
+ const minOutputTokens = 1024;
41
+ let thinkingBudget = budgets[clampReasoning(reasoningLevel)];
42
+ const maxTokens = baseMaxTokens === void 0 ? modelMaxTokens : Math.min(baseMaxTokens + thinkingBudget, modelMaxTokens);
43
+ if (maxTokens <= thinkingBudget) thinkingBudget = Math.max(0, maxTokens - minOutputTokens);
44
+ return {
45
+ maxTokens,
46
+ thinkingBudget
47
+ };
48
+ }
49
+ //#endregion
50
+ export { clampReasoning as i, buildBaseOptions as n, clampMaxTokensToModel as r, adjustMaxTokensForThinking as t };
@@ -31,6 +31,7 @@ const CLAUDE_SONNET_5_THINKING_PROFILE = {
31
31
  ],
32
32
  defaultLevel: "high"
33
33
  };
34
+ const CLAUDE_OPUS_5_THINKING_PROFILE = CLAUDE_SONNET_5_THINKING_PROFILE;
34
35
  /** Resolve the canonical normalized Claude model id for one runtime model ref. */
35
36
  function resolveClaudeModelIdentity(ref) {
36
37
  const normalized = normalizeClaudeModelId((typeof ref.params?.canonicalModelId === "string" ? ref.params.canonicalModelId : void 0) ?? ref.id);
@@ -63,20 +64,38 @@ function resolveClaudeSonnet5ModelIdentity(ref) {
63
64
  if (!match) return;
64
65
  return normalized.slice((match.index ?? 0) + (match[0].startsWith("-") ? 1 : 0));
65
66
  }
67
+ /** Resolve Claude Opus 5 through aliases, direct ids, cloud ids, or deployment metadata. */
68
+ function resolveClaudeOpus5ModelIdentity(ref) {
69
+ const normalized = resolveClaudeModelIdentity(ref);
70
+ if (normalized === "opus" || normalized === "opus-5") return "claude-opus-5";
71
+ const match = /(?:^|-)claude-opus-5(?=$|[^a-z0-9])/.exec(normalized);
72
+ if (!match) return;
73
+ return normalized.slice((match.index ?? 0) + (match[0].startsWith("-") ? 1 : 0));
74
+ }
66
75
  /** Return whether a Claude model supports adaptive thinking. */
67
76
  function supportsClaudeAdaptiveThinking(ref) {
68
77
  const modelId = resolveClaudeModelIdentity(ref);
69
- return /(?:^|-)claude-(?:fable-5|mythos-(?:5|preview)|opus-4-(?:6|7|8)|sonnet-(?:5|4-6))(?=$|[^a-z0-9])/.test(modelId);
78
+ return resolveClaudeOpus5ModelIdentity(ref) !== void 0 || /(?:^|-)claude-(?:fable-5|mythos-(?:5|preview)|opus-4-(?:6|7|8)|sonnet-(?:5|4-6))(?=$|[^a-z0-9])/.test(modelId);
79
+ }
80
+ /** Return whether a Claude model has a native 1M-token context window. */
81
+ function supportsClaude1MContext(ref) {
82
+ const modelId = resolveClaudeModelIdentity(ref);
83
+ return resolveClaudeOpus5ModelIdentity(ref) !== void 0 || /(?:^|-)claude-(?:fable-5|mythos-(?:5|preview)|opus-4-(?:6|7|8)|sonnet-(?:5|4-6))(?=$|[^a-z0-9])/.test(modelId);
84
+ }
85
+ /** Return whether a Claude model supports Anthropic's native fast mode. */
86
+ function supportsClaudeFastMode(ref) {
87
+ const modelId = resolveClaudeModelIdentity(ref);
88
+ return resolveClaudeOpus5ModelIdentity(ref) !== void 0 || /(?:^|-)claude-opus-4-8(?=$|[^a-z0-9])/.test(modelId);
70
89
  }
71
90
  /** Return whether a Claude model supports native max effort. */
72
91
  function supportsClaudeNativeMaxEffort(ref) {
73
92
  const modelId = resolveClaudeModelIdentity(ref);
74
- return /(?:^|-)claude-(?:fable-5|mythos-5|opus-4-(?:6|7|8)|sonnet-(?:5|4-6))(?=$|[^a-z0-9])/.test(modelId);
93
+ return resolveClaudeOpus5ModelIdentity(ref) !== void 0 || /(?:^|-)claude-(?:fable-5|mythos-5|opus-4-(?:6|7|8)|sonnet-(?:5|4-6))(?=$|[^a-z0-9])/.test(modelId);
75
94
  }
76
95
  /** Return whether a Claude model supports native xhigh effort. */
77
96
  function supportsClaudeNativeXhighEffort(ref) {
78
97
  const modelId = resolveClaudeModelIdentity(ref);
79
- return /(?:^|-)claude-(?:fable-5|mythos-5|opus-4-(?:7|8)|sonnet-5)(?=$|[^a-z0-9])/.test(modelId);
98
+ return resolveClaudeOpus5ModelIdentity(ref) !== void 0 || /(?:^|-)claude-(?:fable-5|mythos-5|opus-4-(?:7|8)|sonnet-5)(?=$|[^a-z0-9])/.test(modelId);
80
99
  }
81
100
  /** Return whether a Claude model rejects caller-selected sampling parameters. */
82
101
  function requiresClaudeDefaultSampling(ref) {
@@ -96,4 +115,4 @@ function resolveClaudeNativeThinkingLevelMap(ref) {
96
115
  };
97
116
  }
98
117
  //#endregion
99
- export { resolveClaudeFable5ModelIdentity as a, resolveClaudeNativeThinkingLevelMap as c, supportsClaudeNativeMaxEffort as d, supportsClaudeNativeXhighEffort as f, requiresClaudeMandatoryAdaptiveThinking as i, resolveClaudeSonnet5ModelIdentity as l, CLAUDE_SONNET_5_THINKING_PROFILE as n, resolveClaudeModelIdentity as o, requiresClaudeDefaultSampling as r, resolveClaudeMythos5ModelIdentity as s, CLAUDE_FABLE_5_THINKING_PROFILE as t, supportsClaudeAdaptiveThinking as u };
118
+ export { requiresClaudeMandatoryAdaptiveThinking as a, resolveClaudeMythos5ModelIdentity as c, resolveClaudeSonnet5ModelIdentity as d, supportsClaude1MContext as f, supportsClaudeNativeXhighEffort as g, supportsClaudeNativeMaxEffort as h, requiresClaudeDefaultSampling as i, resolveClaudeNativeThinkingLevelMap as l, supportsClaudeFastMode as m, CLAUDE_OPUS_5_THINKING_PROFILE as n, resolveClaudeFable5ModelIdentity as o, supportsClaudeAdaptiveThinking as p, CLAUDE_SONNET_5_THINKING_PROFILE as r, resolveClaudeModelIdentity as s, CLAUDE_FABLE_5_THINKING_PROFILE as t, resolveClaudeOpus5ModelIdentity as u };
@@ -0,0 +1,86 @@
1
+ import { n as clampTimerTimeoutMs } from "./number-coercion-DvG7SNMg.mjs";
2
+ //#region packages/ai/src/utils/stream-first-event-timeout.ts
3
+ function getFirstStreamEventTimeoutMs(options) {
4
+ return options?.firstEventTimeoutMs;
5
+ }
6
+ function getFirstStreamEventTimeoutHandler(options) {
7
+ return options?.onFirstEventTimeout;
8
+ }
9
+ function formatOptionalField(name, value) {
10
+ return value ? ` ${name}=${value}` : "";
11
+ }
12
+ function createFirstStreamEventTimeoutError(context) {
13
+ const stage = context.stage ? `${context.stage} ` : "";
14
+ const details = [
15
+ formatOptionalField("provider", context.provider),
16
+ formatOptionalField("api", context.api),
17
+ formatOptionalField("model", context.model)
18
+ ].join("");
19
+ return /* @__PURE__ */ new Error(`${stage}HTTP stream opened but did not deliver a first SSE event within ${context.timeoutMs}ms after streaming headers (first-event timeout).${details}` + (context.hint ? ` ${context.hint}` : ""));
20
+ }
21
+ function createFirstStreamEventAbortController(parentSignal) {
22
+ const controller = new AbortController();
23
+ const abortFromParent = () => {
24
+ if (!controller.signal.aborted) controller.abort(parentSignal?.reason);
25
+ };
26
+ if (parentSignal?.aborted) abortFromParent();
27
+ else parentSignal?.addEventListener("abort", abortFromParent, { once: true });
28
+ return {
29
+ signal: controller.signal,
30
+ abort(reason) {
31
+ if (!controller.signal.aborted) controller.abort(reason);
32
+ },
33
+ dispose() {
34
+ parentSignal?.removeEventListener("abort", abortFromParent);
35
+ }
36
+ };
37
+ }
38
+ function withFirstStreamEventTimeout(stream, context) {
39
+ const timeoutMs = clampTimerTimeoutMs(context.timeoutMs);
40
+ if (timeoutMs === void 0 || context.timeoutMs <= 0) return stream;
41
+ const timeoutContext = {
42
+ ...context,
43
+ timeoutMs
44
+ };
45
+ return { async *[Symbol.asyncIterator]() {
46
+ const iterator = stream[Symbol.asyncIterator]();
47
+ let timer;
48
+ let completed = false;
49
+ const clear = () => {
50
+ if (timer) {
51
+ clearTimeout(timer);
52
+ timer = void 0;
53
+ }
54
+ };
55
+ try {
56
+ const first = await new Promise((resolve, reject) => {
57
+ timer = setTimeout(() => {
58
+ const timeoutError = createFirstStreamEventTimeoutError(timeoutContext);
59
+ timeoutContext.onTimeout?.(timeoutError);
60
+ timeoutContext.abort?.(timeoutError);
61
+ reject(timeoutError);
62
+ }, timeoutMs);
63
+ timer.unref?.();
64
+ iterator.next().then(resolve, reject);
65
+ }).finally(clear);
66
+ if (first.done) {
67
+ completed = true;
68
+ return;
69
+ }
70
+ yield first.value;
71
+ for (;;) {
72
+ const next = await iterator.next();
73
+ if (next.done) {
74
+ completed = true;
75
+ return;
76
+ }
77
+ yield next.value;
78
+ }
79
+ } finally {
80
+ clear();
81
+ if (!completed) iterator.return?.().catch(() => void 0);
82
+ }
83
+ } };
84
+ }
85
+ //#endregion
86
+ export { withFirstStreamEventTimeout as a, getFirstStreamEventTimeoutMs as i, createFirstStreamEventTimeoutError as n, getFirstStreamEventTimeoutHandler as r, createFirstStreamEventAbortController as t };
@@ -0,0 +1,29 @@
1
+ //#region packages/ai/src/utils/stream-first-event-timeout.d.ts
2
+ type StreamStage = "responses" | "completions";
3
+ type FirstStreamEventTimeoutContext = {
4
+ provider?: string;
5
+ api?: string;
6
+ model?: string;
7
+ timeoutMs: number;
8
+ stage?: StreamStage;
9
+ hint?: string;
10
+ abort?: (reason: Error) => void;
11
+ onTimeout?: (reason: Error) => void;
12
+ };
13
+ type FirstStreamEventInternalOptions = {
14
+ firstEventTimeoutMs?: number;
15
+ abortFirstEventStream?: (reason: Error) => void;
16
+ onFirstEventTimeout?: (reason: Error) => void;
17
+ };
18
+ type FirstStreamEventAbortController = {
19
+ signal: AbortSignal;
20
+ abort: (reason: Error) => void;
21
+ dispose: () => void;
22
+ };
23
+ declare function getFirstStreamEventTimeoutMs(options: unknown): number | undefined;
24
+ declare function getFirstStreamEventTimeoutHandler(options: unknown): ((reason: Error) => void) | undefined;
25
+ declare function createFirstStreamEventTimeoutError(context: FirstStreamEventTimeoutContext): Error;
26
+ declare function createFirstStreamEventAbortController(parentSignal?: AbortSignal): FirstStreamEventAbortController;
27
+ declare function withFirstStreamEventTimeout<T>(stream: AsyncIterable<T>, context: FirstStreamEventTimeoutContext): AsyncIterable<T>;
28
+ //#endregion
29
+ export { createFirstStreamEventTimeoutError as a, withFirstStreamEventTimeout as c, createFirstStreamEventAbortController as i, FirstStreamEventInternalOptions as n, getFirstStreamEventTimeoutHandler as o, FirstStreamEventTimeoutContext as r, getFirstStreamEventTimeoutMs as s, FirstStreamEventAbortController as t };
@@ -0,0 +1,93 @@
1
+ //#region packages/ai/src/utils/tls-certificate-errors.ts
2
+ const HOSTNAME_MISMATCH_CODES = /* @__PURE__ */ new Set(["ERR_TLS_CERT_ALTNAME_INVALID", "HOSTNAME_MISMATCH"]);
3
+ const CERTIFICATE_INVALID_CODES = /* @__PURE__ */ new Set([
4
+ "CERT_CHAIN_TOO_LONG",
5
+ "CERT_HAS_EXPIRED",
6
+ "CERT_NOT_YET_VALID",
7
+ "CERT_REJECTED",
8
+ "CERT_REVOKED",
9
+ "CERT_SIGNATURE_FAILURE",
10
+ "CERT_UNTRUSTED",
11
+ "CRL_HAS_EXPIRED",
12
+ "CRL_NOT_YET_VALID",
13
+ "CRL_SIGNATURE_FAILURE",
14
+ "DEPTH_ZERO_SELF_SIGNED_CERT",
15
+ "ERROR_IN_CERT_NOT_AFTER_FIELD",
16
+ "ERROR_IN_CERT_NOT_BEFORE_FIELD",
17
+ "ERROR_IN_CRL_LAST_UPDATE_FIELD",
18
+ "ERROR_IN_CRL_NEXT_UPDATE_FIELD",
19
+ "INVALID_CA",
20
+ "INVALID_PURPOSE",
21
+ "PATH_LENGTH_EXCEEDED",
22
+ "SELF_SIGNED_CERT_IN_CHAIN",
23
+ "UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY",
24
+ "UNABLE_TO_DECRYPT_CERT_SIGNATURE",
25
+ "UNABLE_TO_DECRYPT_CRL_SIGNATURE",
26
+ "UNABLE_TO_GET_CRL",
27
+ "UNABLE_TO_GET_ISSUER_CERT",
28
+ "UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
29
+ "UNABLE_TO_VERIFY_LEAF_SIGNATURE"
30
+ ]);
31
+ const HOSTNAME_MISMATCH_PATTERNS = [
32
+ /hostname\/ip does not match certificate(?:'s)? altnames/i,
33
+ /hostname mismatch/i,
34
+ /host: .+ is not in the cert(?:ificate)?(?:'s)? altnames/i
35
+ ];
36
+ const CERTIFICATE_INVALID_PATTERNS = [
37
+ /certificate has expired/i,
38
+ /certificate is not yet valid/i,
39
+ /self[- ]signed certificate/i,
40
+ /unable to get local issuer certificate/i,
41
+ /unable to verify the first certificate/i
42
+ ];
43
+ const MAX_TLS_ERROR_DEPTH = 8;
44
+ function classifyCode(code) {
45
+ if (HOSTNAME_MISMATCH_CODES.has(code)) return "hostname_mismatch";
46
+ return CERTIFICATE_INVALID_CODES.has(code) ? "certificate_invalid" : null;
47
+ }
48
+ function classifyMessage(message) {
49
+ if (HOSTNAME_MISMATCH_PATTERNS.some((pattern) => pattern.test(message))) return "hostname_mismatch";
50
+ return CERTIFICATE_INVALID_PATTERNS.some((pattern) => pattern.test(message)) ? "certificate_invalid" : null;
51
+ }
52
+ function inspectTlsCertificateErrorInternal(error, seen, depth) {
53
+ if (depth > MAX_TLS_ERROR_DEPTH) return null;
54
+ if (typeof error === "string") {
55
+ const kind = classifyMessage(error);
56
+ return kind ? {
57
+ kind,
58
+ message: error
59
+ } : null;
60
+ }
61
+ if (!error || typeof error !== "object" || seen.has(error)) return null;
62
+ seen.add(error);
63
+ const candidate = error;
64
+ const code = typeof candidate.code === "string" ? candidate.code.trim().toUpperCase() : void 0;
65
+ const message = typeof candidate.message === "string" && candidate.message.trim() ? candidate.message : void 0;
66
+ const codeKind = code ? classifyCode(code) : null;
67
+ if (code && codeKind) return {
68
+ kind: codeKind,
69
+ code,
70
+ message: message ?? code
71
+ };
72
+ const nestedErrors = Array.isArray(candidate.errors) ? candidate.errors : [];
73
+ for (const nested of [
74
+ candidate.cause,
75
+ candidate.error,
76
+ ...nestedErrors
77
+ ]) {
78
+ if (nested === void 0 || nested === error) continue;
79
+ const details = inspectTlsCertificateErrorInternal(nested, seen, depth + 1);
80
+ if (details) return details;
81
+ }
82
+ const messageKind = message ? classifyMessage(message) : null;
83
+ return messageKind && message ? {
84
+ kind: messageKind,
85
+ message
86
+ } : null;
87
+ }
88
+ /** Classify deterministic Node/OpenSSL certificate validation failures. */
89
+ function inspectTlsCertificateError(error) {
90
+ return inspectTlsCertificateErrorInternal(error, /* @__PURE__ */ new Set(), 0);
91
+ }
92
+ //#endregion
93
+ export { inspectTlsCertificateError as t };
@@ -0,0 +1,225 @@
1
+ import { g as isRecord, n as getAiTransportHost, p as normalizeLowercaseStringOrEmpty } from "./host-Dog2WQiR.mjs";
2
+ import { t as sanitizeSurrogates } from "./sanitize-unicode-DT5o51ur.mjs";
3
+ //#region packages/ai/src/utils/prompt-cache-stability.ts
4
+ /**
5
+ * Prompt-cache normalization helpers. They keep generated prompt sections
6
+ * deterministic across platform newlines, trailing whitespace, and input
7
+ * ordering.
8
+ */
9
+ /** Canonicalizes provider tool order without relying on host locale settings. */
10
+ function sortPromptCacheToolsByName(tools) {
11
+ const compareText = (left, right) => {
12
+ const leftText = left ?? "";
13
+ const rightText = right ?? "";
14
+ return leftText < rightText ? -1 : leftText > rightText ? 1 : 0;
15
+ };
16
+ return tools.toSorted((left, right) => compareText(left.wireName ?? left.name, right.wireName ?? right.name) || compareText(left.description, right.description));
17
+ }
18
+ /** Normalize structured prompt text before hashing or snapshot comparison. */
19
+ function normalizeStructuredPromptSection(text) {
20
+ return sanitizeSurrogates(text).replace(/\r\n?/g, "\n").replace(/[ \t]+$/gm, "").trim();
21
+ }
22
+ /** Normalize, de-dupe, and sort capability ids for stable prompt payloads. */
23
+ function normalizePromptCapabilityIds(capabilities) {
24
+ const seen = /* @__PURE__ */ new Set();
25
+ const normalized = [];
26
+ for (const capability of capabilities) {
27
+ const value = normalizeLowercaseStringOrEmpty(normalizeStructuredPromptSection(capability));
28
+ if (!value || seen.has(value)) continue;
29
+ seen.add(value);
30
+ normalized.push(value);
31
+ }
32
+ return normalized.toSorted((left, right) => left.localeCompare(right));
33
+ }
34
+ //#endregion
35
+ //#region packages/ai/src/utils/system-prompt-cache-boundary.ts
36
+ /**
37
+ * System prompt cache-boundary helpers.
38
+ *
39
+ * Keeps stable prompt prefixes separate from dynamic runtime additions for provider prompt caching.
40
+ */
41
+ const SYSTEM_PROMPT_CACHE_BOUNDARY = "\n<!-- OPENCLAW_CACHE_BOUNDARY -->\n";
42
+ function stripSystemPromptCacheBoundary(text) {
43
+ return text.replaceAll(SYSTEM_PROMPT_CACHE_BOUNDARY, "\n");
44
+ }
45
+ function ensureSystemPromptCacheBoundary(systemPrompt) {
46
+ if (systemPrompt.trim().length === 0) return systemPrompt;
47
+ return systemPrompt.includes("\n<!-- OPENCLAW_CACHE_BOUNDARY -->\n") ? systemPrompt : `${systemPrompt}${SYSTEM_PROMPT_CACHE_BOUNDARY}`;
48
+ }
49
+ function splitSystemPromptCacheBoundary(text) {
50
+ const boundaryIndex = text.indexOf(SYSTEM_PROMPT_CACHE_BOUNDARY);
51
+ if (boundaryIndex === -1) return;
52
+ return {
53
+ stablePrefix: text.slice(0, boundaryIndex).trimEnd(),
54
+ dynamicSuffix: text.slice(boundaryIndex + 34).trimStart()
55
+ };
56
+ }
57
+ function prependSystemPromptAdditionAfterCacheBoundary(params) {
58
+ const systemPromptAddition = typeof params.systemPromptAddition === "string" ? normalizeStructuredPromptSection(params.systemPromptAddition) : "";
59
+ if (!systemPromptAddition) return params.systemPrompt;
60
+ if (params.systemPrompt.trim().length === 0) return systemPromptAddition;
61
+ const split = splitSystemPromptCacheBoundary(params.systemPrompt);
62
+ if (!split) return `${systemPromptAddition}\n\n${params.systemPrompt}`;
63
+ const dynamicSuffix = split.dynamicSuffix ? normalizeStructuredPromptSection(split.dynamicSuffix) : "";
64
+ if (!dynamicSuffix) return `${split.stablePrefix}${SYSTEM_PROMPT_CACHE_BOUNDARY}${systemPromptAddition}`;
65
+ return `${split.stablePrefix}${SYSTEM_PROMPT_CACHE_BOUNDARY}${systemPromptAddition}\n\n${dynamicSuffix}`;
66
+ }
67
+ //#endregion
68
+ //#region packages/normalization-core/src/utf16-slice.ts
69
+ function isHighSurrogate(codeUnit) {
70
+ return codeUnit >= 55296 && codeUnit <= 56319;
71
+ }
72
+ function isLowSurrogate(codeUnit) {
73
+ return codeUnit >= 56320 && codeUnit <= 57343;
74
+ }
75
+ /** Slices a UTF-16 string without returning dangling surrogate halves at either edge. */
76
+ function sliceUtf16Safe(input, start, end) {
77
+ const len = input.length;
78
+ let from = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
79
+ let to = end === void 0 ? len : end < 0 ? Math.max(len + end, 0) : Math.min(end, len);
80
+ if (to <= from) return "";
81
+ if (from > 0 && from < len) {
82
+ if (isLowSurrogate(input.charCodeAt(from)) && isHighSurrogate(input.charCodeAt(from - 1))) from += 1;
83
+ }
84
+ if (to > 0 && to < len) {
85
+ if (isHighSurrogate(input.charCodeAt(to - 1)) && isLowSurrogate(input.charCodeAt(to))) to -= 1;
86
+ }
87
+ return input.slice(from, to);
88
+ }
89
+ /** Truncates a UTF-16 string without cutting a surrogate pair in half. */
90
+ function truncateUtf16Safe(input, maxLen) {
91
+ const limit = Math.max(0, Math.floor(maxLen));
92
+ if (input.length <= limit) return input;
93
+ return sliceUtf16Safe(input, 0, limit);
94
+ }
95
+ //#endregion
96
+ //#region packages/ai/src/providers/tool-result-text.ts
97
+ const PROVIDER_TOOL_RESULT_MAX_CHARS = 8e3;
98
+ const IMAGE_TOOL_RESULT_TYPES = /* @__PURE__ */ new Set([
99
+ "image",
100
+ "image_url",
101
+ "input_image"
102
+ ]);
103
+ const AUDIO_TOOL_RESULT_TYPES = /* @__PURE__ */ new Set([
104
+ "audio",
105
+ "input_audio",
106
+ "output_audio"
107
+ ]);
108
+ const MEDIA_ONLY_TOOL_RESULT_TYPES = /* @__PURE__ */ new Set([...IMAGE_TOOL_RESULT_TYPES, ...AUDIO_TOOL_RESULT_TYPES]);
109
+ const INLINE_DATA_URI_PATTERN = /(^|[^A-Za-z0-9_])data:([a-z][a-z0-9.+-]*\/[a-z0-9.+-]+(?:;[a-z0-9.+-]+=[^,;"'\s]+|;base64)*,[^\s"'<>)]+)/gi;
110
+ const MIME_KEY_CANDIDATES = [
111
+ "mimeType",
112
+ "mime_type",
113
+ "mediaType",
114
+ "media_type",
115
+ "contentType",
116
+ "content_type"
117
+ ];
118
+ const TEXTUAL_MIME_PATTERN = /^(?:text\/|application\/(?:json|ld\+json|x-ndjson|xml|javascript|x-www-form-urlencoded)|[^/]+\/[^+]+\+(?:json|xml)$)/i;
119
+ const OPAQUE_OR_BINARY_FIELD_RE = /^(?:blob|buffer|bytes|encrypted_content|encrypted_stdout)$/i;
120
+ function readMimeType(value) {
121
+ if (!isRecord(value)) return;
122
+ for (const key of MIME_KEY_CANDIDATES) {
123
+ const mimeType = value[key];
124
+ if (typeof mimeType === "string" && mimeType.trim().length > 0) return mimeType;
125
+ }
126
+ }
127
+ function isBinaryMimeType(mimeType) {
128
+ const normalized = mimeType.split(";", 1)[0]?.trim().toLowerCase();
129
+ return normalized ? !TEXTUAL_MIME_PATTERN.test(normalized) : false;
130
+ }
131
+ function describeOmittedValue(value, label) {
132
+ const length = typeof value === "string" ? value.length : JSON.stringify(value)?.length;
133
+ return length ? `[${label} omitted: ${length} chars]` : `[${label} omitted]`;
134
+ }
135
+ function redactInlineDataUris(value) {
136
+ return value.replace(INLINE_DATA_URI_PATTERN, (_match, prefix, uri) => `${prefix}[inline data URI: ${uri.length} chars]`);
137
+ }
138
+ function redactStructuredTextValue(value) {
139
+ const host = getAiTransportHost();
140
+ const redacted = host.redactToolPayloadText(value);
141
+ const trimmed = redacted.trim();
142
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return redacted;
143
+ try {
144
+ const redactedWrapper = host.redactSecrets({ structuredTextValue: JSON.parse(redacted) });
145
+ return JSON.stringify(redactedWrapper.structuredTextValue);
146
+ } catch {
147
+ return redacted;
148
+ }
149
+ }
150
+ function stringifyStructuredBlock(block) {
151
+ const seen = /* @__PURE__ */ new WeakSet();
152
+ try {
153
+ const redactedBlock = getAiTransportHost().redactSecrets({ structuredToolResult: block }).structuredToolResult;
154
+ const serialized = JSON.stringify(redactedBlock, function structuredToolResultReplacer(key, value) {
155
+ if (OPAQUE_OR_BINARY_FIELD_RE.test(key)) return `[omitted ${key}]`;
156
+ if (key === "data") {
157
+ const mimeType = readMimeType(this);
158
+ if (mimeType && isBinaryMimeType(mimeType)) return describeOmittedValue(value, "binary data");
159
+ }
160
+ if (typeof value === "bigint") return value.toString();
161
+ if (typeof value === "string") return redactInlineDataUris(redactStructuredTextValue(value));
162
+ if (typeof value === "function" || typeof value === "symbol" || value === void 0) return;
163
+ if (!value || typeof value !== "object") return value;
164
+ if (seen.has(value)) return "[Circular]";
165
+ seen.add(value);
166
+ return value;
167
+ });
168
+ if (!serialized || serialized === "{}") return;
169
+ return serialized;
170
+ } catch {
171
+ return;
172
+ }
173
+ }
174
+ function truncateProviderToolText(text) {
175
+ if (text.length <= PROVIDER_TOOL_RESULT_MAX_CHARS) return text;
176
+ return `${truncateUtf16Safe(text, PROVIDER_TOOL_RESULT_MAX_CHARS)}\n…(truncated)…`;
177
+ }
178
+ /** Media metadata alone is not an attachment; provider emitters need inline bytes. */
179
+ function hasMediaPayload(block) {
180
+ return isRecord(block) && typeof block.data === "string" && block.data.trim().length > 0;
181
+ }
182
+ /** Image metadata alone is not an attachment; provider emitters need inline bytes. */
183
+ function isImageWithMediaPayload(block) {
184
+ return isRecord(block) && block.type === "image" && hasMediaPayload(block);
185
+ }
186
+ function describeToolResultMediaPlaceholder(blocks) {
187
+ let hasImage = false;
188
+ let hasAudio = false;
189
+ for (const block of blocks) {
190
+ if (!hasMediaPayload(block)) continue;
191
+ const record = block;
192
+ const type = typeof record.type === "string" ? record.type : void 0;
193
+ const mimeType = readMimeType(record);
194
+ if (type && IMAGE_TOOL_RESULT_TYPES.has(type) || mimeType?.toLowerCase().startsWith("image/")) hasImage = true;
195
+ if (type && AUDIO_TOOL_RESULT_TYPES.has(type) || mimeType?.toLowerCase().startsWith("audio/")) hasAudio = true;
196
+ }
197
+ if (hasImage && hasAudio) return "(see attached media)";
198
+ if (hasAudio) return "(see attached audio)";
199
+ if (hasImage) return "(see attached image)";
200
+ }
201
+ function extractToolResultBlockText(block) {
202
+ if (!block || typeof block !== "object") return;
203
+ const record = block;
204
+ if (typeof record.type === "string" && MEDIA_ONLY_TOOL_RESULT_TYPES.has(record.type)) return;
205
+ if (record.type === "text") {
206
+ const text = typeof record.text === "string" ? record.text : "";
207
+ return text ? sanitizeSurrogates(text) : void 0;
208
+ }
209
+ const structured = stringifyStructuredBlock(record);
210
+ return structured ? sanitizeSurrogates(truncateProviderToolText(structured)) : void 0;
211
+ }
212
+ function extractToolResultText(blocks) {
213
+ const explicitTexts = [];
214
+ const structuredTexts = [];
215
+ for (const block of blocks) {
216
+ const text = extractToolResultBlockText(block);
217
+ if (!text) continue;
218
+ if (block.type === "text") explicitTexts.push(text);
219
+ else structuredTexts.push(text);
220
+ }
221
+ if (explicitTexts.length > 0) return sanitizeSurrogates(explicitTexts.join("\n"));
222
+ return sanitizeSurrogates(truncateProviderToolText(structuredTexts.join("\n")));
223
+ }
224
+ //#endregion
225
+ export { isImageWithMediaPayload as a, ensureSystemPromptCacheBoundary as c, stripSystemPromptCacheBoundary as d, normalizePromptCapabilityIds as f, hasMediaPayload as i, prependSystemPromptAdditionAfterCacheBoundary as l, sortPromptCacheToolsByName as m, extractToolResultBlockText as n, truncateUtf16Safe as o, normalizeStructuredPromptSection as p, extractToolResultText as r, SYSTEM_PROMPT_CACHE_BOUNDARY as s, describeToolResultMediaPlaceholder as t, splitSystemPromptCacheBoundary as u };
@@ -0,0 +1,2 @@
1
+ import "./host-Dog2WQiR.mjs";
2
+ export {};