pineforge-codegen 0.7.3__tar.gz → 0.7.5__tar.gz

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.

Potentially problematic release.


This version of pineforge-codegen might be problematic. Click here for more details.

Files changed (389) hide show
  1. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/PKG-INFO +1 -1
  2. pineforge_codegen-0.7.5/VERSION +1 -0
  3. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/glue.py +3 -3
  4. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/__init__.py +39 -0
  5. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/emit_top.py +21 -11
  6. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/input.py +142 -1
  7. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/golden/matrix_eigen_pca.cpp +2 -2
  8. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_new.py +34 -0
  9. pineforge_codegen-0.7.5/tests/test_extract_inputs.py +107 -0
  10. pineforge_codegen-0.7.5/tests/test_glue_smoke.py +43 -0
  11. pineforge_codegen-0.7.3/VERSION +0 -1
  12. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/dependabot.yml +0 -0
  13. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/gate.yml +0 -0
  14. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/publish-pyodide.yml +0 -0
  15. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/release.yml +0 -0
  16. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.github/workflows/test.yml +0 -0
  17. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/.gitignore +0 -0
  18. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/CLAUDE.md +0 -0
  19. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/LEGAL.md +0 -0
  20. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/LICENSE +0 -0
  21. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/PYODIDE_TARGET +0 -0
  22. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/README.md +0 -0
  23. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/docs/codegen-coverage-gaps.md +0 -0
  24. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/compare.mjs +0 -0
  25. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/oracle.py +0 -0
  26. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/run-gate.mjs +0 -0
  27. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/gate/selftest.mjs +0 -0
  28. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/npm/README.md +0 -0
  29. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/npm/index.mjs +0 -0
  30. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/npm/package.json +0 -0
  31. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/package-lock.json +0 -0
  32. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/package.json +0 -0
  33. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/__init__.py +0 -0
  34. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/base.py +0 -0
  35. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/call_handlers.py +0 -0
  36. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/contracts.py +0 -0
  37. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/diagnostics.py +0 -0
  38. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/tables.py +0 -0
  39. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/analyzer/types.py +0 -0
  40. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/ast_nodes.py +0 -0
  41. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/__init__.py +0 -0
  42. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/base.py +0 -0
  43. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/helpers.py +0 -0
  44. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
  45. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/security.py +0 -0
  46. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/ta.py +0 -0
  47. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/tables.py +0 -0
  48. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/types.py +0 -0
  49. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/visit_call.py +0 -0
  50. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/visit_expr.py +0 -0
  51. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/codegen/visit_stmt.py +0 -0
  52. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/errors.py +0 -0
  53. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/lexer.py +0 -0
  54. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/parser.py +0 -0
  55. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/pragmas.py +0 -0
  56. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/signatures.py +0 -0
  57. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/support_checker.py +0 -0
  58. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/symbols.py +0 -0
  59. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/tokens.py +0 -0
  60. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pineforge_codegen/tv_input_choices.py +0 -0
  61. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/pyproject.toml +0 -0
  62. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/scripts/build-npm-package.mjs +0 -0
  63. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/scripts/dump-tables.py +0 -0
  64. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/scripts/worker-template.mjs +0 -0
  65. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/__init__.py +0 -0
  66. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/_compile.py +0 -0
  67. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/chart_bg_color.pine +0 -0
  68. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
  69. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
  70. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/divergent_last_bar_index.pine +0 -0
  71. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/divergent_time_close.pine +0 -0
  72. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/export_func.pine +0 -0
  73. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/footprint_new.pine +0 -0
  74. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
  75. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
  76. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
  77. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
  78. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_color.pine +0 -0
  79. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_math.pine +0 -0
  80. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_str.pine +0 -0
  81. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
  82. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
  83. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/err/unknown_ta.pine +0 -0
  84. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
  85. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
  86. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
  87. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
  88. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
  89. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
  90. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
  91. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
  92. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
  93. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
  94. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
  95. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
  96. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
  97. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
  98. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
  99. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
  100. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
  101. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
  102. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
  103. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
  104. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
  105. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
  106. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
  107. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
  108. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
  109. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
  110. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
  111. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
  112. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
  113. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
  114. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
  115. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
  116. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
  117. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
  118. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
  119. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
  120. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
  121. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
  122. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
  123. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
  124. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
  125. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
  126. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
  127. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
  128. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
  129. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
  130. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
  131. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
  132. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
  133. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
  134. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
  135. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
  136. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
  137. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
  138. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
  139. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
  140. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
  141. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
  142. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
  143. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
  144. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
  145. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
  146. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
  147. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
  148. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
  149. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
  150. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
  151. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
  152. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
  153. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
  154. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
  155. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
  156. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
  157. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
  158. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
  159. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
  160. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
  161. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
  162. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
  163. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
  164. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
  165. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
  166. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
  167. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
  168. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
  169. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
  170. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
  171. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
  172. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
  173. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
  174. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
  175. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
  176. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
  177. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
  178. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
  179. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
  180. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
  181. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
  182. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
  183. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
  184. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
  185. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
  186. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
  187. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +0 -0
  188. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
  189. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
  190. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
  191. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
  192. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
  193. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
  194. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
  195. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
  196. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
  197. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
  198. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
  199. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
  200. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
  201. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
  202. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
  203. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
  204. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
  205. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
  206. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
  207. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
  208. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
  209. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
  210. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
  211. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
  212. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
  213. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
  214. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
  215. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
  216. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
  217. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
  218. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
  219. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
  220. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
  221. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
  222. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
  223. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
  224. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
  225. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
  226. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
  227. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
  228. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
  229. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
  230. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
  231. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
  232. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
  233. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
  234. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
  235. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
  236. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
  237. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
  238. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
  239. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
  240. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
  241. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
  242. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
  243. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
  244. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
  245. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
  246. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
  247. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
  248. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
  249. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
  250. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
  251. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
  252. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
  253. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
  254. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
  255. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
  256. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
  257. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
  258. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
  259. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
  260. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
  261. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
  262. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
  263. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
  264. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
  265. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
  266. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
  267. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
  268. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
  269. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
  270. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
  271. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
  272. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
  273. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
  274. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
  275. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
  276. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
  277. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
  278. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
  279. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
  280. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
  281. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
  282. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
  283. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
  284. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
  285. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
  286. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
  287. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
  288. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
  289. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
  290. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
  291. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
  292. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
  293. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
  294. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
  295. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
  296. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
  297. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
  298. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
  299. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
  300. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
  301. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
  302. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
  303. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
  304. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
  305. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
  306. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
  307. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
  308. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
  309. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
  310. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
  311. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
  312. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
  313. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
  314. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
  315. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
  316. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
  317. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
  318. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
  319. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
  320. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
  321. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
  322. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
  323. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
  324. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
  325. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
  326. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
  327. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
  328. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
  329. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
  330. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
  331. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
  332. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
  333. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
  334. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
  335. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
  336. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
  337. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
  338. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
  339. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
  340. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
  341. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
  342. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
  343. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
  344. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
  345. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_analyzer.py +0 -0
  346. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_analyzer_matrix_inference.py +0 -0
  347. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_analyzer_ta_return_types.py +0 -0
  348. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_audit_fixes.py +0 -0
  349. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_determinism.py +0 -0
  350. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_fallthrough_guards.py +0 -0
  351. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_golden.py +0 -0
  352. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_input_getters.py +0 -0
  353. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_codegen_matrix_typed.py +0 -0
  354. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_compile_corpus.py +0 -0
  355. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_compile_smoke.py +0 -0
  356. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_errors.py +0 -0
  357. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_import_all.py +0 -0
  358. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_input_time_int64.py +0 -0
  359. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_int64_time_storage.py +0 -0
  360. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_lexer.py +0 -0
  361. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_official_surface.py +0 -0
  362. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_parser.py +0 -0
  363. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_security_tf_literal.py +0 -0
  364. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_signatures.py +0 -0
  365. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker.py +0 -0
  366. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
  367. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_color_cast.py +0 -0
  368. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_const_namespaces.py +0 -0
  369. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_dividends_earnings.py +0 -0
  370. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_footprint.py +0 -0
  371. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_input_color.py +0 -0
  372. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_input_source.py +0 -0
  373. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_matrix.py +0 -0
  374. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_security_adjustment.py +0 -0
  375. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_syminfo_gap_fields.py +0 -0
  376. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
  377. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_varip.py +0 -0
  378. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_support_checker_volume_row.py +0 -0
  379. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_symbols.py +0 -0
  380. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_ta_official_surface.py +0 -0
  381. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_division.py +0 -0
  382. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_enum_order.py +0 -0
  383. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_pf_trace.py +0 -0
  384. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpile_tr_handle_na.py +0 -0
  385. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_transpiler_matrix_kwargs.py +0 -0
  386. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_typespec_matrix.py +0 -0
  387. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_udt_drawing_field_cleanup.py +0 -0
  388. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_unsupported_reporting.py +0 -0
  389. {pineforge_codegen-0.7.3 → pineforge_codegen-0.7.5}/tests/test_vwap_tuple_unpack.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pineforge-codegen
