programgarden 1.31.2__tar.gz → 1.33.0__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.
- {programgarden-1.31.2 → programgarden-1.33.0}/PKG-INFO +3 -3
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/__init__.py +8 -1
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/context.py +3 -1
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/executor.py +36 -4
- {programgarden-1.31.2 → programgarden-1.33.0}/pyproject.toml +3 -3
- {programgarden-1.31.2 → programgarden-1.33.0}/README.md +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/binding_validator.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/client.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/code_worker.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/database/__init__.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/database/checkpoint_manager.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/database/query_builder.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/database/workflow_position_tracker.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/database/workflow_risk_tracker.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/deep_fixtures.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/node_runner.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/plugin/__init__.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/plugin/sandbox.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/providers/__init__.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/providers/llm_errors.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/providers/llm_provider.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/reconnect_handler.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/resolver.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/resource/__init__.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/resource/context.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/resource/limiter.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/resource/monitor.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/resource/throttle.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/semantic_rules.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/tools/__init__.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/tools/credential_tools.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/tools/definition_tools.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/tools/event_tools.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/tools/job_tools.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/tools/registry_tools.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/tools/sqlite_tools.py +0 -0
- {programgarden-1.31.2 → programgarden-1.33.0}/programgarden/validation_recommender.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: programgarden
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.33.0
|
|
4
4
|
Summary: ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진
|
|
5
5
|
License-Expression: AGPL-3.0-or-later
|
|
6
6
|
Author: 프로그램동산
|
|
@@ -16,8 +16,8 @@ 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 (>=1.15.0,<2.0.0)
|
|
19
|
-
Requires-Dist: programgarden-core (>=1.
|
|
20
|
-
Requires-Dist: programgarden-finance (>=1.
|
|
19
|
+
Requires-Dist: programgarden-core (>=1.25.0,<2.0.0)
|
|
20
|
+
Requires-Dist: programgarden-finance (>=1.9.1,<2.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)
|
|
23
23
|
Requires-Dist: pydantic (>=2.0.0,<3.0.0)
|
|
@@ -91,7 +91,14 @@ except ImportError:
|
|
|
91
91
|
# Community package not installed
|
|
92
92
|
pass
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
# 배포 metadata 에서 파생한다. 손으로 적으면 릴리스 때마다 잊혀 **패키지가 스스로 거짓
|
|
95
|
+
# 버전을 말한다** — 실제로 1.31.2 를 출하하는 동안 여기는 1.29.3 이었다.
|
|
96
|
+
try: # 설치된 배포판
|
|
97
|
+
from importlib.metadata import version as _pkg_version
|
|
98
|
+
|
|
99
|
+
__version__ = _pkg_version("programgarden")
|
|
100
|
+
except Exception: # 소스 트리에서 직접 import (미설치)
|
|
101
|
+
__version__ = "0.0.0+source"
|
|
95
102
|
__all__ = [
|
|
96
103
|
# Core
|
|
97
104
|
"ProgramGarden",
|
|
@@ -150,7 +150,9 @@ class ExecutionContext:
|
|
|
150
150
|
workflow_edges: Optional[List[Any]] = None, # List[ResolvedEdge]
|
|
151
151
|
workflow_nodes: Optional[Dict[str, Any]] = None, # Dict[str, ResolvedNode]
|
|
152
152
|
storage_dir: Optional[str] = None,
|
|
153
|
-
|
|
153
|
+
# sync (appkey, product, paper_trading, *, force_reissue=False, stale_token=None)
|
|
154
|
+
# -> (token, expires_at_epoch)
|
|
155
|
+
ls_token_provider: Optional[Any] = None,
|
|
154
156
|
):
|
|
155
157
|
self.job_id = job_id
|
|
156
158
|
self.workflow_id = workflow_id
|
|
@@ -381,8 +381,14 @@ class NodeExecutorBase:
|
|
|
381
381
|
"""주문 거부 시 투자자 알림 1건 발행(on_notification).
|
|
382
382
|
|
|
383
383
|
on_log warning 과 별개로, AI/UI/텔레그램 소비자가 거부 사유(cause)와 대응
|
|
384
|
-
팁(tip)을 구조화 payload 로 받도록 한다.
|
|
385
|
-
이름(해외주식/해외선물/국내주식)을 정확히
|
|
384
|
+
팁(tip), 그리고 **재시도 판단(retry)** 을 구조화 payload 로 받도록 한다.
|
|
385
|
+
``node_type`` 은 시장별 주문 노드 이름(해외주식/해외선물/국내주식)을 정확히
|
|
386
|
+
라벨링하기 위해 호출자가 전달한다.
|
|
387
|
+
|
|
388
|
+
⚠️ 이 ``data`` 는 ``model_dump()`` 가 아니라 **키를 손으로 고른다.** 그래서
|
|
389
|
+
``OrderRejectInfo`` 에 필드를 추가해도 여기 적지 않으면 알림 경로에는 실리지
|
|
390
|
+
않는다 — 노드 출력(``diagnostics``)은 자동으로 실려서, 한쪽만 새 필드를 갖는
|
|
391
|
+
비대칭이 조용히 생긴다. 필드를 늘릴 때는 이 dict 도 같이 본다.
|
|
386
392
|
"""
|
|
387
393
|
try:
|
|
388
394
|
await context.send_notification(
|
|
@@ -400,6 +406,12 @@ class NodeExecutorBase:
|
|
|
400
406
|
"cause": reject.cause,
|
|
401
407
|
"tip": reject.tip,
|
|
402
408
|
"raw_msg": reject.raw_msg,
|
|
409
|
+
# 🔴 소비자가 거부를 받고 가장 먼저 답해야 하는 질문이 "다시 걸까" 다.
|
|
410
|
+
# 이 키가 빠지면 소비자는 cause/tip 문장에서 그걸 **추론**해야 하고,
|
|
411
|
+
# 그 추론이 틀리면 살아 있는 주문을 중복 발주한다. 이 dict 는 필드를
|
|
412
|
+
# 손으로 고르므로, RetryAdvice 를 만들어 놓고도 여기 안 적으면
|
|
413
|
+
# 알림 경로에는 영원히 안 실린다(실제로 그 상태였다).
|
|
414
|
+
"retry": reject.retry.value,
|
|
403
415
|
"known": reject.known,
|
|
404
416
|
},
|
|
405
417
|
)
|
|
@@ -547,10 +559,25 @@ class LSClientManager:
|
|
|
547
559
|
# appkey/product/paper_trading; returns (access_token, expires_at_epoch).
|
|
548
560
|
token_provider = getattr(context, "ls_token_provider", None)
|
|
549
561
|
if token_provider is not None:
|
|
562
|
+
from programgarden_finance.ls.token_manager import provider_accepts_kwarg
|
|
563
|
+
|
|
564
|
+
# 사용 중 토큰 실패로 촉발되는 강제 재발급을 서버까지 전달한다. 이 인자를
|
|
565
|
+
# 못 넘기면 서버가 캐시된(이미 죽었을 수 있는) 토큰을 그대로 돌려줘
|
|
566
|
+
# 재발급이 아무 효과가 없다. 구판 provider(3-인자)와도 호환되도록,
|
|
567
|
+
# 실제 provider 가 받는 키워드만 골라 넘긴다.
|
|
568
|
+
_forwards_force = provider_accepts_kwarg(token_provider, "force_reissue")
|
|
569
|
+
_forwards_stale = provider_accepts_kwarg(token_provider, "stale_token")
|
|
570
|
+
|
|
550
571
|
def _sync_token_provider(
|
|
551
572
|
_appkey=appkey, _product=product, _paper=paper_trading,
|
|
573
|
+
*, force_reissue: bool = False, stale_token=None,
|
|
552
574
|
):
|
|
553
|
-
|
|
575
|
+
extra = {}
|
|
576
|
+
if force_reissue and _forwards_force:
|
|
577
|
+
extra["force_reissue"] = True
|
|
578
|
+
if force_reissue and _forwards_stale:
|
|
579
|
+
extra["stale_token"] = stale_token
|
|
580
|
+
return token_provider(_appkey, _product, _paper, **extra)
|
|
554
581
|
|
|
555
582
|
ls.set_token_provider(provider=_sync_token_provider)
|
|
556
583
|
context.log("info", f"LS token provider attached for {product}", node_id)
|
|
@@ -17486,7 +17513,12 @@ class WorkflowExecutor:
|
|
|
17486
17513
|
# self-issuing via GenerateToken, so the platform server is the single
|
|
17487
17514
|
# token issuer and this executor is a pure consumer. login() is sync, so
|
|
17488
17515
|
# the provider is a sync callable:
|
|
17489
|
-
# (appkey: str, product: str, paper_trading: bool
|
|
17516
|
+
# (appkey: str, product: str, paper_trading: bool,
|
|
17517
|
+
# *, force_reissue: bool = False, stale_token: str | None = None)
|
|
17518
|
+
# -> (access_token, expires_at_epoch)
|
|
17519
|
+
# force_reissue 는 **사용 중** 토큰이 죽었다고 확인됐을 때만 True 로 온다 —
|
|
17520
|
+
# 서버가 캐시를 무시하고 새로 발급해야 한다는 뜻이다. 구판 3-인자 provider 도
|
|
17521
|
+
# 그대로 동작한다(받는 키워드만 골라 넘긴다).
|
|
17490
17522
|
# Left None for standalone/public usage (unchanged self-issue path).
|
|
17491
17523
|
self.ls_token_provider = None
|
|
17492
17524
|
|
|
@@ -5,7 +5,7 @@ authors = [
|
|
|
5
5
|
homepage = "https://programgarden.com"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
name = "programgarden"
|
|
8
|
-
version = "1.
|
|
8
|
+
version = "1.33.0"
|
|
9
9
|
license = "AGPL-3.0-or-later"
|
|
10
10
|
description = "ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진"
|
|
11
11
|
readme = "README.md"
|
|
@@ -29,8 +29,8 @@ lxml = "^6.0.2"
|
|
|
29
29
|
pytickersymbols = {version = ">=1.17.5", python = ">=3.12,<4.0"}
|
|
30
30
|
aiosqlite = "^0.20.0"
|
|
31
31
|
litellm = ">=1.40.0"
|
|
32
|
-
programgarden-core = "^1.
|
|
33
|
-
programgarden-finance = "^1.
|
|
32
|
+
programgarden-core = "^1.25.0"
|
|
33
|
+
programgarden-finance = "^1.9.1"
|
|
34
34
|
programgarden-community = "^1.15.0"
|
|
35
35
|
|
|
36
36
|
[tool.poetry.group.dev.dependencies]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{programgarden-1.31.2 → programgarden-1.33.0}/programgarden/database/workflow_position_tracker.py
RENAMED
|
File without changes
|
{programgarden-1.31.2 → programgarden-1.33.0}/programgarden/database/workflow_risk_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|