programgarden 2.5.1__tar.gz → 2.5.3__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.
Files changed (66) hide show
  1. {programgarden-2.5.1 → programgarden-2.5.3}/PKG-INFO +6 -2
  2. {programgarden-2.5.1 → programgarden-2.5.3}/README.md +4 -0
  3. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/executor.py +6 -0
  4. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/incremental_build.py +1 -1
  5. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_semantics.py +5 -1
  6. {programgarden-2.5.1 → programgarden-2.5.3}/pyproject.toml +2 -2
  7. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/__init__.py +0 -0
  8. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/binding_validator.py +0 -0
  9. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/client.py +0 -0
  10. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/code_worker.py +0 -0
  11. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/context.py +0 -0
  12. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/__init__.py +0 -0
  13. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/adjustment_delivery.py +0 -0
  14. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/broker_evidence.py +0 -0
  15. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/broker_order_totals.py +0 -0
  16. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/broker_snapshot.py +0 -0
  17. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/checkpoint_manager.py +0 -0
  18. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/db_naming.py +0 -0
  19. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/execution_storage.py +0 -0
  20. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/fill_reconciler.py +0 -0
  21. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/order_cancellation.py +0 -0
  22. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/order_recovery.py +0 -0
  23. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/owned_order_cancellation.py +0 -0
  24. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/position_reconciliation.py +0 -0
  25. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/query_builder.py +0 -0
  26. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/workflow_position_tracker.py +0 -0
  27. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/database/workflow_risk_tracker.py +0 -0
  28. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/deep_fixtures.py +0 -0
  29. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/futures_orderable.py +0 -0
  30. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/futures_pnl.py +0 -0
  31. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/futures_read_evidence.py +0 -0
  32. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/managed_order_control.py +0 -0
  33. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/node_runner.py +0 -0
  34. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/order_lifecycle.py +0 -0
  35. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/plugin/__init__.py +0 -0
  36. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/plugin/sandbox.py +0 -0
  37. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/providers/__init__.py +0 -0
  38. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/providers/llm_errors.py +0 -0
  39. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/providers/llm_provider.py +0 -0
  40. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/reconnect_handler.py +0 -0
  41. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_contracts.py +0 -0
  42. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_events.py +0 -0
  43. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_external.py +0 -0
  44. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_order_adapter.py +0 -0
  45. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_orders.py +0 -0
  46. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_scenarios.py +0 -0
  47. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_sources.py +0 -0
  48. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_sqlite.py +0 -0
  49. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/replay_triggers.py +0 -0
  50. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/resolver.py +0 -0
  51. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/resource/__init__.py +0 -0
  52. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/resource/context.py +0 -0
  53. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/resource/limiter.py +0 -0
  54. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/resource/monitor.py +0 -0
  55. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/resource/throttle.py +0 -0
  56. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/semantic_rules.py +0 -0
  57. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/tools/__init__.py +0 -0
  58. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/tools/credential_tools.py +0 -0
  59. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/tools/definition_tools.py +0 -0
  60. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/tools/event_tools.py +0 -0
  61. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/tools/job_tools.py +0 -0
  62. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/tools/registry_tools.py +0 -0
  63. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/tools/sqlite_tools.py +0 -0
  64. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/validation_recommender.py +0 -0
  65. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/validation_replay.py +0 -0
  66. {programgarden-2.5.1 → programgarden-2.5.3}/programgarden/valuation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: programgarden
3
- Version: 2.5.1
3
+ Version: 2.5.3
4
4
  Summary: ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  Author: 프로그램동산
@@ -16,7 +16,7 @@ Requires-Dist: croniter (>=6.0.0,<7.0.0)
16
16
  Requires-Dist: litellm (>=1.40.0)
17
17
  Requires-Dist: lxml (>=6.0.2,<7.0.0)
18
18
  Requires-Dist: programgarden-community (>=2.3.1,<3.0.0)
19
- Requires-Dist: programgarden-core (>=2.5.1,<3.0.0)
19
+ Requires-Dist: programgarden-core (>=2.5.3,<3.0.0)
20
20
  Requires-Dist: programgarden-finance (>=2.0.1,<3.0.0)
21
21
  Requires-Dist: psutil (>=6.0.0,<7.0.0)
22
22
  Requires-Dist: psycopg2-binary (>=2.9.11,<3.0.0)
@@ -29,6 +29,10 @@ Description-Content-Type: text/markdown
29
29
 
30
30
  # ProgramGarden
31
31
 