3
- Version: 0.7.3
3
+ Version: 0.7.5
4
4
  Summary: PineScript v6 to C++ transpiler that targets the pineforge-engine runtime.
5
5
  Project-URL: Homepage, https://github.com/pineforge-4pass/pineforge-codegen-oss
6
6
  Project-URL: Issues, https://github.com/pineforge-4pass/pineforge-codegen-oss/issues
@@ -0,0 +1 @@
1
+ 0.7.5
@@ -9,13 +9,13 @@ import sys
9
9
  if "/codegen" not in sys.path:
10
10
  sys.path.insert(0, "/codegen")
11
11
 
12
- from pineforge_codegen import transpile
12
+ from pineforge_codegen import transpile_full
13
13
  from pineforge_codegen.errors import CompileError
14
14
 
15
15
 
16
16
  def transpile_json(source: str) -> str:
17
17
  try:
18
- cpp = transpile(source)
18
+ full = transpile_full(source)
19
19
  except CompileError as e:
20
20
  diags = []
21
21
  for d in e.diagnostics:
@@ -32,4 +32,4 @@ def transpile_json(source: str) -> str:
32
32
  entry["endCol"] = end_col
33
33
  diags.append(entry)
34
34
  return json.dumps({"ok": False, "error": str(e), "diagnostics": diags})
