@vtxmacro/cli 2026.9.64 → 2026.9.66

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/bin/vtx.js CHANGED
@@ -77,7 +77,7 @@ var init_agent_cli_release = __esm({
77
77
  "agent-cli-release.json"() {
78
78
  agent_cli_release_default = {
79
79
  package_name: "@vtxmacro/cli",
80
- package_version: "2026.9.64",
80
+ package_version: "2026.9.66",
81
81
  codex_package_name: "@openai/codex",
82
82
  codex_version: "0.155.0",
83
83
  copilot_sdk_package_name: "@github/copilot-sdk",
@@ -20515,6 +20515,10 @@ var init_runtime_policy_generated = __esm({
20515
20515
  base_delay_milliseconds: 500,
20516
20516
  min_delay_milliseconds: 250,
20517
20517
  max_delay_milliseconds: 1e4
20518
+ },
20519
+ deployment_reload_observability: {
20520
+ bootstrap_max_error_events_per_page: 4,
20521
+ bootstrap_max_profiles: 10
20518
20522
  }
20519
20523
  },
20520
20524
  ai_dashboard: {
@@ -42604,6 +42608,10 @@ var init_runtime_policy_generated2 = __esm({
42604
42608
  base_delay_milliseconds: 500,
42605
42609
  min_delay_milliseconds: 250,
42606
42610
  max_delay_milliseconds: 1e4
42611
+ },
42612
+ deployment_reload_observability: {
42613
+ bootstrap_max_error_events_per_page: 4,
42614
+ bootstrap_max_profiles: 10
42607
42615
  }
42608
42616
  },
42609
42617
  ai_dashboard: {
@@ -48869,6 +48877,520 @@ var init_runtime_redaction = __esm({
48869
48877
  }
48870
48878
  });
48871
48879
 
48880
+ // lib/runtime/channel-sender.ts
48881
+ var RUNTIME_TAB_ID_STORAGE_KEY, createRuntimeUuid, getOrCreateRuntimeTabSenderId;
48882
+ var init_channel_sender = __esm({
48883
+ "lib/runtime/channel-sender.ts"() {
48884
+ "use strict";
48885
+ init_define_VTX_EXO_POLICY();
48886
+ init_define_VTX_GROK_POLICY();
48887
+ init_define_VTX_PI_MODEL_POLICY();
48888
+ RUNTIME_TAB_ID_STORAGE_KEY = "vtx_client_runtime_tab_id";
48889
+ createRuntimeUuid = () => {
48890
+ if (typeof globalThis.crypto !== "undefined" && typeof globalThis.crypto.randomUUID === "function") {
48891
+ return globalThis.crypto.randomUUID();
48892
+ }
48893
+ return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
48894
+ };
48895
+ getOrCreateRuntimeTabSenderId = () => {
48896
+ if (typeof window === "undefined") {
48897
+ return null;
48898
+ }
48899
+ try {
48900
+ const stored = window.sessionStorage.getItem(RUNTIME_TAB_ID_STORAGE_KEY);
48901
+ if (stored && stored.trim()) {
48902
+ return stored;
48903
+ }
48904
+ const created = createRuntimeUuid();
48905
+ window.sessionStorage.setItem(RUNTIME_TAB_ID_STORAGE_KEY, created);
48906
+ return created;
48907
+ } catch {
48908
+ return null;
48909
+ }
48910
+ };
48911
+ }
48912
+ });
48913
+
48914
+ // lib/runtime/network-debug.ts
48915
+ var MAX_RUNTIME_NETWORK_DEBUG_ENTRIES, MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES, MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES, RUNTIME_NETWORK_DEBUG_STORAGE_KEY, RUNTIME_PROVIDER_FAILURE_DEBUG_STORAGE_KEY, RUNTIME_MARKET_DATA_FAILURE_DEBUG_STORAGE_KEY, runtimeNetworkDebugEntries, runtimeProviderFailureDebugEntries, runtimeMarketDataFailureDebugEntries, runtimeNetworkDebugListeners, isRuntimeMarketDataFailureDebugEntry, persistRuntimeNetworkDebugEntries, persistRuntimeProviderFailureDebugEntries, persistRuntimeMarketDataFailureDebugEntries, emitRuntimeNetworkDebugEntries, emitRuntimeProviderFailureDebugEntries, emitRuntimeMarketDataFailureDebugEntries, buildRuntimeNetworkDebugId, normalizeRuntimeNetworkUrl, readRuntimeNetworkBrowserContext, classifyRuntimeNetworkFailure, isLocalProviderFailureProbeCandidate, buildLocalProviderProbeUrls, patchRuntimeProviderFailureDebugEntry, runLocalProviderFailureHealthProbe, compactRuntimePromptString, shouldCompactRuntimeRequestString, sanitizeRuntimeNetworkDebugPayload, getRuntimeNetworkDebugEntries, startRuntimeNetworkDebugTrace, appendRuntimeDebugEvent;
48916
+ var init_network_debug = __esm({
48917
+ "lib/runtime/network-debug.ts"() {
48918
+ "use strict";
48919
+ init_define_VTX_EXO_POLICY();
48920
+ init_define_VTX_GROK_POLICY();
48921
+ init_define_VTX_PI_MODEL_POLICY();
48922
+ init_runtime_redaction();
48923
+ init_channel_sender();
48924
+ MAX_RUNTIME_NETWORK_DEBUG_ENTRIES = 80;
48925
+ MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES = 20;
48926
+ MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES = 20;
48927
+ RUNTIME_NETWORK_DEBUG_STORAGE_KEY = "vtx_client_runtime_network_debug_entries_v1";
48928
+ RUNTIME_PROVIDER_FAILURE_DEBUG_STORAGE_KEY = "vtx_client_runtime_provider_failure_debug_entries_v1";
48929
+ RUNTIME_MARKET_DATA_FAILURE_DEBUG_STORAGE_KEY = "vtx_client_runtime_market_data_failure_debug_entries_v1";
48930
+ runtimeNetworkDebugEntries = [];
48931
+ runtimeProviderFailureDebugEntries = [];
48932
+ runtimeMarketDataFailureDebugEntries = [];
48933
+ runtimeNetworkDebugListeners = /* @__PURE__ */ new Set();
48934
+ isRuntimeMarketDataFailureDebugEntry = (entry) => entry.kind === "runtime" && entry.label.startsWith("market_data_api:") && entry.outcome === "error";
48935
+ persistRuntimeNetworkDebugEntries = () => {
48936
+ if (typeof window === "undefined") {
48937
+ return;
48938
+ }
48939
+ try {
48940
+ window.localStorage.setItem(
48941
+ RUNTIME_NETWORK_DEBUG_STORAGE_KEY,
48942
+ JSON.stringify(runtimeNetworkDebugEntries.slice(0, MAX_RUNTIME_NETWORK_DEBUG_ENTRIES))
48943
+ );
48944
+ } catch {
48945
+ }
48946
+ };
48947
+ persistRuntimeProviderFailureDebugEntries = () => {
48948
+ if (typeof window === "undefined") {
48949
+ return;
48950
+ }
48951
+ try {
48952
+ window.localStorage.setItem(
48953
+ RUNTIME_PROVIDER_FAILURE_DEBUG_STORAGE_KEY,
48954
+ JSON.stringify(runtimeProviderFailureDebugEntries.slice(0, MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES))
48955
+ );
48956
+ } catch {
48957
+ }
48958
+ };
48959
+ persistRuntimeMarketDataFailureDebugEntries = () => {
48960
+ if (typeof window === "undefined") {
48961
+ return;
48962
+ }
48963
+ try {
48964
+ window.localStorage.setItem(
48965
+ RUNTIME_MARKET_DATA_FAILURE_DEBUG_STORAGE_KEY,
48966
+ JSON.stringify(runtimeMarketDataFailureDebugEntries.slice(0, MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES))
48967
+ );
48968
+ } catch {
48969
+ }
48970
+ };
48971
+ emitRuntimeNetworkDebugEntries = (options = {}) => {
48972
+ if (options.persist !== false) {
48973
+ persistRuntimeNetworkDebugEntries();
48974
+ }
48975
+ const snapshot = getRuntimeNetworkDebugEntries();
48976
+ runtimeNetworkDebugListeners.forEach((listener) => listener(snapshot));
48977
+ };
48978
+ emitRuntimeProviderFailureDebugEntries = (options = {}) => {
48979
+ if (options.persist !== false) {
48980
+ persistRuntimeProviderFailureDebugEntries();
48981
+ }
48982
+ const snapshot = getRuntimeNetworkDebugEntries();
48983
+ runtimeNetworkDebugListeners.forEach((listener) => listener(snapshot));
48984
+ };
48985
+ emitRuntimeMarketDataFailureDebugEntries = (options = {}) => {
48986
+ if (options.persist !== false) {
48987
+ persistRuntimeMarketDataFailureDebugEntries();
48988
+ }
48989
+ const snapshot = getRuntimeNetworkDebugEntries();
48990
+ runtimeNetworkDebugListeners.forEach((listener) => listener(snapshot));
48991
+ };
48992
+ buildRuntimeNetworkDebugId = () => {
48993
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
48994
+ return crypto.randomUUID();
48995
+ }
48996
+ return `runtime-net-${Date.now()}-${Math.random().toString(16).slice(2)}`;
48997
+ };
48998
+ normalizeRuntimeNetworkUrl = (value) => {
48999
+ try {
49000
+ const parsed = new URL(value);
49001
+ return {
49002
+ targetProtocol: parsed.protocol ? parsed.protocol.replace(/:$/, "").toLowerCase() : null,
49003
+ targetHost: parsed.host || "unknown-host",
49004
+ targetPath: sanitizeRuntimeNetworkPath(parsed.pathname || "/")
49005
+ };
49006
+ } catch {
49007
+ return {
49008
+ targetProtocol: null,
49009
+ targetHost: "invalid-url",
49010
+ targetPath: sanitizeRuntimeNetworkPath(value)
49011
+ };
49012
+ }
49013
+ };
49014
+ readRuntimeNetworkBrowserContext = () => {
49015
+ if (typeof window === "undefined") {
49016
+ return {
49017
+ tabId: null,
49018
+ online: null,
49019
+ visibilityState: null,
49020
+ hidden: null,
49021
+ focused: null,
49022
+ pageHost: null,
49023
+ connectionEffectiveType: null,
49024
+ connectionDownlink: null,
49025
+ connectionRtt: null
49026
+ };
49027
+ }
49028
+ const nav = typeof navigator !== "undefined" ? navigator : null;
49029
+ const connection = nav && typeof nav === "object" ? nav.connection : null;
49030
+ let tabId = null;
49031
+ try {
49032
+ tabId = getOrCreateRuntimeTabSenderId() || null;
49033
+ } catch {
49034
+ tabId = null;
49035
+ }
49036
+ return {
49037
+ tabId,
49038
+ online: nav && typeof nav.onLine === "boolean" ? nav.onLine : null,
49039
+ visibilityState: typeof document !== "undefined" && typeof document.visibilityState === "string" ? document.visibilityState : null,
49040
+ hidden: typeof document !== "undefined" && typeof document.hidden === "boolean" ? document.hidden : null,
49041
+ focused: typeof document !== "undefined" && typeof document.hasFocus === "function" ? document.hasFocus() : null,
49042
+ pageHost: window.location?.host || null,
49043
+ connectionEffectiveType: typeof connection?.effectiveType === "string" ? connection.effectiveType : null,
49044
+ connectionDownlink: Number.isFinite(Number(connection?.downlink)) ? Number(connection?.downlink) : null,
49045
+ connectionRtt: Number.isFinite(Number(connection?.rtt)) ? Number(connection?.rtt) : null
49046
+ };
49047
+ };
49048
+ classifyRuntimeNetworkFailure = (error48, status) => {
49049
+ if (status != null) {
49050
+ return `http_${status}`;
49051
+ }
49052
+ if (!error48) {
49053
+ return null;
49054
+ }
49055
+ const normalized = error48.toLowerCase();
49056
+ if (normalized.includes("abort")) {
49057
+ return "abort";
49058
+ }
49059
+ if (normalized.includes("cors")) {
49060
+ return "cors";
49061
+ }
49062
+ if (normalized.includes("failed to fetch") || normalized.includes("networkerror")) {
49063
+ return "fetch_failed";
49064
+ }
49065
+ if (normalized.includes("load failed") || normalized.includes("network request failed")) {
49066
+ return "network_failed";
49067
+ }
49068
+ return "error";
49069
+ };
49070
+ isLocalProviderFailureProbeCandidate = (entry) => {
49071
+ if (entry.kind !== "provider" || entry.label !== "local" || entry.status != null) {
49072
+ return false;
49073
+ }
49074
+ const host = entry.targetHost.toLowerCase();
49075
+ if (host.startsWith("127.0.0.1:") || host === "127.0.0.1" || host.startsWith("localhost:") || host === "localhost" || host.startsWith("[::1]:") || host === "[::1]") {
49076
+ return true;
49077
+ }
49078
+ return false;
49079
+ };
49080
+ buildLocalProviderProbeUrls = (entry) => {
49081
+ const protocol = entry.targetProtocol === "https" ? "https" : "http";
49082
+ const origin = `${protocol}://${entry.targetHost}`;
49083
+ return [
49084
+ { path: "/api/v0/models", url: `${origin}/api/v0/models` },
49085
+ { path: "/v1/models", url: `${origin}/v1/models` }
49086
+ ];
49087
+ };
49088
+ patchRuntimeProviderFailureDebugEntry = (id2, patcher) => {
49089
+ runtimeProviderFailureDebugEntries = runtimeProviderFailureDebugEntries.map((entry) => entry.id === id2 ? patcher(entry) : entry);
49090
+ emitRuntimeProviderFailureDebugEntries();
49091
+ };
49092
+ runLocalProviderFailureHealthProbe = (entry) => {
49093
+ if (typeof fetch !== "function" || !isLocalProviderFailureProbeCandidate(entry)) {
49094
+ return;
49095
+ }
49096
+ const probeStartedAt = Date.now();
49097
+ const probe = {
49098
+ reason: "local_provider_network_failure",
49099
+ startedAt: probeStartedAt,
49100
+ completedAt: null,
49101
+ attempts: []
49102
+ };
49103
+ patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
49104
+ ...current,
49105
+ healthProbe: probe
49106
+ }));
49107
+ void (async () => {
49108
+ const attempts = [];
49109
+ for (const candidate of buildLocalProviderProbeUrls(entry)) {
49110
+ const startedAt = Date.now();
49111
+ const attempt = {
49112
+ path: candidate.path,
49113
+ startedAt,
49114
+ completedAt: null,
49115
+ outcome: "pending",
49116
+ status: null,
49117
+ error: null,
49118
+ elapsedMs: null
49119
+ };
49120
+ attempts.push(attempt);
49121
+ patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
49122
+ ...current,
49123
+ healthProbe: {
49124
+ ...current.healthProbe ?? probe,
49125
+ attempts: attempts.slice()
49126
+ }
49127
+ }));
49128
+ const controller = typeof AbortController !== "undefined" ? new AbortController() : null;
49129
+ const timeoutId = controller ? setTimeout(() => controller.abort(), 2e3) : null;
49130
+ try {
49131
+ const response = await fetch(candidate.url, {
49132
+ method: "GET",
49133
+ signal: controller?.signal
49134
+ });
49135
+ const completedAt2 = Date.now();
49136
+ attempt.completedAt = completedAt2;
49137
+ attempt.outcome = response.ok ? "ok" : "error";
49138
+ attempt.status = response.status;
49139
+ attempt.error = response.ok ? null : `HTTP ${response.status}`;
49140
+ attempt.elapsedMs = Math.max(0, completedAt2 - startedAt);
49141
+ } catch (error48) {
49142
+ const completedAt2 = Date.now();
49143
+ attempt.completedAt = completedAt2;
49144
+ attempt.outcome = "error";
49145
+ attempt.error = getSanitizedRuntimeErrorMessage(error48) || "health probe failed";
49146
+ attempt.elapsedMs = Math.max(0, completedAt2 - startedAt);
49147
+ } finally {
49148
+ if (timeoutId) {
49149
+ clearTimeout(timeoutId);
49150
+ }
49151
+ }
49152
+ patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
49153
+ ...current,
49154
+ healthProbe: {
49155
+ ...current.healthProbe ?? probe,
49156
+ attempts: attempts.slice()
49157
+ }
49158
+ }));
49159
+ if (attempt.outcome === "ok") {
49160
+ break;
49161
+ }
49162
+ }
49163
+ const completedAt = Date.now();
49164
+ patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
49165
+ ...current,
49166
+ healthProbe: {
49167
+ ...current.healthProbe ?? probe,
49168
+ completedAt,
49169
+ attempts: attempts.slice()
49170
+ }
49171
+ }));
49172
+ })();
49173
+ };
49174
+ compactRuntimePromptString = (value) => {
49175
+ const normalized = sanitizeRuntimeDiagnosticValue(value);
49176
+ const preview = normalized.replace(/\s+/g, " ").trim().slice(0, 220);
49177
+ return `[OMITTED_PROMPT_TEXT chars=${normalized.length}${preview ? ` preview=${JSON.stringify(preview)}` : ""}]`;
49178
+ };
49179
+ shouldCompactRuntimeRequestString = (key, value) => {
49180
+ if (value.length <= 500) {
49181
+ return false;
49182
+ }
49183
+ const normalizedKey = key.trim().toLowerCase();
49184
+ return normalizedKey === "system" || normalizedKey === "instructions" || normalizedKey === "content" || normalizedKey === "text" || normalizedKey === "input" || normalizedKey === "prompt" || normalizedKey.endsWith("_prompt");
49185
+ };
49186
+ sanitizeRuntimeNetworkDebugPayload = (value, options = {}) => {
49187
+ if (value == null) {
49188
+ return value;
49189
+ }
49190
+ if (typeof value === "string") {
49191
+ if (options.compactPromptText && shouldCompactRuntimeRequestString(options.key || "", value)) {
49192
+ return compactRuntimePromptString(value);
49193
+ }
49194
+ return sanitizeRuntimeDiagnosticValue(value);
49195
+ }
49196
+ if (typeof value === "number" || typeof value === "boolean") {
49197
+ return value;
49198
+ }
49199
+ if (Array.isArray(value)) {
49200
+ return value.map((item) => sanitizeRuntimeNetworkDebugPayload(item, options));
49201
+ }
49202
+ if (typeof value === "object") {
49203
+ const out = {};
49204
+ for (const [key, item] of Object.entries(value)) {
49205
+ const normalizedKey = key.trim().toLowerCase();
49206
+ if (normalizedKey === "authorization" || normalizedKey === "x-api-key" || normalizedKey === "api-key" || normalizedKey === "apikey" || normalizedKey === "signature" || normalizedKey.includes("secret") || normalizedKey.includes("private_key") || normalizedKey.includes("signing_key")) {
49207
+ out[key] = "[REDACTED]";
49208
+ continue;
49209
+ }
49210
+ out[key] = sanitizeRuntimeNetworkDebugPayload(item, {
49211
+ ...options,
49212
+ key
49213
+ });
49214
+ }
49215
+ return out;
49216
+ }
49217
+ return sanitizeRuntimeDiagnosticValue(String(value));
49218
+ };
49219
+ getRuntimeNetworkDebugEntries = () => runtimeNetworkDebugEntries.slice();
49220
+ startRuntimeNetworkDebugTrace = (input) => {
49221
+ const { targetProtocol, targetHost, targetPath } = normalizeRuntimeNetworkUrl(input.url);
49222
+ const entry = {
49223
+ id: buildRuntimeNetworkDebugId(),
49224
+ kind: input.kind,
49225
+ label: input.label,
49226
+ transport: "browser",
49227
+ providerTransport: input.kind === "provider" ? input.providerTransport ?? "direct" : null,
49228
+ actualRelayPath: input.kind === "provider" && input.providerTransport === "server_relay" ? "/llm/native-provider-relay" : null,
49229
+ method: (input.method || "POST").toUpperCase(),
49230
+ targetProtocol,
49231
+ targetHost,
49232
+ targetPath,
49233
+ startedAt: Date.now(),
49234
+ completedAt: null,
49235
+ status: null,
49236
+ outcome: "pending",
49237
+ error: null,
49238
+ note: typeof input.note === "string" ? input.note : null,
49239
+ request: null,
49240
+ response: null,
49241
+ browser: {
49242
+ started: readRuntimeNetworkBrowserContext(),
49243
+ completed: null,
49244
+ elapsedMs: null,
49245
+ failureKind: null
49246
+ }
49247
+ };
49248
+ runtimeNetworkDebugEntries = [entry, ...runtimeNetworkDebugEntries].slice(0, MAX_RUNTIME_NETWORK_DEBUG_ENTRIES);
49249
+ emitRuntimeNetworkDebugEntries();
49250
+ let completed = false;
49251
+ const finalize2 = (outcome, status, error48) => {
49252
+ if (completed) {
49253
+ return;
49254
+ }
49255
+ completed = true;
49256
+ const completedAt = Date.now();
49257
+ const completedBrowserContext = readRuntimeNetworkBrowserContext();
49258
+ runtimeNetworkDebugEntries = runtimeNetworkDebugEntries.map((candidate) => candidate.id === entry.id ? {
49259
+ ...candidate,
49260
+ completedAt,
49261
+ status,
49262
+ outcome,
49263
+ error: error48,
49264
+ browser: candidate.browser ? {
49265
+ ...candidate.browser,
49266
+ completed: completedBrowserContext,
49267
+ elapsedMs: Math.max(0, completedAt - candidate.startedAt),
49268
+ failureKind: outcome === "error" ? classifyRuntimeNetworkFailure(error48, status) : null
49269
+ } : null
49270
+ } : candidate);
49271
+ emitRuntimeNetworkDebugEntries();
49272
+ const failedProviderEntry = runtimeNetworkDebugEntries.find((candidate) => candidate.id === entry.id && candidate.kind === "provider" && candidate.outcome === "error");
49273
+ if (failedProviderEntry) {
49274
+ const providerFailureEntry = {
49275
+ ...failedProviderEntry,
49276
+ healthProbe: null
49277
+ };
49278
+ runtimeProviderFailureDebugEntries = [
49279
+ providerFailureEntry,
49280
+ ...runtimeProviderFailureDebugEntries.filter((candidate) => candidate.id !== providerFailureEntry.id)
49281
+ ].slice(0, MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES);
49282
+ emitRuntimeProviderFailureDebugEntries();
49283
+ runLocalProviderFailureHealthProbe(providerFailureEntry);
49284
+ }
49285
+ const failedMarketDataEntry = runtimeNetworkDebugEntries.find((candidate) => candidate.id === entry.id && isRuntimeMarketDataFailureDebugEntry(candidate));
49286
+ if (failedMarketDataEntry) {
49287
+ runtimeMarketDataFailureDebugEntries = [
49288
+ failedMarketDataEntry,
49289
+ ...runtimeMarketDataFailureDebugEntries.filter((candidate) => candidate.id !== failedMarketDataEntry.id)
49290
+ ].slice(0, MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES);
49291
+ emitRuntimeMarketDataFailureDebugEntries();
49292
+ }
49293
+ };
49294
+ const attachPayload = (field, payload) => {
49295
+ runtimeNetworkDebugEntries = runtimeNetworkDebugEntries.map((candidate) => candidate.id === entry.id ? {
49296
+ ...candidate,
49297
+ [field]: sanitizeRuntimeNetworkDebugPayload(payload, {
49298
+ compactPromptText: field === "request"
49299
+ })
49300
+ } : candidate);
49301
+ emitRuntimeNetworkDebugEntries();
49302
+ };
49303
+ return {
49304
+ id: entry.id,
49305
+ attachRequest: (payload) => attachPayload("request", payload),
49306
+ attachResponse: (payload) => attachPayload("response", payload),
49307
+ completeSuccess: (status) => finalize2("ok", typeof status === "number" ? status : null, null),
49308
+ completeError: (error48, status) => {
49309
+ const message = getSanitizedRuntimeErrorMessage(error48);
49310
+ finalize2("error", typeof status === "number" ? status : null, message);
49311
+ }
49312
+ };
49313
+ };
49314
+ appendRuntimeDebugEvent = (input) => {
49315
+ const outcome = input.outcome === "error" ? "error" : "ok";
49316
+ const entry = {
49317
+ id: buildRuntimeNetworkDebugId(),
49318
+ kind: "runtime",
49319
+ label: String(input.label || "runtime_event").trim() || "runtime_event",
49320
+ transport: "browser",
49321
+ method: "TRACE",
49322
+ targetProtocol: null,
49323
+ targetHost: "client-runtime",
49324
+ targetPath: "/runtime",
49325
+ startedAt: Date.now(),
49326
+ completedAt: Date.now(),
49327
+ status: null,
49328
+ outcome,
49329
+ error: null,
49330
+ note: typeof input.note === "string" && input.note.trim().length > 0 ? input.note.trim() : null,
49331
+ request: null,
49332
+ response: null,
49333
+ browser: {
49334
+ started: readRuntimeNetworkBrowserContext(),
49335
+ completed: readRuntimeNetworkBrowserContext(),
49336
+ elapsedMs: 0,
49337
+ failureKind: null
49338
+ }
49339
+ };
49340
+ runtimeNetworkDebugEntries = [entry, ...runtimeNetworkDebugEntries].slice(0, MAX_RUNTIME_NETWORK_DEBUG_ENTRIES);
49341
+ emitRuntimeNetworkDebugEntries({ persist: outcome === "error" });
49342
+ };
49343
+ }
49344
+ });
49345
+
49346
+ // lib/runtime/sl-tp-execution-settings.ts
49347
+ var resolveBooleanSetting, resolvePositiveNumberSetting, resolveRiskModeSetting, resolveStopLossTypeSetting, buildRuntimeSlTpExecutionSettings;
49348
+ var init_sl_tp_execution_settings = __esm({
49349
+ "lib/runtime/sl-tp-execution-settings.ts"() {
49350
+ "use strict";
49351
+ init_define_VTX_EXO_POLICY();
49352
+ init_define_VTX_GROK_POLICY();
49353
+ init_define_VTX_PI_MODEL_POLICY();
49354
+ resolveBooleanSetting = (settings, key, fallback) => {
49355
+ if (Object.prototype.hasOwnProperty.call(settings, key)) {
49356
+ return settings[key] === true;
49357
+ }
49358
+ return fallback === true;
49359
+ };
49360
+ resolvePositiveNumberSetting = (settings, key, fallback) => {
49361
+ const raw = Object.prototype.hasOwnProperty.call(settings, key) ? settings[key] : fallback;
49362
+ const parsed = Number(raw);
49363
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
49364
+ };
49365
+ resolveRiskModeSetting = (settings, key, fallback) => {
49366
+ const normalized = String(Object.prototype.hasOwnProperty.call(settings, key) ? settings[key] : fallback).trim().toLowerCase();
49367
+ return normalized === "usdc" ? "usdc" : "percent";
49368
+ };
49369
+ resolveStopLossTypeSetting = (settings, fallback) => {
49370
+ const normalized = String(
49371
+ Object.prototype.hasOwnProperty.call(settings, "stop_loss_type") ? settings.stop_loss_type : fallback
49372
+ ).trim().toLowerCase();
49373
+ return normalized === "trailing" ? "trailing" : "fixed";
49374
+ };
49375
+ buildRuntimeSlTpExecutionSettings = (settings, config2) => ({
49376
+ tpSlEnabled: resolveBooleanSetting(
49377
+ settings,
49378
+ "tp_sl_enabled",
49379
+ config2.default_ai_tp_sl_enabled ?? config2.default_tp_sl_enabled
49380
+ ),
49381
+ stopLossEnabled: resolveBooleanSetting(settings, "sl_enabled", config2.default_sl_enabled),
49382
+ stopLossType: resolveStopLossTypeSetting(settings, config2.default_stop_loss_type),
49383
+ stopLossMode: resolveRiskModeSetting(settings, "stop_loss_mode", config2.default_stop_loss_mode),
49384
+ stopLossPct: resolvePositiveNumberSetting(settings, "stop_loss_pct", config2.default_stop_loss_pct),
49385
+ stopLossUsdc: resolvePositiveNumberSetting(settings, "stop_loss_usdc", config2.default_stop_loss_usdc),
49386
+ takeProfitEnabled: resolveBooleanSetting(settings, "tp_enabled", config2.default_tp_enabled),
49387
+ takeProfitMode: resolveRiskModeSetting(settings, "take_profit_mode", config2.default_take_profit_mode),
49388
+ takeProfitPct: resolvePositiveNumberSetting(settings, "take_profit_pct", config2.default_take_profit_pct),
49389
+ takeProfitUsdc: resolvePositiveNumberSetting(settings, "take_profit_usdc", config2.default_take_profit_usdc)
49390
+ });
49391
+ }
49392
+ });
49393
+
48872
49394
  // lib/runtime/hyperliquid-public-read.ts
