programgarden 1.41.1__tar.gz → 1.41.2__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.41.1 → programgarden-1.41.2}/PKG-INFO +9 -1
- {programgarden-1.41.1 → programgarden-1.41.2}/README.md +8 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/executor.py +20 -10
- {programgarden-1.41.1 → programgarden-1.41.2}/pyproject.toml +1 -1
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/__init__.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/binding_validator.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/client.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/code_worker.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/context.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/__init__.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/adjustment_delivery.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/broker_evidence.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/broker_order_totals.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/broker_snapshot.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/checkpoint_manager.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/db_naming.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/execution_storage.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/fill_reconciler.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/order_cancellation.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/order_recovery.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/owned_order_cancellation.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/position_reconciliation.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/query_builder.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/workflow_position_tracker.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/workflow_risk_tracker.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/deep_fixtures.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/futures_orderable.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/futures_pnl.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/futures_read_evidence.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/managed_order_control.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/node_runner.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/order_lifecycle.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/plugin/__init__.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/plugin/sandbox.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/providers/__init__.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/providers/llm_errors.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/providers/llm_provider.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/reconnect_handler.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/resolver.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/resource/__init__.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/resource/context.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/resource/limiter.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/resource/monitor.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/resource/throttle.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/semantic_rules.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/tools/__init__.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/tools/credential_tools.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/tools/definition_tools.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/tools/event_tools.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/tools/job_tools.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/tools/registry_tools.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/tools/sqlite_tools.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/validation_recommender.py +0 -0
- {programgarden-1.41.1 → programgarden-1.41.2}/programgarden/valuation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: programgarden
|
|
3
|
-
Version: 1.41.
|
|
3
|
+
Version: 1.41.2
|
|
4
4
|
Summary: ProgramGarden - 노드 기반 자동매매 DSL 실행 엔진
|
|
5
5
|
License-Expression: AGPL-3.0-or-later
|
|
6
6
|
Author: 프로그램동산
|
|
@@ -118,6 +118,14 @@ the finance package's observed-response reference and StockAccountTracker;
|
|
|
118
118
|
`02679` is not a generic success code. Missing, malformed, mismatched and failed
|
|
119
119
|
reads retain `error` / `reason=fetch_failed` so workflows can block new entries.
|
|
120
120
|
|
|
121
|
+
Overseas-stock historical queries preserve the exchange supplied by each symbol,
|
|
122
|
+
including when the account has no holdings. Item-bound consumers of an explicitly
|
|
123
|
+
empty selected upstream list are skipped before expression evaluation; this also
|
|
124
|
+
covers SymbolFilter output and explicit edge ports. Empty condition gates retain
|
|
125
|
+
their stronger literal-order protection, while non-item aggregate/report nodes
|
|
126
|
+
continue to run. A skipped order keeps its declared output ports and a no-signal
|
|
127
|
+
result row. These safeguards do not establish that upstream market data is valid.
|
|
128
|
+
|
|
121
129
|
For one-shot workflows, an unhandled `order_result.success=False` returned directly
|
|
122
130
|
by a main-flow node makes the final job status `failed` and emits `WORKFLOW_FAILED`.
|
|
123
131
|
The original broker message remains in node diagnostics and the failure statistics.
|
|
@@ -89,6 +89,14 @@ the finance package's observed-response reference and StockAccountTracker;
|
|
|
89
89
|
`02679` is not a generic success code. Missing, malformed, mismatched and failed
|
|
90
90
|
reads retain `error` / `reason=fetch_failed` so workflows can block new entries.
|
|
91
91
|
|
|
92
|
+
Overseas-stock historical queries preserve the exchange supplied by each symbol,
|
|
93
|
+
including when the account has no holdings. Item-bound consumers of an explicitly
|
|
94
|
+
empty selected upstream list are skipped before expression evaluation; this also
|
|
95
|
+
covers SymbolFilter output and explicit edge ports. Empty condition gates retain
|
|
96
|
+
their stronger literal-order protection, while non-item aggregate/report nodes
|
|
97
|
+
continue to run. A skipped order keeps its declared output ports and a no-signal
|
|
98
|
+
result row. These safeguards do not establish that upstream market data is valid.
|
|
99
|
+
|
|
92
100
|
For one-shot workflows, an unhandled `order_result.success=False` returned directly
|
|
93
101
|
by a main-flow node makes the final job status `failed` and emits `WORKFLOW_FAILED`.
|
|
94
102
|
The original broker message remains in node diagnostics and the failure statistics.
|
|
@@ -12809,8 +12809,12 @@ class HistoricalDataNodeExecutor(NodeExecutorBase):
|
|
|
12809
12809
|
|
|
12810
12810
|
for symbol in symbols:
|
|
12811
12811
|
try:
|
|
12812
|
-
#
|
|
12813
|
-
exchcd =
|
|
12812
|
+
# Preserve the requested symbol's exchange even without holdings.
|
|
12813
|
+
exchcd = (
|
|
12814
|
+
(symbol_exchange_map or {}).get(symbol)
|
|
12815
|
+
or position_market_code.get(symbol)
|
|
12816
|
+
or self.EXCHANGE_CODES.get(symbol_to_exchange.get(symbol), "82")
|
|
12817
|
+
)
|
|
12814
12818
|
|
|
12815
12819
|
# symbols_raw에서 exchange 정보 가져오기 (우선순위: symbols_raw > exchcd 변환)
|
|
12816
12820
|
exchange = symbol_to_exchange.get(symbol) or exchcd_to_exchange.get(exchcd, "NASDAQ")
|
|
@@ -21963,10 +21967,16 @@ class WorkflowJob:
|
|
|
21963
21967
|
# `{{ nodes.cond.symbols }}` 로 전체를 소비하는 알림/집계/표시 노드까지
|
|
21964
21968
|
# 침묵한다. "통과 0건이면 아무것도 안 하는 게 정답" 은 **주문 노드**
|
|
21965
21969
|
# 이야기이고, 상태 보고 노드는 그날도 말을 해야 한다(요구사항 4).
|
|
21970
|
+
# Empty SymbolFilter/explicit-port lists also have no iteration item.
|
|
21971
|
+
# Preserve non-item aggregate/report consumers and the stronger
|
|
21972
|
+
# condition-gate guard for literal orders.
|
|
21966
21973
|
skip_reason = None
|
|
21967
21974
|
if (
|
|
21968
21975
|
not should_iterate
|
|
21969
|
-
and
|
|
21976
|
+
and (
|
|
21977
|
+
iterate_source == self.ITERATE_SOURCE_PASSED_SYMBOLS
|
|
21978
|
+
or self._references_iteration_item(config)
|
|
21979
|
+
)
|
|
21970
21980
|
and isinstance(input_data, list)
|
|
21971
21981
|
and not input_data
|
|
21972
21982
|
and (
|
|
@@ -21975,8 +21985,8 @@ class WorkflowJob:
|
|
|
21975
21985
|
)
|
|
21976
21986
|
):
|
|
21977
21987
|
skip_reason = (
|
|
21978
|
-
f"upstream
|
|
21979
|
-
"
|
|
21988
|
+
f"selected upstream source '{iterate_source_node_id}' returned an empty array "
|
|
21989
|
+
"— skipped without executing, so no broker "
|
|
21980
21990
|
"request was made"
|
|
21981
21991
|
)
|
|
21982
21992
|
|
|
@@ -21990,14 +22000,14 @@ class WorkflowJob:
|
|
|
21990
22000
|
# `context.log` 는 파드 stdout 에 안 찍히므로 _safe_print 를 병기한다.
|
|
21991
22001
|
self.context.log(
|
|
21992
22002
|
"info",
|
|
21993
|
-
f"{node.node_type}:
|
|
21994
|
-
|
|
21995
|
-
|
|
22003
|
+
f"{node.node_type}: selected upstream source '{iterate_source_node_id}' "
|
|
22004
|
+
"has no items; skipping execution "
|
|
22005
|
+
"(no_upstream_signal; no order/query request).",
|
|
21996
22006
|
node_id,
|
|
21997
22007
|
)
|
|
21998
22008
|
_safe_print(
|
|
21999
22009
|
f" ⏭️ no_upstream_signal: {node_id} ({node.node_type}) "
|
|
22000
|
-
f"← {iterate_source_node_id}
|
|
22010
|
+
f"← {iterate_source_node_id} selected items=0 — not executed"
|
|
22001
22011
|
)
|
|
22002
22012
|
outputs = self._no_signal_skip_outputs(
|
|
22003
22013
|
node.node_type, skip_reason, iterate_source_node_id,
|
|
@@ -22528,7 +22538,7 @@ class WorkflowJob:
|
|
|
22528
22538
|
for port_name, port_type in _declared_output_ports(node_type):
|
|
22529
22539
|
payload[port_name] = _empty_port_value(port_type)
|
|
22530
22540
|
|
|
22531
|
-
message = "No
|
|
22541
|
+
message = "No items available from the selected upstream source."
|
|
22532
22542
|
if node_type.endswith("OrderNode"):
|
|
22533
22543
|
# 주문 노드 소비자(원장/UI/챗봇)는 order_result 와 `result` 행을 본다.
|
|
22534
22544
|
order_result = {
|
|
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
|
{programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/owned_order_cancellation.py
RENAMED
|
File without changes
|
{programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/position_reconciliation.py
RENAMED
|
File without changes
|
|
File without changes
|
{programgarden-1.41.1 → programgarden-1.41.2}/programgarden/database/workflow_position_tracker.py
RENAMED
|
File without changes
|
{programgarden-1.41.1 → programgarden-1.41.2}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|