35
- return json.dumps({"ok": True, "cpp": cpp})
35
+ return json.dumps({"ok": True, "cpp": full["cpp"], "inputs": full["inputs"], "strategyParams": full["strategyParams"]})
@@ -51,3 +51,42 @@ def transpile(pine_source: str, *, check_support: bool = True, filename: str = "
51
51
  # ``if (trace_enabled_) { trace(...); ... }`` block.
52
52
  ctx.pf_trace_pragmas = pragmas
53
53
  return CodeGen(ctx).generate()
54
+
55
+
56
+ def transpile_full(pine_source: str, *, check_support: bool = True,
57
+ filename: str = "<input>") -> dict:
58
+ """Transpile like :func:`transpile`, plus the host-UI input manifest.
59
+
60
+ Runs ONE pipeline pass (Lexer -> Parser -> support check -> Analyzer ->
61
+ CodeGen.generate) and returns the generated C++ alongside the data the
62
+ cloud Studio needs to auto-build a backtest "override params" form:
63
+
64
+ - ``cpp``: the generated C++ source (identical to :func:`transpile`).
65
+ - ``inputs``: a list of ``InputDef`` dicts (one per top-level
66
+ ``var = input.*(...)`` declaration). Each has ``title`` / ``type`` /
67
+ ``default`` and optionally ``min`` / ``max`` / ``step`` / ``options``
68
+ (omitted when the corresponding signature argument is absent or
69
+ references a non-const value). See
70
+ :meth:`CodeGen.extract_input_manifest`.
71
+ - ``strategyParams``: the literal ``strategy(...)`` kwargs the analyzer
72
+ surfaced (e.g. ``initial_capital``, ``pyramiding``).
73
+
74
+ Args mirror :func:`transpile`.
75
+
76
+ Returns:
77
+ ``{"cpp": str, "inputs": list[dict], "strategyParams": dict}``.
78
+ """
79
+ pragmas = extract_pf_trace_pragmas(pine_source)
80
+ tokens = Lexer(pine_source, filename=filename).tokenize()
81
+ ast = Parser(tokens, source=pine_source, filename=filename).parse()
82
+ if check_support:
83
+ check_support_or_raise(ast, filename=filename)
84
+ ctx = Analyzer(ast, filename=filename).analyze()
85
+ ctx.pf_trace_pragmas = pragmas
86
+ gen = CodeGen(ctx)
87
+ cpp = gen.generate()
88
+ return {
89
+ "cpp": cpp,
90
+ "inputs": gen.extract_input_manifest(),
91
+ "strategyParams": dict(ctx.strategy_params),
92
+ }
@@ -611,17 +611,27 @@ class TopLevelEmitter:
611
611
  lines.append(" static_cast<MagnifierDistribution>(magnifier_dist));")
612
612
  else:
613
613
  # The magnifier-aware run() overload handles ratio=1 (no
614
- # aggregation) and empty itf/stf (auto-detect) on its own, so
615
- # we only need to fall back to the simple ``run(bars, n)``
616
- # path when the caller explicitly opted out of magnifier AND
617
- # there is no timeframe aggregation in play. Previously the
618
- # short-circuit ``itf.empty() || stf.empty() || itf == stf``
619
- # silently dropped the bar_magnifier flag whenever the host
620
- # passed empty TFs (the validator's default) turning every
621
- # magnifier-opt-in run into a non-magnifier run and producing
622
- # 0.21% exit-price drift on the magnifier-distribution probes.
614
+ # aggregation), empty itf (auto-detect from bar timestamps),
615
+ # and empty stf (default-to-input) entirely on its own, so we
616
+ # route through it whenever ANY TF/magnifier knob is set. We
617
+ # only fall back to the simple ``run(bars, n)`` path when the
618
+ # caller passed NO magnifier AND NO timeframe at all.
619
+ #
620
+ # The previous guard ``(!itf.empty() && !stf.empty() && itf != stf)``
621
+ # required BOTH timeframes to be present before aggregating.
622
+ # The cloud caller passes ``input_tf=""`` (auto-detect) with a
623
+ # concrete ``script_tf="240"``; that made the guard false and
624
+ # the chosen ``script_tf`` was silently ignored — the strategy
625
+ # ran on raw 1m bars with no aggregation. It also dropped the
626
+ # bar_magnifier flag whenever the host passed empty TFs,
627
+ # producing 0.21% exit-price drift on the magnifier probes.
628
+ #
629
+ # Over-approximating to ``!itf.empty() || !stf.empty()`` is
630
+ # always correct: the TF-aware overload is a no-op when the
631
+ # ratio resolves to 1, so the only thing lost in that case is
632
+ # the precalc optimization — never correctness.
623
633
  lines.append(" bool needs_full_run = (bar_magnifier != 0)")
624
- lines.append(" || (!itf.empty() && !stf.empty() && itf != stf);")
634
+ lines.append(" || !itf.empty() || !stf.empty();")
625
635
  lines.append(" if (!needs_full_run) {")
626
636
  lines.append(" strat->run(bars, n);")
627
637
  lines.append(" } else {")
@@ -865,7 +875,7 @@ class TopLevelEmitter:
865
875
  lines.append(" bool bar_magnifier = false,")
866
876
  lines.append(" int magnifier_samples = 4,")
867
877
  lines.append(" MagnifierDistribution magnifier_dist = MagnifierDistribution::ENDPOINTS) {")
868
- lines.append(" bool needs_dynamic = bar_magnifier || (!input_tf.empty() && !script_tf.empty() && input_tf != script_tf);")
878
+ lines.append(" bool needs_dynamic = bar_magnifier || !input_tf.empty() || !script_tf.empty();")
869
879
  lines.append(" if (needs_dynamic) {")
870
880
  lines.append(" _use_precalc = false;")
871
881
  lines.append(" } else {")
@@ -15,13 +15,32 @@ Mixin contract — host class must provide:
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- from ..ast_nodes import FuncCall, Identifier, MemberAccess, StringLiteral
18
+ from ..ast_nodes import (
19
+ BoolLiteral,
20
+ FuncCall,
21
+ Identifier,
22
+ MemberAccess,
23
+ NumberLiteral,
24
+ StringLiteral,
25
+ VarDecl,
26
+ )
19
27
  from .. import signatures as sigs
20
28
 
21
29
 
22
30
  class InputHelper:
23
31
  """``input.*`` call analysis helpers — defaults, titles, getter dispatch, enum guard."""
24
32
 
33
+ # Maps the input function short-name -> the form-facing type tag emitted in
34
+ # the input manifest (consumed by the host UI's override form). ``price``
35
+ # is a float slider, ``time`` an int timestamp; everything string-like
36
+ # collapses to "string".
37
+ _FORM_TYPE = {
38
+ "int": "int", "float": "float", "bool": "bool", "string": "string",
39
+ "source": "source", "enum": "enum", "price": "float", "time": "int",
40
+ "color": "string", "timeframe": "string", "session": "string",
41
+ "symbol": "string", "text_area": "string",
42
+ }
43
+
25
44
  def _is_input_call(self, node: FuncCall) -> bool:
26
45
  """True if ``node`` is an ``input(...)`` or ``input.<type>(...)`` call."""
27
46
  func_name, namespace = self._resolve_callee(node.callee)
@@ -187,3 +206,125 @@ class InputHelper:
187
206
  f"{ename}.{dv.member} is not a member of enum {ename} "
188
207
  "(internal: Analyzer should reject this first)"
189
208
  )