48873
49395
  var policy, weights, recoveryPolicy, budgets, unpersistedBudgets, cache, pending2, PREFIX, priorityRank, createHyperliquidPublicPriorityScope, promoteHyperliquidPublicPriority, abortError2, checkAbort, wait, storage, loadBudget, saveBudget, withBudgetLock, HyperliquidPublicReadError, getHyperliquidPublicReadBudget, cooldownError, recoveryWaitError, fallbackDelayMs, admit, cooldown, finishHyperliquidRecoveryRequest, assertHyperliquidRecoveryDispatch, cacheTtlMs, eligibleCache, reserveHyperliquidPublicReads, releaseHyperliquidPublicReadReservation, admitHyperliquidExchangeRequest, recordHyperliquidExchangeResponse, readHyperliquidPublicInfo;
48874
49396
  var init_hyperliquid_public_read = __esm({
@@ -49930,472 +50452,6 @@ var init_hyperliquid_fee_contract = __esm({
49930
50452
  }
49931
50453
  });
49932
50454
 
49933
- // lib/runtime/channel-sender.ts
49934
- var RUNTIME_TAB_ID_STORAGE_KEY, createRuntimeUuid, getOrCreateRuntimeTabSenderId;
49935
- var init_channel_sender = __esm({
49936
- "lib/runtime/channel-sender.ts"() {
49937
- "use strict";
49938
- init_define_VTX_EXO_POLICY();
49939
- init_define_VTX_GROK_POLICY();
49940
- init_define_VTX_PI_MODEL_POLICY();
49941
- RUNTIME_TAB_ID_STORAGE_KEY = "vtx_client_runtime_tab_id";
49942
- createRuntimeUuid = () => {
49943
- if (typeof globalThis.crypto !== "undefined" && typeof globalThis.crypto.randomUUID === "function") {
49944
- return globalThis.crypto.randomUUID();
49945
- }
49946
- return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
49947
- };
49948
- getOrCreateRuntimeTabSenderId = () => {
49949
- if (typeof window === "undefined") {
49950
- return null;
49951
- }
49952
- try {
49953
- const stored = window.sessionStorage.getItem(RUNTIME_TAB_ID_STORAGE_KEY);
49954
- if (stored && stored.trim()) {
49955
- return stored;
49956
- }
49957
- const created = createRuntimeUuid();
49958
- window.sessionStorage.setItem(RUNTIME_TAB_ID_STORAGE_KEY, created);
49959
- return created;
49960
- } catch {
49961
- return null;
49962
- }
49963
- };
49964
- }
49965
- });
49966
-
49967
- // lib/runtime/network-debug.ts
49968
- var MAX_RUNTIME_NETWORK_DEBUG_ENTRIES, MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES, MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES, RUNTIME_NETWORK_DEBUG_STORAGE_KEY, RUNTIME_PROVIDER_FAILURE_DEBUG_STORAGE_KEY, RUNTIME_MARKET_DATA_FAILURE_DEBUG_STORAGE_KEY, runtimeNetworkDebugEntries, runtimeProviderFailureDebugEntries, runtimeMarketDataFailureDebugEntries, runtimeNetworkDebugListeners, isRuntimeMarketDataFailureDebugEntry, persistRuntimeNetworkDebugEntries, persistRuntimeProviderFailureDebugEntries, persistRuntimeMarketDataFailureDebugEntries, emitRuntimeNetworkDebugEntries, emitRuntimeProviderFailureDebugEntries, emitRuntimeMarketDataFailureDebugEntries, buildRuntimeNetworkDebugId, normalizeRuntimeNetworkUrl, readRuntimeNetworkBrowserContext, classifyRuntimeNetworkFailure, isLocalProviderFailureProbeCandidate, buildLocalProviderProbeUrls, patchRuntimeProviderFailureDebugEntry, runLocalProviderFailureHealthProbe, compactRuntimePromptString, shouldCompactRuntimeRequestString, sanitizeRuntimeNetworkDebugPayload, getRuntimeNetworkDebugEntries, startRuntimeNetworkDebugTrace, appendRuntimeDebugEvent;
49969
- var init_network_debug = __esm({
49970
- "lib/runtime/network-debug.ts"() {
49971
- "use strict";
49972
- init_define_VTX_EXO_POLICY();
49973
- init_define_VTX_GROK_POLICY();
49974
- init_define_VTX_PI_MODEL_POLICY();
49975
- init_runtime_redaction();
49976
- init_channel_sender();
49977
- MAX_RUNTIME_NETWORK_DEBUG_ENTRIES = 80;
49978
- MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES = 20;
49979
- MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES = 20;
49980
- RUNTIME_NETWORK_DEBUG_STORAGE_KEY = "vtx_client_runtime_network_debug_entries_v1";
49981
- RUNTIME_PROVIDER_FAILURE_DEBUG_STORAGE_KEY = "vtx_client_runtime_provider_failure_debug_entries_v1";
49982
- RUNTIME_MARKET_DATA_FAILURE_DEBUG_STORAGE_KEY = "vtx_client_runtime_market_data_failure_debug_entries_v1";
49983
- runtimeNetworkDebugEntries = [];
49984
- runtimeProviderFailureDebugEntries = [];
49985
- runtimeMarketDataFailureDebugEntries = [];
49986
- runtimeNetworkDebugListeners = /* @__PURE__ */ new Set();
49987
- isRuntimeMarketDataFailureDebugEntry = (entry) => entry.kind === "runtime" && entry.label.startsWith("market_data_api:") && entry.outcome === "error";
49988
- persistRuntimeNetworkDebugEntries = () => {
49989
- if (typeof window === "undefined") {
49990
- return;
49991
- }
49992
- try {
49993
- window.localStorage.setItem(
49994
- RUNTIME_NETWORK_DEBUG_STORAGE_KEY,
49995
- JSON.stringify(runtimeNetworkDebugEntries.slice(0, MAX_RUNTIME_NETWORK_DEBUG_ENTRIES))
49996
- );
49997
- } catch {
49998
- }
49999
- };
50000
- persistRuntimeProviderFailureDebugEntries = () => {
50001
- if (typeof window === "undefined") {
50002
- return;
50003
- }
50004
- try {
50005
- window.localStorage.setItem(
50006
- RUNTIME_PROVIDER_FAILURE_DEBUG_STORAGE_KEY,
50007
- JSON.stringify(runtimeProviderFailureDebugEntries.slice(0, MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES))
50008
- );
50009
- } catch {
50010
- }
50011
- };
50012
- persistRuntimeMarketDataFailureDebugEntries = () => {
50013
- if (typeof window === "undefined") {
50014
- return;
50015
- }
50016
- try {
50017
- window.localStorage.setItem(
50018
- RUNTIME_MARKET_DATA_FAILURE_DEBUG_STORAGE_KEY,
50019
- JSON.stringify(runtimeMarketDataFailureDebugEntries.slice(0, MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES))
50020
- );
50021
- } catch {
50022
- }
50023
- };
50024
- emitRuntimeNetworkDebugEntries = (options = {}) => {
50025
- if (options.persist !== false) {
50026
- persistRuntimeNetworkDebugEntries();
50027
- }
50028
- const snapshot = getRuntimeNetworkDebugEntries();
50029
- runtimeNetworkDebugListeners.forEach((listener) => listener(snapshot));
50030
- };
50031
- emitRuntimeProviderFailureDebugEntries = (options = {}) => {
50032
- if (options.persist !== false) {
50033
- persistRuntimeProviderFailureDebugEntries();
50034
- }
50035
- const snapshot = getRuntimeNetworkDebugEntries();
50036
- runtimeNetworkDebugListeners.forEach((listener) => listener(snapshot));
50037
- };
50038
- emitRuntimeMarketDataFailureDebugEntries = (options = {}) => {
50039
- if (options.persist !== false) {
50040
- persistRuntimeMarketDataFailureDebugEntries();
50041
- }
50042
- const snapshot = getRuntimeNetworkDebugEntries();
50043
- runtimeNetworkDebugListeners.forEach((listener) => listener(snapshot));
50044
- };
50045
- buildRuntimeNetworkDebugId = () => {
50046
- if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
50047
- return crypto.randomUUID();
50048
- }
50049
- return `runtime-net-${Date.now()}-${Math.random().toString(16).slice(2)}`;
50050
- };
50051
- normalizeRuntimeNetworkUrl = (value) => {
50052
- try {
50053
- const parsed = new URL(value);
50054
- return {
50055
- targetProtocol: parsed.protocol ? parsed.protocol.replace(/:$/, "").toLowerCase() : null,
50056
- targetHost: parsed.host || "unknown-host",
50057
- targetPath: sanitizeRuntimeNetworkPath(parsed.pathname || "/")
50058
- };
50059
- } catch {
50060
- return {
50061
- targetProtocol: null,
50062
- targetHost: "invalid-url",
50063
- targetPath: sanitizeRuntimeNetworkPath(value)
50064
- };
50065
- }
50066
- };
50067
- readRuntimeNetworkBrowserContext = () => {
50068
- if (typeof window === "undefined") {
50069
- return {
50070
- tabId: null,
50071
- online: null,
50072
- visibilityState: null,
50073
- hidden: null,
50074
- focused: null,
50075
- pageHost: null,
50076
- connectionEffectiveType: null,
50077
- connectionDownlink: null,
50078
- connectionRtt: null
50079
- };
50080
- }
50081
- const nav = typeof navigator !== "undefined" ? navigator : null;
50082
- const connection = nav && typeof nav === "object" ? nav.connection : null;
50083
- let tabId = null;
50084
- try {
50085
- tabId = getOrCreateRuntimeTabSenderId() || null;
50086
- } catch {
50087
- tabId = null;
50088
- }
50089
- return {
50090
- tabId,
50091
- online: nav && typeof nav.onLine === "boolean" ? nav.onLine : null,
50092
- visibilityState: typeof document !== "undefined" && typeof document.visibilityState === "string" ? document.visibilityState : null,
50093
- hidden: typeof document !== "undefined" && typeof document.hidden === "boolean" ? document.hidden : null,
50094
- focused: typeof document !== "undefined" && typeof document.hasFocus === "function" ? document.hasFocus() : null,
50095
- pageHost: window.location?.host || null,
50096
- connectionEffectiveType: typeof connection?.effectiveType === "string" ? connection.effectiveType : null,
50097
- connectionDownlink: Number.isFinite(Number(connection?.downlink)) ? Number(connection?.downlink) : null,
50098
- connectionRtt: Number.isFinite(Number(connection?.rtt)) ? Number(connection?.rtt) : null
50099
- };
50100
- };
50101
- classifyRuntimeNetworkFailure = (error48, status) => {
50102
- if (status != null) {
50103
- return `http_${status}`;
50104
- }
50105
- if (!error48) {
50106
- return null;
50107
- }
50108
- const normalized = error48.toLowerCase();
50109
- if (normalized.includes("abort")) {
50110
- return "abort";
50111
- }
50112
- if (normalized.includes("cors")) {
50113
- return "cors";
50114
- }
50115
- if (normalized.includes("failed to fetch") || normalized.includes("networkerror")) {
50116
- return "fetch_failed";
50117
- }
50118
- if (normalized.includes("load failed") || normalized.includes("network request failed")) {
50119
- return "network_failed";
50120
- }
50121
- return "error";
50122
- };
50123
- isLocalProviderFailureProbeCandidate = (entry) => {
50124
- if (entry.kind !== "provider" || entry.label !== "local" || entry.status != null) {
50125
- return false;
50126
- }
50127
- const host = entry.targetHost.toLowerCase();
50128
- if (host.startsWith("127.0.0.1:") || host === "127.0.0.1" || host.startsWith("localhost:") || host === "localhost" || host.startsWith("[::1]:") || host === "[::1]") {
50129
- return true;
50130
- }
50131
- return false;
50132
- };
50133
- buildLocalProviderProbeUrls = (entry) => {
50134
- const protocol = entry.targetProtocol === "https" ? "https" : "http";
50135
- const origin = `${protocol}://${entry.targetHost}`;
50136
- return [
50137
- { path: "/api/v0/models", url: `${origin}/api/v0/models` },
50138
- { path: "/v1/models", url: `${origin}/v1/models` }
50139
- ];
50140
- };
50141
- patchRuntimeProviderFailureDebugEntry = (id2, patcher) => {
50142
- runtimeProviderFailureDebugEntries = runtimeProviderFailureDebugEntries.map((entry) => entry.id === id2 ? patcher(entry) : entry);
50143
- emitRuntimeProviderFailureDebugEntries();
50144
- };
50145
- runLocalProviderFailureHealthProbe = (entry) => {
50146
- if (typeof fetch !== "function" || !isLocalProviderFailureProbeCandidate(entry)) {
50147
- return;
50148
- }
50149
- const probeStartedAt = Date.now();
50150
- const probe = {
50151
- reason: "local_provider_network_failure",
50152
- startedAt: probeStartedAt,
50153
- completedAt: null,
50154
- attempts: []
50155
- };
50156
- patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
50157
- ...current,
50158
- healthProbe: probe
50159
- }));
50160
- void (async () => {
50161
- const attempts = [];
50162
- for (const candidate of buildLocalProviderProbeUrls(entry)) {
50163
- const startedAt = Date.now();
50164
- const attempt = {
50165
- path: candidate.path,
50166
- startedAt,
50167
- completedAt: null,
50168
- outcome: "pending",
50169
- status: null,
50170
- error: null,
50171
- elapsedMs: null
50172
- };
50173
- attempts.push(attempt);
50174
- patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
50175
- ...current,
50176
- healthProbe: {
50177
- ...current.healthProbe ?? probe,
50178
- attempts: attempts.slice()
50179
- }
50180
- }));
50181
- const controller = typeof AbortController !== "undefined" ? new AbortController() : null;
50182
- const timeoutId = controller ? setTimeout(() => controller.abort(), 2e3) : null;
50183
- try {
50184
- const response = await fetch(candidate.url, {
50185
- method: "GET",
50186
- signal: controller?.signal
50187
- });
50188
- const completedAt2 = Date.now();
50189
- attempt.completedAt = completedAt2;
50190
- attempt.outcome = response.ok ? "ok" : "error";
50191
- attempt.status = response.status;
50192
- attempt.error = response.ok ? null : `HTTP ${response.status}`;
50193
- attempt.elapsedMs = Math.max(0, completedAt2 - startedAt);
50194
- } catch (error48) {
50195
- const completedAt2 = Date.now();
50196
- attempt.completedAt = completedAt2;
50197
- attempt.outcome = "error";
50198
- attempt.error = getSanitizedRuntimeErrorMessage(error48) || "health probe failed";
50199
- attempt.elapsedMs = Math.max(0, completedAt2 - startedAt);
50200
- } finally {
50201
- if (timeoutId) {
50202
- clearTimeout(timeoutId);
50203
- }
50204
- }
50205
- patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
50206
- ...current,
50207
- healthProbe: {
50208
- ...current.healthProbe ?? probe,
50209
- attempts: attempts.slice()
50210
- }
50211
- }));
50212
- if (attempt.outcome === "ok") {
50213
- break;
50214
- }
50215
- }
50216
- const completedAt = Date.now();
50217
- patchRuntimeProviderFailureDebugEntry(entry.id, (current) => ({
50218
- ...current,
50219
- healthProbe: {
50220
- ...current.healthProbe ?? probe,
50221
- completedAt,
50222
- attempts: attempts.slice()
50223
- }
50224
- }));
50225
- })();
50226
- };
50227
- compactRuntimePromptString = (value) => {
50228
- const normalized = sanitizeRuntimeDiagnosticValue(value);
50229
- const preview = normalized.replace(/\s+/g, " ").trim().slice(0, 220);
50230
- return `[OMITTED_PROMPT_TEXT chars=${normalized.length}${preview ? ` preview=${JSON.stringify(preview)}` : ""}]`;
50231
- };
50232
- shouldCompactRuntimeRequestString = (key, value) => {
50233
- if (value.length <= 500) {
50234
- return false;
50235
- }
50236
- const normalizedKey = key.trim().toLowerCase();
50237
- return normalizedKey === "system" || normalizedKey === "instructions" || normalizedKey === "content" || normalizedKey === "text" || normalizedKey === "input" || normalizedKey === "prompt" || normalizedKey.endsWith("_prompt");
50238
- };
50239
- sanitizeRuntimeNetworkDebugPayload = (value, options = {}) => {
50240
- if (value == null) {
50241
- return value;
50242
- }
50243
- if (typeof value === "string") {
50244
- if (options.compactPromptText && shouldCompactRuntimeRequestString(options.key || "", value)) {
50245
- return compactRuntimePromptString(value);
50246
- }
50247
- return sanitizeRuntimeDiagnosticValue(value);
50248
- }
50249
- if (typeof value === "number" || typeof value === "boolean") {
50250
- return value;
50251
- }
50252
- if (Array.isArray(value)) {
50253
- return value.map((item) => sanitizeRuntimeNetworkDebugPayload(item, options));
50254
- }
50255
- if (typeof value === "object") {
50256
- const out = {};
50257
- for (const [key, item] of Object.entries(value)) {
50258
- const normalizedKey = key.trim().toLowerCase();
50259
- if (normalizedKey === "authorization" || normalizedKey === "x-api-key" || normalizedKey === "api-key" || normalizedKey === "apikey" || normalizedKey === "signature" || normalizedKey.includes("secret") || normalizedKey.includes("private_key") || normalizedKey.includes("signing_key")) {
50260
- out[key] = "[REDACTED]";
50261
- continue;
50262
- }
50263
- out[key] = sanitizeRuntimeNetworkDebugPayload(item, {
50264
- ...options,
50265
- key
50266
- });
50267
- }
50268
- return out;
50269
- }
50270
- return sanitizeRuntimeDiagnosticValue(String(value));
50271
- };
50272
- getRuntimeNetworkDebugEntries = () => runtimeNetworkDebugEntries.slice();
50273
- startRuntimeNetworkDebugTrace = (input) => {
50274
- const { targetProtocol, targetHost, targetPath } = normalizeRuntimeNetworkUrl(input.url);
50275
- const entry = {
50276
- id: buildRuntimeNetworkDebugId(),
50277
- kind: input.kind,
50278
- label: input.label,
50279
- transport: "browser",
50280
- providerTransport: input.kind === "provider" ? input.providerTransport ?? "direct" : null,
50281
- actualRelayPath: input.kind === "provider" && input.providerTransport === "server_relay" ? "/llm/native-provider-relay" : null,
50282
- method: (input.method || "POST").toUpperCase(),
50283
- targetProtocol,
50284
- targetHost,
50285
- targetPath,
50286
- startedAt: Date.now(),
50287
- completedAt: null,
50288
- status: null,
50289
- outcome: "pending",
50290
- error: null,
50291
- note: typeof input.note === "string" ? input.note : null,
50292
- request: null,
50293
- response: null,
50294
- browser: {
50295
- started: readRuntimeNetworkBrowserContext(),
50296
- completed: null,
50297
- elapsedMs: null,
50298
- failureKind: null
50299
- }
50300
- };
50301
- runtimeNetworkDebugEntries = [entry, ...runtimeNetworkDebugEntries].slice(0, MAX_RUNTIME_NETWORK_DEBUG_ENTRIES);
50302
- emitRuntimeNetworkDebugEntries();
50303
- let completed = false;
50304
- const finalize2 = (outcome, status, error48) => {
50305
- if (completed) {
50306
- return;
50307
- }
50308
- completed = true;
50309
- const completedAt = Date.now();
50310
- const completedBrowserContext = readRuntimeNetworkBrowserContext();
50311
- runtimeNetworkDebugEntries = runtimeNetworkDebugEntries.map((candidate) => candidate.id === entry.id ? {
50312
- ...candidate,
50313
- completedAt,
50314
- status,
50315
- outcome,
50316
- error: error48,
50317
- browser: candidate.browser ? {
50318
- ...candidate.browser,
50319
- completed: completedBrowserContext,
50320
- elapsedMs: Math.max(0, completedAt - candidate.startedAt),
50321
- failureKind: outcome === "error" ? classifyRuntimeNetworkFailure(error48, status) : null
50322
- } : null
50323
- } : candidate);
50324
- emitRuntimeNetworkDebugEntries();
50325
- const failedProviderEntry = runtimeNetworkDebugEntries.find((candidate) => candidate.id === entry.id && candidate.kind === "provider" && candidate.outcome === "error");
50326
- if (failedProviderEntry) {
50327
- const providerFailureEntry = {
50328
- ...failedProviderEntry,
50329
- healthProbe: null
50330
- };
50331
- runtimeProviderFailureDebugEntries = [
50332
- providerFailureEntry,
50333
- ...runtimeProviderFailureDebugEntries.filter((candidate) => candidate.id !== providerFailureEntry.id)
50334
- ].slice(0, MAX_RUNTIME_PROVIDER_FAILURE_DEBUG_ENTRIES);
50335
- emitRuntimeProviderFailureDebugEntries();
50336
- runLocalProviderFailureHealthProbe(providerFailureEntry);
50337
- }
50338
- const failedMarketDataEntry = runtimeNetworkDebugEntries.find((candidate) => candidate.id === entry.id && isRuntimeMarketDataFailureDebugEntry(candidate));
50339
- if (failedMarketDataEntry) {
50340
- runtimeMarketDataFailureDebugEntries = [
50341
- failedMarketDataEntry,
50342
- ...runtimeMarketDataFailureDebugEntries.filter((candidate) => candidate.id !== failedMarketDataEntry.id)
50343
- ].slice(0, MAX_RUNTIME_MARKET_DATA_FAILURE_DEBUG_ENTRIES);
50344
- emitRuntimeMarketDataFailureDebugEntries();
50345
- }
50346
- };
50347
- const attachPayload = (field, payload) => {
50348
- runtimeNetworkDebugEntries = runtimeNetworkDebugEntries.map((candidate) => candidate.id === entry.id ? {
50349
- ...candidate,
50350
- [field]: sanitizeRuntimeNetworkDebugPayload(payload, {
50351
- compactPromptText: field === "request"
50352
- })
50353
- } : candidate);
50354
- emitRuntimeNetworkDebugEntries();
50355
- };
50356
- return {
50357
- id: entry.id,
50358
- attachRequest: (payload) => attachPayload("request", payload),
50359
- attachResponse: (payload) => attachPayload("response", payload),
50360
- completeSuccess: (status) => finalize2("ok", typeof status === "number" ? status : null, null),
50361
- completeError: (error48, status) => {
50362
- const message = getSanitizedRuntimeErrorMessage(error48);
50363
- finalize2("error", typeof status === "number" ? status : null, message);
50364
- }
50365
- };
50366
- };
50367
- appendRuntimeDebugEvent = (input) => {
50368
- const outcome = input.outcome === "error" ? "error" : "ok";
50369
- const entry = {
50370
- id: buildRuntimeNetworkDebugId(),
50371
- kind: "runtime",
50372
- label: String(input.label || "runtime_event").trim() || "runtime_event",
50373
- transport: "browser",
50374
- method: "TRACE",
50375
- targetProtocol: null,
50376
- targetHost: "client-runtime",
50377
- targetPath: "/runtime",
50378
- startedAt: Date.now(),
50379
- completedAt: Date.now(),
50380
- status: null,
50381
- outcome,
50382
- error: null,
50383
- note: typeof input.note === "string" && input.note.trim().length > 0 ? input.note.trim() : null,
50384
- request: null,
50385
- response: null,
50386
- browser: {
50387
- started: readRuntimeNetworkBrowserContext(),
50388
- completed: readRuntimeNetworkBrowserContext(),
50389
- elapsedMs: 0,
50390
- failureKind: null
50391
- }
50392
- };
50393
- runtimeNetworkDebugEntries = [entry, ...runtimeNetworkDebugEntries].slice(0, MAX_RUNTIME_NETWORK_DEBUG_ENTRIES);
50394
- emitRuntimeNetworkDebugEntries({ persist: outcome === "error" });
50395
- };
50396
- }
50397
- });
50398
-
50399
50455
  // lib/runtime/hyperliquid-account-state-adapter.ts