32
+ The REST overseas-stock account output preserves broker-reported `sellable_qty`
33
+ separately from holdings; absent capacity remains null. See
34
+ [the sell-capacity contract](../../docs/overseas-stock-sellable-quantity.md).
35
+
32
36
  Unreleased execution reconciliation work is documented in
33
37
  [execution-reconciliation.md](../../docs/execution-reconciliation.md). Its
34
38
  optional host storage identity is not yet enabled in deployed worker/tray hosts;
@@ -1,5 +1,9 @@
1
1
  # ProgramGarden
2
2
 
3
+ The REST overseas-stock account output preserves broker-reported `sellable_qty`
4
+ separately from holdings; absent capacity remains null. See
5
+ [the sell-capacity contract](../../docs/overseas-stock-sellable-quantity.md).
6
+
3
7
  Unreleased execution reconciliation work is documented in
4
8
  [execution-reconciliation.md](../../docs/execution-reconciliation.md). Its
5
9
  optional host storage identity is not yet enabled in deployed worker/tray hosts;
@@ -5966,6 +5966,12 @@ class AccountNodeExecutor(NodeExecutorBase):
5966
5966
  "name": item.JpnMktHanglIsuNm.strip() if item.JpnMktHanglIsuNm else symbol,
5967
5967
  "qty": item.AstkBalQty,
5968
5968
  "quantity": item.AstkBalQty, # NewOrderNode 호환
5969
+ # SDK defaults are not evidence that LS returned this quantity.
5970
+ "sellable_qty": (
5971
+ item.AstkSellAbleQty
5972
+ if "AstkSellAbleQty" in getattr(item, "model_fields_set", set())
5973
+ else None
5974
+ ),
5969
5975
  "direction": "long", # 주식은 보유=매수(long)
5970
5976
  "close_side": "sell", # 청산=매도
5971
5977
  "avg_price": item.FcstckUprc,
@@ -60,7 +60,7 @@ def runtime_identity() -> str:
60
60
  packages = {}
61
61
  for name in ("programgarden", "programgarden-core", "programgarden-community", "programgarden-finance",
62
62
  "pydantic", "pydantic-core", "numpy", "pandas", "scipy", "tzdata", "pytz", "croniter", "aiosqlite",
63
- "pyportfolioopt", "quantstats", "scikit-learn", "statsmodels"):
63
+ "pyportfolioopt", "quantstats", "scikit-learn", "statsmodels", "exchange-calendars"):
64
64
  try:
65
65
  packages[name] = importlib.metadata.version(name)
66
66
  except importlib.metadata.PackageNotFoundError:
@@ -372,7 +372,11 @@ def _time_rules(node_type: str, role: str) -> List[Dict[str, Any]]:
372
372
  "max_duration_hours": {"default": None, "gt": 0}, "pin": "range_not_const"},
373
373
  ]
374
374
  if node_type == "SessionGateNode":
375
- return [{"id": "evaluate_at_fixture_instant"}] # validation_replay.py:276-283
375
+ return [{"id": "evaluate_at_fixture_instant"},
376
+ {"id": "optional_exchange_calendar", "field": "exchange_calendar",
377
+ "supported": ["XNYS", "XNAS"], "mode": "intersect_configured_windows",
378
+ "holidays": True, "early_closes": True, "live_halts": False,
379
+ "failure": "allowed_false", "close_exclusive": True}] # validation_replay.py:276-283
376
380
  if node_type == "TradingHoursFilterNode":
377
381
  return [{"id": "wait_blocks_replay"}] # replay_triggers.py:62-71
378
382
  if node_type == "ThrottleNode":
@@ -5,7 +5,7 @@ authors = [
5
5
  homepage = "https://programgarden.com"
6
6
  requires-python = ">=3.12"
7
7
  name = "programgarden"
8
- version = "2.5.1"
8
+ version = "2.5.3"
9
9
  license = "AGPL-3.0-or-later"
10
10
  description = "ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진"
11
11
  readme = "README.md"
@@ -36,7 +36,7 @@ litellm = ">=1.40.0"
36
36
  # 로 통째 실패한다(1.35.1 의 조용한 TypeError 보다 강한 모듈 로드 실패).
37
37
  # (1.26.0 이후로도 context.py 는 WorkflowPnLEvent(**event_data) 에 personal_metrics
38
38
  # 를 무조건 실으므로 그 하한 근거도 이 상한에 포함된다.)
39
- programgarden-core = "^2.5.1"
39
+ programgarden-core = "^2.5.3"
40
40
  programgarden-finance = "^2.0.1"
41
41
  programgarden-community = "^2.3.1"
42
42