209
+
210
+ # ------------------------------------------------------------------
211
+ # Input manifest extraction (host UI override-form source of truth)
212
+ # ------------------------------------------------------------------
213
+
214
+ def _literal_or_none(self, node):
215
+ """Return a JSON scalar for a *const* literal AST node, else None.
216
+
217
+ ``None`` signals non-const (an identifier, computed expression, …) so
218
+ callers can omit a bound/option that references a runtime value.
219
+ Enum member refs (``Dir.Up``) collapse to the ``"Dir.Up"`` string tag.
220
+ """
221
+ if isinstance(node, StringLiteral):
222
+ return node.value
223
+ # BoolLiteral must be checked before NumberLiteral: a Pine ``true`` is a
224
+ # BoolLiteral (not a NumberLiteral), but guarding the order keeps intent
225
+ # explicit and future-proof against bool/int node overlap.
226
+ if isinstance(node, BoolLiteral):
227
+ return node.value
228
+ if isinstance(node, NumberLiteral):
229
+ return node.value
230
+ # enum member ref like ``Dir.Up`` -> "Dir.Up" (string tag)
231
+ if isinstance(node, MemberAccess) and isinstance(node.object, Identifier):
232
+ return f"{node.object.name}.{node.member}"
233
+ return None
234
+
235
+ def _merged_args(self, node: FuncCall, func_name, namespace):
236
+ """Merge positional args + kwargs into signature-positional order.
237
+
238
+ Returns ``(param_names | None, merged_list)``. Mirrors the merge logic
239
+ in :meth:`_get_input_title` / :meth:`_get_input_default` so manifest
240
+ extraction reads bounds/options off the same positions codegen does.
241
+ """
242
+ if namespace == "input" and func_name in sigs.INPUT_FUNCTIONS:
243
+ names = sigs.get_param_names("input", func_name)
244
+ elif func_name == "input" and namespace is None:
245
+ names = sigs.get_param_names(None, "input")
246
+ else:
247
+ names = None
248
+ merged = list(node.args)
249
+ if names:
250
+ for i, pname in enumerate(names):
251
+ if pname in node.kwargs:
252
+ while len(merged) <= i:
253
+ merged.append(None)
254
+ if merged[i] is None:
255
+ merged[i] = node.kwargs[pname]
256
+ return names, merged
257
+
258
+ def extract_input_manifest(self) -> list[dict]:
259
+ """Walk top-level ``var = input.*(...)`` decls into an InputDef list.
260
+
261
+ Each entry: ``{title, type, default[, min, max, step, options]}``. The
262
+ optional keys are emitted only when the corresponding signature
263
+ argument is a const literal; a bound/option referencing a non-literal
264
+ is omitted (never crashes). One pass over ``self.ctx.ast.body``.
265
+ """
266
+ out: list[dict] = []
267
+ for stmt in self.ctx.ast.body:
268
+ if not (
269
+ isinstance(stmt, VarDecl)
270
+ and isinstance(stmt.value, FuncCall)
271
+ and self._is_input_call(stmt.value)
272
+ ):
273
+ continue
274
+ node = stmt.value
275
+ func_name, namespace = self._resolve_callee(node.callee)
276
+ names, merged = self._merged_args(node, func_name, namespace)
277
+ title = self._get_input_title(node, var_name=stmt.name)
278
+ default_node = self._get_input_default(node)
279
+ default_val = (
280
+ self._literal_or_none(default_node)
281
+ if default_node is not None
282
+ else None
283
+ )
284
+ if namespace == "input":
285
+ form_type = self._FORM_TYPE.get(func_name, "string")
286
+ else:
287
+ # Plain ``input(...)``: Pine types the result by its defval.
288
+ # The codegen already emits the matching scalar getter, so the
289
+ # manifest must mirror that — infer from the resolved default's
290
+ # Python type. ``bool`` MUST be tested before ``int`` because
291
+ # ``isinstance(True, int)`` is True. A None/non-literal default
292
+ # falls back to "string".
293
+ if isinstance(default_val, bool):
294
+ form_type = "bool"
295
+ elif isinstance(default_val, int):
296
+ form_type = "int"
297
+ elif isinstance(default_val, float):
298
+ form_type = "float"
299
+ elif isinstance(default_val, str):
300
+ form_type = "string"
301
+ else:
302
+ form_type = "string"
303
+ entry: dict = {
304
+ "title": title,
305
+ "type": form_type,
306
+ "default": default_val,
307
+ }
308
+ # Pull min/max/step/options by signature param name; emit only
309
+ # const literals so the override form never references a runtime
310
+ # value it can't reproduce.
311
+ if names:
312
+ idx = {n: i for i, n in enumerate(names)}
313
+ for key, pname in (("min", "minval"), ("max", "maxval"), ("step", "step")):
314
+ i = idx.get(pname)
315
+ if i is not None and i < len(merged) and merged[i] is not None:
316
+ v = self._literal_or_none(merged[i])
317
+ # bool is an int subclass — exclude it from numeric bounds
318
+ if isinstance(v, (int, float)) and not isinstance(v, bool):
319
+ entry[key] = v
320
+ oi = idx.get("options")
321
+ if oi is not None and oi < len(merged) and merged[oi] is not None:
322
+ opts_node = merged[oi]
323
+ elems = getattr(opts_node, "elements", None)
324
+ if elems is not None:
325
+ vals = [self._literal_or_none(e) for e in elems]
326
+ # any non-const element -> omit the whole options list
327
+ if vals and all(isinstance(v, str) for v in vals):
328
+ entry["options"] = vals
329
+ out.append(entry)
330
+ return out
@@ -233,7 +233,7 @@ public:
233
233
  bool bar_magnifier = false,