50400
50456
  var unsupportedUserActiveAssetCache, MAX_UNSUPPORTED_USER_ACTIVE_ASSET_CACHE_KEYS, UNSUPPORTED_USER_ACTIVE_ASSET_STORAGE_KEY, USER_FILLS_CACHE_STORAGE_PREFIX, ACCOUNT_STATE_CACHE_STORAGE_PREFIX, browserUserFillsCache, browserUserFillsInFlight, HYPERLIQUID_USER_FILLS_PROVIDER_PAGE_CAP, browserAccountStateCache, browserAccountStateInFlight, UNSUPPORTED_USER_ACTIVE_ASSET_DETAIL_PATTERNS, unsupportedUserActiveAssetCacheHydrated, hydrateUnsupportedUserActiveAssetCache, persistUnsupportedUserActiveAssetCache, toPositiveFinite, toFinite, firstFiniteNumber, parseFundingUsdcFromInfoPosition, buildActiveAssetCacheKey, buildUserFillsCacheKey, buildUserFillsStorageKey, buildAccountStateCacheKey, buildAccountStateStorageKey, hasActiveInfoRateLimitCooldown, requireNonNegativeConfigSeconds, requireAccountStateCacheConfig, requireUserFillsCacheConfig, normalizeFillSymbol, buildSymbolFilter, filterFillsBySymbols, readBrowserUserFillsCache, writeBrowserUserFillsCache, cloneBrowserAccountStateResult, withAccountStateEvidence, readBrowserAccountStateCache, writeBrowserAccountStateCache, isRateLimitError, createAbortError, waitForSharedBrowserRequest, waitForSharedBrowserUserFills, getBrowserActiveAssetTypeCandidates, normalizeHyperliquidErrorDetail, isUnsupportedUserActiveAssetError, rememberUnsupportedUserActiveAssetKey, parseInfoPositions, requireFinitePromptMetric, requirePromptClearinghouseState, requirePromptSpotState, normalizePerpDexName, listConfiguredPerpDexs, listPerpDexsForAccountState, prefixHip3PositionCoins, aggregateClearinghouseResponses, hasCompletePerpDexAccountMetrics, normalizeBrowserFillToTradeHistory, isPerpFill, settleAccountReads, fetchHyperliquidInfoRead, fetchHyperliquidInfoPayload, requireHyperliquidApiUrl, requireWalletAddress, parseInfoPositionSnapshot, fetchBrowserAccountState, fetchBrowserAccountStateUncached, fetchBrowserUserFills, fetchBrowserPositionSnapshot;
