@vtxmacro/cli 2026.10.20 → 2026.10.21

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
@@ -113,7 +113,7 @@ var init_routing = __esm({
113
113
  var agent_cli_release_default;
114
114
  var init_agent_cli_release = __esm({
115
115
  "agent-cli-release.json"() {
116
- agent_cli_release_default = { package_name: "@vtxmacro/cli", package_version: "2026.10.20", codex_package_name: "@openai/codex", codex_version: "0.155.0", copilot_sdk_package_name: "@github/copilot-sdk", copilot_sdk_version: "1.0.0-beta.8", copilot_cli_package_name: "@github/copilot", copilot_cli_version: "1.0.80", deepseek_harness_version: "0.1.1-rc.2", deepseek_harness_packages: ["@deepseek-ai/dsh-agent", "@deepseek-ai/dsh-agent-instructions", "@deepseek-ai/dsh-agent-loop", "@deepseek-ai/dsh-agent-spine-demo", "@deepseek-ai/dsh-anonymous-user-id", "@deepseek-ai/dsh-atomic-write", "@deepseek-ai/dsh-attachment", "@deepseek-ai/dsh-brand", "@deepseek-ai/dsh-code-runtime", "@deepseek-ai/dsh-credentials", "@deepseek-ai/dsh-fs", "@deepseek-ai/dsh-goal", "@deepseek-ai/dsh-goal-round-driver", "@deepseek-ai/dsh-home-paths", "@deepseek-ai/dsh-invariants", "@deepseek-ai/dsh-jobs", "@deepseek-ai/dsh-jobs-local", "@deepseek-ai/dsh-launch-environment", "@deepseek-ai/dsh-llm", "@deepseek-ai/dsh-llm-deepseek", "@deepseek-ai/dsh-llm-retry", "@deepseek-ai/dsh-output-retention", "@deepseek-ai/dsh-sandbox", "@deepseek-ai/dsh-sandbox-policy", "@deepseek-ai/dsh-scope", "@deepseek-ai/dsh-session", "@deepseek-ai/dsh-session-checkpoint-policy", "@deepseek-ai/dsh-session-persistence", "@deepseek-ai/dsh-session-persistence-jsonl", "@deepseek-ai/dsh-session-projection", "@deepseek-ai/dsh-session-title", "@deepseek-ai/dsh-settings", "@deepseek-ai/dsh-shell", "@deepseek-ai/dsh-shell-env", "@deepseek-ai/dsh-skill", "@deepseek-ai/dsh-skill-filesystem", "@deepseek-ai/dsh-subprocess", "@deepseek-ai/dsh-system-prompt", "@deepseek-ai/dsh-timeout", "@deepseek-ai/dsh-tool-bash", "@deepseek-ai/dsh-tool-goal", "@deepseek-ai/dsh-tool-jobs", "@deepseek-ai/dsh-tool-skill", "@deepseek-ai/dsh-tools", "@deepseek-ai/dsh-typert-protocol", "@deepseek-ai/dsh-user-approval"], deepseek_cordis_package_name: "@deepseek-ai/cordis", deepseek_cordis_version: "4.0.1", deepseek_support_packages: { "@deepseek-ai/cordis-plugin-timer": "1.1.3" }, platforms: { "linux-x64": { package_name: "@openai/codex-linux-x64", target: "x86_64-unknown-linux-musl", binary_name: "codex", sha256: "660e159a49e823ac8e5986cb238f73158ce4b957d40d9292f8de90862644b501" }, "win32-x64": { package_name: "@openai/codex-win32-x64", target: "x86_64-pc-windows-msvc", binary_name: "codex.exe", sha256: "e4c11374bd9de8ad5c3b7617fd4654bb7839901edb0863f9930666863c7a021b" } }, pi_coding_agent_package_name: "@earendil-works/pi-coding-agent", pi_ai_package_name: "@earendil-works/pi-ai", pi_version: "0.85.1", pi_support_packages: ["@earendil-works/pi-agent-core", "@earendil-works/pi-telemetry", "@earendil-works/pi-tui", "@earendil-works/chord"], grok_version: "1.0.30", grok_platforms: { "linux-x64": { package_name: "@xai-official/grok-linux-x64", binary_name: "grok", sha256: "504dd6546ab991b75d36698242875ce461489cd1f8cd84285873cb55bd5c7d54" }, "win32-x64": { package_name: "@xai-official/grok-win32-x64", binary_name: "grok.exe", sha256: "48736d1a4342a801ea26d0ecde4c516b653f791399065adaa55973f83abd8867" } } };
116
+ agent_cli_release_default = { package_name: "@vtxmacro/cli", package_version: "2026.10.21", codex_package_name: "@openai/codex", codex_version: "0.155.0", copilot_sdk_package_name: "@github/copilot-sdk", copilot_sdk_version: "1.0.0-beta.8", copilot_cli_package_name: "@github/copilot", copilot_cli_version: "1.0.80", deepseek_harness_version: "0.1.1-rc.2", deepseek_harness_packages: ["@deepseek-ai/dsh-agent", "@deepseek-ai/dsh-agent-instructions", "@deepseek-ai/dsh-agent-loop", "@deepseek-ai/dsh-agent-spine-demo", "@deepseek-ai/dsh-anonymous-user-id", "@deepseek-ai/dsh-atomic-write", "@deepseek-ai/dsh-attachment", "@deepseek-ai/dsh-brand", "@deepseek-ai/dsh-code-runtime", "@deepseek-ai/dsh-credentials", "@deepseek-ai/dsh-fs", "@deepseek-ai/dsh-goal", "@deepseek-ai/dsh-goal-round-driver", "@deepseek-ai/dsh-home-paths", "@deepseek-ai/dsh-invariants", "@deepseek-ai/dsh-jobs", "@deepseek-ai/dsh-jobs-local", "@deepseek-ai/dsh-launch-environment", "@deepseek-ai/dsh-llm", "@deepseek-ai/dsh-llm-deepseek", "@deepseek-ai/dsh-llm-retry", "@deepseek-ai/dsh-output-retention", "@deepseek-ai/dsh-sandbox", "@deepseek-ai/dsh-sandbox-policy", "@deepseek-ai/dsh-scope", "@deepseek-ai/dsh-session", "@deepseek-ai/dsh-session-checkpoint-policy", "@deepseek-ai/dsh-session-persistence", "@deepseek-ai/dsh-session-persistence-jsonl", "@deepseek-ai/dsh-session-projection", "@deepseek-ai/dsh-session-title", "@deepseek-ai/dsh-settings", "@deepseek-ai/dsh-shell", "@deepseek-ai/dsh-shell-env", "@deepseek-ai/dsh-skill", "@deepseek-ai/dsh-skill-filesystem", "@deepseek-ai/dsh-subprocess", "@deepseek-ai/dsh-system-prompt", "@deepseek-ai/dsh-timeout", "@deepseek-ai/dsh-tool-bash", "@deepseek-ai/dsh-tool-goal", "@deepseek-ai/dsh-tool-jobs", "@deepseek-ai/dsh-tool-skill", "@deepseek-ai/dsh-tools", "@deepseek-ai/dsh-typert-protocol", "@deepseek-ai/dsh-user-approval"], deepseek_cordis_package_name: "@deepseek-ai/cordis", deepseek_cordis_version: "4.0.1", deepseek_support_packages: { "@deepseek-ai/cordis-plugin-timer": "1.1.3" }, platforms: { "linux-x64": { package_name: "@openai/codex-linux-x64", target: "x86_64-unknown-linux-musl", binary_name: "codex", sha256: "660e159a49e823ac8e5986cb238f73158ce4b957d40d9292f8de90862644b501" }, "win32-x64": { package_name: "@openai/codex-win32-x64", target: "x86_64-pc-windows-msvc", binary_name: "codex.exe", sha256: "e4c11374bd9de8ad5c3b7617fd4654bb7839901edb0863f9930666863c7a021b" } }, pi_coding_agent_package_name: "@earendil-works/pi-coding-agent", pi_ai_package_name: "@earendil-works/pi-ai", pi_version: "0.85.1", pi_support_packages: ["@earendil-works/pi-agent-core", "@earendil-works/pi-telemetry", "@earendil-works/pi-tui", "@earendil-works/chord"], grok_version: "1.0.30", grok_platforms: { "linux-x64": { package_name: "@xai-official/grok-linux-x64", binary_name: "grok", sha256: "504dd6546ab991b75d36698242875ce461489cd1f8cd84285873cb55bd5c7d54" }, "win32-x64": { package_name: "@xai-official/grok-win32-x64", binary_name: "grok.exe", sha256: "48736d1a4342a801ea26d0ecde4c516b653f791399065adaa55973f83abd8867" } } };
117
117
  }
118
118
  });
119
119
 
@@ -514,7 +514,6 @@ var init_runtime_policy_generated = __esm({
514
514
  hidden_ticker_update_interval_ms: 16,
515
515
  client_close_fill_sync_attempts: 3,
516
516
  client_close_fill_sync_retry_step_ms: 300,
517
- leverage_update_debounce_ms: 250,
518
517
  post_leverage_update_order_delay_ms: 250,
519
518
  takeover_telemetry_error_chars: 500,
520
519
  takeover_telemetry_error_name_chars: 120,
@@ -658,7 +657,8 @@ var init_runtime_policy_generated = __esm({
658
657
  debug_event_lines: 120
659
658
  },
660
659
  help_page: {
661
- hash_scroll_settle_ms: 250
660
+ hash_scroll_settle_ms: 250,
661
+ app_docs_retry_seconds: 3
662
662
  },
663
663
  history_page: {
664
664
  preferences_save_debounce_ms: 500,
@@ -1340,7 +1340,8 @@ var init_runtime_policy_generated = __esm({
1340
1340
  app_host: {
1341
1341
  profiles_refresh_interval_seconds: 60,
1342
1342
  running_report_interval_seconds: 5,
1343
- page_identity_retry_seconds: 5,
1343
+ page_start_wait_seconds: 45,
1344
+ page_start_poll_seconds: 1,
1344
1345
  profiles_read_timeout_seconds: 30
1345
1346
  }
1346
1347
  },
@@ -1465,7 +1466,7 @@ var init_runtime_policy_generated = __esm({
1465
1466
  });
1466
1467
 
1467
1468
  // lib/constants.ts
1468
- var MS_PER_SECOND, SECONDS_PER_MINUTE, MINUTES_PER_HOUR, HOURS_PER_DAY, DAYS_PER_WEEK, MS_PER_MINUTE, SECONDS_PER_HOUR, SECONDS_PER_DAY, SECONDS_PER_WEEK, MINUTES_PER_DAY, MINUTES_PER_WEEK, MS_PER_HOUR, MS_PER_DAY, READ_STAMP_TIE_MS, READ_STAMP_STEP_BACK_MS, CLOCK_FIELD_DIGITS, BACKOFF_GROWTH_FACTOR, BYTES_PER_KIB, BYTES_PER_MIB, BITS_PER_BYTE, BYTE_MASK, OWNER_ONLY_FILE_MODE, OWNER_ONLY_DIRECTORY_MODE, GROUP_OTHER_PERMISSION_BITS, DECIMAL_RADIX, HEX_RADIX, BASE36_RADIX, BYTE_HEX_DIGITS, UINT32_HEX_DIGITS, RANDOM_FRACTION_PREFIX_LENGTH, PERCENT_SCALE, MIDPOINT_DIVISOR, SQUARE_EXPONENT, FNV1A_32_OFFSET_BASIS, FNV1A_32_PRIME, JSON_INDENT_SPACES, INT32_MIN, INT32_MAX, SET_TIMEOUT_MAX_DELAY_MS, POSITION_SIZE_EPSILON, CANDLE_TIMEFRAME_SECONDS, HTTP_STATUS, HTTP_STATUS_MIN, HTTP_STATUS_MAX, HTTP_CLIENT_ERROR_MIN, HTTP_SERVER_ERROR_MIN, USD_DISPLAY_DECIMALS, AI_COST_ESTIMATE_PERIOD_DAYS, SECONDS_PER_AI_COST_ESTIMATE_PERIOD, DATE_FIELD_DIGITS, EXTERNAL_INFERENCE_LIMITS, NODE_ARGV_COMMAND_ARGS_START, EXIT_CODE_TEMPFAIL, SHA256_INITIAL_STATE, SHA256_ROUND_CONSTANTS, SHA256, UINT64_HIGH_WORD_DIVISOR, CANONICAL_BASE64URL, INFERENCE_ENVELOPE_CRYPTO, EXTERNAL_INFERENCE_SCHEMA_BOUNDS, JSON_RPC_ERROR_CODES, INFERENCE_MCP_SCHEMA_PROBE_MAX_DEPTH, INFERENCE_HOST_PROCESS_LOCK_RECORD_SCHEMA_VERSION, INFERENCE_HOST_RECLAIM_GUARD_CREATE_PASSES, LINUX_PROC_STAT_COMM_TERMINATOR_CHARS, INFERENCE_HOST_RANDOM_BYTES, INFERENCE_OAUTH_TOKEN_MAX_LENGTH, INFERENCE_CREDENTIAL_WINDOWS_NOT_FOUND_EXIT_CODE, MACOS_SECURITY_ITEM_NOT_FOUND_EXIT_CODE, INFERENCE_CREDENTIAL_LABEL_ACCOUNT_KEY_CHARS, INFERENCE_HOST_STABLE_OPERATION_ID_HASH_CHARS, INFERENCE_HOST_DRAIN_PRIORITY, INFERENCE_JOB_CLAIM_SCHEMA_VERSION, INFERENCE_HOST_WINDOWS_TASK_IDENTITY_MAX_CHARS, INFERENCE_HOST_OWNER_ONLY_EXECUTABLE_MODE, WINDOWS_TASKKILL_PROCESS_NOT_FOUND_EXIT_CODE, INFERENCE_HOST_CLI_MAX_SERVICE_POSITIONALS, INFERENCE_HOST_CLI_MAX_COMMAND_POSITIONALS, INFERENCE_HOST_DISPLAY_NAME_MAX_CHARS, INFERENCE_HOST_REVOCATION_CHECKPOINT_MAX_CHARS, INFERENCE_HOST_MODEL_ID_MAX_CHARS, CODEX_RECOVERY_RECEIPT_MAX_CHARS, CODEX_HOSTED_ATTEMPT_PATH_SEGMENTS, CODEX_GUARDIAN_PROCESS_TOKEN_BYTES, CODEX_RATE_LIMIT_EXHAUSTED_PERCENT, INFERENCE_HOST_PROXY_TOKEN_BYTES, GROK_TOOL_SERVER_TOKEN_BYTES, GROK_NATIVE_SESSION_GROUP_NAME_MAX_CHARS, GROK_POLICY_TRANSPORT_MAX_BYTES, EXO_POLICY_MAX_TOOL_ROUNDS, EXO_POLICY_MAX_MODELS, EXO_POLICY_MODEL_NAME_MAX_CHARS, EXO_RUNTIME_VERSION_COMMIT_CHARS, PI_QUALIFIED_MODEL_ID_MAX_CHARS, PI_STRUCTURED_OUTPUT_MAX_DEPTH, PI_STRUCTURED_OUTPUT_MAX_PROPERTIES, INFERENCE_HOST_API_KEY_MIN_CHARS, INFERENCE_HOST_API_KEY_MAX_BYTES, INFERENCE_HOST_API_KEY_IDENTITY_HEX_CHARS, DEEPSEEK_HARNESS_NODE_LTS_MAJOR, DEEPSEEK_HARNESS_NODE_LTS_MIN_MINOR, DEEPSEEK_HARNESS_NODE_CURRENT_MAJOR, PROMPT_FIXED_DIGITS, PROMPT_SIGNIFICANT_DIGITS, PROMPT_NUMBER_MAX_DIGITS, PROMPT_PRICE_INTEGER_THRESHOLD, PROMPT_MARGIN_UTILIZATION_DECIMALS, PROMPT_SYMBOL_MAX_CHARS, PROMPT_PARTIAL_UNIT_ROUND_UP_FRACTION, HALF_UP_ROUNDING_OFFSET, PROMPT_ENTRY_PRICE_MATCH_ABS_TOLERANCE, PROMPT_ENTRY_PRICE_MATCH_REL_TOLERANCE, DECISION_OUTPUT_EXAMPLE_TRADABILITY, INDICATOR_RSI_PERIOD, INDICATOR_ATR_PERIOD, INDICATOR_MACD_FAST_PERIOD, INDICATOR_MACD_SLOW_PERIOD, INDICATOR_MACD_SIGNAL_PERIOD, INDICATOR_BOLLINGER_PERIOD, INDICATOR_BOLLINGER_STD_DEV, INDICATOR_OSCILLATOR_MAX, EMA_SMOOTHING_NUMERATOR, PROMPT_EMA_PERIODS, JSON_UNICODE_ESCAPE_PREFIX_LENGTH, JSON_UNICODE_ESCAPE_HEX_DIGITS, JSON_CONTROL_CHARACTER_MAX, RUNTIME_DEBUG_SNIPPET_CHARS, RUNTIME_DEBUG_PROMPT_SNIPPET_CHARS, RUNTIME_DEBUG_TOKEN_PREFIX_CHARS, RUNTIME_DEBUG_USD_DECIMALS, REVIEW_FAILURE_DETAIL_MAX_CHARS, RUNTIME_LATENCY_SECONDS_DECIMALS, AI_SCHEDULE_CLOCK_PARTS, ESTIMATED_CHARS_PER_TOKEN, PROVIDER_ERROR_RAW_TEXT_MAX_CHARS, AI_CALL_COST_DECIMALS, PROVIDER_DIAGNOSTIC_LIMITS, AI_INVOCATION_CONTRACT_VERSION, AI_INVOCATION_TELEMETRY_LIMITS, PROVIDER_USAGE_DETAIL_LIMITS, HYPERLIQUID_EXCHANGE_SPECIFICATION, HYPERLIQUID_TPSL_BATCH_MIN_ORDERS, HYPERLIQUID_USER_FILLS_PROVIDER_PAGE_CAP, HYPERLIQUID_ROW_WEIGHTED_INFO_REQUESTS, HYPERLIQUID_INFO_ROWS_PER_EXTRA_WEIGHT, HYPERLIQUID_META_AND_ASSET_CTXS_PARTS, HYPERLIQUID_SIDE_PAIR_LENGTH, HYPERLIQUID_SIGNED_SIZE_MATCH_EXTRA_DECIMALS, HYPERLIQUID_OPEN_ORDERS_MAX_NESTING_DEPTH, ACCOUNT_PAYLOAD_MODE_SEARCH_MAX_DEPTH, HYPERLIQUID_ACCOUNT_ROUNDING_DECIMALS, HYPERLIQUID_UNREALIZED_PNL_ZERO_TOLERANCE, HYPERLIQUID_MAX_DEPLOYER_FEE_SCALE, HYPERLIQUID_DEPLOYER_FEE_SCALE_MULTIPLIER, HYPERLIQUID_GROWTH_MODE_FEE_FACTOR, HYPERLIQUID_ALIGNED_QUOTE_NON_DEPLOYER_FEE_FACTOR, HYPERLIQUID_CLOSE_SIZE_RELATIVE_TOLERANCE, HYPERLIQUID_POSITION_SIZE_MATCH_ABS_TOLERANCE, HYPERLIQUID_POSITION_SIZE_MATCH_RELATIVE_TOLERANCE, HYPERLIQUID_LOT_FLOOR_NOISE_DECIMALS, HYPERLIQUID_RECOVERY_BACKOFF_MAX_EXPONENT, HYPERLIQUID_RECOVERY_CONCURRENCY_GROWTH_FACTOR, UUID_BYTES, UUID_HEX_GROUP_ENDS, MSGPACK, CLIENT_RUNTIME_DEFAULT_RETRY_SECONDS, CLIENT_RUNTIME_PROVIDER_ATTEMPT_SUMMARY_MAX_CHARS, CLIENT_RUNTIME_HL_REQUEST_TYPE_MAX_CHARS, CLIENT_RUNTIME_DRAWDOWN_DEBUG_DECIMALS, CLIENT_PROTECTIVE_GROUP_VERSION, CLIENT_PROTECTIVE_TPSL_PAIR_LEGS, CLIENT_PROTECTIVE_FILL_MATCH_ABS_TOLERANCE, CLIENT_PROTECTIVE_FILL_MATCH_REL_TOLERANCE, CLIENT_CLOSE_FILL_EPSILON_ULPS, COPY_TRADING_SIZE_EPSILON, COPY_TRADING_RELATIVE_SIZE_TOLERANCE, COPY_TRADING_NOTIONAL_CAP_TOLERANCE_USD, CLIENT_ACCOUNT_PNL_NONZERO_MIN_USD, RUNTIME_PORTFOLIO_PERIOD_ENTRY_LENGTH, CLIENT_EXCHANGE_RECONCILIATION_MAX_DELAY_MS, RFC1918_172_BLOCK_SECOND_OCTET, AGENT_CLI_TAKEOVER_REQUIRED_EXIT_CODE, EXIT_CODE_INTERRUPTED, EXIT_CODE_SIGNAL_BASE, BYOK_PROVIDER_DISPLAY_ORDER_STEP, TOKENS_PER_MILLION, RENDER_DEBUG_ID_RANDOM_CHARS;
1469
+ var MS_PER_SECOND, SECONDS_PER_MINUTE, MINUTES_PER_HOUR, HOURS_PER_DAY, DAYS_PER_WEEK, MS_PER_MINUTE, SECONDS_PER_HOUR, SECONDS_PER_DAY, SECONDS_PER_WEEK, MINUTES_PER_DAY, MINUTES_PER_WEEK, MS_PER_HOUR, MS_PER_DAY, READ_STAMP_TIE_MS, READ_STAMP_STEP_BACK_MS, CLOCK_FIELD_DIGITS, BACKOFF_GROWTH_FACTOR, BYTES_PER_KIB, BYTES_PER_MIB, BITS_PER_BYTE, BYTE_MASK, OWNER_ONLY_FILE_MODE, OWNER_ONLY_DIRECTORY_MODE, GROUP_OTHER_PERMISSION_BITS, DECIMAL_RADIX, HEX_RADIX, BASE36_RADIX, BYTE_HEX_DIGITS, UINT32_HEX_DIGITS, RANDOM_FRACTION_PREFIX_LENGTH, PERCENT_SCALE, MIDPOINT_DIVISOR, SQUARE_EXPONENT, FNV1A_32_OFFSET_BASIS, FNV1A_32_PRIME, JSON_INDENT_SPACES, INT32_MIN, INT32_MAX, SET_TIMEOUT_MAX_DELAY_MS, POSITION_SIZE_EPSILON, CANDLE_TIMEFRAME_SECONDS, HTTP_STATUS, HTTP_STATUS_MIN, HTTP_STATUS_MAX, HTTP_CLIENT_ERROR_MIN, HTTP_SERVER_ERROR_MIN, PROMPT_RESCUE_ASKS_PER_CYCLE_BUILD, USD_DISPLAY_DECIMALS, AI_COST_ESTIMATE_PERIOD_DAYS, SECONDS_PER_AI_COST_ESTIMATE_PERIOD, DATE_FIELD_DIGITS, EXTERNAL_INFERENCE_LIMITS, NODE_ARGV_COMMAND_ARGS_START, EXIT_CODE_TEMPFAIL, SHA256_INITIAL_STATE, SHA256_ROUND_CONSTANTS, SHA256, UINT64_HIGH_WORD_DIVISOR, CANONICAL_BASE64URL, INFERENCE_ENVELOPE_CRYPTO, EXTERNAL_INFERENCE_SCHEMA_BOUNDS, JSON_RPC_ERROR_CODES, INFERENCE_MCP_SCHEMA_PROBE_MAX_DEPTH, INFERENCE_HOST_PROCESS_LOCK_RECORD_SCHEMA_VERSION, INFERENCE_HOST_RECLAIM_GUARD_CREATE_PASSES, LINUX_PROC_STAT_COMM_TERMINATOR_CHARS, INFERENCE_HOST_RANDOM_BYTES, INFERENCE_OAUTH_TOKEN_MAX_LENGTH, INFERENCE_CREDENTIAL_WINDOWS_NOT_FOUND_EXIT_CODE, MACOS_SECURITY_ITEM_NOT_FOUND_EXIT_CODE, INFERENCE_CREDENTIAL_LABEL_ACCOUNT_KEY_CHARS, INFERENCE_HOST_STABLE_OPERATION_ID_HASH_CHARS, INFERENCE_HOST_DRAIN_PRIORITY, INFERENCE_JOB_CLAIM_SCHEMA_VERSION, INFERENCE_HOST_WINDOWS_TASK_IDENTITY_MAX_CHARS, INFERENCE_HOST_OWNER_ONLY_EXECUTABLE_MODE, WINDOWS_TASKKILL_PROCESS_NOT_FOUND_EXIT_CODE, INFERENCE_HOST_CLI_MAX_SERVICE_POSITIONALS, INFERENCE_HOST_CLI_MAX_COMMAND_POSITIONALS, INFERENCE_HOST_DISPLAY_NAME_MAX_CHARS, INFERENCE_HOST_REVOCATION_CHECKPOINT_MAX_CHARS, INFERENCE_HOST_MODEL_ID_MAX_CHARS, CODEX_RECOVERY_RECEIPT_MAX_CHARS, CODEX_HOSTED_ATTEMPT_PATH_SEGMENTS, CODEX_GUARDIAN_PROCESS_TOKEN_BYTES, CODEX_RATE_LIMIT_EXHAUSTED_PERCENT, INFERENCE_HOST_PROXY_TOKEN_BYTES, GROK_TOOL_SERVER_TOKEN_BYTES, GROK_NATIVE_SESSION_GROUP_NAME_MAX_CHARS, GROK_POLICY_TRANSPORT_MAX_BYTES, EXO_POLICY_MAX_TOOL_ROUNDS, EXO_POLICY_MAX_MODELS, EXO_POLICY_MODEL_NAME_MAX_CHARS, EXO_RUNTIME_VERSION_COMMIT_CHARS, PI_QUALIFIED_MODEL_ID_MAX_CHARS, PI_STRUCTURED_OUTPUT_MAX_DEPTH, PI_STRUCTURED_OUTPUT_MAX_PROPERTIES, INFERENCE_HOST_API_KEY_MIN_CHARS, INFERENCE_HOST_API_KEY_MAX_BYTES, INFERENCE_HOST_API_KEY_IDENTITY_HEX_CHARS, DEEPSEEK_HARNESS_NODE_LTS_MAJOR, DEEPSEEK_HARNESS_NODE_LTS_MIN_MINOR, DEEPSEEK_HARNESS_NODE_CURRENT_MAJOR, PROMPT_FIXED_DIGITS, PROMPT_SIGNIFICANT_DIGITS, PROMPT_NUMBER_MAX_DIGITS, PROMPT_RELATIVE_VOLUME_DIGITS, BINARY_RADIX, PROMPT_PRICE_INTEGER_THRESHOLD, PROMPT_MARGIN_UTILIZATION_DECIMALS, PROMPT_SYMBOL_MAX_CHARS, PROMPT_PARTIAL_UNIT_ROUND_UP_FRACTION, HALF_UP_ROUNDING_OFFSET, PROMPT_ENTRY_PRICE_MATCH_ABS_TOLERANCE, PROMPT_ENTRY_PRICE_MATCH_REL_TOLERANCE, DECISION_OUTPUT_EXAMPLE_TRADABILITY, INDICATOR_RSI_PERIOD, INDICATOR_ATR_PERIOD, INDICATOR_MACD_FAST_PERIOD, INDICATOR_MACD_SLOW_PERIOD, INDICATOR_MACD_SIGNAL_PERIOD, INDICATOR_BOLLINGER_PERIOD, INDICATOR_BOLLINGER_STD_DEV, INDICATOR_OSCILLATOR_MAX, EMA_SMOOTHING_NUMERATOR, PROMPT_EMA_PERIODS, JSON_UNICODE_ESCAPE_PREFIX_LENGTH, JSON_UNICODE_ESCAPE_HEX_DIGITS, JSON_CONTROL_CHARACTER_MAX, RUNTIME_DEBUG_SNIPPET_CHARS, RUNTIME_DEBUG_PROMPT_SNIPPET_CHARS, RUNTIME_DEBUG_TOKEN_PREFIX_CHARS, RUNTIME_DEBUG_USD_DECIMALS, REVIEW_FAILURE_DETAIL_MAX_CHARS, RUNTIME_LATENCY_SECONDS_DECIMALS, AI_SCHEDULE_CLOCK_PARTS, ESTIMATED_CHARS_PER_TOKEN, PROVIDER_ERROR_RAW_TEXT_MAX_CHARS, AI_CALL_COST_DECIMALS, PROVIDER_DIAGNOSTIC_LIMITS, AI_INVOCATION_CONTRACT_VERSION, AI_INVOCATION_TELEMETRY_LIMITS, PROVIDER_USAGE_DETAIL_LIMITS, HYPERLIQUID_EXCHANGE_SPECIFICATION, HYPERLIQUID_TPSL_BATCH_MIN_ORDERS, HYPERLIQUID_USER_FILLS_PROVIDER_PAGE_CAP, HYPERLIQUID_ROW_WEIGHTED_INFO_REQUESTS, HYPERLIQUID_INFO_ROWS_PER_EXTRA_WEIGHT, HYPERLIQUID_META_AND_ASSET_CTXS_PARTS, HYPERLIQUID_SIDE_PAIR_LENGTH, HYPERLIQUID_SIGNED_SIZE_MATCH_EXTRA_DECIMALS, HYPERLIQUID_OPEN_ORDERS_MAX_NESTING_DEPTH, ACCOUNT_PAYLOAD_MODE_SEARCH_MAX_DEPTH, HYPERLIQUID_ACCOUNT_ROUNDING_DECIMALS, HYPERLIQUID_UNREALIZED_PNL_ZERO_TOLERANCE, HYPERLIQUID_MAX_DEPLOYER_FEE_SCALE, HYPERLIQUID_DEPLOYER_FEE_SCALE_MULTIPLIER, HYPERLIQUID_GROWTH_MODE_FEE_FACTOR, HYPERLIQUID_ALIGNED_QUOTE_NON_DEPLOYER_FEE_FACTOR, HYPERLIQUID_CLOSE_SIZE_RELATIVE_TOLERANCE, HYPERLIQUID_POSITION_SIZE_MATCH_ABS_TOLERANCE, HYPERLIQUID_POSITION_SIZE_MATCH_RELATIVE_TOLERANCE, HYPERLIQUID_LOT_FLOOR_NOISE_DECIMALS, HYPERLIQUID_RECOVERY_BACKOFF_MAX_EXPONENT, HYPERLIQUID_RECOVERY_CONCURRENCY_GROWTH_FACTOR, UUID_BYTES, UUID_HEX_GROUP_ENDS, MSGPACK, CLIENT_RUNTIME_DEFAULT_RETRY_SECONDS, CLIENT_RUNTIME_PROVIDER_ATTEMPT_SUMMARY_MAX_CHARS, CLIENT_RUNTIME_HL_REQUEST_TYPE_MAX_CHARS, CLIENT_RUNTIME_DRAWDOWN_DEBUG_DECIMALS, CLIENT_PROTECTIVE_GROUP_VERSION, CLIENT_PROTECTIVE_TPSL_PAIR_LEGS, CLIENT_PROTECTIVE_FILL_MATCH_ABS_TOLERANCE, CLIENT_PROTECTIVE_FILL_MATCH_REL_TOLERANCE, CLIENT_CLOSE_FILL_EPSILON_ULPS, COPY_TRADING_SIZE_EPSILON, COPY_TRADING_RELATIVE_SIZE_TOLERANCE, COPY_TRADING_NOTIONAL_CAP_TOLERANCE_USD, CLIENT_ACCOUNT_PNL_NONZERO_MIN_USD, RUNTIME_PORTFOLIO_PERIOD_ENTRY_LENGTH, CLIENT_EXCHANGE_RECONCILIATION_MAX_DELAY_MS, RFC1918_172_BLOCK_SECOND_OCTET, AGENT_CLI_TAKEOVER_REQUIRED_EXIT_CODE, EXIT_CODE_INTERRUPTED, EXIT_CODE_SIGNAL_BASE, BYOK_PROVIDER_DISPLAY_ORDER_STEP, TOKENS_PER_MILLION, RENDER_DEBUG_ID_RANDOM_CHARS;
1469
1470
  var init_constants = __esm({
1470
1471
  "lib/constants.ts"() {
1471
1472
  "use strict";
@@ -1558,6 +1559,7 @@ var init_constants = __esm({
1558
1559
  HTTP_STATUS_MAX = 599;
1559
1560
  HTTP_CLIENT_ERROR_MIN = 400;
1560
1561
  HTTP_SERVER_ERROR_MIN = 500;
1562
+ PROMPT_RESCUE_ASKS_PER_CYCLE_BUILD = 2;
1561
1563
  USD_DISPLAY_DECIMALS = 2;
1562
1564
  AI_COST_ESTIMATE_PERIOD_DAYS = 30;
1563
1565
  SECONDS_PER_AI_COST_ESTIMATE_PERIOD = SECONDS_PER_DAY * AI_COST_ESTIMATE_PERIOD_DAYS;
@@ -1830,6 +1832,8 @@ var init_constants = __esm({
1830
1832
  PROMPT_FIXED_DIGITS = 2;
1831
1833
  PROMPT_SIGNIFICANT_DIGITS = 5;
1832
1834
  PROMPT_NUMBER_MAX_DIGITS = 100;
1835
+ PROMPT_RELATIVE_VOLUME_DIGITS = 2;
1836
+ BINARY_RADIX = 2;
1833
1837
  PROMPT_PRICE_INTEGER_THRESHOLD = 1e5;
1834
1838
  PROMPT_MARGIN_UTILIZATION_DECIMALS = 1;
1835
1839
  PROMPT_SYMBOL_MAX_CHARS = 100;
@@ -20328,7 +20332,6 @@ var init_runtime_policy_generated2 = __esm({
20328
20332
  hidden_ticker_update_interval_ms: 16,
20329
20333
  client_close_fill_sync_attempts: 3,
20330
20334
  client_close_fill_sync_retry_step_ms: 300,
20331
- leverage_update_debounce_ms: 250,
20332
20335
  post_leverage_update_order_delay_ms: 250,
20333
20336
  takeover_telemetry_error_chars: 500,
20334
20337
  takeover_telemetry_error_name_chars: 120,
@@ -20472,7 +20475,8 @@ var init_runtime_policy_generated2 = __esm({
20472
20475
  debug_event_lines: 120
20473
20476
  },
20474
20477
  help_page: {
20475
- hash_scroll_settle_ms: 250
20478
+ hash_scroll_settle_ms: 250,
20479
+ app_docs_retry_seconds: 3
20476
20480
  },
20477
20481
  history_page: {
20478
20482
  preferences_save_debounce_ms: 500,
@@ -21154,7 +21158,8 @@ var init_runtime_policy_generated2 = __esm({
21154
21158
  app_host: {
21155
21159
  profiles_refresh_interval_seconds: 60,
21156
21160
  running_report_interval_seconds: 5,
21157
- page_identity_retry_seconds: 5,
21161
+ page_start_wait_seconds: 45,
21162
+ page_start_poll_seconds: 1,
21158
21163
  profiles_read_timeout_seconds: 30
21159
21164
  }
21160
21165
  },
@@ -52886,6 +52891,66 @@ var init_protection_storage = __esm({
52886
52891
  }
52887
52892
  });
52888
52893
 
52894
+ // lib/android-app.ts
52895
+ var ANDROID_APP_PACKAGES, ANDROID_APP_REFERRER_SCHEME, ANDROID_APP_LAUNCH_STORAGE_KEY, ANDROID_APP_HOST_FRAGMENT_PARAM, knownLaunch, storedLaunch, referrerPackage, hostFragment, remember, androidAppLaunch, isAndroidAppPage;
52896
+ var init_android_app = __esm({
52897
+ "lib/android-app.ts"() {
52898
+ "use strict";
52899
+ init_define_VTX_EXO_POLICY();
52900
+ init_define_VTX_GROK_POLICY();
52901
+ init_define_VTX_PI_MODEL_POLICY();
52902
+ ANDROID_APP_PACKAGES = ["com.vtxmacro.android", "com.vtxmacro.android.debug"];
52903
+ ANDROID_APP_REFERRER_SCHEME = "android-app://";
52904
+ ANDROID_APP_LAUNCH_STORAGE_KEY = "vtx_android_app_launch";
52905
+ ANDROID_APP_HOST_FRAGMENT_PARAM = "vtx_app_host";
52906
+ storedLaunch = () => {
52907
+ try {
52908
+ const parsed = JSON.parse(window.sessionStorage.getItem(ANDROID_APP_LAUNCH_STORAGE_KEY) || "null");
52909
+ if (!parsed || !ANDROID_APP_PACKAGES.includes(parsed.packageName)) return null;
52910
+ return { packageName: parsed.packageName, hostDeviceId: typeof parsed.hostDeviceId === "string" ? parsed.hostDeviceId : null };
52911
+ } catch {
52912
+ return null;
52913
+ }
52914
+ };
52915
+ referrerPackage = () => {
52916
+ const referrer = document.referrer;
52917
+ if (!referrer.startsWith(ANDROID_APP_REFERRER_SCHEME)) return null;
52918
+ const packageName = referrer.slice(ANDROID_APP_REFERRER_SCHEME.length).replace(/\/$/, "");
52919
+ return ANDROID_APP_PACKAGES.includes(packageName) ? packageName : null;
52920
+ };
52921
+ hostFragment = () => new URLSearchParams(window.location.hash.replace(/^#/, "")).get(ANDROID_APP_HOST_FRAGMENT_PARAM);
52922
+ remember = (launch) => {
52923
+ knownLaunch = launch;
52924
+ try {
52925
+ window.sessionStorage.setItem(ANDROID_APP_LAUNCH_STORAGE_KEY, JSON.stringify(launch));
52926
+ } catch {
52927
+ }
52928
+ const fragment = new URLSearchParams(window.location.hash.replace(/^#/, ""));
52929
+ if (fragment.has(ANDROID_APP_HOST_FRAGMENT_PARAM)) {
52930
+ fragment.delete(ANDROID_APP_HOST_FRAGMENT_PARAM);
52931
+ const rest = fragment.toString();
52932
+ window.history.replaceState(window.history.state, "", `${window.location.pathname}${window.location.search}${rest ? `#${rest}` : ""}`);
52933
+ }
52934
+ return launch;
52935
+ };
52936
+ androidAppLaunch = () => {
52937
+ if (typeof window === "undefined") return null;
52938
+ if (knownLaunch !== void 0) {
52939
+ const named = knownLaunch && !knownLaunch.hostDeviceId ? hostFragment() : null;
52940
+ return named && knownLaunch ? remember({ ...knownLaunch, hostDeviceId: named }) : knownLaunch;
52941
+ }
52942
+ const stored = storedLaunch();
52943
+ const packageName = referrerPackage();
52944
+ if (!packageName) {
52945
+ knownLaunch = stored;
52946
+ return knownLaunch;
52947
+ }
52948
+ return remember({ packageName, hostDeviceId: hostFragment() || stored?.hostDeviceId || null });
52949
+ };
52950
+ isAndroidAppPage = () => androidAppLaunch() !== null;
52951
+ }
52952
+ });
52953
+
52889
52954
  // lib/api/browser-api-url.ts
52890
52955
  function resolveBrowserApiUrl(hostname3, protocol, publicApiUrl, development, privateSecondOctets) {
52891
52956
  if (development) {
@@ -53006,6 +53071,7 @@ var init_shared = __esm({
53006
53071
  init_define_VTX_EXO_POLICY();
53007
53072
  init_define_VTX_GROK_POLICY();
53008
53073
  init_define_VTX_PI_MODEL_POLICY();
53074
+ init_android_app();
53009
53075
  init_browser_api_url();
53010
53076
  init_runtime_policy_generated2();
53011
53077
  init_constants();
@@ -53181,6 +53247,7 @@ var init_shared = __esm({
53181
53247
  return `web-${action}-${suffix}`;
53182
53248
  };
53183
53249
  getErrorMessage = (error48, defaultMessage) => {
53250
+ if (typeof error48?.detail_in_android_app === "string" && isAndroidAppPage()) return error48.detail_in_android_app;
53184
53251
  const extractRateLimitMessage = (raw) => {
53185
53252
  if (!/rate\s*limit|429|cooling\s*down/i.test(raw)) return null;
53186
53253
  const match = raw.match(/cooling\s*down\s*for\s*([0-9]+(?:\.[0-9]+)?)s/i);
@@ -54864,40 +54931,6 @@ var init_client_host_commands = __esm({
54864
54931
  }
54865
54932
  });
54866
54933
 
54867
- // lib/api/insights-access-center.ts
54868
- var init_insights_access_center = __esm({
54869
- "lib/api/insights-access-center.ts"() {
54870
- "use strict";
54871
- init_define_VTX_EXO_POLICY();
54872
- init_define_VTX_GROK_POLICY();
54873
- init_define_VTX_PI_MODEL_POLICY();
54874
- init_shared();
54875
- }
54876
- });
54877
-
54878
- // lib/api/updates.ts
54879
- var init_updates = __esm({
54880
- "lib/api/updates.ts"() {
54881
- "use strict";
54882
- init_define_VTX_EXO_POLICY();
54883
- init_define_VTX_GROK_POLICY();
54884
- init_define_VTX_PI_MODEL_POLICY();
54885
- init_shared();
54886
- init_constants();
54887
- }
54888
- });
54889
-
54890
- // lib/api/profile-emoji.ts
54891
- var init_profile_emoji = __esm({
54892
- "lib/api/profile-emoji.ts"() {
54893
- "use strict";
54894
- init_define_VTX_EXO_POLICY();
54895
- init_define_VTX_GROK_POLICY();
54896
- init_define_VTX_PI_MODEL_POLICY();
54897
- init_shared();
54898
- }
54899
- });
54900
-
54901
54934
  // lib/runtime/host-storage.ts
54902
54935
  function configureRuntimeHostStorage(storage3) {
54903
54936
  configuredStorage = storage3;
@@ -55144,6 +55177,107 @@ var init_server_runtime_lease = __esm({
55144
55177
  }
55145
55178
  });
55146
55179
 
55180
+ // lib/api/logout.ts
55181
+ var init_logout = __esm({
55182
+ "lib/api/logout.ts"() {
55183
+ "use strict";
55184
+ init_define_VTX_EXO_POLICY();
55185
+ init_define_VTX_GROK_POLICY();
55186
+ init_define_VTX_PI_MODEL_POLICY();
55187
+ init_android_app();
55188
+ init_server_runtime_lease();
55189
+ init_shared();
55190
+ }
55191
+ });
55192
+
55193
+ // lib/api/insights-access-center.ts
55194
+ var init_insights_access_center = __esm({
55195
+ "lib/api/insights-access-center.ts"() {
55196
+ "use strict";
55197
+ init_define_VTX_EXO_POLICY();
55198
+ init_define_VTX_GROK_POLICY();
55199
+ init_define_VTX_PI_MODEL_POLICY();
55200
+ init_shared();
55201
+ }
55202
+ });
55203
+
55204
+ // lib/api/updates.ts
55205
+ var init_updates = __esm({
55206
+ "lib/api/updates.ts"() {
55207
+ "use strict";
55208
+ init_define_VTX_EXO_POLICY();
55209
+ init_define_VTX_GROK_POLICY();
55210
+ init_define_VTX_PI_MODEL_POLICY();
55211
+ init_shared();
55212
+ init_constants();
55213
+ }
55214
+ });
55215
+
55216
+ // lib/api/profile-emoji.ts
55217
+ var init_profile_emoji = __esm({
55218
+ "lib/api/profile-emoji.ts"() {
55219
+ "use strict";
55220
+ init_define_VTX_EXO_POLICY();
55221
+ init_define_VTX_GROK_POLICY();
55222
+ init_define_VTX_PI_MODEL_POLICY();
55223
+ init_shared();
55224
+ }
55225
+ });
55226
+
55227
+ // app/(app)/trade/tradeRefreshPolicy.ts
55228
+ function parseTradeRefreshPolicy(raw) {
55229
+ const source = raw && typeof raw === "object" ? raw : {};
55230
+ const parsed = {};
55231
+ for (const key of TRADE_REFRESH_POLICY_KEYS) {
55232
+ const value = Number(source[key]);
55233
+ if (!Number.isFinite(value) || value <= 0) {
55234
+ throw new Error(`Missing required runtime policy ui.trade_refresh_policy.${key}`);
55235
+ }
55236
+ parsed[key] = value;
55237
+ }
55238
+ if (parsed.account_read_backoff_min_ms > parsed.account_read_backoff_max_ms) {
55239
+ throw new Error("Invalid runtime policy ui.trade_refresh_policy: account_read_backoff_min_ms exceeds account_read_backoff_max_ms");
55240
+ }
55241
+ return parsed;
55242
+ }
55243
+ var TRADE_REFRESH_POLICY_KEYS, TRADE_REFRESH_POLICY;
55244
+ var init_tradeRefreshPolicy = __esm({
55245
+ "app/(app)/trade/tradeRefreshPolicy.ts"() {
55246
+ "use strict";
55247
+ init_define_VTX_EXO_POLICY();
55248
+ init_define_VTX_GROK_POLICY();
55249
+ init_define_VTX_PI_MODEL_POLICY();
55250
+ init_constants();
55251
+ init_runtime_policy_generated2();
55252
+ TRADE_REFRESH_POLICY_KEYS = [
55253
+ "server_config_stream_timeout_ms",
55254
+ "config_retry_interval_ms",
55255
+ "copy_trading_status_poll_ms",
55256
+ "post_execution_refresh_delay_ms",
55257
+ "account_read_backoff_min_ms",
55258
+ "account_read_backoff_max_ms",
55259
+ "account_read_backoff_exponent_max",
55260
+ "ai_start_grace_min_ms"
55261
+ ];
55262
+ TRADE_REFRESH_POLICY = parseTradeRefreshPolicy(
55263
+ runtime_policy_generated_default2.ui?.trade_refresh_policy
55264
+ );
55265
+ }
55266
+ });
55267
+
55268
+ // lib/api/account-summary.ts
55269
+ var init_account_summary = __esm({
55270
+ "lib/api/account-summary.ts"() {
55271
+ "use strict";
55272
+ init_define_VTX_EXO_POLICY();
55273
+ init_define_VTX_GROK_POLICY();
55274
+ init_define_VTX_PI_MODEL_POLICY();
55275
+ init_tradeRefreshPolicy();
55276
+ init_constants();
55277
+ init_shared();
55278
+ }
55279
+ });
55280
+
55147
55281
  // lib/runtime/hyperliquid-account-mode-contract.ts
55148
55282
  function resolveExactHyperliquidAccountMode(userAbstraction, ...dexEvidence) {
55149
55283
  const mode = extractCanonicalHyperliquidAccountMode(userAbstraction);
@@ -55744,7 +55878,7 @@ var init_hyperliquid_order_status = __esm({
55744
55878
  });
55745
55879
 
55746
55880
  // lib/runtime/hyperliquid-public-read.ts
55747
- var policy, weights, recoveryPolicy, budgets, unpersistedBudgets, cache, pending2, PREFIX, priorityRank, createHyperliquidPublicPriorityScope, promoteHyperliquidPublicPriority, hostTransport, abortError2, checkAbort, wait, waitUnlessPromoted, storage, loadBudget, saveBudget, withBudgetLock, HyperliquidPublicReadError, getHyperliquidPublicReadBudget, cooldownError, recoveryWaitError, nonTradingWeightCap, nonTradingWaitMs, fallbackDelayMs, admit, settleRowWeightedReservation, cooldown, finishHyperliquidRecoveryRequest, assertHyperliquidRecoveryDispatch, validateHyperliquidRecoveryDispatch, cacheTtlMs, eligibleCache, reserveHyperliquidPublicReads, releaseHyperliquidPublicReadReservation, admitHyperliquidExchangeRequest, recordHyperliquidExchangeResponse, readHyperliquidPublicInfo;
55881
+ var policy, weights, recoveryPolicy, budgets, unpersistedBudgets, cache, pending2, PREFIX, priorityRank, createHyperliquidPublicPriorityScope, promoteHyperliquidPublicPriority, hostTransport, hyperliquidPrivateInfoHeldOff, abortError2, checkAbort, wait, waitUnlessPromoted, storage, loadBudget, saveBudget, withBudgetLock, HyperliquidPublicReadError, getHyperliquidPublicReadBudget, cooldownError, recoveryWaitError, nonTradingWeightCap, nonTradingWaitMs, fallbackDelayMs, admit, settleRowWeightedReservation, cooldown, finishHyperliquidRecoveryRequest, assertHyperliquidRecoveryDispatch, validateHyperliquidRecoveryDispatch, cacheTtlMs, eligibleCache, reserveHyperliquidPublicReads, releaseHyperliquidPublicReadReservation, admitHyperliquidExchangeRequest, recordHyperliquidExchangeResponse, readHyperliquidPublicInfo;
55748
55882
  var init_hyperliquid_public_read = __esm({
55749
55883
  "lib/runtime/hyperliquid-public-read.ts"() {
55750
55884
  "use strict";
@@ -55770,6 +55904,7 @@ var init_hyperliquid_public_read = __esm({
55770
55904
  scope.followers?.forEach((promote) => promote(priority));
55771
55905
  };
55772
55906
  hostTransport = null;
55907
+ hyperliquidPrivateInfoHeldOff = async () => await hostTransport?.privateInfoHeldOff?.() === true;
55773
55908
  abortError2 = (signal) => getSanitizedRuntimeAbortReason(signal, "Aborted");
55774
55909
  checkAbort = (signal) => {
55775
55910
  if (signal?.aborted) throw abortError2(signal);
@@ -56517,7 +56652,8 @@ var init_runtime_error_reason_rules = __esm({
56517
56652
  { contains: "order was not sent" },
56518
56653
  { any: [
56519
56654
  { contains: "signing key is not authorized for the configured wallet" },
56520
- { contains: "hyperliquid confirmed that the signing key is not authorized" }
56655
+ { contains: "hyperliquid confirmed that the signing key is not authorized" },
56656
+ { contains: "hyperliquid has not approved this key for this profile's wallet" }
56521
56657
  ] }
56522
56658
  ] } },
56523
56659
  { reason_code: "credentials_missing", when: { all: [
@@ -56581,7 +56717,8 @@ var init_runtime_error_reason_rules = __esm({
56581
56717
  ] } },
56582
56718
  { reason_code: "hyperliquid_wallet_not_authorized", when: { any: [
56583
56719
  { contains: "hyperliquid api wallet is not authorized" },
56584
- { contains: "hyperliquid signing key is not authorized for this wallet" }
56720
+ { contains: "hyperliquid signing key is not authorized for this wallet" },
56721
+ { contains: "hyperliquid has not approved this key for this profile's wallet" }
56585
56722
  ] } },
56586
56723
  { reason_code: "ai_service_rate_limit", when: { any: [
56587
56724
  { all: [
@@ -56747,6 +56884,21 @@ var init_runtime_error_reason_rules2 = __esm({
56747
56884
  }
56748
56885
  });
56749
56886
 
56887
+ // lib/runtime/signing-key-messages.ts
56888
+ var SIGNING_KEY_NOT_APPROVED, SIGNING_KEY_INVALID, SIGNING_KEY_THEN_START, SIGNING_KEY_NOT_APPROVED_THEN_START;
56889
+ var init_signing_key_messages = __esm({
56890
+ "lib/runtime/signing-key-messages.ts"() {
56891
+ "use strict";
56892
+ init_define_VTX_EXO_POLICY();
56893
+ init_define_VTX_GROK_POLICY();
56894
+ init_define_VTX_PI_MODEL_POLICY();
56895
+ SIGNING_KEY_NOT_APPROVED = "Hyperliquid has not approved this key for this profile's wallet. API wallets expire, so it may have run out. On Hyperliquid, open More > API and authorize an API wallet for this wallet, then paste its private key in System > Hyperliquid Configuration > Private Key (Secret) and save.";
56896
+ SIGNING_KEY_INVALID = "This is not a valid private key. Paste the API wallet's private key from Hyperliquid (0x followed by 64 characters).";
56897
+ SIGNING_KEY_THEN_START = "Then start the bot.";
56898
+ SIGNING_KEY_NOT_APPROVED_THEN_START = `${SIGNING_KEY_NOT_APPROVED} ${SIGNING_KEY_THEN_START}`;
56899
+ }
56900
+ });
56901
+
56750
56902
  // lib/runtime/error-surface-contract.ts
56751
56903
  var RUNTIME_SERVICE_UNAVAILABLE_TOKENS, RUNTIME_APP_BOOTSTRAP_UNAVAILABLE_TOKENS, RUNTIME_BROWSER_FETCH_FAILURE_TOKENS, SENSITIVE_DB_TOKENS, SCHEMA_DISCLOSURE_TOKENS, SQL_STATEMENT_PATTERN, TRACEBACK_PATTERN, DB_SESSION_STATE_PATTERNS, RUNTIME_MARKET_DATA_FAILURE_TOKENS, RUNTIME_CYCLE_DEADLINE_TOKENS, RUNTIME_TIMEOUT_TOKENS, RUNTIME_GENERIC_TIMEOUT_MESSAGE, LEGACY_RUNTIME_TIMEOUT_PATTERN, RUNTIME_PROVIDER_NETWORK_FAILURE_TOKENS, RUNTIME_EXPLICIT_CORS_TOKENS, RUNTIME_MODEL_UNAVAILABLE_TOKENS, RUNTIME_REASONING_CONTROL_REJECTION_TOKENS, RUNTIME_CANONICAL_PREFIX_TOKENS, RUNTIME_PROVIDER_RETRY_STATUS_PATTERN, RUNTIME_SERVICE_UNAVAILABLE_STATUSES, RUNTIME_MISSING_CONFIG_PATTERN, DEFAULT_RUNTIME_RETRY_SECONDS, normalizeRuntimeRetrySeconds, hasRuntimeRetrySeconds, runtimeRetryPhrase, applyRuntimeRetrySeconds, RUNTIME_PROVIDER_FAILURE_PATTERN, RUNTIME_HYPERLIQUID_RATE_LIMIT_PATTERN, RUNTIME_HYPERLIQUID_INFO_429_PATTERN, RUNTIME_HYPERLIQUID_REQUEST_TYPE_PATTERN, RUNTIME_HYPERLIQUID_WALLET_NOT_AUTHORIZED_PATTERN, runtimePausePrefix, ensureRuntimeWarningPrefix, stripRuntimeWarningPrefix, isRuntimeAppBootstrapUnavailableError, isSensitiveRuntimeErrorDetail, extractRuntimeProviderError, extractHttpStatusCode, formatHyperliquidRateLimitMessage, providerStatusLabel, PROVIDER_ATTEMPT_SUMMARY_ITEM, PROVIDER_ATTEMPT_SUMMARY_PATTERN, PROVIDER_ATTEMPT_STATUS_PATTERN, isCanonicalProviderAttemptSummary, providerAttemptSummaryStatuses, normalizeRuntimeErrorMessage, RUNTIME_ERROR_REASON_PREDICATES, deriveRuntimeErrorReasonCode, EXECUTION_DISPATCH_RISK_RANK, selectPrimaryExecutionFailure, EXECUTION_ERROR_DEFAULTS, isExecutionErrorReasonCode, RuntimeExecutionError, projectExecutionErrorContract, projectRuntimeErrorSurfaceContract;
56752
56904
  var init_error_surface_contract = __esm({
@@ -56759,6 +56911,7 @@ var init_error_surface_contract = __esm({
56759
56911
  init_status_contract();
56760
56912
  init_runtime_redaction();
56761
56913
  init_runtime_error_reason_rules2();
56914
+ init_signing_key_messages();
56762
56915
  RUNTIME_SERVICE_UNAVAILABLE_TOKENS = [
56763
56916
  "503",
56764
56917
  "service unavailable",
@@ -57058,7 +57211,7 @@ var init_error_surface_contract = __esm({
57058
57211
  return formatHyperliquidRateLimitMessage({ message, pausePrefix, retrySeconds });
57059
57212
  }
57060
57213
  if (RUNTIME_HYPERLIQUID_WALLET_NOT_AUTHORIZED_PATTERN.test(message)) {
57061
- return `${pausePrefix}: This profile's Hyperliquid API wallet is not authorized. Re-sync the Hyperliquid key for this profile or approve the API wallet, then restart Client Mode.`;
57214
+ return `${pausePrefix}: ${SIGNING_KEY_NOT_APPROVED_THEN_START}`;
57062
57215
  }
57063
57216
  if (statusCode == null && isRuntimeAppBootstrapUnavailableError(message)) {
57064
57217
  return `${pausePrefix}: VTX could not load this profile's runtime settings because the server returned 503. ${runtimeRetryPhrase(retrySeconds)}`;
@@ -57215,7 +57368,7 @@ var init_error_surface_contract = __esm({
57215
57368
  } else if (resolvedReason === "signer_validation_unavailable") {
57216
57369
  message = `\u26A0\uFE0F The ${orderLabel} was not sent: VTX could not verify this profile's signing-key authorization because required Hyperliquid account data was temporarily unavailable. No order was submitted, and the signing key was not rejected. VTX will try again automatically if the trader is running; no action is required.`;
57217
57370
  } else if (resolvedReason === "wallet_not_authorized") {
57218
- message = `\u26A0\uFE0F The ${orderLabel} was not sent: Hyperliquid confirmed that the signing key is not authorized for the configured wallet. No order was submitted. Stop the trader, then reconnect the correct wallet and signing key in System.`;
57371
+ message = `\u26A0\uFE0F The ${orderLabel} was not sent: ${SIGNING_KEY_NOT_APPROVED}`;
57219
57372
  } else if (resolvedReason === "credentials_missing") {
57220
57373
  message = `\u26A0\uFE0F The ${orderLabel} was not sent: a wallet address and authorized signing key are required for trading.`;
57221
57374
  } else if (resolvedReason === "local_safety_block") {
@@ -91685,9 +91838,11 @@ var init_api2 = __esm({
91685
91838
  init_market_data();
91686
91839
  init_screener();
91687
91840
  init_client_host_commands();
91841
+ init_logout();
91688
91842
  init_insights_access_center();
91689
91843
  init_updates();
91690
91844
  init_profile_emoji();
91845
+ init_account_summary();
91691
91846
  init_server_runtime_lease();
91692
91847
  clientRuntimeSecretHeaders = (profileId) => {
91693
91848
  const headers = getProfileHeaders({}, profileId);
@@ -92322,6 +92477,7 @@ var init_hyperliquid_signer_binding = __esm({
92322
92477
  init_hyperliquid_client();
92323
92478
  init_hyperliquid_exchange_rejections();
92324
92479
  init_error_surface_contract();
92480
+ init_signing_key_messages();
92325
92481
  DeviceSigningKeyError = class extends RuntimeExecutionError {
92326
92482
  constructor(message, reasonCode, deviceSigningKeyFailure) {
92327
92483
  super(message, reasonCode);
@@ -92393,7 +92549,7 @@ var init_hyperliquid_signer_binding = __esm({
92393
92549
  );
92394
92550
  } catch {
92395
92551
  throw new DeviceSigningKeyError(
92396
- "Invalid Hyperliquid signing key.",
92552
+ SIGNING_KEY_INVALID,
92397
92553
  "credentials_missing",
92398
92554
  "device_signing_key_invalid"
92399
92555
  );
@@ -92412,7 +92568,7 @@ var init_hyperliquid_signer_binding = __esm({
92412
92568
  const cached2 = validatedSignerBindings.get(cacheKey);
92413
92569
  if (cached2 && cached2.generation === generation) return cached2.binding;
92414
92570
  }
92415
- const remember = (binding) => {
92571
+ const remember2 = (binding) => {
92416
92572
  if (signerBindingCache && generation !== null) validatedSignerBindings.set(cacheKey, { generation, binding });
92417
92573
  return binding;
92418
92574
  };
@@ -92433,7 +92589,7 @@ var init_hyperliquid_signer_binding = __esm({
92433
92589
  }
92434
92590
  const signerRole = String(roleResponse.role || "").trim().toLowerCase();
92435
92591
  if (signerRole === "user" && signerAddress === walletAddress) {
92436
- return remember({
92592
+ return remember2({
92437
92593
  signerAddress,
92438
92594
  walletAddress,
92439
92595
  signerRole: "user"
@@ -92445,7 +92601,7 @@ var init_hyperliquid_signer_binding = __esm({
92445
92601
  ["user"]
92446
92602
  );
92447
92603
  if (masterWallet === walletAddress) {
92448
- return remember({
92604
+ return remember2({
92449
92605
  signerAddress,
92450
92606
  walletAddress,
92451
92607
  signerRole: "agent"
@@ -92453,7 +92609,7 @@ var init_hyperliquid_signer_binding = __esm({
92453
92609
  }
92454
92610
  }
92455
92611
  throw new DeviceSigningKeyError(
92456
- "The device Hyperliquid signing key is not authorized for this profile wallet. Stop the runtime and reconnect the wallet.",
92612
+ SIGNING_KEY_NOT_APPROVED,
92457
92613
  "wallet_not_authorized",
92458
92614
  "device_signing_key_unauthorized"
92459
92615
  );
@@ -108732,6 +108888,183 @@ var init_profile_model_cascade = __esm({
108732
108888
  }
108733
108889
  });
108734
108890
 
108891
+ // lib/runtime/prompt-variable-validation-contract.ts
108892
+ var ESCAPED_OPEN_BRACE, ESCAPED_CLOSE_BRACE, PROMPT_PLACEHOLDER_PATTERN, ESCAPED_BRACE_PAIR_PATTERN, readPromptTemplate, restoreEscapedBraces, countAtMost, countBelow, locatePlaceholders, isPromptVariableName, renderPromptTemplate, promptTemplatePlaceholderSpans, promptTemplatePlaceholders, promptTemplateVariables, NEWS_PROMPT_VARIABLES, REFERENCE_CANDLES_PROMPT_VARIABLE, ALLOWED_PROMPT_VARIABLES, OPTIONAL_BLANK_PROMPT_VARIABLES, coercePromptVariableValue, isMissingPromptVariableValue, validatePromptVariables;
108893
+ var init_prompt_variable_validation_contract = __esm({
108894
+ "lib/runtime/prompt-variable-validation-contract.ts"() {
108895
+ "use strict";
108896
+ init_define_VTX_EXO_POLICY();
108897
+ init_define_VTX_GROK_POLICY();
108898
+ init_define_VTX_PI_MODEL_POLICY();
108899
+ ESCAPED_OPEN_BRACE = "__VTX_PROMPT_OPEN_BRACE__";
108900
+ ESCAPED_CLOSE_BRACE = "__VTX_PROMPT_CLOSE_BRACE__";
108901
+ PROMPT_PLACEHOLDER_PATTERN = /\{([a-zA-Z0-9_]+)\}/g;
108902
+ ESCAPED_BRACE_PAIR_PATTERN = /\{\{|\}\}/g;
108903
+ readPromptTemplate = (template) => {
108904
+ const prepared = template.replaceAll("{{", ESCAPED_OPEN_BRACE).replaceAll("}}", ESCAPED_CLOSE_BRACE);
108905
+ return {
108906
+ prepared,
108907
+ placeholders: Array.from(prepared.matchAll(PROMPT_PLACEHOLDER_PATTERN), (match) => ({
108908
+ name: match[1],
108909
+ start: match.index,
108910
+ end: match.index + match[0].length
108911
+ }))
108912
+ };
108913
+ };
108914
+ restoreEscapedBraces = (text) => text.replaceAll(ESCAPED_OPEN_BRACE, "{").replaceAll(ESCAPED_CLOSE_BRACE, "}");
108915
+ countAtMost = (ascending, value) => {
108916
+ let low = 0;
108917
+ let high = ascending.length;
108918
+ while (low < high) {
108919
+ const middle = low + high >>> 1;
108920
+ if (ascending[middle] <= value) low = middle + 1;
108921
+ else high = middle;
108922
+ }
108923
+ return low;
108924
+ };
108925
+ countBelow = (ascending, value) => {
108926
+ let low = 0;
108927
+ let high = ascending.length;
108928
+ while (low < high) {
108929
+ const middle = low + high >>> 1;
108930
+ if (ascending[middle] < value) low = middle + 1;
108931
+ else high = middle;
108932
+ }
108933
+ return low;
108934
+ };
108935
+ locatePlaceholders = (template) => {
108936
+ const { prepared, placeholders } = readPromptTemplate(template);
108937
+ const markerStarts = [];
108938
+ const markerEnds = [];
108939
+ const addedLengths = [];
108940
+ let added = 0;
108941
+ for (const pair of template.matchAll(ESCAPED_BRACE_PAIR_PATTERN)) {
108942
+ const marker = pair[0] === "{{" ? ESCAPED_OPEN_BRACE : ESCAPED_CLOSE_BRACE;
108943
+ markerStarts.push(pair.index + added);
108944
+ added += marker.length - pair[0].length;
108945
+ markerEnds.push(pair.index + pair[0].length + added);
108946
+ addedLengths.push(added);
108947
+ }
108948
+ return {
108949
+ prepared,
108950
+ located: placeholders.map((placeholder) => {
108951
+ const markersBefore = countAtMost(markerEnds, placeholder.start);
108952
+ if (countBelow(markerStarts, placeholder.end) !== markersBefore) {
108953
+ return { placeholder, sourceStart: null };
108954
+ }
108955
+ const offset = markersBefore > 0 ? addedLengths[markersBefore - 1] : 0;
108956
+ return { placeholder, sourceStart: placeholder.start - offset };
108957
+ })
108958
+ };
108959
+ };
108960
+ isPromptVariableName = (name) => !/^[0-9]/.test(name);
108961
+ renderPromptTemplate = (template, contextVars) => {
108962
+ if (typeof template !== "string" || !template) {
108963
+ return "";
108964
+ }
108965
+ const safeContext = contextVars && typeof contextVars === "object" ? contextVars : {};
108966
+ const { prepared, placeholders } = readPromptTemplate(template);
108967
+ const rendered = [];
108968
+ let cursor = 0;
108969
+ for (const placeholder of placeholders) {
108970
+ rendered.push(prepared.slice(cursor, placeholder.start));
108971
+ const value = Object.prototype.hasOwnProperty.call(safeContext, placeholder.name) ? safeContext[placeholder.name] : void 0;
108972
+ rendered.push(value === null || value === void 0 ? "" : String(value));
108973
+ cursor = placeholder.end;
108974
+ }
108975
+ rendered.push(prepared.slice(cursor));
108976
+ return restoreEscapedBraces(rendered.join(""));
108977
+ };
108978
+ promptTemplatePlaceholderSpans = (template) => {
108979
+ if (typeof template !== "string" || !template) {
108980
+ return [];
108981
+ }
108982
+ const spans = [];
108983
+ for (const { placeholder, sourceStart } of locatePlaceholders(template).located) {
108984
+ if (sourceStart !== null) {
108985
+ spans.push({
108986
+ name: placeholder.name,
108987
+ start: sourceStart,
108988
+ end: sourceStart + (placeholder.end - placeholder.start)
108989
+ });
108990
+ }
108991
+ }
108992
+ return spans;
108993
+ };
108994
+ promptTemplatePlaceholders = (template) => promptTemplatePlaceholderSpans(template).map((placeholder) => placeholder.name);
108995
+ promptTemplateVariables = (template) => promptTemplatePlaceholders(template).filter(isPromptVariableName);
108996
+ NEWS_PROMPT_VARIABLES = ["news_benzinga", "news_telegram"];
108997
+ REFERENCE_CANDLES_PROMPT_VARIABLE = "reference_candles";
108998
+ ALLOWED_PROMPT_VARIABLES = /* @__PURE__ */ new Set([
108999
+ "current_time",
109000
+ "candles",
109001
+ REFERENCE_CANDLES_PROMPT_VARIABLE,
109002
+ "market_stats",
109003
+ "account_status",
109004
+ "calendar",
109005
+ "behavior_state",
109006
+ "positions",
109007
+ "performance",
109008
+ "market_regime",
109009
+ ...NEWS_PROMPT_VARIABLES,
109010
+ "size",
109011
+ "leverage",
109012
+ "interval"
109013
+ ]);
109014
+ OPTIONAL_BLANK_PROMPT_VARIABLES = /* @__PURE__ */ new Set([
109015
+ "calendar",
109016
+ REFERENCE_CANDLES_PROMPT_VARIABLE,
109017
+ ...NEWS_PROMPT_VARIABLES
109018
+ ]);
109019
+ coercePromptVariableValue = (value) => {
109020
+ if (value === null || value === void 0) {
109021
+ return "";
109022
+ }
109023
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
109024
+ return value;
109025
+ }
109026
+ if (Array.isArray(value) || typeof value === "object" && value !== null) {
109027
+ return JSON.stringify(value);
109028
+ }
109029
+ return String(value);
109030
+ };
109031
+ isMissingPromptVariableValue = (value) => {
109032
+ if (value === null || value === void 0) {
109033
+ return true;
109034
+ }
109035
+ if (typeof value === "string") {
109036
+ return value.trim().length === 0;
109037
+ }
109038
+ return false;
109039
+ };
109040
+ validatePromptVariables = ({
109041
+ template,
109042
+ contextVars
109043
+ }) => {
109044
+ const normalized = {};
109045
+ for (const [key, value] of Object.entries(contextVars)) {
109046
+ if (!ALLOWED_PROMPT_VARIABLES.has(key)) {
109047
+ throw new Error(`Unknown prompt variable key: ${key}`);
109048
+ }
109049
+ normalized[key] = coercePromptVariableValue(value);
109050
+ }
109051
+ const required2 = new Set(promptTemplateVariables(String(template ?? "")));
109052
+ for (const key of Array.from(required2).sort()) {
109053
+ if (!ALLOWED_PROMPT_VARIABLES.has(key)) {
109054
+ throw new Error(`Unknown prompt variable placeholder in template: ${key}`);
109055
+ }
109056
+ if (!Object.prototype.hasOwnProperty.call(normalized, key)) {
109057
+ throw new Error(`Missing required prompt variable: ${key}`);
109058
+ }
109059
+ if (!OPTIONAL_BLANK_PROMPT_VARIABLES.has(key) && isMissingPromptVariableValue(normalized[key])) {
109060
+ throw new Error(`Missing required prompt variable value: ${key}`);
109061
+ }
109062
+ }
109063
+ return normalized;
109064
+ };
109065
+ }
109066
+ });
109067
+
108735
109068
  // lib/ai-settings-helpers.ts
108736
109069
  var sortAiSettings;
108737
109070
  var init_ai_settings_helpers = __esm({
@@ -108741,6 +109074,7 @@ var init_ai_settings_helpers = __esm({
108741
109074
  init_define_VTX_GROK_POLICY();
108742
109075
  init_define_VTX_PI_MODEL_POLICY();
108743
109076
  init_perp_dex_scope();
109077
+ init_prompt_variable_validation_contract();
108744
109078
  sortAiSettings = (settings) => {
108745
109079
  if (!settings || typeof settings !== "object") return settings;
108746
109080
  const normalized = { ...settings };
@@ -108883,6 +109217,7 @@ var init_ai_settings_helpers = __esm({
108883
109217
  "trading_timeframes",
108884
109218
  "max_trading_timeframes",
108885
109219
  "ai_indicators",
109220
+ "reference_candles_settings",
108886
109221
  // 3) Trading limits
108887
109222
  "trading_interval",
108888
109223
  "leverage",
@@ -109058,7 +109393,7 @@ var init_candle_timeframes = __esm({
109058
109393
  });
109059
109394
 
109060
109395
  // lib/runtime/candle-prompt-contract.ts
109061
- var projectCandlePromptComponent;
109396
+ var AI_INDICATOR_ROW_COLUMNS, AI_INDICATOR_KEYS, EMA_INDICATOR_KEYS, CANDLE_BASE_ROW_COLUMNS, candlesRowColumns, projectCandlePromptComponent, readCandleNumber, closedCandleCount, calculateRelativeVolumeSeries;
109062
109397
  var init_candle_prompt_contract = __esm({
109063
109398
  "lib/runtime/candle-prompt-contract.ts"() {
109064
109399
  "use strict";
@@ -109066,6 +109401,31 @@ var init_candle_prompt_contract = __esm({
109066
109401
  init_define_VTX_GROK_POLICY();
109067
109402
  init_define_VTX_PI_MODEL_POLICY();
109068
109403
  init_candle_timeframes();
109404
+ init_constants();
109405
+ AI_INDICATOR_ROW_COLUMNS = {
109406
+ rsi: ["rsi"],
109407
+ macd: ["macd_line", "macd_signal", "macd_hist"],
109408
+ bollinger: ["bb_upper", "bb_lower"],
109409
+ atr: ["atr"],
109410
+ ema_9: ["ema_9"],
109411
+ ema_21: ["ema_21"],
109412
+ ema_50: ["ema_50"],
109413
+ ema_200: ["ema_200"],
109414
+ rv: ["rv"]
109415
+ };
109416
+ AI_INDICATOR_KEYS = Object.keys(AI_INDICATOR_ROW_COLUMNS);
109417
+ EMA_INDICATOR_KEYS = Object.keys(PROMPT_EMA_PERIODS);
109418
+ CANDLE_BASE_ROW_COLUMNS = ["ts", "o", "h", "l", "c", "v"];
109419
+ candlesRowColumns = (activeIndicators) => {
109420
+ const flags = activeIndicators ?? {};
109421
+ const columns = [...CANDLE_BASE_ROW_COLUMNS];
109422
+ for (const key of AI_INDICATOR_KEYS) {
109423
+ if (flags[key]) {
109424
+ columns.push(...AI_INDICATOR_ROW_COLUMNS[key]);
109425
+ }
109426
+ }
109427
+ return columns;
109428
+ };
109069
109429
  projectCandlePromptComponent = (input) => {
109070
109430
  const intervalSeconds = candleTimeframeSeconds(input.timeframe);
109071
109431
  if (intervalSeconds === void 0) {
@@ -109114,6 +109474,51 @@ var init_candle_prompt_contract = __esm({
109114
109474
  projected.l = rows[rows.length - 1];
109115
109475
  return projected;
109116
109476
  };
109477
+ readCandleNumber = (value) => {
109478
+ if (typeof value === "number") {
109479
+ return value;
109480
+ }
109481
+ if (typeof value === "string" && value.trim()) {
109482
+ const numeric2 = Number(value);
109483
+ return Number.isNaN(numeric2) ? void 0 : numeric2;
109484
+ }
109485
+ return void 0;
109486
+ };
109487
+ closedCandleCount = (input) => {
109488
+ const intervalSeconds = candleTimeframeSeconds(input.timeframe);
109489
+ const lastOpenTimestamp = input.openTimestamps.at(-1);
109490
+ if (intervalSeconds === void 0 || lastOpenTimestamp === void 0) {
109491
+ return 0;
109492
+ }
109493
+ const lastIsClosed = lastOpenTimestamp + intervalSeconds <= input.asOfTimestamp;
109494
+ return lastIsClosed ? input.openTimestamps.length : input.openTimestamps.length - 1;
109495
+ };
109496
+ calculateRelativeVolumeSeries = (input) => {
109497
+ const series = Array(input.candles.length).fill(null);
109498
+ const baseline = input.baselineDollarVolume;
109499
+ const recentCandles = input.recentCandles;
109500
+ if (typeof baseline !== "number" || !(baseline > 0) || !Number.isInteger(recentCandles) || recentCandles <= 0) {
109501
+ return series;
109502
+ }
109503
+ const closed = Math.min(Math.max(Math.trunc(Number(input.closedCount)) || 0, 0), input.candles.length);
109504
+ if (closed < recentCandles) {
109505
+ return series;
109506
+ }
109507
+ const dollarVolumes = [];
109508
+ for (const candle of input.candles.slice(0, closed)) {
109509
+ const close = readCandleNumber(candle?.close);
109510
+ const volume = readCandleNumber(candle?.volume);
109511
+ if (close === void 0 || volume === void 0) {
109512
+ return series;
109513
+ }
109514
+ dollarVolumes.push(close * volume);
109515
+ }
109516
+ for (let index = recentCandles - 1; index < closed; index += 1) {
109517
+ const windowDollarVolume = dollarVolumes.slice(index - recentCandles + 1, index + 1).reduce((sum, value) => sum + value, 0);
109518
+ series[index] = Number.isFinite(windowDollarVolume) && windowDollarVolume >= 0 ? windowDollarVolume / baseline : null;
109519
+ }
109520
+ return series;
109521
+ };
109117
109522
  }
109118
109523
  });
109119
109524
 
@@ -109899,6 +110304,7 @@ async function requestServerHostPromptRescue(profileId, payload, options) {
109899
110304
  options
109900
110305
  );
109901
110306
  }
110307
+ var SERVER_PROMPT_RESCUE_NODE_OUTAGE_REASON;
109902
110308
  var init_server_host_prompt_rescue = __esm({
109903
110309
  "lib/api/server-host-prompt-rescue.ts"() {
109904
110310
  "use strict";
@@ -109906,6 +110312,7 @@ var init_server_host_prompt_rescue = __esm({
109906
110312
  init_define_VTX_GROK_POLICY();
109907
110313
  init_define_VTX_PI_MODEL_POLICY();
109908
110314
  init_api2();
110315
+ SERVER_PROMPT_RESCUE_NODE_OUTAGE_REASON = "private_node_unavailable";
109909
110316
  }
109910
110317
  });
109911
110318
 
@@ -113256,89 +113663,8 @@ var init_provider_client = __esm({
113256
113663
  }
113257
113664
  });
113258
113665
 
113259
- // lib/runtime/prompt-variable-validation-contract.ts
113260
- var PROMPT_VARIABLE_PATTERN, NEWS_PROMPT_VARIABLES, ALLOWED_PROMPT_VARIABLES, OPTIONAL_BLANK_PROMPT_VARIABLES, coercePromptVariableValue, isMissingPromptVariableValue, validatePromptVariables;
113261
- var init_prompt_variable_validation_contract = __esm({
113262
- "lib/runtime/prompt-variable-validation-contract.ts"() {
113263
- "use strict";
113264
- init_define_VTX_EXO_POLICY();
113265
- init_define_VTX_GROK_POLICY();
113266
- init_define_VTX_PI_MODEL_POLICY();
113267
- PROMPT_VARIABLE_PATTERN = /(?<!\{)\{([a-zA-Z_][a-zA-Z0-9_]*)\}(?!\})/g;
113268
- NEWS_PROMPT_VARIABLES = ["news_benzinga", "news_telegram"];
113269
- ALLOWED_PROMPT_VARIABLES = /* @__PURE__ */ new Set([
113270
- "current_time",
113271
- "candles",
113272
- "market_stats",
113273
- "account_status",
113274
- "calendar",
113275
- "behavior_state",
113276
- "positions",
113277
- "performance",
113278
- "market_regime",
113279
- ...NEWS_PROMPT_VARIABLES,
113280
- "size",
113281
- "leverage",
113282
- "interval"
113283
- ]);
113284
- OPTIONAL_BLANK_PROMPT_VARIABLES = /* @__PURE__ */ new Set([
113285
- "calendar",
113286
- ...NEWS_PROMPT_VARIABLES
113287
- ]);
113288
- coercePromptVariableValue = (value) => {
113289
- if (value === null || value === void 0) {
113290
- return "";
113291
- }
113292
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
113293
- return value;
113294
- }
113295
- if (Array.isArray(value) || typeof value === "object" && value !== null) {
113296
- return JSON.stringify(value);
113297
- }
113298
- return String(value);
113299
- };
113300
- isMissingPromptVariableValue = (value) => {
113301
- if (value === null || value === void 0) {
113302
- return true;
113303
- }
113304
- if (typeof value === "string") {
113305
- return value.trim().length === 0;
113306
- }
113307
- return false;
113308
- };
113309
- validatePromptVariables = ({
113310
- template,
113311
- contextVars
113312
- }) => {
113313
- const normalized = {};
113314
- for (const [key, value] of Object.entries(contextVars)) {
113315
- if (!ALLOWED_PROMPT_VARIABLES.has(key)) {
113316
- throw new Error(`Unknown prompt variable key: ${key}`);
113317
- }
113318
- normalized[key] = coercePromptVariableValue(value);
113319
- }
113320
- const required2 = /* @__PURE__ */ new Set();
113321
- for (const match of template.matchAll(PROMPT_VARIABLE_PATTERN)) {
113322
- required2.add(match[1]);
113323
- }
113324
- for (const key of required2) {
113325
- if (!ALLOWED_PROMPT_VARIABLES.has(key)) {
113326
- throw new Error(`Unknown prompt variable placeholder in template: ${key}`);
113327
- }
113328
- if (!Object.prototype.hasOwnProperty.call(normalized, key)) {
113329
- throw new Error(`Missing required prompt variable: ${key}`);
113330
- }
113331
- if (!OPTIONAL_BLANK_PROMPT_VARIABLES.has(key) && isMissingPromptVariableValue(normalized[key])) {
113332
- throw new Error(`Missing required prompt variable value: ${key}`);
113333
- }
113334
- }
113335
- return normalized;
113336
- };
113337
- }
113338
- });
113339
-
113340
113666
  // lib/runtime/prompt-contract.ts
113341
- var PROMPT_PLACEHOLDER_MAP, DATA_FORMAT_TAG_ALIASES, buildDecisionInstructionVariables, candlesRowColumns, renderCandleIndicatorDefinitions, NEWS_COLUMN_DESCRIPTIONS, isNewsPromptTag, newsTagBlock, newsRowColumns, renderNewsLegendLine, behaviorStateHasObjectField, candlesHaveLiveField, templateReferencesTag, templateTagOrder, renderDataFormatLegend, replaceEmbeddedDataFormatLegend, canonicalizePromptPlaceholders, normalizePromptWhitespace, renderPromptTemplate, formatInstructionTemplate, constructPromptSystemTemplate;
113667
+ var PROMPT_PLACEHOLDER_MAP, DATA_FORMAT_TAG_ALIASES, buildDecisionInstructionVariables, renderCandleIndicatorDefinitions, NEWS_COLUMN_DESCRIPTIONS, isNewsPromptTag, newsTagBlock, newsRowColumns, renderNewsLegendLine, behaviorStateHasObjectField, candleBlockPayload, candlesHaveLiveField, templateReferencesTag, templateTagOrder, renderDataFormatLegend, replaceEmbeddedDataFormatLegend, SIZE_AMOUNT_USDC_LABEL_PATTERN, labelSizeAmountInUsd, canonicalizePromptPlaceholders, normalizePromptWhitespace, formatInstructionTemplate, constructPromptSystemTemplate;
113342
113668
  var init_prompt_contract = __esm({
113343
113669
  "lib/runtime/prompt-contract.ts"() {
113344
113670
  "use strict";
@@ -113346,6 +113672,8 @@ var init_prompt_contract = __esm({
113346
113672
  init_define_VTX_GROK_POLICY();
113347
113673
  init_define_VTX_PI_MODEL_POLICY();
113348
113674
  init_prompt_variable_validation_contract();
113675
+ init_prompt_variable_validation_contract();
113676
+ init_candle_prompt_contract();
113349
113677
  init_constants();
113350
113678
  PROMPT_PLACEHOLDER_MAP = {};
113351
113679
  DATA_FORMAT_TAG_ALIASES = {};
@@ -113370,38 +113698,22 @@ var init_prompt_contract = __esm({
113370
113698
  max_trades: Math.trunc(maxTrades)
113371
113699
  };
113372
113700
  };
113373
- candlesRowColumns = (activeIndicators) => {
113374
- const flags = activeIndicators ?? {};
113375
- const cols = ["ts", "o", "h", "l", "c", "v"];
113376
- if (flags.rsi) cols.push("rsi");
113377
- if (flags.macd) cols.push("macd_line", "macd_signal", "macd_hist");
113378
- if (flags.bollinger) cols.push("bb_upper", "bb_lower");
113379
- if (flags.atr) cols.push("atr");
113380
- if (flags.ema_9) cols.push("ema_9");
113381
- if (flags.ema_21) cols.push("ema_21");
113382
- if (flags.ema_50) cols.push("ema_50");
113383
- if (flags.ema_200) cols.push("ema_200");
113384
- return cols;
113385
- };
113386
113701
  renderCandleIndicatorDefinitions = (activeIndicators, indicatorSchemas) => {
113387
113702
  const flags = activeIndicators ?? {};
113388
113703
  const schemas = indicatorSchemas ?? {};
113389
- const definitions = [];
113390
- for (const key of ["rsi", "macd", "bollinger", "atr"]) {
113704
+ const schemaKeys = [];
113705
+ for (const key of AI_INDICATOR_KEYS) {
113391
113706
  if (!flags[key]) continue;
113392
- const definition = String(schemas[key] ?? "").trim();
113393
- if (!definition) {
113394
- throw new Error(`Missing prompts config key: instructions.data_format.candle_indicators.${key}`);
113395
- }
113396
- definitions.push(definition);
113707
+ const schemaKey = EMA_INDICATOR_KEYS.includes(key) ? "ema" : key;
113708
+ if (!schemaKeys.includes(schemaKey)) schemaKeys.push(schemaKey);
113397
113709
  }
113398
- if (["ema_9", "ema_21", "ema_50", "ema_200"].some((key) => flags[key])) {
113399
- const definition = String(schemas.ema ?? "").trim();
113710
+ const definitions = schemaKeys.map((schemaKey) => {
113711
+ const definition = String(schemas[schemaKey] ?? "").trim();
113400
113712
  if (!definition) {
113401
- throw new Error("Missing prompts config key: instructions.data_format.candle_indicators.ema");
113713
+ throw new Error(`Missing prompts config key: instructions.data_format.candle_indicators.${schemaKey}`);
113402
113714
  }
113403
- definitions.push(definition);
113404
- }
113715
+ return definition;
113716
+ });
113405
113717
  return definitions.length > 0 ? `; indicators: ${definitions.join("; ")}` : "";
113406
113718
  };
113407
113719
  NEWS_COLUMN_DESCRIPTIONS = {
@@ -113448,41 +113760,47 @@ var init_prompt_contract = __esm({
113448
113760
  return false;
113449
113761
  }
113450
113762
  };
113451
- candlesHaveLiveField = (candlesSummary) => {
113452
- const rawSummary = String(candlesSummary ?? "").trim();
113453
- const match = rawSummary.match(/<candles>\s*([\s\S]*?)\s*<\/candles>/i);
113763
+ candleBlockPayload = (summary, tag, allowBareJson) => {
113764
+ const rawSummary = String(summary ?? "").trim();
113765
+ const match = rawSummary.match(new RegExp(`<${tag}>\\s*([\\s\\S]*?)\\s*<\\/${tag}>`, "i"));
113766
+ if (!match && !allowBareJson) return null;
113454
113767
  const rawPayload = match?.[1] ?? rawSummary;
113455
113768
  try {
113456
113769
  const payload = JSON.parse(rawPayload);
113457
- if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
113458
- return Object.values(payload).some((symbolPayload) => {
113459
- if (!symbolPayload || typeof symbolPayload !== "object" || Array.isArray(symbolPayload)) {
113460
- return false;
113461
- }
113462
- const data4 = symbolPayload.data;
113463
- if (!data4 || typeof data4 !== "object" || Array.isArray(data4)) return false;
113464
- return Object.values(data4).some(
113465
- (component) => Boolean(
113466
- component && typeof component === "object" && !Array.isArray(component) && Object.prototype.hasOwnProperty.call(component, "l")
113467
- )
113468
- );
113469
- });
113770
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return null;
113771
+ return payload;
113470
113772
  } catch {
113471
- return false;
113773
+ return null;
113472
113774
  }
113473
113775
  };
113776
+ candlesHaveLiveField = (candlesSummary, tag = "candles", allowBareJson = true) => {
113777
+ const payload = candleBlockPayload(candlesSummary, tag, allowBareJson);
113778
+ if (!payload) return false;
113779
+ return Object.values(payload).some((symbolPayload) => {
113780
+ if (!symbolPayload || typeof symbolPayload !== "object" || Array.isArray(symbolPayload)) {
113781
+ return false;
113782
+ }
113783
+ const data4 = symbolPayload.data;
113784
+ if (!data4 || typeof data4 !== "object" || Array.isArray(data4)) return false;
113785
+ return Object.values(data4).some(
113786
+ (component) => Boolean(
113787
+ component && typeof component === "object" && !Array.isArray(component) && Object.prototype.hasOwnProperty.call(component, "l")
113788
+ )
113789
+ );
113790
+ });
113791
+ };
113474
113792
  templateReferencesTag = (template, tag) => {
113475
113793
  const canonicalTag = DATA_FORMAT_TAG_ALIASES[tag] ?? tag;
113476
113794
  const aliases = /* @__PURE__ */ new Set([tag, canonicalTag]);
113477
113795
  for (const [alias, canonical] of Object.entries(DATA_FORMAT_TAG_ALIASES)) {
113478
113796
  if (canonical === canonicalTag) aliases.add(alias);
113479
113797
  }
113480
- return [...template.matchAll(/(?<!\{)\{([a-zA-Z0-9_]+)\}(?!\})/g)].some((match) => aliases.has(match[1]));
113798
+ return promptTemplatePlaceholders(template).some((name) => aliases.has(name));
113481
113799
  };
113482
113800
  templateTagOrder = (template) => {
113483
113801
  const ordered = [];
113484
- for (const match of template.matchAll(/(?<!\{)\{([a-zA-Z0-9_]+)\}(?!\})/g)) {
113485
- const tag = DATA_FORMAT_TAG_ALIASES[match[1]] ?? match[1];
113802
+ for (const name of promptTemplatePlaceholders(template)) {
113803
+ const tag = DATA_FORMAT_TAG_ALIASES[name] ?? name;
113486
113804
  if (!ordered.includes(tag)) ordered.push(tag);
113487
113805
  }
113488
113806
  return ordered;
@@ -113515,6 +113833,29 @@ var init_prompt_contract = __esm({
113515
113833
  legend = legend.replaceAll(candleLiveFieldToken, liveField);
113516
113834
  legend = legend.replaceAll(candleLiveGuidanceToken, liveGuidance);
113517
113835
  }
113836
+ const referenceLiveFieldToken = "{reference_candle_live_field}";
113837
+ const referenceLiveGuidanceToken = "{reference_candle_live_guidance}";
113838
+ const referenceBlockPresent = candleBlockPayload(
113839
+ options.referenceCandlesSummary,
113840
+ REFERENCE_CANDLES_PROMPT_VARIABLE,
113841
+ false
113842
+ ) !== null;
113843
+ if (legend.includes(referenceLiveFieldToken) || legend.includes(referenceLiveGuidanceToken)) {
113844
+ let referenceLiveField = "";
113845
+ let referenceLiveGuidance = "";
113846
+ if (candlesHaveLiveField(options.referenceCandlesSummary, REFERENCE_CANDLES_PROMPT_VARIABLE, false)) {
113847
+ referenceLiveField = String(options.candleLiveFieldSchema ?? "").trim();
113848
+ referenceLiveGuidance = String(options.candleLiveGuidance ?? "").trim();
113849
+ if (!referenceLiveField) {
113850
+ throw new Error("Missing prompts config key: instructions.data_format.candle_live_field");
113851
+ }
113852
+ if (!referenceLiveGuidance) {
113853
+ throw new Error("Missing prompts config key: instructions.data_format.candle_live_guidance");
113854
+ }
113855
+ }
113856
+ legend = legend.replaceAll(referenceLiveFieldToken, referenceLiveField);
113857
+ legend = legend.replaceAll(referenceLiveGuidanceToken, referenceLiveGuidance);
113858
+ }
113518
113859
  const behaviorLastTradeToken = "{behavior_last_trade}";
113519
113860
  if (legend.includes(behaviorLastTradeToken)) {
113520
113861
  let behaviorLastTrade = "";
@@ -113608,6 +113949,28 @@ var init_prompt_contract = __esm({
113608
113949
  );
113609
113950
  }
113610
113951
  }
113952
+ if (tag === REFERENCE_CANDLES_PROMPT_VARIABLE) {
113953
+ const referenceColumnsToken = "{reference_candle_columns}";
113954
+ if (!line.includes(referenceColumnsToken)) {
113955
+ throw new Error(
113956
+ "Missing prompts placeholder: instructions.data_format.legend reference_candles line requires {reference_candle_columns}"
113957
+ );
113958
+ }
113959
+ line = line.replaceAll(
113960
+ referenceColumnsToken,
113961
+ candlesRowColumns(options.referenceIndicatorFlags).join(",")
113962
+ );
113963
+ line = line.replaceAll(
113964
+ "{reference_candle_indicator_definitions}",
113965
+ renderCandleIndicatorDefinitions(
113966
+ options.referenceIndicatorFlags,
113967
+ options.candleIndicatorSchemas
113968
+ )
113969
+ );
113970
+ if (shouldFilter && !referenceBlockPresent) {
113971
+ continue;
113972
+ }
113973
+ }
113611
113974
  if (isNewsPromptTag(tag)) {
113612
113975
  line = renderNewsLegendLine(line, options.newsSummary, tag);
113613
113976
  if (shouldFilter && !newsTagBlock(options.newsSummary, tag)) {
@@ -113676,6 +114039,25 @@ var init_prompt_contract = __esm({
113676
114039
  }
113677
114040
  return replacedLines.join("\n").trim();
113678
114041
  };
114042
+ SIZE_AMOUNT_USDC_LABEL_PATTERN = / USDC(?![\p{L}\p{N}_])/uy;
114043
+ labelSizeAmountInUsd = (template) => {
114044
+ const rewritten = [];
114045
+ let cursor = 0;
114046
+ for (const { name, end } of promptTemplatePlaceholderSpans(template)) {
114047
+ if (name !== "size") {
114048
+ continue;
114049
+ }
114050
+ SIZE_AMOUNT_USDC_LABEL_PATTERN.lastIndex = end;
114051
+ const label2 = SIZE_AMOUNT_USDC_LABEL_PATTERN.exec(template);
114052
+ if (!label2) {
114053
+ continue;
114054
+ }
114055
+ rewritten.push(template.slice(cursor, label2.index), " USD");
114056
+ cursor = label2.index + label2[0].length;
114057
+ }
114058
+ rewritten.push(template.slice(cursor));
114059
+ return rewritten.join("");
114060
+ };
113679
114061
  canonicalizePromptPlaceholders = (template) => {
113680
114062
  if (typeof template !== "string" || !template) {
113681
114063
  return { template: "", changed: false };
@@ -113688,7 +114070,7 @@ var init_prompt_contract = __esm({
113688
114070
  changed = true;
113689
114071
  }
113690
114072
  }
113691
- const usdTemplate = updated.replace(/(?<!\{)\{size\}(?!\}) USDC\b/g, "{size} USD");
114073
+ const usdTemplate = labelSizeAmountInUsd(updated);
113692
114074
  changed ||= usdTemplate !== updated;
113693
114075
  updated = usdTemplate;
113694
114076
  return { template: updated, changed };
@@ -113699,16 +114081,6 @@ var init_prompt_contract = __esm({
113699
114081
  }
113700
114082
  return text.replace(/\r\n/g, "\n").replace(/[\t ]{2,}\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
113701
114083
  };
113702
- renderPromptTemplate = (template, contextVars) => {
113703
- const escapedOpen = "__VTX_PROMPT_OPEN_BRACE__";
113704
- const escapedClose = "__VTX_PROMPT_CLOSE_BRACE__";
113705
- const prepared = template.replaceAll("{{", escapedOpen).replaceAll("}}", escapedClose);
113706
- const rendered = prepared.replace(/\{([a-zA-Z0-9_]+)\}/g, (_match, key) => {
113707
- const value = contextVars[key];
113708
- return value === null || value === void 0 ? "" : String(value);
113709
- });
113710
- return rendered.replaceAll(escapedOpen, "{").replaceAll(escapedClose, "}");
113711
- };
113712
114084
  formatInstructionTemplate = (template, vars) => {
113713
114085
  const escapedOpen = "__VTX_INSTR_OPEN_BRACE__";
113714
114086
  const escapedClose = "__VTX_INSTR_CLOSE_BRACE__";
@@ -113771,7 +114143,9 @@ ${jsonInstruction}`.trim();
113771
114143
  behaviorPreviousDecisionSchema: instructions.data_format?.behavior_previous_decision,
113772
114144
  behaviorPreviousCampaignSchema: instructions.data_format?.behavior_previous_campaign,
113773
114145
  behaviorEntryTradeSchema: instructions.data_format?.behavior_entry_trade,
113774
- candleIndicatorSchemas: instructions.data_format?.candle_indicators
114146
+ candleIndicatorSchemas: instructions.data_format?.candle_indicators,
114147
+ referenceCandlesSummary: options.referenceCandlesSummary,
114148
+ referenceIndicatorFlags: options.referenceIndicatorFlags
113775
114149
  });
113776
114150
  const hasDataFormatInstructions = /^[ \t]*DATA FORMAT(?: INSTRUCTIONS)?:/m.test(template);
113777
114151
  if (legend && !hasDataFormatInstructions) {
@@ -113788,7 +114162,9 @@ ${legend}`.trim();
113788
114162
  behaviorPreviousDecisionSchema: instructions.data_format?.behavior_previous_decision,
113789
114163
  behaviorPreviousCampaignSchema: instructions.data_format?.behavior_previous_campaign,
113790
114164
  behaviorEntryTradeSchema: instructions.data_format?.behavior_entry_trade,
113791
- candleIndicatorSchemas: instructions.data_format?.candle_indicators
114165
+ candleIndicatorSchemas: instructions.data_format?.candle_indicators,
114166
+ referenceCandlesSummary: options.referenceCandlesSummary,
114167
+ referenceIndicatorFlags: options.referenceIndicatorFlags
113792
114168
  });
113793
114169
  template = replaceEmbeddedDataFormatLegend(template, canonicalLegend, legend);
113794
114170
  }
@@ -113974,7 +114350,7 @@ var init_behavior_memory_prompt_observability = __esm({
113974
114350
  });
113975
114351
 
113976
114352
  // lib/runtime/prompt-number-contract.ts
113977
- var finiteNumber3, roundPromptFixed, roundPromptSignificant, roundPromptNonnegativeUnits;
114353
+ var finiteNumber3, roundPromptFixed, roundPromptSignificant, roundPromptRelativeVolume, roundPromptNonnegativeUnits;
113978
114354
  var init_prompt_number_contract = __esm({
113979
114355
  "lib/runtime/prompt-number-contract.ts"() {
113980
114356
  "use strict";
@@ -114008,6 +114384,27 @@ var init_prompt_number_contract = __esm({
114008
114384
  const rounded = Number(numeric2.toPrecision(digits));
114009
114385
  return Object.is(rounded, -0) ? 0 : rounded;
114010
114386
  };
114387
+ roundPromptRelativeVolume = (value) => {
114388
+ if (value === null || value === void 0 || typeof value === "boolean") {
114389
+ return null;
114390
+ }
114391
+ if (typeof value === "string" && !value.trim()) {
114392
+ return null;
114393
+ }
114394
+ const numeric2 = finiteNumber3(value);
114395
+ if (numeric2 == null) {
114396
+ return null;
114397
+ }
114398
+ const digits = PROMPT_RELATIVE_VOLUME_DIGITS;
114399
+ const awayFromZero = numeric2.toFixed(digits);
114400
+ const tieNumerator = numeric2 * BINARY_RADIX ** (digits + 1);
114401
+ if (!Number.isInteger(tieNumerator) || Math.abs(tieNumerator) % BINARY_RADIX !== 1) {
114402
+ return Number(awayFromZero);
114403
+ }
114404
+ const towardZero = numeric2.toFixed(digits + 1).slice(0, -1);
114405
+ const towardZeroIsEven = Number(towardZero.at(-1)) % BINARY_RADIX === 0;
114406
+ return Number(towardZeroIsEven ? towardZero : awayFromZero);
114407
+ };
114011
114408
  roundPromptNonnegativeUnits = (value) => {
114012
114409
  const numeric2 = finiteNumber3(value);
114013
114410
  if (numeric2 == null || numeric2 <= 0) {
@@ -114561,6 +114958,7 @@ __export(local_analysis_exports, {
114561
114958
  buildLocalRuntimePromptArtifacts: () => buildLocalRuntimePromptArtifacts,
114562
114959
  buildPromptBehaviorStateArtifacts: () => buildPromptBehaviorStateArtifacts,
114563
114960
  buildPromptBehaviorStateValue: () => buildPromptBehaviorStateValue,
114961
+ buildPromptCandleTimeframeComponent: () => buildPromptCandleTimeframeComponent,
114564
114962
  capacityUnitSize: () => capacityUnitSize,
114565
114963
  derivePromptVisibleSections: () => derivePromptVisibleSections,
114566
114964
  isClientRuntimeAgentInstructionEmpty: () => isClientRuntimeAgentInstructionEmpty,
@@ -114576,7 +114974,7 @@ __export(local_analysis_exports, {
114576
114974
  runLocalRuntimeCycle: () => runLocalRuntimeCycle,
114577
114975
  summarizeReviewFailureExplanation: () => summarizeReviewFailureExplanation
114578
114976
  });
114579
- var CYCLE_TIMEOUT_FLOOR_MS, DECISION_SETTLEMENT_RESERVE_MAX_BUDGET_DIVISOR, MIN_AGENT_INSTRUCTION_RETRY_AFTER_MS, PROMPT_PARITY_ERROR_DETAIL_MAX_CHARS, EXTERNAL_INFERENCE_RUNTIME_POLL_INTERVAL_MS, REVIEW_PROVIDER_SERVER_ERROR_STATUSES, TRUNCATION_ELLIPSIS2, normalizeNativeValues, assertPromptModelController, resolveRuntimeReasoningControlsForModel, modelScopedKey, resolveNativeValuesForModel, observeRuntimeCycle, observeAccountState, aiOrderSlippageFraction, serverBehaviorStateArtifacts, ClientRuntimeAgentInstructionEmpty, isClientRuntimeAgentInstructionEmpty, ClientRuntimeAiSchedulePaused, ClientRuntimeAiScheduleStillActive, isClientRuntimeAiScheduleStillActive, ServerDispatchAccountStateStale, isServerDispatchAccountStateStale, isClientRuntimeAiSchedulePaused, acceptancePositionCaps, accountSnapshotCapturedAt, buildClaimedAgentRuntimeCycleResult, resolveRuntimeMarginModePreference, resolveRuntimeLeveragePreference, resolveBooleanSetting2, CLIENT_RUNTIME_LIVE_CONTEXT_UNAVAILABLE_ERRORS, BEHAVIOR_STATE_UNAVAILABLE_ERROR, CriticalBehaviorStateError, clampNumber, resolveExternalInferenceRuntimeTimeoutSeconds, toPositiveFinite3, compactSnippet, hashRuntimeDebugText, EFFECTIVE_INPUT_MANIFEST_SCHEMA_VERSION, PROMPT_ASSEMBLY_DEFINITION_VERSION, RUNTIME_SOURCE_DEFINITION_VERSION, DECISION_INPUT_DEFINITION_VERSION, CONTEXT_ENVELOPE_DEFINITION_VERSION, CLIENT_RUNTIME_SOURCE_VERSION, CLIENT_MAIN_PROMPT_RENDERER, SERVER_MAIN_PROMPT_RENDERER, CLIENT_REVIEW_PROMPT_RENDERER, SERVER_REVIEW_PROMPT_RENDERER, resolveEffectivePromptRuntimeProvenance, canonicalManifestValue, canonicalManifestJson, sha256ManifestHex, effectiveInputComponent, buildEffectiveInputManifest, derivePromptVisibleSections, decodeDecisionTracePayload, extractDecisionSymbolTrace, formatDecisionSymbolTrace, formatActionableDecisionSymbols, decisionRecordsBySymbol, normalizePromptSymbols, JSON_MODEL_OUTPUT_FENCE_PATTERN, STRICT_MODEL_OUTPUT_KEYS, currentModelOutputValidationErrors, currentModelOutputMatchesContract, projectCurrentModelDecisionContent, modelOutputValidationError, SERVER_UNREADABLE_REPLY_HOLD_REASONING, buildMissingDecisionHold, buildDecisionPlansFromResponse, buildReviewCandidatePlansFromResponse, forceUnavailableSymbolsToHold, extractTemplatePlaceholders, requireReviewPrimaryUserPromptTemplate, containsCompetingBehaviorStateMarkup, containsCompetingMainBehaviorStateMarkup, requireStrategyReviewTemplates, preflightStrategyReviewPromptContract, extractRuntimeReasoningSelection, isAbortError, isRuntimeTimeoutAbortReason, REVIEW_FAILURE_SENSITIVE_DB_TOKENS, REVIEW_FAILURE_SCHEMA_DISCLOSURE_TOKENS, REVIEW_FAILURE_SQL_STATEMENT_PATTERN, REVIEW_FAILURE_TRACEBACK_PATTERN, isSensitiveReviewFailureDetail, summarizeReviewFailureExplanation, buildReviewFailureHoldReason, createAbortError2, settleRuntimeCyclePromise, unwrapRuntimeCycleSettledResult, normalizeDecisionLabel, normalizeRuntimeSymbol, PromptContractFetchError, isLivePromptContextUnavailableError, buildFailClosedHoldResult, buildPromptConstructionFailureResult, buildLivePromptContextUnavailableFailureResult, pickFirstString, normalizeRuntimeStringList, requirePositiveRuntimeLimit, resolveRuntimeTradingScope, normalizeRuntimeProviderAlias, resolveCatalogModelEntry, createClientRuntimeProviderSetupError, createProviderSetupRejectionError, evaluateModelEligibility, extractReviewRuntimeReasoningSelection, isUsableRuntimeSettingsFallback, resolveRuntimeSettings, formatRuntimeDurationMs, normalizeRuntimeTimingNote, appendRuntimeTimingEvent, reportPromptParityTelemetry, resolveLocalRuntimeSecretRequirements, resolveLocalRuntimeSecretProvider, toEpochSeconds, REQUIRED_AI_INDICATOR_KEYS, sortTradingTimeframes, normalizePromptIdentityTimestamp, resolveCompletedCandleBoundary, normalizeAiIndicatorFlags, getPromptLookback, computeSma, computeEma, computeRsi, computeAtr, computeMacd, computeBollingerBands, getIndicatorValue, buildPromptCandlesComponent, CANDLE_CLOSE_TICKER_TIMEFRAME, candleCloseTicker, buildPromptCandlesPayload, formatUtcTimestampWithWeekday, formatUtcNowWithWeekday, formatPromptPrice, capacityUnitSize, computePromptUnitsUsedForPosition, buildPromptAccountStatusValue, buildPromptPositionsValue, sanitizePromptSymbol, fillTimeMs, fillSize, normalizeFillSide, normalizeFillOrderId, normalizeFillRiskOrderIdentity, fillStartPosition, fillSortValue, sortFillsAscending, sortFillsDescending, inferEntryFromStartPositionChain, inferEntryFromCurrentPositionSize, calculateCurrentPositionState, calculatePositionEntryTimes, countPositionAdds, latestPositionRiskIncreaseTimeMs, latestPositionRiskIncreaseEvidence, compactPromptRiskIncrease, roundPositiveDecimalHalfUp, compactPromptLastTrade, ENTRY_TRADE_FIELDS, PREVIOUS_DECISION_FIELDS, PREVIOUS_CAMPAIGN_FIELDS, hasExactKeys2, isNonnegativeInteger, isFiniteNumber, isExactEnumString, isNonemptyPromptText, isCampaignReasoningText, projectBackendDecisionMemoryItem, requireRenderedStrategyBehaviorState, canonicalFillSideForRiskEvidence, isValidRiskEvidenceFill, isValidCampaignBoundaryFill, normalizeFillHistoryCoverage, resolveFillHistoryCoverageForSymbol, buildPromptBehaviorStateArtifacts, buildPromptBehaviorStateValue, shouldCompareServerPromptParity, buildLocalRuntimePromptArtifacts, createRuntimeId2, asRecord, buildRuntimeConstraintRejectionMessage, hasDeviceProviderSecret, requireNonEmptyStringField, requirePositiveIntegerField, compareContractVersion, parsePromptContractTimestamp, assertPromptContractCompatibility, assertPromptContractTemporalBounds, sleepWithAbort, requireAgentPollRetryAfterMs, materializeClaimedClientRuntimeAgentInstruction, attachClientRuntimeErrorProvenance, isExternalRuntimeProviderResult, invokeClientExternalInference, assertPromptContractBindingTupleEqual, assertPromptContractScopeMatch, fetchBoundPromptContracts, formatTemplateWithNamedVariables, carryReturnedModelCalls, runLocalRuntimeCycle;
114977
+ var CYCLE_TIMEOUT_FLOOR_MS, DECISION_SETTLEMENT_RESERVE_MAX_BUDGET_DIVISOR, MIN_AGENT_INSTRUCTION_RETRY_AFTER_MS, PROMPT_PARITY_ERROR_DETAIL_MAX_CHARS, EXTERNAL_INFERENCE_RUNTIME_POLL_INTERVAL_MS, REVIEW_PROVIDER_SERVER_ERROR_STATUSES, TRUNCATION_ELLIPSIS2, normalizeNativeValues, assertPromptModelController, resolveRuntimeReasoningControlsForModel, modelScopedKey, resolveNativeValuesForModel, observeRuntimeCycle, observeAccountState, aiOrderSlippageFraction, serverBehaviorStateArtifacts, ClientRuntimeAgentInstructionEmpty, isClientRuntimeAgentInstructionEmpty, ClientRuntimeAiSchedulePaused, ClientRuntimeAiScheduleStillActive, isClientRuntimeAiScheduleStillActive, ServerDispatchAccountStateStale, isServerDispatchAccountStateStale, isClientRuntimeAiSchedulePaused, acceptancePositionCaps, accountSnapshotCapturedAt, buildClaimedAgentRuntimeCycleResult, resolveRuntimeMarginModePreference, resolveRuntimeLeveragePreference, resolveBooleanSetting2, CLIENT_RUNTIME_LIVE_CONTEXT_UNAVAILABLE_ERRORS, BEHAVIOR_STATE_UNAVAILABLE_ERROR, CriticalBehaviorStateError, clampNumber, resolveExternalInferenceRuntimeTimeoutSeconds, toPositiveFinite3, compactSnippet, hashRuntimeDebugText, EFFECTIVE_INPUT_MANIFEST_SCHEMA_VERSION, PROMPT_ASSEMBLY_DEFINITION_VERSION, RUNTIME_SOURCE_DEFINITION_VERSION, DECISION_INPUT_DEFINITION_VERSION, CONTEXT_ENVELOPE_DEFINITION_VERSION, CLIENT_RUNTIME_SOURCE_VERSION, CLIENT_MAIN_PROMPT_RENDERER, SERVER_MAIN_PROMPT_RENDERER, CLIENT_REVIEW_PROMPT_RENDERER, SERVER_REVIEW_PROMPT_RENDERER, resolveEffectivePromptRuntimeProvenance, canonicalManifestValue, canonicalManifestJson, sha256ManifestHex, effectiveInputComponent, buildEffectiveInputManifest, MANIFEST_COMPONENT_NAME, derivePromptVisibleSections, decodeDecisionTracePayload, extractDecisionSymbolTrace, formatDecisionSymbolTrace, formatActionableDecisionSymbols, decisionRecordsBySymbol, normalizePromptSymbols, JSON_MODEL_OUTPUT_FENCE_PATTERN, STRICT_MODEL_OUTPUT_KEYS, currentModelOutputValidationErrors, currentModelOutputMatchesContract, projectCurrentModelDecisionContent, modelOutputValidationError, SERVER_UNREADABLE_REPLY_HOLD_REASONING, buildMissingDecisionHold, buildDecisionPlansFromResponse, buildReviewCandidatePlansFromResponse, forceUnavailableSymbolsToHold, extractTemplatePlaceholders, requireReviewPrimaryUserPromptTemplate, containsCompetingBehaviorStateMarkup, containsCompetingMainBehaviorStateMarkup, requireStrategyReviewTemplates, preflightStrategyReviewPromptContract, extractRuntimeReasoningSelection, isAbortError, isRuntimeTimeoutAbortReason, REVIEW_FAILURE_SENSITIVE_DB_TOKENS, REVIEW_FAILURE_SCHEMA_DISCLOSURE_TOKENS, REVIEW_FAILURE_SQL_STATEMENT_PATTERN, REVIEW_FAILURE_TRACEBACK_PATTERN, isSensitiveReviewFailureDetail, summarizeReviewFailureExplanation, buildReviewFailureHoldReason, createAbortError2, settleRuntimeCyclePromise, unwrapRuntimeCycleSettledResult, normalizeDecisionLabel, normalizeRuntimeSymbol, PromptContractFetchError, isLivePromptContextUnavailableError, buildFailClosedHoldResult, buildPromptConstructionFailureResult, buildLivePromptContextUnavailableFailureResult, pickFirstString, normalizeRuntimeStringList, requirePositiveRuntimeLimit, resolveRuntimeTradingScope, normalizeRuntimeProviderAlias, resolveCatalogModelEntry, createClientRuntimeProviderSetupError, createProviderSetupRejectionError, evaluateModelEligibility, extractReviewRuntimeReasoningSelection, isUsableRuntimeSettingsFallback, resolveRuntimeSettings, formatRuntimeDurationMs, normalizeRuntimeTimingNote, appendRuntimeTimingEvent, reportPromptParityTelemetry, resolveLocalRuntimeSecretRequirements, resolveLocalRuntimeSecretProvider, toEpochSeconds, AI_INDICATOR_KEYS_NEWER_THAN_SOME_SERVERS, sortTradingTimeframes, normalizePromptIdentityTimestamp, resolveCompletedCandleBoundary, normalizeAiIndicatorFlags, getPromptLookback, computeSma, computeEma, computeRsi, computeAtr, computeMacd, computeBollingerBands, getIndicatorValue, buildPromptCandlesComponent, buildPromptCandleTimeframeComponent, resolvePromptRelativeVolumeContext, promptRelativeVolumeBaseline, CANDLE_CLOSE_TICKER_TIMEFRAME, candleCloseTicker, buildPromptCandlesPayload, formatUtcTimestampWithWeekday, formatUtcNowWithWeekday, formatPromptPrice, capacityUnitSize, computePromptUnitsUsedForPosition, buildPromptAccountStatusValue, buildPromptPositionsValue, sanitizePromptSymbol, fillTimeMs, fillSize, normalizeFillSide, normalizeFillOrderId, normalizeFillRiskOrderIdentity, fillStartPosition, fillSortValue, sortFillsAscending, sortFillsDescending, inferEntryFromStartPositionChain, inferEntryFromCurrentPositionSize, calculateCurrentPositionState, calculatePositionEntryTimes, countPositionAdds, latestPositionRiskIncreaseTimeMs, latestPositionRiskIncreaseEvidence, compactPromptRiskIncrease, roundPositiveDecimalHalfUp, compactPromptLastTrade, ENTRY_TRADE_FIELDS, PREVIOUS_DECISION_FIELDS, PREVIOUS_CAMPAIGN_FIELDS, hasExactKeys2, isNonnegativeInteger, isFiniteNumber, isExactEnumString, isNonemptyPromptText, isCampaignReasoningText, projectBackendDecisionMemoryItem, requireRenderedStrategyBehaviorState, canonicalFillSideForRiskEvidence, isValidRiskEvidenceFill, isValidCampaignBoundaryFill, normalizeFillHistoryCoverage, resolveFillHistoryCoverageForSymbol, buildPromptBehaviorStateArtifacts, buildPromptBehaviorStateValue, shouldCompareServerPromptParity, buildLocalRuntimePromptArtifacts, createRuntimeId2, asRecord, buildRuntimeConstraintRejectionMessage, hasDeviceProviderSecret, requireNonEmptyStringField, requirePositiveIntegerField, compareContractVersion, parsePromptContractTimestamp, assertPromptContractCompatibility, assertPromptContractTemporalBounds, sleepWithAbort, requireAgentPollRetryAfterMs, materializeClaimedClientRuntimeAgentInstruction, attachClientRuntimeErrorProvenance, isExternalRuntimeProviderResult, invokeClientExternalInference, assertPromptContractBindingTupleEqual, assertPromptContractScopeMatch, fetchBoundPromptContracts, formatTemplateWithNamedVariables, carryReturnedModelCalls, runLocalRuntimeCycle;
114580
114978
  var init_local_analysis = __esm({
114581
114979
  "lib/runtime/local-analysis.ts"() {
114582
114980
  "use strict";
@@ -115304,13 +115702,12 @@ var init_local_analysis = __esm({
115304
115702
  }
115305
115703
  };
115306
115704
  };
115705
+ MANIFEST_COMPONENT_NAME = /^[a-z][a-z0-9_]{0,63}$/;
115307
115706
  derivePromptVisibleSections = (input) => {
115308
115707
  const configuredTemplate = input.configuredTemplates.filter((value) => typeof value === "string").join("\n");
115309
- const placeholders = /* @__PURE__ */ new Set();
115310
- const placeholderPattern = /(?<!\{)\{([a-z][a-z0-9_]{0,63})\}(?!\})/g;
115311
- for (const match of configuredTemplate.matchAll(placeholderPattern)) {
115312
- placeholders.add(match[1]);
115313
- }
115708
+ const placeholders = new Set(
115709
+ promptTemplatePlaceholders(configuredTemplate).filter((name) => MANIFEST_COMPONENT_NAME.test(name))
115710
+ );
115314
115711
  const finalPromptText = input.renderedPrompts.filter((value) => typeof value === "string").join("\n");
115315
115712
  return new Set(Object.entries(input.dynamicComponents).filter(([name, value]) => {
115316
115713
  if (placeholders.has(name)) {
@@ -115697,21 +116094,11 @@ var init_local_analysis = __esm({
115697
116094
  `No usable candle data was available for configured symbol ${normalizedSymbol || plan.symbol}; forced HOLD.`
115698
116095
  );
115699
116096
  });
115700
- extractTemplatePlaceholders = (template) => {
115701
- const matches2 = Array.from(template.matchAll(/(?<!\{)\{([a-zA-Z0-9_]+)\}(?!\})/g));
115702
- const unique = /* @__PURE__ */ new Set();
115703
- for (const match of matches2) {
115704
- const key = String(match[1] || "").trim();
115705
- if (key) {
115706
- unique.add(key);
115707
- }
115708
- }
115709
- return Array.from(unique).sort();
115710
- };
116097
+ extractTemplatePlaceholders = (template) => Array.from(new Set(promptTemplatePlaceholders(template))).sort();
115711
116098
  requireReviewPrimaryUserPromptTemplate = (template) => {
115712
116099
  const canonical = canonicalizePromptPlaceholders(template).template;
115713
- const activePrimaryPlaceholders = Array.from(
115714
- canonical.matchAll(/(?<!\{)\{primary_user_prompt\}(?!\})/g)
116100
+ const activePrimaryPlaceholders = promptTemplatePlaceholders(canonical).filter(
116101
+ (name) => name === "primary_user_prompt"
115715
116102
  );
115716
116103
  if (activePrimaryPlaceholders.length > 1 || /<\/?behavior_state\b/.test(canonical)) {
115717
116104
  throw new CriticalBehaviorStateError();
@@ -116317,16 +116704,7 @@ ${reviewOutputContract}`;
116317
116704
  }
116318
116705
  return 0;
116319
116706
  };
116320
- REQUIRED_AI_INDICATOR_KEYS = [
116321
- "rsi",
116322
- "macd",
116323
- "bollinger",
116324
- "atr",
116325
- "ema_9",
116326
- "ema_21",
116327
- "ema_50",
116328
- "ema_200"
116329
- ];
116707
+ AI_INDICATOR_KEYS_NEWER_THAN_SOME_SERVERS = ["rv"];
116330
116708
  sortTradingTimeframes = (timeframes) => sortCandleTimeframes(Array.from(
116331
116709
  new Set(
116332
116710
  timeframes.map((value) => String(value || "").trim()).filter(Boolean)
@@ -116359,19 +116737,25 @@ ${reviewOutputContract}`;
116359
116737
  throw new Error("Missing required client runtime config: default_ai_indicators.");
116360
116738
  }
116361
116739
  const normalizedDefaults = Object.fromEntries(
116362
- REQUIRED_AI_INDICATOR_KEYS.map((key) => {
116740
+ AI_INDICATOR_KEYS.flatMap((key) => {
116363
116741
  const rawValue = defaultsValue[key];
116742
+ if (rawValue === void 0 && AI_INDICATOR_KEYS_NEWER_THAN_SOME_SERVERS.includes(key)) {
116743
+ return [];
116744
+ }
116364
116745
  if (typeof rawValue !== "boolean") {
116365
116746
  throw new Error(`Invalid client runtime config: default_ai_indicators.${key} must be boolean.`);
116366
116747
  }
116367
- return [key, rawValue];
116748
+ return [[key, rawValue]];
116368
116749
  })
116369
116750
  );
116370
116751
  if (!overridesValue || typeof overridesValue !== "object" || Array.isArray(overridesValue)) {
116371
116752
  return normalizedDefaults;
116372
116753
  }
116373
116754
  const merged = { ...normalizedDefaults };
116374
- for (const key of REQUIRED_AI_INDICATOR_KEYS) {
116755
+ for (const key of AI_INDICATOR_KEYS) {
116756
+ if (!Object.prototype.hasOwnProperty.call(normalizedDefaults, key)) {
116757
+ continue;
116758
+ }
116375
116759
  const overrideValue = overridesValue[key];
116376
116760
  if (overrideValue == null) {
116377
116761
  continue;
@@ -116579,7 +116963,7 @@ ${reviewOutputContract}`;
116579
116963
  }
116580
116964
  return roundPromptSignificant(value, roundDigits);
116581
116965
  };
116582
- buildPromptCandlesComponent = (candles, promptLookback, activeIndicators) => {
116966
+ buildPromptCandlesComponent = (candles, promptLookback, activeIndicators, relativeVolume) => {
116583
116967
  const sortedCandles = [...candles].sort(
116584
116968
  (left, right) => toEpochSeconds(left.timestamp) - toEpochSeconds(right.timestamp)
116585
116969
  );
@@ -116619,6 +117003,18 @@ ${reviewOutputContract}`;
116619
117003
  if (activeIndicators.ema_200) {
116620
117004
  indicators.ema_200 = computeEma(closes, PROMPT_EMA_PERIODS.ema_200);
116621
117005
  }
117006
+ if (activeIndicators.rv) {
117007
+ indicators.rv = calculateRelativeVolumeSeries({
117008
+ candles: sortedCandles,
117009
+ closedCount: relativeVolume ? closedCandleCount({
117010
+ openTimestamps: sortedCandles.map((candle) => toEpochSeconds(candle.timestamp)),
117011
+ timeframe: relativeVolume.timeframe,
117012
+ asOfTimestamp: relativeVolume.asOfTimestamp
117013
+ }) : 0,
117014
+ baselineDollarVolume: relativeVolume?.baselineDollarVolume ?? null,
117015
+ recentCandles: relativeVolume?.recentCandles ?? 0
117016
+ });
117017
+ }
116622
117018
  const recentCandles = sortedCandles.slice(-Math.max(promptLookback, 1));
116623
117019
  const startIndex = sortedCandles.length - recentCandles.length;
116624
117020
  const summarized = recentCandles.map((candle, index) => {
@@ -116631,38 +117027,55 @@ ${reviewOutputContract}`;
116631
117027
  roundPromptSignificant(candle.close, PROMPT_SIGNIFICANT_DIGITS),
116632
117028
  Math.trunc(Number(candle.volume) || 0)
116633
117029
  ];
116634
- if (activeIndicators.rsi) {
116635
- const rsiValue = getIndicatorValue(indicators.rsi, currentIndex);
116636
- row.push(rsiValue == null ? null : roundPromptFixed(rsiValue, 1));
116637
- }
116638
- if (activeIndicators.macd) {
116639
- row.push(getIndicatorValue(indicators.macd_line, currentIndex));
116640
- row.push(getIndicatorValue(indicators.macd_signal, currentIndex));
116641
- row.push(getIndicatorValue(indicators.macd_hist, currentIndex));
116642
- }
116643
- if (activeIndicators.bollinger) {
116644
- row.push(getIndicatorValue(indicators.bb_upper, currentIndex));
116645
- row.push(getIndicatorValue(indicators.bb_lower, currentIndex));
116646
- }
116647
- if (activeIndicators.atr) {
116648
- row.push(getIndicatorValue(indicators.atr, currentIndex));
116649
- }
116650
- if (activeIndicators.ema_9) {
116651
- row.push(getIndicatorValue(indicators.ema_9, currentIndex));
116652
- }
116653
- if (activeIndicators.ema_21) {
116654
- row.push(getIndicatorValue(indicators.ema_21, currentIndex));
116655
- }
116656
- if (activeIndicators.ema_50) {
116657
- row.push(getIndicatorValue(indicators.ema_50, currentIndex));
116658
- }
116659
- if (activeIndicators.ema_200) {
116660
- row.push(getIndicatorValue(indicators.ema_200, currentIndex));
117030
+ for (const indicatorKey of AI_INDICATOR_KEYS) {
117031
+ if (!activeIndicators[indicatorKey]) {
117032
+ continue;
117033
+ }
117034
+ for (const column of AI_INDICATOR_ROW_COLUMNS[indicatorKey]) {
117035
+ if (column === "rv") {
117036
+ row.push(roundPromptRelativeVolume(indicators.rv?.[currentIndex] ?? null));
117037
+ continue;
117038
+ }
117039
+ const value = getIndicatorValue(indicators[column], currentIndex);
117040
+ row.push(column === "rsi" && value != null ? roundPromptFixed(value, 1) : value);
117041
+ }
116661
117042
  }
116662
117043
  return row;
116663
117044
  });
116664
117045
  return { c: summarized };
116665
117046
  };
117047
+ buildPromptCandleTimeframeComponent = (input) => projectCandlePromptComponent({
117048
+ component: buildPromptCandlesComponent(
117049
+ input.candles,
117050
+ input.promptLookback,
117051
+ input.activeIndicators,
117052
+ input.relativeVolume ? { ...input.relativeVolume, timeframe: input.timeframe, asOfTimestamp: input.asOfTimestamp } : null
117053
+ ),
117054
+ timeframe: input.timeframe,
117055
+ asOfTimestamp: input.asOfTimestamp
117056
+ });
117057
+ resolvePromptRelativeVolumeContext = (derivedContext) => {
117058
+ const baselinesBySymbol = derivedContext.relative_volume_baselines;
117059
+ const recentCandles = derivedContext.relative_volume_recent_candles;
117060
+ if (!baselinesBySymbol || typeof baselinesBySymbol !== "object" || Array.isArray(baselinesBySymbol)) {
117061
+ return null;
117062
+ }
117063
+ if (typeof recentCandles !== "number" || !Number.isInteger(recentCandles) || recentCandles <= 0) {
117064
+ return null;
117065
+ }
117066
+ return { baselinesBySymbol, recentCandles };
117067
+ };
117068
+ promptRelativeVolumeBaseline = (context, symbol2, timeframe) => {
117069
+ const symbolKey = Object.prototype.hasOwnProperty.call(context.baselinesBySymbol, symbol2) ? symbol2 : Object.keys(context.baselinesBySymbol).find(
117070
+ (candidate) => normalizeHyperliquidMarketSymbol(candidate) === normalizeHyperliquidMarketSymbol(symbol2)
117071
+ );
117072
+ const timeframeBaselines = symbolKey === void 0 ? null : context.baselinesBySymbol[symbolKey];
117073
+ if (!timeframeBaselines || typeof timeframeBaselines !== "object" || Array.isArray(timeframeBaselines)) {
117074
+ return null;
117075
+ }
117076
+ const baseline = timeframeBaselines[timeframe];
117077
+ return typeof baseline === "number" && Number.isFinite(baseline) ? baseline : null;
117078
+ };
116666
117079
  CANDLE_CLOSE_TICKER_TIMEFRAME = "5m";
116667
117080
  candleCloseTicker = (symbol2, candlesByTimeframe) => {
116668
117081
  const preferred = candlesByTimeframe[CANDLE_CLOSE_TICKER_TIMEFRAME] ?? [];
@@ -116682,10 +117095,16 @@ ${reviewOutputContract}`;
116682
117095
  for (const timeframe of input.timeframes) {
116683
117096
  const candles = input.candlesBySymbol[symbol2]?.[timeframe] ?? [];
116684
117097
  const promptLookback = getPromptLookback(input.lookbackSettings, timeframe, input.defaultLookbacks, input.maxLookback);
116685
- symbolData.data[timeframe] = projectCandlePromptComponent({
116686
- component: buildPromptCandlesComponent(candles, promptLookback, input.activeIndicators),
117098
+ symbolData.data[timeframe] = buildPromptCandleTimeframeComponent({
117099
+ candles,
116687
117100
  timeframe,
116688
- asOfTimestamp
117101
+ promptLookback,
117102
+ activeIndicators: input.activeIndicators,
117103
+ asOfTimestamp,
117104
+ relativeVolume: input.relativeVolume ? {
117105
+ baselineDollarVolume: promptRelativeVolumeBaseline(input.relativeVolume, symbol2, timeframe),
117106
+ recentCandles: input.relativeVolume.recentCandles
117107
+ } : null
116689
117108
  });
116690
117109
  }
116691
117110
  payload[symbol2] = symbolData;
@@ -117661,7 +118080,7 @@ ${behaviorJson}
117661
118080
  };
117662
118081
  buildLocalRuntimePromptArtifacts = (input) => {
117663
118082
  const { template: effectiveUserTemplate } = canonicalizePromptPlaceholders(input.userTemplate);
117664
- const activePlaceholders = new Set(extractTemplatePlaceholders(effectiveUserTemplate));
118083
+ const activePlaceholders = new Set(promptTemplatePlaceholders(effectiveUserTemplate));
117665
118084
  const systemPrompt = constructPromptSystemTemplate(input.systemTemplate, {
117666
118085
  instructions: input.instructions,
117667
118086
  symbols: input.symbols,
@@ -117673,7 +118092,9 @@ ${behaviorJson}
117673
118092
  candlesSummary: String(input.contextVars.candles ?? ""),
117674
118093
  newsSummary: NEWS_PROMPT_VARIABLES.map((key) => String(input.contextVars[key] ?? "")).filter((block) => block.trim().length > 0).join("\n"),
117675
118094
  calendarSummary: String(input.contextVars.calendar ?? ""),
117676
- behaviorStateSummary: String(input.contextVars.behavior_state ?? "")
118095
+ behaviorStateSummary: String(input.contextVars.behavior_state ?? ""),
118096
+ referenceCandlesSummary: String(input.contextVars[REFERENCE_CANDLES_PROMPT_VARIABLE] ?? ""),
118097
+ referenceIndicatorFlags: input.referenceIndicators
117677
118098
  });
117678
118099
  const templateContextVars = Object.fromEntries(
117679
118100
  Object.entries(input.contextVars).filter(([key]) => activePlaceholders.has(key))
@@ -118730,30 +119151,9 @@ ${behaviorJson}
118730
119151
  const getLatestTotalUnrealizedPnl = () => _latestTotalUnrealizedPnl;
118731
119152
  const getAccountStateResolvedAtMs = () => _accountStateResolvedAtMs;
118732
119153
  const accountStateStartedAtMs = Date.now();
118733
- let promptRescueSequence = 0;
119154
+ let promptRescueSequence = input.dispatchContextRebuild === true ? PROMPT_RESCUE_ASKS_PER_CYCLE_BUILD : 0;
118734
119155
  observeRuntimeCycle(input, { stage: "market_context" });
118735
- const browserAccountStateTask = fetchBrowserAccountState2({
118736
- publicRequestPriority: "trading_analysis",
118737
- config: config2,
118738
- walletAddress,
118739
- symbol: localFallbackSymbol,
118740
- tickerPrice: 0,
118741
- leverage: resolveRuntimeLeveragePreference(settings, config2),
118742
- aggregatePerpDexs: true,
118743
- perpDexScope: perpDexScopeForSymbols(symbols),
118744
- feeSymbols: symbols,
118745
- includeEffectiveTakerRate: true,
118746
- // A Server bot's cycle reads the account authoritatively, as the Python
118747
- // Server loop does: never a cached or rate-limit-stale observation.
118748
- forceRefresh: input.executionMode === "server",
118749
- // And values it as that loop does: Perps equity alone unless the loop's
118750
- // own tests count Spot (serverLoopAccountValue). A Client bot's cycle
118751
- // keeps the device rule.
118752
- serverLoopAccountValue: input.executionMode === "server",
118753
- sessionId,
118754
- signal: timeoutController.signal
118755
- }).catch(async (error48) => {
118756
- if (input.executionMode !== "server" || !(error48 instanceof HyperliquidPublicReadError)) throw error48;
119156
+ const rescueAccountState = async (serverReason) => {
118757
119157
  promptRescueSequence += 1;
118758
119158
  try {
118759
119159
  const rescued = await requestServerHostPromptRescue(profileId, {
@@ -118766,20 +119166,59 @@ ${behaviorJson}
118766
119166
  symbol: localFallbackSymbol,
118767
119167
  symbols,
118768
119168
  requestSequence: promptRescueSequence,
118769
- serverReason: error48.code
119169
+ serverReason
118770
119170
  }, {
118771
119171
  schedulerInstanceId: String(input.schedulerInstanceId || "").trim(),
118772
119172
  signal: timeoutController.signal
118773
119173
  });
118774
- appendRuntimeDebugEvent({ label: "account_state_prompt_rescued", note: `job=${rescued.job_id} reason=${error48.code}` });
119174
+ appendRuntimeDebugEvent({ label: "account_state_prompt_rescued", note: `job=${rescued.job_id} reason=${serverReason}` });
118775
119175
  return accountStateFromServerPromptRescueSnapshot(rescued.snapshot, localFallbackSymbol);
119176
+ } catch (rescueError) {
119177
+ if (!timeoutController.signal.aborted) {
119178
+ appendRuntimeDebugEvent({
119179
+ label: "account_state_prompt_rescue_unavailable",
119180
+ note: `reason=${serverReason} ${rescueError instanceof Error ? rescueError.message : String(rescueError)}`,
119181
+ outcome: "error"
119182
+ });
119183
+ }
119184
+ throw rescueError;
119185
+ }
119186
+ };
119187
+ const browserAccountStateTask = (async () => {
119188
+ if (input.executionMode === "server" && input.dispatchContextRebuild !== true && await hyperliquidPrivateInfoHeldOff()) {
119189
+ try {
119190
+ return await rescueAccountState(SERVER_PROMPT_RESCUE_NODE_OUTAGE_REASON);
119191
+ } catch (rescueError) {
119192
+ if (timeoutController.signal.aborted) throw rescueError;
119193
+ }
119194
+ }
119195
+ return fetchBrowserAccountState2({
119196
+ publicRequestPriority: "trading_analysis",
119197
+ config: config2,
119198
+ walletAddress,
119199
+ symbol: localFallbackSymbol,
119200
+ tickerPrice: 0,
119201
+ leverage: resolveRuntimeLeveragePreference(settings, config2),
119202
+ aggregatePerpDexs: true,
119203
+ perpDexScope: perpDexScopeForSymbols(symbols),
119204
+ feeSymbols: symbols,
119205
+ includeEffectiveTakerRate: true,
119206
+ // A Server bot's cycle reads the account authoritatively, as the Python
119207
+ // Server loop does: never a cached or rate-limit-stale observation.
119208
+ forceRefresh: input.executionMode === "server",
119209
+ // And values it as that loop does: Perps equity alone unless the loop's
119210
+ // own tests count Spot (serverLoopAccountValue). A Client bot's cycle
119211
+ // keeps the device rule.
119212
+ serverLoopAccountValue: input.executionMode === "server",
119213
+ sessionId,
119214
+ signal: timeoutController.signal
119215
+ });
119216
+ })().catch(async (error48) => {
119217
+ if (input.executionMode !== "server" || !(error48 instanceof HyperliquidPublicReadError)) throw error48;
119218
+ try {
119219
+ return await rescueAccountState(error48.code);
118776
119220
  } catch (rescueError) {
118777
119221
  if (timeoutController.signal.aborted) throw rescueError;
118778
- appendRuntimeDebugEvent({
118779
- label: "account_state_prompt_rescue_unavailable",
118780
- note: rescueError instanceof Error ? rescueError.message : String(rescueError),
118781
- outcome: "error"
118782
- });
118783
119222
  throw error48;
118784
119223
  }
118785
119224
  }).then((state2) => {
@@ -119106,6 +119545,8 @@ ${behaviorJson}
119106
119545
  const contractPrefersLocalSource = isClientOnlyModelSource(authoritativeModelSource);
119107
119546
  const temperature = clampNumber(settings.temperature, config2.default_temperature);
119108
119547
  const maxTokens = Math.round(clampNumber(settings.max_tokens, config2.default_max_tokens));
119548
+ const derivedContext = asRecord(promptDerivedContext.derived_context);
119549
+ const relativeVolumeContext = activeIndicators.rv ? resolvePromptRelativeVolumeContext(derivedContext) : null;
119109
119550
  const candlesPayload = buildPromptCandlesPayload({
119110
119551
  symbols: promptSymbols,
119111
119552
  timeframes: promptTimeframes,
@@ -119114,7 +119555,8 @@ ${behaviorJson}
119114
119555
  lookbackSettings,
119115
119556
  defaultLookbacks: effectiveDefaultLookbacks,
119116
119557
  maxLookback: config2.max_analysis_lookback,
119117
- activeIndicators
119558
+ activeIndicators,
119559
+ relativeVolume: relativeVolumeContext
119118
119560
  });
119119
119561
  if (!Object.prototype.hasOwnProperty.call(candlesPayload, symbol2)) {
119120
119562
  throw new Error(`Prompt contract symbol is missing from local market payload: ${symbol2}`);
@@ -119269,7 +119711,6 @@ ${behaviorJson}
119269
119711
  "configured_user_template"
119270
119712
  );
119271
119713
  const templatePlaceholders = extractTemplatePlaceholders(userTemplate);
119272
- const derivedContext = asRecord(promptDerivedContext.derived_context);
119273
119714
  const cycleCutoff = normalizePromptIdentityTimestamp(
119274
119715
  derivedContext.behavior_memory_cutoff ?? promptDerivedContext.derived_context_generated_at
119275
119716
  );
@@ -119284,6 +119725,9 @@ ${behaviorJson}
119284
119725
  "market_regime",
119285
119726
  ...NEWS_PROMPT_VARIABLES,
119286
119727
  "calendar",
119728
+ // The server renders the whole <reference_candles> block; it is
119729
+ // present, possibly blank, whenever the template uses the variable.
119730
+ REFERENCE_CANDLES_PROMPT_VARIABLE,
119287
119731
  "interval"
119288
119732
  ].includes(key));
119289
119733
  for (const key of requiredDerivedKeys) {
@@ -119293,6 +119737,11 @@ ${behaviorJson}
119293
119737
  }
119294
119738
  const intervalContext = String(derivedContext.interval ?? "").trim();
119295
119739
  const calendarContext = String(derivedContext.calendar ?? "");
119740
+ const referenceCandlesContext = String(derivedContext[REFERENCE_CANDLES_PROMPT_VARIABLE] ?? "");
119741
+ const rawReferenceIndicators = derivedContext.reference_candles_indicators;
119742
+ const referenceIndicators = rawReferenceIndicators && typeof rawReferenceIndicators === "object" && !Array.isArray(rawReferenceIndicators) ? Object.fromEntries(
119743
+ Object.entries(rawReferenceIndicators).map(([key, value]) => [key, Boolean(value)])
119744
+ ) : void 0;
119296
119745
  if (typeof promptKnobs.behavior_memory_enabled !== "boolean") {
119297
119746
  throw new Error("Prompt metadata missing lane-effective behavior_memory_enabled Boolean.");
119298
119747
  }
@@ -119354,6 +119803,7 @@ ${behaviorJson}
119354
119803
  candles: `<candles>
119355
119804
  ${stringifyPromptJson(candlesPayload)}
119356
119805
  </candles>`,
119806
+ [REFERENCE_CANDLES_PROMPT_VARIABLE]: referenceCandlesContext,
119357
119807
  market_stats: String(derivedContext.market_stats ?? ""),
119358
119808
  account_status: buildPromptAccountStatusValue(
119359
119809
  accountSummary,
@@ -119437,7 +119887,9 @@ ${stringifyPromptJson(candlesPayload)}
119437
119887
  note: [
119438
119888
  `interval_source=${intervalContext ? "derived_context" : "missing"}`,
119439
119889
  `calendar_source=${calendarContext ? "derived_context" : "missing"}`,
119440
- ...NEWS_PROMPT_VARIABLES.map((key) => `${key}_source=${Object.prototype.hasOwnProperty.call(derivedContext, key) ? "derived_context" : "missing"}`)
119890
+ ...NEWS_PROMPT_VARIABLES.map((key) => `${key}_source=${Object.prototype.hasOwnProperty.call(derivedContext, key) ? "derived_context" : "missing"}`),
119891
+ `${REFERENCE_CANDLES_PROMPT_VARIABLE}_source=${Object.prototype.hasOwnProperty.call(derivedContext, REFERENCE_CANDLES_PROMPT_VARIABLE) ? "derived_context" : "missing"}`,
119892
+ ...activeIndicators.rv ? [`relative_volume_baselines_source=${relativeVolumeContext ? "derived_context" : "missing"}`] : []
119441
119893
  ].join(" ")
119442
119894
  });
119443
119895
  const contextSnapshots = {
@@ -119463,6 +119915,7 @@ ${stringifyPromptJson(candlesPayload)}
119463
119915
  const contextValueSummary = [
119464
119916
  "current_time",
119465
119917
  "candles",
119918
+ REFERENCE_CANDLES_PROMPT_VARIABLE,
119466
119919
  "market_stats",
119467
119920
  "account_status",
119468
119921
  "calendar",
@@ -119503,6 +119956,7 @@ ${stringifyPromptJson(candlesPayload)}
119503
119956
  systemTemplate,
119504
119957
  instructions: asRecord(promptMetadata.prompt_instructions),
119505
119958
  activeIndicators,
119959
+ referenceIndicators,
119506
119960
  symbols: promptSymbols,
119507
119961
  maxTradesPerPrompt,
119508
119962
  metricsWindowHours,
@@ -119627,7 +120081,11 @@ ${stringifyPromptJson(candlesPayload)}
119627
120081
  leverage: metadataLeverage,
119628
120082
  active_indicators: activeIndicators,
119629
120083
  candles_payload: stringifyPromptJson(candlesPayload),
119630
- context_vars: contextVars
120084
+ context_vars: contextVars,
120085
+ // The server's re-render needs the flags its reference block was built
120086
+ // with for that block's legend line; the block itself is echoed in
120087
+ // context_vars.reference_candles.
120088
+ ...referenceIndicators ? { reference_active_indicators: referenceIndicators } : {}
119631
120089
  };
119632
120090
  if (input.requireServerPromptParity && shouldCompareServerPromptParity()) {
119633
120091
  try {
@@ -120806,6 +121264,7 @@ var init_engine = __esm({
120806
121264
  init_api2();
120807
121265
  init_history_evidence();
120808
121266
  init_portfolio_evidence();
121267
+ init_signing_key_messages();
120809
121268
  init_copy_trading_evidence();
120810
121269
  DEVICE_DIAGNOSTICS3 = runtime_policy_generated_default2.trading.engine.client_runtime.device_diagnostics;
120811
121270
  FALLBACK_ERROR_MAX_CHARS = runtime_policy_generated_default2.trading.engine.client_runtime.request_bounds.max_fallback_error_length;
@@ -123997,10 +124456,11 @@ var init_engine = __esm({
123997
124456
  if (analysisAbortController.signal.aborted || this._isStopping || this._analysisRequestId !== requestId) {
123998
124457
  throw new DOMException("The operation was aborted.", "AbortError");
123999
124458
  }
124000
- const runCycle = (secrets) => runLocalRuntimeCycle2({
124459
+ const runCycle = (secrets, dispatchContextRebuild = false) => runLocalRuntimeCycle2({
124001
124460
  profileId,
124002
124461
  mode: runtimeMode,
124003
124462
  analysisRunId: requestId,
124463
+ dispatchContextRebuild,
124004
124464
  secrets,
124005
124465
  sessionId,
124006
124466
  deviceId,
@@ -124086,7 +124546,7 @@ var init_engine = __esm({
124086
124546
  throw error48;
124087
124547
  }
124088
124548
  appendRuntimeDebugEvent({ label: "server_dispatch_context_rebuilt", note: "attempt=2", outcome: "ok" });
124089
- return runCycle(secrets);
124549
+ return runCycle(secrets, true);
124090
124550
  });
124091
124551
  let result;
124092
124552
  try {
@@ -125387,7 +125847,7 @@ var init_engine = __esm({
125387
125847
  // this owner session, or null when the report was not accepted.
125388
125848
  async _reportDeviceSigningKeyStartFailure(reason, failure2) {
125389
125849
  if (!this._profileId || !this._sessionId || !this._deviceId) return null;
125390
- const sanitizedReason = getSanitizedRuntimeErrorMessage(reason) || "Invalid Hyperliquid signing key.";
125850
+ const sanitizedReason = getSanitizedRuntimeErrorMessage(reason) || SIGNING_KEY_INVALID;
125391
125851
  try {
125392
125852
  const response = await reportClientRuntimeError(
125393
125853
  this._profileId,