234
234
  int magnifier_samples = 4,
235
235
  MagnifierDistribution magnifier_dist = MagnifierDistribution::ENDPOINTS) {
236
- bool needs_dynamic = bar_magnifier || (!input_tf.empty() && !script_tf.empty() && input_tf != script_tf);
236
+ bool needs_dynamic = bar_magnifier || !input_tf.empty() || !script_tf.empty();
237
237
  if (needs_dynamic) {
238
238
  _use_precalc = false;
239
239
  } else {
@@ -262,7 +262,7 @@ extern "C" {
262
262
  std::string itf = input_tf ? input_tf : "";
263
263
  std::string stf = script_tf ? script_tf : "";
264
264
  bool needs_full_run = (bar_magnifier != 0)
265
- || (!itf.empty() && !stf.empty() && itf != stf);
265
+ || !itf.empty() || !stf.empty();
266
266
  if (!needs_full_run) {
267
267
  strat->run(bars, n);
268
268
  } else {
@@ -43,6 +43,40 @@ strategy("Test")
43
43
  assert "run_backtest" in cpp # backward compat
44
44
 
45
45
 
46
+ def test_run_backtest_full_routes_to_tf_aware_run_when_only_script_tf_set():
47
+ """Regression: a chosen script_tf must not be silently ignored.
48
+
49
+ The cloud caller passes ``input_tf=""`` (auto-detect) with a concrete
50
+ ``script_tf`` (e.g. "240"). The old ``run_backtest_full`` guard required
51
+ BOTH timeframes present (``!itf.empty() && !stf.empty() && itf != stf``),
52
+ so an empty input_tf made ``needs_full_run`` false and the strategy ran
53
+ on raw 1m bars — the chosen script_tf was dropped and no aggregation
54
+ happened. The fix over-approximates: route through the TF-aware overload
55
+ whenever ANY TF/magnifier knob is set.
56
+
57
+ This pins the emitted guard so the regression cannot silently return.
58
+ ``run_backtest_full`` is emitted for every strategy (no security calls
59
+ needed), so a bare strategy exercises the shim guard. The precalc-gating
60
+ ``run(...)`` overload is only emitted when there is a static TA call
61
+ site (``ta.sma`` here), so the body uses one to cover both guards.
62
+ """
63
+ cpp = _generate('//@version=6\nstrategy("T")\nx = ta.sma(close, 14)\nplot(x)\n')
64
+
65
+ # The C ABI shim guard must fire on a non-empty script_tf alone.
66
+ assert "bool needs_full_run = (bar_magnifier != 0)" in cpp
67
+ assert "|| !itf.empty() || !stf.empty();" in cpp
68
+ # The old AND-of-both-TFs guard must be gone.
69
+ assert "!itf.empty() && !stf.empty() && itf != stf" not in cpp
70
+
71
+ # The run(...) overload that gates precalc must also route dynamically
72
+ # whenever either TF is set (not only when both differ).
73
+ assert (
74
+ "bool needs_dynamic = bar_magnifier || !input_tf.empty() || !script_tf.empty();"
75
+ in cpp
76
+ )
77
+ assert "!input_tf.empty() && !script_tf.empty() && input_tf != script_tf" not in cpp
78
+
79
+
46
80
  # === Task 9: Basic structure and translations ===
47
81
 
48
82
 
@@ -0,0 +1,107 @@
1
+ from pineforge_codegen import transpile_full
2
+
3
+ PREAMBLE = "//@version=6\nstrategy(\"T\")\n"
4
+
5
+
6
+ def _full(body: str):
7
+ return transpile_full(PREAMBLE + body)
8
+
9
+
10
+ def test_int_input_manifest():
11
+ r = _full("length = input.int(14, \"Length\", minval=2, maxval=200, step=2)\n")
12
+ inp = next(i for i in r["inputs"] if i["title"] == "Length")
13
+ assert inp["type"] == "int"
14
+ assert inp["default"] == 14
15
+ assert inp["min"] == 2
16
+ assert inp["max"] == 200
17
+ assert inp["step"] == 2
18
+
19
+
20
+ def test_float_omits_absent_bounds():
21
+ r = _full("mult = input.float(2.0, \"Mult\")\n")
22
+ inp = next(i for i in r["inputs"] if i["title"] == "Mult")
23
+ assert inp["type"] == "float"
24
+ assert inp["default"] == 2.0
25
+ assert "min" not in inp and "max" not in inp
26
+
27
+
28
+ def test_bool_and_title_fallback_to_var_name():
29
+ r = _full("use_x = input.bool(true)\n")
30
+ inp = next(i for i in r["inputs"] if i["title"] == "use_x")
31
+ assert inp["type"] == "bool"
32
+ assert inp["default"] is True
33
+
34
+
35
+ def test_string_options():
36
+ r = _full("mode = input.string(\"a\", \"Mode\", options=[\"a\", \"b\", \"c\"])\n")
37
+ inp = next(i for i in r["inputs"] if i["title"] == "Mode")
38
+ assert inp["type"] == "string"
39
+ assert inp["options"] == ["a", "b", "c"]
40
+
41
+
42
+ def test_non_const_options_omitted():
43
+ # options referencing a non-literal must be omitted, not crash
44
+ r = _full("v = \"x\"\nmode = input.string(\"a\", \"Mode\", options=[v, \"b\"])\n")
45
+ inp = next(i for i in r["inputs"] if i["title"] == "Mode")
46
+ assert "options" not in inp
47
+
48
+
49
+ def test_source_type():
50
+ r = _full("src = input.source(close, \"Source\")\n")
51
+ inp = next(i for i in r["inputs"] if i["title"] == "Source")
52
+ assert inp["type"] == "source"
53
+
54
+
55
+ def test_plain_input_int_form_type():
56
+ r = _full("len = input(10, \"Xi\")\n")
57
+ inp = next(i for i in r["inputs"] if i["title"] == "Xi")
58
+ assert inp["type"] == "int"
59
+ assert inp["default"] == 10
60
+
61
+
62
+ def test_plain_input_float_form_type():
63
+ r = _full("f = input(1.5, \"Xf\")\n")
64
+ inp = next(i for i in r["inputs"] if i["title"] == "Xf")
65
+ assert inp["type"] == "float"
66
+ assert inp["default"] == 1.5
67
+
68
+
69
+ def test_plain_input_bool_form_type():
70
+ r = _full("b = input(true, \"Xb\")\n")
71
+ inp = next(i for i in r["inputs"] if i["title"] == "Xb")
72
+ assert inp["type"] == "bool"
73
+ assert inp["default"] is True
74
+
75
+
76
+ def test_plain_input_string_form_type():
77
+ r = _full("s = input(\"a\", \"Xs\")\n")
78
+ inp = next(i for i in r["inputs"] if i["title"] == "Xs")
79
+ assert inp["type"] == "string"
80
+ assert inp["default"] == "a"
81
+
82
+
83
+ def test_non_const_minval_bound_omitted():
84
+ # minval bound referencing a prior const-assigned identifier is non-literal
85
+ # at the call site -> "min" omitted, no crash, other facets unaffected.
86
+ r = _full("somevar = 2\nlen = input.int(14, \"Len\", minval=somevar, maxval=200, step=2)\n")
87
+ inp = next(i for i in r["inputs"] if i["title"] == "Len")
88
+ assert inp["default"] == 14
89
+ assert "min" not in inp
90
+ assert inp["max"] == 200
91
+ assert inp["step"] == 2
92
+
93
+
94
+ def test_zero_inputs():
95
+ r = _full("a = close + 1\n")
96
+ assert r["inputs"] == []
97
+
98
+
99
+ def test_strategy_params_surfaced():
100
+ r = transpile_full("//@version=6\nstrategy(\"T\", initial_capital=5000, pyramiding=2)\na = close\n")
101
+ assert r["strategyParams"]["initial_capital"] == 5000
102
+ assert r["strategyParams"]["pyramiding"] == 2
103
+
104
+
105
+ def test_cpp_still_returned():
106
+ r = _full("length = input.int(14, \"Length\")\n")
107
+ assert 'get_input_int("Length", 14)' in r["cpp"]
@@ -0,0 +1,43 @@
1
+ """Glue contract smoke test for gate/glue.py.
2
+
3
+ Loads gate/glue.py directly (it carries a `sys.path.insert(0, "/codegen")`
4
+ preamble; `pineforge_codegen` still resolves because the repo root is on
5
+ sys.path when pytest runs from there) and asserts the transpile_json envelope:
6
+
7
+ - valid source -> ok:true with inputs[] and strategyParams (the new manifest)
8
+ - invalid source -> ok:false with a diagnostics key (error branch untouched)
9
+ """
10
+ import importlib.util
11
+ import json
12
+ import os
13
+
14
+ _REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
15
+ _GLUE_PATH = os.path.join(_REPO_ROOT, "gate", "glue.py")
16
+
17
+
18
+ def _load_glue():
19
+ spec = importlib.util.spec_from_file_location("pineforge_glue_under_test", _GLUE_PATH)
20
+ module = importlib.util.module_from_spec(spec)
21
+ spec.loader.exec_module(module)
22
+ return module
23
+
24
+
25
+ def test_valid_source_emits_manifest():
26
+ glue = _load_glue()
27
+ src = (
28
+ "//@version=6\n"
29
+ 'strategy("T", initial_capital=5000)\n'
30
+ 'length = input.int(14, "Length")\n'
31
+ "plot(close)\n"
32
+ )
33
+ d = json.loads(glue.transpile_json(src))
34
+ assert d["ok"] is True
35
+ assert any(i["title"] == "Length" for i in d["inputs"])
36
+ assert d["strategyParams"]["initial_capital"] == 5000
37
+
38
+
39
+ def test_invalid_source_still_returns_error_envelope():
40
+ glue = _load_glue()
41
+ d = json.loads(glue.transpile_json("strategy("))
42
+ assert d["ok"] is False
43
+ assert "diagnostics" in d
@@ -1 +0,0 @@
1
- 0.7.3