50401
50457
  var init_hyperliquid_account_state_adapter = __esm({
@@ -52099,6 +52155,26 @@ var init_local_breadcrumbs = __esm({
52099
52155
  }
52100
52156
  });
52101
52157
 
52158
+ // lib/api/browser-api-url.ts
52159
+ function resolveBrowserApiUrl(hostname3, protocol, publicApiUrl, development) {
52160
+ if (development) {
52161
+ const local = hostname3 === "localhost" || hostname3 === "127.0.0.1" || hostname3.startsWith("192.168.") || hostname3.startsWith("10.") || hostname3.startsWith("172.") && Number(hostname3.split(".")[1]) >= 16 && Number(hostname3.split(".")[1]) <= 31;
52162
+ if (local) return `http://${hostname3}:8000`;
52163
+ }
52164
+ if (publicApiUrl) return publicApiUrl;
52165
+ const baseHost = hostname3.startsWith("www.") ? hostname3.slice(4) : hostname3;
52166
+ const apiHost = baseHost.startsWith("api.") ? baseHost : `api.${baseHost}`;
52167
+ return `${protocol}//${apiHost}`;
52168
+ }
52169
+ var init_browser_api_url = __esm({
52170
+ "lib/api/browser-api-url.ts"() {
52171
+ "use strict";
52172
+ init_define_VTX_EXO_POLICY();
52173
+ init_define_VTX_GROK_POLICY();
52174
+ init_define_VTX_PI_MODEL_POLICY();
52175
+ }
52176
+ });
52177
+
52102
52178
  // lib/api/shared.ts
52103
52179
  function getProfileHeaders(baseHeaders = {}, explicitProfileId) {
52104
52180
  const headers = { ...baseHeaders };
@@ -52113,34 +52189,19 @@ var init_shared = __esm({
52113
52189
  init_define_VTX_EXO_POLICY();
52114
52190
  init_define_VTX_GROK_POLICY();
52115
52191
  init_define_VTX_PI_MODEL_POLICY();
52192
+ init_browser_api_url();
52116
52193
  init_runtime_policy_generated();
52117
52194
  init_abort();
52118
52195
  getApiUrl = () => {
52119
52196
  if (typeof window === "undefined") {
52120
52197
  return process.env.API_URL_SERVER || process.env.NEXT_PUBLIC_API_URL || "http://api:8000";
52121
52198
  }
52122
- if (process.env.NODE_ENV === "development") {
52123
- const hostname3 = window.location.hostname;
52124
- const isLocalNetworkIP = hostname3.startsWith("192.168.") || hostname3.startsWith("10.") || hostname3.startsWith("172.") && parseInt(hostname3.split(".")[1]) >= 16 && parseInt(hostname3.split(".")[1]) <= 31;
52125
- if (isLocalNetworkIP) {
52126
- return `http://${hostname3}:8000`;
52127
- }
52128
- if (hostname3 === "localhost" || hostname3 === "127.0.0.1") {
52129
- return `http://${hostname3}:8000`;
52130
- }
52131
- }
52132
- if (process.env.NEXT_PUBLIC_API_URL) {
52133
- return process.env.NEXT_PUBLIC_API_URL;
52134
- }
52135
- try {
52136
- const hostname3 = window.location.hostname;
52137
- const protocol = window.location.protocol;
52138
- const baseHost = hostname3.startsWith("www.") ? hostname3.slice(4) : hostname3;
52139
- const apiHost = baseHost.startsWith("api.") ? baseHost : `api.${baseHost}`;
52140
- return `${protocol}//${apiHost}`;
52141
- } catch {
52142
- return "http://localhost:8000";
52143
- }
52199
+ return resolveBrowserApiUrl(
52200
+ window.location.hostname,
52201
+ window.location.protocol,
52202
+ process.env.NEXT_PUBLIC_API_URL,
52203
+ process.env.NODE_ENV === "development"
52204
+ );
52144
52205
  };
52145
52206
  API_URL = getApiUrl();
52146
52207
  sleep2 = (ms) => new Promise((resolve13) => setTimeout(resolve13, ms));
@@ -52206,6 +52267,18 @@ var init_shared = __esm({
52206
52267
  }
52207
52268
  });
52208
52269
 
52270
+ // lib/api/client-runtime-bootstrap.ts
52271
+ var init_client_runtime_bootstrap = __esm({
52272
+ "lib/api/client-runtime-bootstrap.ts"() {
52273
+ "use strict";
52274
+ init_define_VTX_EXO_POLICY();
52275
+ init_define_VTX_GROK_POLICY();
52276
+ init_define_VTX_PI_MODEL_POLICY();
52277
+ init_local_breadcrumbs();
52278
+ init_browser_api_url();
52279
+ }
52280
+ });
52281
+
52209
52282
  // lib/api/billing.ts
52210
52283
  var init_billing = __esm({
52211
52284
  "lib/api/billing.ts"() {
@@ -52273,6 +52346,17 @@ var init_screener = __esm({
52273
52346
  }
52274
52347
  });
52275
52348
 
52349
+ // lib/api/client-host-commands.ts
52350
+ var init_client_host_commands = __esm({
52351
+ "lib/api/client-host-commands.ts"() {
52352
+ "use strict";
52353
+ init_define_VTX_EXO_POLICY();
52354
+ init_define_VTX_GROK_POLICY();
52355
+ init_define_VTX_PI_MODEL_POLICY();
52356
+ init_shared();
52357
+ }
52358
+ });
52359
+
52276
52360
  // lib/runtime/server-runtime-lease.ts
52277
52361
  var CLIENT_RUNTIME_SERVER_LEASE_STORAGE_KEY, canUseStorage, normalizeProfileId, normalizeLeaseGeneration, parseLeaseRecord, readPersistedLeaseMap, writePersistedLeaseMap, isLeaseExpired, getPersistedClientRuntimeServerLease, persistExistingClientRuntimeServerLease, persistClientRuntimeServerLease, clearPersistedClientRuntimeServerLease;
52278
52362
  var init_server_runtime_lease = __esm({
@@ -52977,9 +53061,11 @@ var init_api2 = __esm({
52977
53061
  init_abort();
52978
53062
  init_shared();
52979
53063
  init_shared();
53064
+ init_client_runtime_bootstrap();
52980
53065
  init_billing();
52981
53066
  init_market_data();
52982
53067
  init_screener();
53068
+ init_client_host_commands();
52983
53069
  init_server_runtime_lease();
52984
53070
  preferencesWriteQueue = Promise.resolve();
52985
53071
  CLIENT_SUPPORTED_PROMPT_CONTRACT_VERSION = String(
@@ -87338,7 +87424,7 @@ var init_browser_trading = __esm({
87338
87424
  throwIfAborted(input.signal);
87339
87425
  const signingKey = await resolveSigningKey(input);
87340
87426
  throwIfAborted(input.signal);
87341
- const mutation = createExchangeMutationIdentity(false);
87427
+ const mutation = createExchangeMutationIdentity(false, input);
87342
87428
  const payload = await buildHyperliquidUpdateLeveragePayload({
87343
87429
  config: input.config ?? null,
87344
87430
  publicRequestPriority: input.publicRequestPriority,
@@ -87581,6 +87667,8 @@ var init_browser_trading = __esm({
87581
87667
  const side = positionSize > 0 ? "sell" : "buy";
87582
87668
  return executeClientMarketOrder({
87583
87669
  profileId,
87670
+ mutationId: input.mutationId,
87671
+ clientOrderId: input.clientOrderId,
87584
87672
  runtimeSessionId: input.runtimeSessionId,
87585
87673
  runtimeLeaseToken: input.runtimeLeaseToken,
87586
87674
  runtimeDeviceId: input.runtimeDeviceId,
@@ -87844,7 +87932,7 @@ var init_execution_guard_contract = __esm({
87844
87932
  });
87845
87933
 
87846
87934
  // lib/runtime/runtime-execution.ts
87847
- var executionReadPriority, fetchClientRuntimeOpenOrders, createRuntimeId, _extractOrderId, _toExecutionMetadata, _extractClientMutationId, trailingStopMemory, protectiveGroupMemory, protectiveGroupReadFailures, windowHandoffCleanupAttempts, clientRuntimeProtectionStorage, resolveClientRuntimeProtectionStorage, setClientRuntimeProtectionStorage, trailingStopStorageKey, readTrackedTrailingStops, writeTrackedTrailingStops, rememberTrailingStop, protectiveGroupStorageKey, readClientProtectiveGroups, writeClientProtectiveGroups, hasClientProtectiveGroupReadFailure, readFreshClientProtectiveGroups, stableProtectionSnapshot, exactClientProtectiveGroupSnapshot, exactClientProtectiveGroupSetSnapshot, replaceExactClientProtectiveGroup, replaceExactClientProtectiveGroupSet, isClientRuntimeLeaseOwnershipError, hasClientRuntimeProtectionState, clearClientRuntimeVetoedProtectiveIntent, rethrowWindowHandoffAfterProtectiveReplacementVeto, canPersistClientProtectiveGroups, removeTrackedTrailingStop, replaceTrackedTrailingStop, replaceProtectiveLeg, replacementJournalEntryOrderId, buildProtectiveReplacementJournalGroup, isProtectiveReplacementJournalGroup, reserveProtectiveLegReplacement, ensureProtectiveReplacementJournalCompanion, buildVetoedProtectiveReplacementCleanup, assertExactProtectiveReplacementDispatchAuthority, transitionProtectiveReplacementAcknowledgement, transitionTerminalProtectiveReplacement, pendingProtectiveReplacementReport, toPositiveNumber, resolveRiskPct, buildTriggerPrice, isConfiguredProtectionRequested, protectiveAction, isExactClientPositionTpslPair, hasAmbiguousClientPositionTpslAuthority, protectiveStableShapeMatches, protectiveLiveShapeMatches, protectiveTerminalShapeMatches, cancelClientProtectiveLeg, buildPendingProtectivePlan, attachClientProtectivePlan, resolveJournaledAttachmentContinuity, recoverJournaledClientProtectiveAttachments, recoverPendingClientProtectiveGroups, recoverPendingProtectiveReplacements, reconcileClientProtectiveGroups, cancelAllClientProtectiveGroups, tightenClientTrailingStops, throwIfAborted2, sleep3, roundAssetSize, resolvePositionSize, resolveCurrentPositionSize, buildPositionSnapshot, signedRemainingExposureAfterConfirmedReduction, verifyNoLiveClientProtectiveTriggers, executeClientRuntimeDecision;
87935
+ var executionReadPriority, fetchClientRuntimeOpenOrders, createRuntimeId, _extractOrderId, _toExecutionMetadata, _extractClientMutationId, trailingStopMemory, protectiveGroupMemory, protectiveGroupReadFailures, windowHandoffCleanupAttempts, clientRuntimeProtectionStorage, resolveClientRuntimeProtectionStorage, setClientRuntimeProtectionStorage, trailingStopStorageKey, readTrackedTrailingStops, writeTrackedTrailingStops, rememberTrailingStop, protectiveGroupStorageKey, readClientProtectiveGroups, writeClientProtectiveGroups, hasClientProtectiveGroupReadFailure, readFreshClientProtectiveGroups, stableProtectionSnapshot, exactClientProtectiveGroupSnapshot, exactClientProtectiveGroupSetSnapshot, replaceExactClientProtectiveGroup, replaceExactClientProtectiveGroupSet, isClientRuntimeLeaseOwnershipError, hasClientRuntimeProtectionState, clearClientRuntimeVetoedProtectiveIntent, rethrowWindowHandoffAfterProtectiveReplacementVeto, canPersistClientProtectiveGroups, removeTrackedTrailingStop, replaceTrackedTrailingStop, replaceProtectiveLeg, replacementJournalEntryOrderId, buildProtectiveReplacementJournalGroup, isProtectiveReplacementJournalGroup, reserveProtectiveLegReplacement, ensureProtectiveReplacementJournalCompanion, buildVetoedProtectiveReplacementCleanup, assertExactProtectiveReplacementDispatchAuthority, transitionProtectiveReplacementAcknowledgement, transitionTerminalProtectiveReplacement, pendingProtectiveReplacementReport, toPositiveNumber, resolveRiskPct, buildTriggerPrice, isConfiguredProtectionRequested, protectiveAction, isExactClientPositionTpslPair, hasAmbiguousClientPositionTpslAuthority, protectiveStableShapeMatches, protectiveLiveShapeMatches, protectiveTerminalShapeMatches, cancelClientProtectiveLeg, buildPendingProtectivePlan, attachClientProtectivePlan, resolveJournaledAttachmentContinuity, recoverJournaledClientProtectiveAttachments, recoverPendingClientProtectiveGroups, recoverPendingProtectiveReplacements, reconcileClientProtectiveGroups, cancelAllClientProtectiveGroups, tightenClientTrailingStops, throwIfAborted2, sleep3, roundAssetSize, resolvePositionSize, resolveCurrentPositionSize, buildPositionSnapshot, signedRemainingExposureAfterConfirmedReduction, verifyNoLiveClientProtectiveTriggers, clientExecutionMutations, withClientExecutionMutation, executeClientRuntimeDecision, maintainClientRuntimeTrailingStops, executeClientRuntimeDecisionUnlocked;
87848
87936
  var init_runtime_execution = __esm({
87849
87937
  "lib/runtime/runtime-execution.ts"() {
87850
87938
  "use strict";
@@ -89065,11 +89153,16 @@ var init_runtime_execution = __esm({
89065
89153
  }
89066
89154
  return reports;
89067
89155
  }
89156
+ const { sz_decimals: assetSizeDecimals } = await resolveHyperliquidAsset({
89157
+ symbol: symbol2,
89158
+ config: request.config,
89159
+ publicRequestPriority: "trading_reduce"
89160
+ });
89068
89161
  const candidates = allocatedCandidates.map((candidate) => ({
89069
89162
  ...candidate,
89070
89163
  triggerPrice: Number(formatHyperliquidTriggerPriceWire(
89071
89164
  candidate.triggerPrice,
89072
- request.executionContext.sizeDecimals
89165
+ assetSizeDecimals
89073
89166
  ))
89074
89167
  }));
89075
89168
  const positionTpsl = candidates.length === 2;
@@ -91338,6 +91431,15 @@ var init_runtime_execution = __esm({
91338
91431
  retained.push(record5);
91339
91432
  }
91340
91433
  }
91434
+ if (eligible.length === 0) {
91435
+ writeTrackedTrailingStops(profileId, symbol2, retained);
91436
+ return [];
91437
+ }
91438
+ const { sz_decimals: assetSizeDecimals } = await resolveHyperliquidAsset({
91439
+ symbol: symbol2,
91440
+ config: request.config,
91441
+ publicRequestPriority: "trading_reduce"
91442
+ });
91341
91443
  const reports = [];
91342
91444
  const updated = [...retained];
91343
91445
  let remainingExposure = Math.abs(currentPositionSize);
@@ -91386,7 +91488,7 @@ var init_runtime_execution = __esm({
91386
91488
  const rawCandidatePrice = buildTriggerPrice(currentPrice, riskPct, isLong, false);
91387
91489
  const candidatePrice = rawCandidatePrice > 0 ? Number(formatHyperliquidTriggerPriceWire(
91388
91490
  rawCandidatePrice,
91389
- request.executionContext.sizeDecimals
91491
+ assetSizeDecimals
91390
91492
  )) : 0;
91391
91493
  const tightens = candidatePrice > 0 && (isLong ? candidatePrice > record5.triggerPrice : candidatePrice < record5.triggerPrice);
91392
91494
  const canonicalRecordSize = roundAssetSize(
@@ -91466,6 +91568,9 @@ var init_runtime_execution = __esm({
91466
91568
  signal: request.signal,
91467
91569
  signingKey: request.signingKey,
91468
91570
  onExchangeOrderDispatched: () => {
91571
+ if (request.shouldCancelBeforeExchangeOrderDispatch?.()) {
91572
+ throw new Error(CLIENT_RUNTIME_WINDOW_HANDOFF_BEFORE_PLAN_DISPATCH);
91573
+ }
91469
91574
  if (!assertExactProtectiveReplacementDispatchAuthority({
91470
91575
  profileId,
91471
91576
  symbol: symbol2,
@@ -91770,7 +91875,58 @@ var init_runtime_execution = __esm({
91770
91875
  return { blocksEntry: false, reports: [] };
91771
91876
  }
91772
91877
  };
91773
- executeClientRuntimeDecision = async (input) => {
91878
+ clientExecutionMutations = /* @__PURE__ */ new Map();
91879
+ withClientExecutionMutation = async (request, work) => {
91880
+ const key = String(request.profileId).trim();
91881
+ const previous = clientExecutionMutations.get(key);
91882
+ const pending3 = (previous ?? Promise.resolve()).catch(() => void 0).then(() => {
91883
+ throwIfAborted2(request.signal);
91884
+ if (request.shouldCancelBeforeExchangeOrderDispatch?.()) {
91885
+ throw new Error(CLIENT_RUNTIME_WINDOW_HANDOFF_BEFORE_PLAN_DISPATCH);
91886
+ }
91887
+ return work();
91888
+ });
91889
+ clientExecutionMutations.set(key, pending3);
91890
+ try {
91891
+ return await pending3;
91892
+ } finally {
91893
+ if (clientExecutionMutations.get(key) === pending3) clientExecutionMutations.delete(key);
91894
+ }
91895
+ };
91896
+ executeClientRuntimeDecision = (input) => withClientExecutionMutation(input, () => executeClientRuntimeDecisionUnlocked(input));
91897
+ maintainClientRuntimeTrailingStops = (request) => withClientExecutionMutation(request, async () => {
91898
+ const context = request.executionContext;
91899
+ const capturedAt = Date.parse(context.decisionSnapshotCapturedAt ?? "");
91900
+ const maxAge = Number(context.executionFreshnessMaxAgeSeconds) * 1e3;
91901
+ const age = Date.now() - capturedAt;
91902
+ if (!context.tpSlEnabled || context.stopLossEnabled === false || context.stopLossType !== "trailing" || !Number.isFinite(age) || age < 0 || !Number.isFinite(maxAge) || maxAge <= 0 || age > maxAge || !Number.isFinite(context.currentPositionSize) || context.currentPositionSize === 0 || !Number.isFinite(context.lastPrice) || context.lastPrice <= 0) return [];
91903
+ const groups = readFreshClientProtectiveGroups(String(request.profileId).trim(), context.symbol);
91904
+ if (hasClientProtectiveGroupReadFailure(String(request.profileId).trim(), context.symbol) || groups.some((group) => group.walletAddress !== String(context.walletAddress ?? "").trim().toLowerCase() || group.pendingEntry || group.attachmentJournal || group.cleanupRequired || group.legs.some((leg) => leg.replacement))) return [];
91905
+ if (!groups.some((group) => group.legs.some((leg) => leg.isTrailing && typeof leg.orderId === "number"))) return [];
91906
+ const { sz_decimals: assetSizeDecimals } = await resolveHyperliquidAsset({
91907
+ symbol: context.symbol,
91908
+ config: request.config,
91909
+ publicRequestPriority: "trading_reduce"
91910
+ });
91911
+ const isLong = context.currentPositionSize > 0;
91912
+ const improves = groups.some((group) => group.isLong === isLong && group.legs.some((leg) => {
91913
+ if (!leg.isTrailing || typeof leg.orderId !== "number") return false;
91914
+ const size = roundAssetSize(Math.min(leg.size, Math.abs(context.currentPositionSize)), context.sizeDecimals);
91915
+ if (!(size > 0)) return false;
91916
+ const risk = resolveRiskPct(context.stopLossMode, context.stopLossPct, context.stopLossUsdc, context.lastPrice * size);
91917
+ const raw = buildTriggerPrice(context.lastPrice, risk, isLong, false);
91918
+ const candidate = raw > 0 ? Number(formatHyperliquidTriggerPriceWire(raw, assetSizeDecimals)) : 0;
91919
+ return candidate > 0 && (isLong ? candidate > leg.triggerPrice : candidate < leg.triggerPrice);
91920
+ }));
91921
+ if (!improves) return [];
91922
+ await request.beforeTrailingMaintenance?.(request.signal);
91923
+ const guardedRequest = { ...request, onExchangeOrderDispatched: (kind) => {
91924
+ if (Date.now() - capturedAt > maxAge) throw new Error("Trailing observation expired before exchange dispatch.");
91925
+ request.onExchangeOrderDispatched?.(kind);
91926
+ } };
91927
+ return tightenClientTrailingStops({ request: guardedRequest, currentPositionSize: context.currentPositionSize, currentPrice: context.lastPrice });
91928
+ });
91929
+ executeClientRuntimeDecisionUnlocked = async (input) => {
91774
91930
  throwIfAborted2(input.signal);
91775
91931
  const requestedUnits = Math.max(0, Math.trunc(input.units));
91776
91932
  appendRuntimeDebugEvent({
@@ -91800,7 +91956,7 @@ var init_runtime_execution = __esm({
91800
91956
  execution_metadata: { reason_code: "protective_lifecycle_storage_invalid" }
91801
91957
  }] : hasTrackedProtection ? await reconcileClientProtectiveGroups(input) : [];
91802
91958
  if (input.decision === "HOLD" || requestedUnits <= 0) {
91803
- const shouldTrail = input.executionContext.tpSlEnabled === true && input.executionContext.stopLossEnabled !== false && input.executionContext.stopLossType === "trailing" && decisionSnapshotPositionSize !== 0;
91959
+ const shouldTrail = !input.skipTrailingMaintenance && input.executionContext.tpSlEnabled === true && input.executionContext.stopLossEnabled !== false && input.executionContext.stopLossType === "trailing" && decisionSnapshotPositionSize !== 0;
91804
91960
  if (shouldTrail && !reconciliationReports.some((report) => report.status === "failed")) {
91805
91961
  const {
91806
91962
  currentPositionSize: currentPositionSize2,
@@ -92632,12 +92788,17 @@ var init_runtime_execution = __esm({
92632
92788
  }
92633
92789
  const mutationId = createRuntimeId().toLowerCase();
92634
92790
  const clientOrderId = `0x${mutationId.replaceAll("-", "")}`;
92791
+ const { sz_decimals: assetSizeDecimals } = await resolveHyperliquidAsset({
92792
+ symbol: input.executionContext.symbol,
92793
+ config: input.config,
92794
+ publicRequestPriority: "trading_reduce"
92795
+ });
92635
92796
  const provisionalLeg = {
92636
92797
  kind,
92637
92798
  orderId: clientOrderId,
92638
92799
  triggerPrice: Number(formatHyperliquidTriggerPriceWire(
92639
92800
  triggerInput.triggerPrice,
92640
- input.executionContext.sizeDecimals
92801
+ assetSizeDecimals
92641
92802
  )),
92642
92803
  size: legSize,
92643
92804
  isTrailing: !triggerInput.isTakeProfit && input.executionContext.stopLossType === "trailing"
@@ -92722,7 +92883,7 @@ var init_runtime_execution = __esm({
92722
92883
  orderId: triggerOrderId,
92723
92884
  triggerPrice: Number(formatHyperliquidTriggerPriceWire(
92724
92885
  triggerInput.triggerPrice,
92725
- input.executionContext.sizeDecimals
92886
+ assetSizeDecimals
92726
92887
  )),
92727
92888
  size: legSize,
92728
92889
  isTrailing
@@ -93998,7 +94159,7 @@ async function fetchLocalHyperliquidSnapshot(input) {
93998
94159
  symbol: input.symbol,
93999
94160
  timeframe: input.timeframe,
94000
94161
  decisionSnapshotId: input.decisionSnapshotId,
94001
- decisionSnapshotCapturedAt: input.decisionSnapshotCapturedAt,
94162
+ decisionSnapshotCapturedAt: new Date(Math.min(Date.parse(input.decisionSnapshotCapturedAt), accountState.evidence?.fetchedAtMs ?? Date.parse(input.decisionSnapshotCapturedAt))).toISOString(),
94002
94163
  currentPositionSize: Number.isFinite(currentPositionSize) ? currentPositionSize : 0,
94003
94164
  currentPositionEntryPrice: accountState.positions.find((position) => normalizeRuntimeSymbol(position.symbol) === normalizeRuntimeSymbol(input.symbol))?.entry_price ?? null,
94004
94165
  walletAddress,
@@ -94009,7 +94170,8 @@ async function fetchLocalHyperliquidSnapshot(input) {
94009
94170
  marginMode,
94010
94171
  closePositionDelaySeconds: requireFiniteNumber(input.llmConfig.client_runtime_close_position_delay_seconds, "close position delay seconds"),
94011
94172
  maxSlippageFraction: requireFiniteNumber(input.llmConfig.default_max_slippage, "max slippage") / 100,
94012
- executionFreshnessMaxAgeSeconds
94173
+ executionFreshnessMaxAgeSeconds,
94174
+ ...buildRuntimeSlTpExecutionSettings(promptKnobs, input.llmConfig)
94013
94175
  }
94014
94176
  };
94015
94177
  }
@@ -94178,6 +94340,40 @@ function createHeadlessLocalWorker(options) {
94178
94340
  user_prompt: providerInput.userPrompt
94179
94341
  })
94180
94342
  ]);
94343
+ const symbol2 = requireText(prompt.symbol ?? metadata.symbol, "symbol");
94344
+ const timeframe = requireText(prompt.timeframe ?? metadata.timeframe, "timeframe");
94345
+ const secrets = objectOrNull3(input.secrets) ?? {};
94346
+ const protectiveSettings = buildRuntimeSlTpExecutionSettings(objectOrNull3(metadata.prompt_knobs) ?? {}, llmConfig);
94347
+ let preparedHyperliquidContext = null;
94348
+ try {
94349
+ preparedHyperliquidContext = protectiveSettings.tpSlEnabled && protectiveSettings.stopLossEnabled && protectiveSettings.stopLossType === "trailing" && hasClientRuntimeProtectionState(input.profileId, symbol2) ? await fetchLocalHyperliquidSnapshot({
94350
+ client: options.client,
94351
+ profileId: input.profileId,
94352
+ llmConfig,
94353
+ secrets,
94354
+ metadata,
94355
+ symbol: symbol2,
94356
+ timeframe,
94357
+ decisionSnapshotId,
94358
+ decisionSnapshotCapturedAt,
94359
+ fetchAccountState
94360
+ }) : null;
94361
+ if (preparedHyperliquidContext && preparedHyperliquidContext.accountState.evidence?.source !== "stale_if_429") {
94362
+ await maintainClientRuntimeTrailingStops({
94363
+ profileId: String(input.profileId),
94364
+ sessionId: input.runtimeState.runtimeSessionId,
94365
+ runtimeLeaseToken: input.runtimeState.leaseToken,
94366
+ runtimeDeviceId: input.runtimeState.deviceId,
94367
+ signingKey: preparedHyperliquidContext.signingKey,
94368
+ config: buildHeadlessExchangeConfig(llmConfig),
94369
+ decision: "HOLD",
94370
+ units: 0,
94371
+ executionContext: preparedHyperliquidContext.executionContext
94372
+ });
94373
+ }
94374
+ } catch {
94375
+ appendRuntimeDebugEvent({ label: "client_pre_inference_trailing_maintenance", note: "Headless trailing maintenance unavailable; continuing inference.", outcome: "error" });
94376
+ }
94181
94377
  let providerResult;
94182
94378
  try {
94183
94379
  providerResult = options.invokeProvider ? await options.invokeProvider(providerInput) : await invokeOpenAiCompatibleProvider(providerInput, fetchImpl);
@@ -94227,10 +94423,7 @@ function createHeadlessLocalWorker(options) {
94227
94423
  }
94228
94424
  throw error48;
94229
94425
  }
94230
- const symbol2 = requireText(prompt.symbol ?? metadata.symbol, "symbol");
94231
- const timeframe = requireText(prompt.timeframe ?? metadata.timeframe, "timeframe");
94232
94426
  const providerDecision = extractDecisionPayload(providerResult.content, symbol2);
94233
- const secrets = objectOrNull3(input.secrets) ?? {};
94234
94427
  const normalizedUsage = normalizeRuntimeUsageDetails(providerResult.usage);
94235
94428
  const detailedUsage = {
94236
94429
  ...normalizedUsage,
@@ -94305,7 +94498,7 @@ function createHeadlessLocalWorker(options) {
94305
94498
  "Increase Position Tradability minimum"
94306
94499
  );
94307
94500
  const holdHasProtectiveWork = hasClientRuntimeProtectionState(input.profileId, symbol2);
94308
- const candidateHyperliquidContext = (providerDecision.decision === "HOLD" || providerDecision.units <= 0) && !holdHasProtectiveWork ? null : await fetchLocalHyperliquidSnapshot({
94501
+ const candidateHyperliquidContext = (providerDecision.decision === "HOLD" || providerDecision.units <= 0) && !holdHasProtectiveWork ? null : preparedHyperliquidContext ?? await fetchLocalHyperliquidSnapshot({
94309
94502
  client: options.client,
94310
94503
  profileId: input.profileId,
94311
94504
  llmConfig,
@@ -94451,7 +94644,8 @@ function createHeadlessLocalWorker(options) {
94451
94644
  config: buildHeadlessExchangeConfig(llmConfig),
94452
94645
  decision: accepted.decision,
94453
94646
  units: accepted.units,
94454
- executionContext: localHyperliquidContext.executionContext
94647
+ executionContext: localHyperliquidContext.executionContext,
94648
+ skipTrailingMaintenance: preparedHyperliquidContext !== null
94455
94649
  });
94456
94650
  return {
94457
94651
  ...baseTradeSync,
@@ -94470,6 +94664,8 @@ var init_headless_local_worker = __esm({
94470
94664
  init_define_VTX_EXO_POLICY();
94471
94665
  init_define_VTX_GROK_POLICY();
94472
94666
  init_define_VTX_PI_MODEL_POLICY();
94667
+ init_network_debug();
94668
+ init_sl_tp_execution_settings();
94473
94669
  init_hyperliquid_account_state_adapter();
94474
94670
  init_hyperliquid_market_symbol();
94475
94671
  init_runtime_execution();