@senpi/runtime 1.0.95-dev.feat-dsl-backend-int.20260415201130 → 1.0.95-dev.runtime-phase-2.20260416163440
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/dist/actions/action-runtime-module.d.ts +55 -0
- package/dist/actions/action-runtime-module.d.ts.map +1 -0
- package/dist/actions/action-runtime-module.js +444 -0
- package/dist/actions/action-runtime-module.js.map +1 -0
- package/dist/actions/close-position/close-position.action.d.ts +1 -0
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +55 -20
- package/dist/actions/close-position/close-position.action.js.map +1 -1
- package/dist/actions/decision-engine.d.ts.map +1 -1
- package/dist/actions/decision-engine.js +5 -0
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/llm-decision/shared.d.ts +1 -1
- package/dist/actions/llm-decision/shared.d.ts.map +1 -1
- package/dist/actions/llm-decision/shared.js +1 -1
- package/dist/actions/llm-decision/shared.js.map +1 -1
- package/dist/actions/notifications/formatter.d.ts +39 -0
- package/dist/actions/notifications/formatter.d.ts.map +1 -0
- package/dist/actions/notifications/formatter.js +68 -0
- package/dist/actions/notifications/formatter.js.map +1 -0
- package/dist/actions/notifications/index.d.ts +37 -0
- package/dist/actions/notifications/index.d.ts.map +1 -0
- package/dist/actions/notifications/index.js +89 -0
- package/dist/actions/notifications/index.js.map +1 -0
- package/dist/actions/open-position/open-position.action.d.ts +1 -0
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +132 -27
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/open-position/resolve-margin.d.ts +22 -0
- package/dist/actions/open-position/resolve-margin.d.ts.map +1 -0
- package/dist/actions/open-position/resolve-margin.js +30 -0
- package/dist/actions/open-position/resolve-margin.js.map +1 -0
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +4 -1
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/actions/store/action-store.d.ts +45 -0
- package/dist/actions/store/action-store.d.ts.map +1 -0
- package/dist/actions/store/action-store.js +127 -0
- package/dist/actions/store/action-store.js.map +1 -0
- package/dist/actions/store/index.d.ts +11 -0
- package/dist/actions/store/index.d.ts.map +1 -0
- package/dist/actions/store/index.js +9 -0
- package/dist/actions/store/index.js.map +1 -0
- package/dist/actions/store/paths.d.ts +15 -0
- package/dist/actions/store/paths.d.ts.map +1 -0
- package/dist/actions/store/paths.js +29 -0
- package/dist/actions/store/paths.js.map +1 -0
- package/dist/actions/store/types.d.ts +114 -0
- package/dist/actions/store/types.d.ts.map +1 -0
- package/dist/actions/store/types.js +48 -0
- package/dist/actions/store/types.js.map +1 -0
- package/dist/actions/tracking-helpers.d.ts +13 -0
- package/dist/actions/tracking-helpers.d.ts.map +1 -0
- package/dist/actions/tracking-helpers.js +47 -0
- package/dist/actions/tracking-helpers.js.map +1 -0
- package/dist/actions/types.d.ts +8 -0
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +105 -3
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +426 -0
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/constants/order-types.d.ts +7 -0
- package/dist/constants/order-types.d.ts.map +1 -0
- package/dist/constants/order-types.js +6 -0
- package/dist/constants/order-types.js.map +1 -0
- package/dist/context/interpolate.d.ts +6 -2
- package/dist/context/interpolate.d.ts.map +1 -1
- package/dist/context/interpolate.js +6 -2
- package/dist/context/interpolate.js.map +1 -1
- package/dist/context/types.d.ts +8 -1
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/types.js +8 -1
- package/dist/context/types.js.map +1 -1
- package/dist/dsl/config/exit-block.d.ts +7 -0
- package/dist/dsl/config/exit-block.d.ts.map +1 -1
- package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -1
- package/dist/dsl/config/parse-plugin-config.js +27 -1
- package/dist/dsl/config/parse-plugin-config.js.map +1 -1
- package/dist/dsl/config/unknown-keys.d.ts.map +1 -1
- package/dist/dsl/config/unknown-keys.js +3 -1
- package/dist/dsl/config/unknown-keys.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts +4 -0
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +3 -1
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts +4 -0
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +51 -7
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +3 -1
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/health/index.d.ts +5 -2
- package/dist/health/index.d.ts.map +1 -1
- package/dist/health/index.js +103 -6
- package/dist/health/index.js.map +1 -1
- package/dist/health/types.d.ts +99 -0
- package/dist/health/types.d.ts.map +1 -1
- package/dist/health/types.js +7 -1
- package/dist/health/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -1
- package/dist/risk/guardrail.types.d.ts +53 -0
- package/dist/risk/guardrail.types.d.ts.map +1 -0
- package/dist/risk/guardrail.types.js +5 -0
- package/dist/risk/guardrail.types.js.map +1 -0
- package/dist/risk/index.d.ts +2 -4
- package/dist/risk/index.d.ts.map +1 -1
- package/dist/risk/index.js +2 -6
- package/dist/risk/index.js.map +1 -1
- package/dist/risk/risk-audit-log.d.ts +25 -0
- package/dist/risk/risk-audit-log.d.ts.map +1 -0
- package/dist/risk/risk-audit-log.js +30 -0
- package/dist/risk/risk-audit-log.js.map +1 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts +162 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts.map +1 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js +285 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js.map +1 -0
- package/dist/runtime/create-actions.d.ts +6 -2
- package/dist/runtime/create-actions.d.ts.map +1 -1
- package/dist/runtime/create-actions.js +18 -7
- package/dist/runtime/create-actions.js.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +5 -0
- package/dist/runtime/create-scanner-module.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.js +12 -1
- package/dist/runtime/create-scanner-module.js.map +1 -1
- package/dist/runtime/load-runtime-config.d.ts +1 -1
- package/dist/runtime/load-runtime-config.d.ts.map +1 -1
- package/dist/runtime/load-runtime-config.js +37 -1
- package/dist/runtime/load-runtime-config.js.map +1 -1
- package/dist/runtime/map-strategies.d.ts +1 -1
- package/dist/runtime/map-strategies.d.ts.map +1 -1
- package/dist/runtime/map-strategies.js +38 -1
- package/dist/runtime/map-strategies.js.map +1 -1
- package/dist/runtime/risk-guard.d.ts +23 -2
- package/dist/runtime/risk-guard.d.ts.map +1 -1
- package/dist/runtime/risk-guard.js +441 -5
- package/dist/runtime/risk-guard.js.map +1 -1
- package/dist/runtime/run.d.ts +7 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -0
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +1169 -24
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +105 -2
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +26 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +192 -6
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/scanner-composition.d.ts +10 -0
- package/dist/runtime/scanner-composition.d.ts.map +1 -1
- package/dist/runtime/scanner-composition.js +10 -0
- package/dist/runtime/scanner-composition.js.map +1 -1
- package/dist/runtime/scanner-registry.d.ts +39 -1
- package/dist/runtime/scanner-registry.d.ts.map +1 -1
- package/dist/runtime/scanner-registry.js +105 -2
- package/dist/runtime/scanner-registry.js.map +1 -1
- package/dist/runtime/state-layout.d.ts +2 -0
- package/dist/runtime/state-layout.d.ts.map +1 -1
- package/dist/runtime/state-layout.js +1 -0
- package/dist/runtime/state-layout.js.map +1 -1
- package/dist/runtime/validate-action-prompts.d.ts +30 -0
- package/dist/runtime/validate-action-prompts.d.ts.map +1 -0
- package/dist/runtime/validate-action-prompts.js +110 -0
- package/dist/runtime/validate-action-prompts.js.map +1 -0
- package/dist/scanners/__tests__/test-helpers.d.ts +10 -0
- package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -1
- package/dist/scanners/__tests__/test-helpers.js +52 -0
- package/dist/scanners/__tests__/test-helpers.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts +37 -0
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +130 -12
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/engine/result-builder.d.ts +16 -0
- package/dist/scanners/engine/result-builder.d.ts.map +1 -1
- package/dist/scanners/engine/result-builder.js +22 -0
- package/dist/scanners/engine/result-builder.js.map +1 -1
- package/dist/scanners/engine/strategy-registry.d.ts +2 -0
- package/dist/scanners/engine/strategy-registry.d.ts.map +1 -1
- package/dist/scanners/engine/strategy-registry.js +5 -1
- package/dist/scanners/engine/strategy-registry.js.map +1 -1
- package/dist/scanners/external-scanner-receiver.d.ts +118 -0
- package/dist/scanners/external-scanner-receiver.d.ts.map +1 -0
- package/dist/scanners/external-scanner-receiver.js +266 -0
- package/dist/scanners/external-scanner-receiver.js.map +1 -0
- package/dist/scanners/implementations/external-scanner.d.ts +17 -0
- package/dist/scanners/implementations/external-scanner.d.ts.map +1 -0
- package/dist/scanners/implementations/external-scanner.js +51 -0
- package/dist/scanners/implementations/external-scanner.js.map +1 -0
- package/dist/scanners/implementations/index.d.ts +1 -0
- package/dist/scanners/implementations/index.d.ts.map +1 -1
- package/dist/scanners/implementations/index.js +1 -0
- package/dist/scanners/implementations/index.js.map +1 -1
- package/dist/scanners/index.d.ts +4 -1
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +2 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/protocol/scanner.d.ts +3 -1
- package/dist/scanners/protocol/scanner.d.ts.map +1 -1
- package/dist/scanners/runtime-module.d.ts +10 -0
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +19 -3
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/scanners/scanner-definition.d.ts +12 -1
- package/dist/scanners/scanner-definition.d.ts.map +1 -1
- package/dist/scanners/types.d.ts +3 -0
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js.map +1 -1
- package/dist/scripts/run-dsl-standalone-live.js +1 -1
- package/dist/scripts/run-dsl-standalone-live.js.map +1 -1
- package/dist/scripts/run-dsl-standalone-mock.js +1 -1
- package/dist/scripts/run-dsl-standalone-mock.js.map +1 -1
- package/dist/senpi/client.d.ts +27 -2
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +74 -1
- package/dist/senpi/client.js.map +1 -1
- package/dist/senpi/index.d.ts +1 -1
- package/dist/senpi/index.d.ts.map +1 -1
- package/dist/senpi/types.d.ts +68 -0
- package/dist/senpi/types.d.ts.map +1 -1
- package/dist/strategy/strategy-state.d.ts +4 -1
- package/dist/strategy/strategy-state.d.ts.map +1 -1
- package/dist/strategy/strategy-state.js +7 -2
- package/dist/strategy/strategy-state.js.map +1 -1
- package/dist/tracking/constants.d.ts +24 -0
- package/dist/tracking/constants.d.ts.map +1 -0
- package/dist/tracking/constants.js +46 -0
- package/dist/tracking/constants.js.map +1 -0
- package/dist/tracking/index.d.ts +12 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +8 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/tracker.d.ts +22 -0
- package/dist/tracking/tracker.d.ts.map +1 -0
- package/dist/tracking/tracker.js +44 -0
- package/dist/tracking/tracker.js.map +1 -0
- package/dist/tracking/tracking-handler.d.ts +12 -0
- package/dist/tracking/tracking-handler.d.ts.map +1 -0
- package/dist/tracking/tracking-handler.js +148 -0
- package/dist/tracking/tracking-handler.js.map +1 -0
- package/dist/tracking/transport.d.ts +35 -0
- package/dist/tracking/transport.d.ts.map +1 -0
- package/dist/tracking/transport.js +117 -0
- package/dist/tracking/transport.js.map +1 -0
- package/dist/tracking/types.d.ts +21 -0
- package/dist/tracking/types.d.ts.map +1 -0
- package/dist/tracking/types.js +6 -0
- package/dist/tracking/types.js.map +1 -0
- package/dist/types/action.d.ts +13 -2
- package/dist/types/action.d.ts.map +1 -1
- package/dist/types/dsl/index.d.ts +4 -1
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +9 -3
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/utils/resolve-order-type.d.ts +5 -0
- package/dist/utils/resolve-order-type.d.ts.map +1 -0
- package/dist/utils/resolve-order-type.js +29 -0
- package/dist/utils/resolve-order-type.js.map +1 -0
- package/examples/strategies/dsl-showcase.yaml +7 -2
- package/examples/strategies/dsl.yaml +5 -1
- package/examples/strategies/fox-minimal-loosened.yaml +18 -3
- package/examples/strategies/fox-minimal.yaml +25 -3
- package/examples/strategies/minimal.yaml +4 -2
- package/examples/strategies/momentum/how-it-works.md +47 -0
- package/examples/strategies/momentum/momentum-guarded.yaml +161 -0
- package/examples/strategies/risk-showcase.yaml +93 -0
- package/examples/strategies/viper.yaml +11 -3
- package/examples/strategies/wolf.yaml +11 -3
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +12 -4
- package/package.json +4 -4
|
@@ -3,6 +3,8 @@ import { HOOK_EVENT } from '../../types/hooks.js';
|
|
|
3
3
|
import { interpolatePrompt } from '../../context/interpolate.js';
|
|
4
4
|
import { formatDecisionErrorNotification } from '../../runtime/notifications.js';
|
|
5
5
|
import { createLogger } from '../../utils/logger.js';
|
|
6
|
+
import { resolveCloseOrderType, resolveFeeOptimizedLimitOptions } from '../../utils/resolve-order-type.js';
|
|
7
|
+
import { emitTrackingDecision, emitTrackingActionResult } from '../tracking-helpers.js';
|
|
6
8
|
const logger = createLogger('[actions][close-position]');
|
|
7
9
|
// ─── Close Position Action ───────────────────────────────────────────────────
|
|
8
10
|
export class ClosePositionAction {
|
|
@@ -20,6 +22,16 @@ export class ClosePositionAction {
|
|
|
20
22
|
this.decisionEngine.register(new RuleDecisionStrategy());
|
|
21
23
|
this.decisionEngine.register(new NoDecisionStrategy());
|
|
22
24
|
}
|
|
25
|
+
trackingCtx() {
|
|
26
|
+
return {
|
|
27
|
+
hookSystem: this.context.hookSystem,
|
|
28
|
+
actionName: this.name,
|
|
29
|
+
actionType: this.actionType,
|
|
30
|
+
decisionMode: this.config.decision_mode,
|
|
31
|
+
decisionModel: this.config.decision_model,
|
|
32
|
+
minConfidence: this.config.min_confidence,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
23
35
|
async handle(event) {
|
|
24
36
|
logger.info('handling close position', event);
|
|
25
37
|
if (event.type !== HOOK_EVENT.ON_SIGNAL_DETECTED) {
|
|
@@ -58,6 +70,10 @@ export class ClosePositionAction {
|
|
|
58
70
|
error: 'strategy_address_mismatch',
|
|
59
71
|
};
|
|
60
72
|
}
|
|
73
|
+
// Refresh clearinghouse so hasOpenPosition reflects live positions — recipes
|
|
74
|
+
// without a DSL monitor or open-position action never populate this cache
|
|
75
|
+
// otherwise, and every close would short-circuit as 'no_open_position'.
|
|
76
|
+
await strategyState.fetchClearinghouseState();
|
|
61
77
|
// ── Static params path (bypasses decision engine) ──
|
|
62
78
|
if (this.config.decision_mode === 'none' && typeof this.config.params?.asset === 'string') {
|
|
63
79
|
const signals = [{
|
|
@@ -102,16 +118,24 @@ export class ClosePositionAction {
|
|
|
102
118
|
logger.error('decision error', message);
|
|
103
119
|
const notificationMessage = formatDecisionErrorNotification(message);
|
|
104
120
|
await this.context.notifications.notify(notificationMessage).catch(() => { });
|
|
105
|
-
|
|
121
|
+
const trackingCtx = this.trackingCtx();
|
|
122
|
+
emitTrackingDecision(trackingCtx, event, address, scanResult, { error: message }, undefined, interpolatedPrompt, contextData);
|
|
123
|
+
const errorResult = {
|
|
106
124
|
success: false,
|
|
107
125
|
action_type: this.actionType,
|
|
108
126
|
summary: `Decision failed: ${message}`,
|
|
109
127
|
error: message,
|
|
110
128
|
};
|
|
129
|
+
emitTrackingActionResult(trackingCtx, event, address, errorResult);
|
|
130
|
+
return errorResult;
|
|
111
131
|
}
|
|
132
|
+
const trackingCtx = this.trackingCtx();
|
|
133
|
+
const minConfidence = this.config.min_confidence ?? 1;
|
|
134
|
+
const isBelowConfidence = decision.execute && decision.confidence < minConfidence;
|
|
135
|
+
emitTrackingDecision(trackingCtx, event, address, scanResult, decision, minConfidence, interpolatedPrompt, contextData, isBelowConfidence ? 'below_confidence' : undefined);
|
|
112
136
|
if (!decision.execute) {
|
|
113
137
|
logger.info('decision no execute', decision);
|
|
114
|
-
|
|
138
|
+
const rejectedResult = {
|
|
115
139
|
success: true,
|
|
116
140
|
action_type: this.actionType,
|
|
117
141
|
summary: `Decision: no execute — ${decision.reasoning}`,
|
|
@@ -119,10 +143,11 @@ export class ClosePositionAction {
|
|
|
119
143
|
skipReason: 'decision_no_execute',
|
|
120
144
|
data: { confidence: decision.confidence, reasoning: decision.reasoning },
|
|
121
145
|
};
|
|
146
|
+
emitTrackingActionResult(trackingCtx, event, address, rejectedResult);
|
|
147
|
+
return rejectedResult;
|
|
122
148
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return {
|
|
149
|
+
if (isBelowConfidence) {
|
|
150
|
+
const belowConfResult = {
|
|
126
151
|
success: true,
|
|
127
152
|
action_type: this.actionType,
|
|
128
153
|
summary: `Confidence ${decision.confidence} below threshold ${minConfidence}`,
|
|
@@ -130,6 +155,8 @@ export class ClosePositionAction {
|
|
|
130
155
|
skipReason: 'below_confidence',
|
|
131
156
|
data: { confidence: decision.confidence, threshold: minConfidence },
|
|
132
157
|
};
|
|
158
|
+
emitTrackingActionResult(trackingCtx, event, address, belowConfResult);
|
|
159
|
+
return belowConfResult;
|
|
133
160
|
}
|
|
134
161
|
// ── Unified signals path ──
|
|
135
162
|
const signals = this.normalizeSignals(decision.payload);
|
|
@@ -155,25 +182,22 @@ export class ClosePositionAction {
|
|
|
155
182
|
const results = [];
|
|
156
183
|
let closedCount = 0;
|
|
157
184
|
let failedCount = 0;
|
|
185
|
+
const orderType = resolveCloseOrderType(this.config.params?.order_type);
|
|
186
|
+
const feeOptimizedLimitOptions = orderType === 'FEE_OPTIMIZED_LIMIT'
|
|
187
|
+
? resolveFeeOptimizedLimitOptions(this.config.params?.fee_optimized_limit_options)
|
|
188
|
+
: undefined;
|
|
158
189
|
for (const signal of signals) {
|
|
159
190
|
const asset = signal.asset;
|
|
160
191
|
const signalDex = signal.dex;
|
|
161
192
|
const dexForHook = typeof signalDex === 'string' && signalDex.trim() !== '' ? signalDex.trim() : undefined;
|
|
162
193
|
const reason = signal.reason ?? signal.signalType ?? 'action_close';
|
|
163
194
|
if (!strategyState.hasOpenPosition(asset, dexForHook)) {
|
|
164
|
-
results.push({ asset, success: true, reason: 'no_open_position' });
|
|
195
|
+
results.push({ asset, dex: dexForHook ?? null, orderType, success: true, reason: 'no_open_position' });
|
|
165
196
|
continue;
|
|
166
197
|
}
|
|
167
|
-
if (this.config.decision_mode !== 'rule') {
|
|
168
|
-
const gate = this.context.riskGuard.checkGate(address);
|
|
169
|
-
if (gate.gate !== 'OPEN') {
|
|
170
|
-
results.push({ asset, success: true, reason: `risk_gate_${gate.gate}` });
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
198
|
try {
|
|
175
199
|
logger.info('closing position', { wallet: address, asset });
|
|
176
|
-
await this.context.senpi.closePosition(address, asset, { reason, dex: dexForHook });
|
|
200
|
+
await this.context.senpi.closePosition(address, asset, { reason, dex: dexForHook, orderType, feeOptimizedLimitOptions });
|
|
177
201
|
await this.context.hookSystem.fire({
|
|
178
202
|
type: HOOK_EVENT.ON_POSITION_CLOSED,
|
|
179
203
|
runtimeName: event.runtimeName,
|
|
@@ -183,29 +207,40 @@ export class ClosePositionAction {
|
|
|
183
207
|
wallet: address,
|
|
184
208
|
reason: 'action_close',
|
|
185
209
|
closeReason: reason,
|
|
210
|
+
orderType,
|
|
186
211
|
...(dexForHook != null ? { dex: dexForHook } : {}),
|
|
212
|
+
__correlationId: event.data.__correlationId,
|
|
187
213
|
},
|
|
188
214
|
timestamp: new Date().toISOString(),
|
|
189
215
|
});
|
|
190
|
-
|
|
191
|
-
await this.context.notifications.notify(msg);
|
|
192
|
-
results.push({ asset, success: true, reason });
|
|
216
|
+
results.push({ asset, dex: dexForHook ?? null, orderType, closeReason: reason, success: true, reason });
|
|
193
217
|
closedCount++;
|
|
194
218
|
}
|
|
195
219
|
catch (error) {
|
|
196
220
|
const message = error instanceof Error ? error.message : String(error);
|
|
197
221
|
logger.error('close failed', { asset, err: message });
|
|
198
|
-
results.push({ asset, success: false, reason, error: message });
|
|
222
|
+
results.push({ asset, dex: dexForHook ?? null, orderType, closeReason: reason, success: false, reason, error: message });
|
|
199
223
|
failedCount++;
|
|
200
224
|
}
|
|
201
225
|
}
|
|
202
226
|
const skippedCount = results.length - closedCount - failedCount;
|
|
203
|
-
|
|
227
|
+
const summary = `Close: ${closedCount} closed, ${failedCount} failed, ${skippedCount} skipped`;
|
|
228
|
+
logger.info('close position result', {
|
|
229
|
+
address,
|
|
230
|
+
summary,
|
|
231
|
+
closedCount,
|
|
232
|
+
failedCount,
|
|
233
|
+
skippedCount,
|
|
234
|
+
results,
|
|
235
|
+
});
|
|
236
|
+
const actionResult = {
|
|
204
237
|
success: closedCount > 0 || failedCount === 0,
|
|
205
238
|
action_type: this.actionType,
|
|
206
|
-
summary
|
|
239
|
+
summary,
|
|
207
240
|
data: { results, closedCount, failedCount, skippedCount },
|
|
208
241
|
};
|
|
242
|
+
emitTrackingActionResult(this.trackingCtx(), event, address, actionResult);
|
|
243
|
+
return actionResult;
|
|
209
244
|
}
|
|
210
245
|
}
|
|
211
246
|
// ─── Factory & Manifest ─────────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close-position.action.js","sourceRoot":"","sources":["../../../src/actions/close-position/close-position.action.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEtH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"close-position.action.js","sourceRoot":"","sources":["../../../src/actions/close-position/close-position.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-engine.d.ts","sourceRoot":"","sources":["../../src/actions/decision-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EAGZ,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC3D;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAA6C;IAE/D,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAOpF;AAID,qBAAa,mBAAoB,YAAW,gBAAgB;IAG9C,OAAO,CAAC,WAAW;IAF/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAS;gBAEhB,WAAW,EAAE,WAAW;IAEtC,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"decision-engine.d.ts","sourceRoot":"","sources":["../../src/actions/decision-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EAGZ,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC3D;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAA6C;IAE/D,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAOpF;AAID,qBAAa,mBAAoB,YAAW,gBAAgB;IAG9C,OAAO,CAAC,WAAW;IAF/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAS;gBAEhB,WAAW,EAAE,WAAW;IAEtC,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAwChE;AAID,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAU;IAE/B,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAuChE;AAID,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAU;IAE/B,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAShE"}
|
|
@@ -46,6 +46,11 @@ export class LlmDecisionStrategy {
|
|
|
46
46
|
confidence: decision.confidence,
|
|
47
47
|
reasoning: decision.reasoning,
|
|
48
48
|
payload: decision.payload ?? {},
|
|
49
|
+
decisionTelemetry: {
|
|
50
|
+
durationMs: response.latencyMs,
|
|
51
|
+
tokensUsed: response.tokensUsed,
|
|
52
|
+
model: request.model,
|
|
53
|
+
},
|
|
49
54
|
};
|
|
50
55
|
}
|
|
51
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-engine.js","sourceRoot":"","sources":["../../src/actions/decision-engine.ts"],"names":[],"mappings":"AAyBA,+EAA+E;AAE/E,MAAM,OAAO,cAAc;IACjB,UAAU,GAAG,IAAI,GAAG,EAAkC,CAAC;IAE/D,QAAQ,CAAC,QAA0B;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAkB,EAAE,OAAwB;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;CACF;AAED,8EAA8E;AAE9E,MAAM,OAAO,mBAAmB;IAGV;IAFX,IAAI,GAAiB,KAAK,CAAC;IAEpC,YAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAEhD,KAAK,CAAC,MAAM,CAAC,OAAwB;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAiB;YAC7D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAEnC,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IACE,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ;YACvC,QAAQ,CAAC,UAAU,GAAG,CAAC;YACvB,QAAQ,CAAC,UAAU,GAAG,EAAE,EACxB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU;YACrD,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"decision-engine.js","sourceRoot":"","sources":["../../src/actions/decision-engine.ts"],"names":[],"mappings":"AAyBA,+EAA+E;AAE/E,MAAM,OAAO,cAAc;IACjB,UAAU,GAAG,IAAI,GAAG,EAAkC,CAAC;IAE/D,QAAQ,CAAC,QAA0B;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAkB,EAAE,OAAwB;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;CACF;AAED,8EAA8E;AAE9E,MAAM,OAAO,mBAAmB;IAGV;IAFX,IAAI,GAAiB,KAAK,CAAC;IAEpC,YAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAEhD,KAAK,CAAC,MAAM,CAAC,OAAwB;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAiB;YAC7D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAEnC,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IACE,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ;YACvC,QAAQ,CAAC,UAAU,GAAG,CAAC;YACvB,QAAQ,CAAC,UAAU,GAAG,EAAE,EACxB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU;YACrD,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;YAC/B,iBAAiB,EAAE;gBACjB,UAAU,EAAE,QAAQ,CAAC,SAAS;gBAC9B,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB;SACF,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAE/E,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAiB,MAAM,CAAC;IAErC,KAAK,CAAC,MAAM,CAAC,OAAwB;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,UAAoC,CAAC;QAC7E,MAAM,OAAO,GAAa,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAC1D,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAC7C,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,kCAAkC;gBAC7C,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAEzB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU;YACV,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,kBAAkB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjE,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3B,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,MAAM,EAAG,CAAC,CAAC,IAAI,EAAE,MAAiB,IAAI,CAAC,CAAC,UAAU;oBAClD,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,GAAyB;oBACtC,IAAI,EAAE,CAAC,CAAC,IAAI;iBACb,CAAC,CAAC;aACJ;SACF,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAE/E,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAiB,MAAM,CAAC;IAErC,KAAK,CAAC,MAAM,CAAC,OAAwB;QACnC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,sBAAsB;YACjC,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -22,7 +22,7 @@ export declare const ACTION_DECISION_SCHEMA: {
|
|
|
22
22
|
};
|
|
23
23
|
readonly required: readonly ["execute", "confidence", "reasoning"];
|
|
24
24
|
};
|
|
25
|
-
export declare const SYSTEM_PROMPT = "You are a trading decision engine. Analyze the provided context and decide whether to execute the requested trading action.\n\nRespond with a JSON object:\n- execute (boolean): whether the action should proceed\n- confidence (integer 1\u201310): how confident you are\n- reasoning (string): concise explanation of your decision\n- actionType (string): the action type being evaluated\n- payload (object): action-specific fields
|
|
25
|
+
export declare const SYSTEM_PROMPT = "You are a trading decision engine. Analyze the provided context and decide whether to execute the requested trading action.\n\nRespond with a JSON object:\n- execute (boolean): whether the action should proceed\n- confidence (integer 1\u201310): how confident you are\n- reasoning (string): concise explanation of your decision\n- actionType (string): the action type being evaluated\n- payload (object): action-specific fields. For OPEN_POSITION, payload.signals is an array where each signal has: asset (string), direction (\"LONG\"|\"SHORT\"), reason (string). Optionally include \"leverage\" (number, your recommended leverage) and \"margin\" (number, $ margin amount) per signal if you have conviction about position sizing.";
|
|
26
26
|
/**
|
|
27
27
|
* Extract a decision object from the llm-task response.
|
|
28
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/actions/llm-decision/shared.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEnE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;CAUzB,CAAC;AAEX,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/actions/llm-decision/shared.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEnE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;CAUzB,CAAC;AAEX,eAAO,MAAM,aAAa,8tBAOuT,CAAC;AA8BlV;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG;IAAE,QAAQ,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA8DpF"}
|
|
@@ -19,7 +19,7 @@ Respond with a JSON object:
|
|
|
19
19
|
- confidence (integer 1–10): how confident you are
|
|
20
20
|
- reasoning (string): concise explanation of your decision
|
|
21
21
|
- actionType (string): the action type being evaluated
|
|
22
|
-
- payload (object): action-specific fields
|
|
22
|
+
- payload (object): action-specific fields. For OPEN_POSITION, payload.signals is an array where each signal has: asset (string), direction ("LONG"|"SHORT"), reason (string). Optionally include "leverage" (number, your recommended leverage) and "margin" (number, $ margin amount) per signal if you have conviction about position sizing.`;
|
|
23
23
|
// ─── Response parsing ───────────────────────────────────────────────────────
|
|
24
24
|
/**
|
|
25
25
|
* Try to parse a JSON string into a record. Returns null on failure.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/actions/llm-decision/shared.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,OAAO,EAAK,EAAE,IAAI,EAAE,SAAS,EAAE;QAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;QACxD,SAAS,EAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,OAAO,EAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC;CACxC,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/actions/llm-decision/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain-text messages for action-layer Telegram notifications (open submit / close).
|
|
3
|
+
*/
|
|
4
|
+
/** Payload emitted with {@link import("../../types/hooks.js").HOOK_EVENT.ON_OPEN_ORDER_SUBMITTED}. */
|
|
5
|
+
export interface ActionOrderSubmittedData {
|
|
6
|
+
asset: string;
|
|
7
|
+
direction: "LONG" | "SHORT";
|
|
8
|
+
leverage: number;
|
|
9
|
+
wallet: string;
|
|
10
|
+
/** Display dex; `"main"` is omitted in copy. */
|
|
11
|
+
dex: string;
|
|
12
|
+
reasoning?: string;
|
|
13
|
+
orderId?: string;
|
|
14
|
+
marginAmount?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Payload on {@link import("../../types/hooks.js").HOOK_EVENT.ON_POSITION_CLOSED} (non–position-tracker). */
|
|
17
|
+
export interface ActionPositionClosedData {
|
|
18
|
+
asset: string;
|
|
19
|
+
wallet: string;
|
|
20
|
+
/** Machine reason (e.g. `action_close`); prefer `closeReason` for display. */
|
|
21
|
+
reason?: string;
|
|
22
|
+
/** User-facing close explanation when present. */
|
|
23
|
+
closeReason?: string;
|
|
24
|
+
dex?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Human-readable line(s) for a successful open-order submit (after Senpi accepts the order).
|
|
28
|
+
*
|
|
29
|
+
* @param data - Fields from the hook event `data` object
|
|
30
|
+
* @returns Multi-line plain text suitable for Telegram
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatOrderSubmitted(data: ActionOrderSubmittedData): string;
|
|
33
|
+
/**
|
|
34
|
+
* Human-readable line for a position closed via the action layer (or other non-tracker sources).
|
|
35
|
+
*
|
|
36
|
+
* @param data - Fields from the hook event `data` object
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatPositionClosed(data: ActionPositionClosedData): string;
|
|
39
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../src/actions/notifications/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8BH,sGAAsG;AACtG,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,8GAA8G;AAC9G,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAU3E;AAaD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAG3E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain-text messages for action-layer Telegram notifications (open submit / close).
|
|
3
|
+
*/
|
|
4
|
+
function formatUsdWithCommas(n, fractionDigits) {
|
|
5
|
+
return new Intl.NumberFormat("en-US", {
|
|
6
|
+
style: "currency",
|
|
7
|
+
currency: "USD",
|
|
8
|
+
minimumFractionDigits: fractionDigits,
|
|
9
|
+
maximumFractionDigits: fractionDigits,
|
|
10
|
+
}).format(n);
|
|
11
|
+
}
|
|
12
|
+
/** Collateral display: trim meaningless trailing zeros (e.g. $500, $493.20). */
|
|
13
|
+
function fmtMargin(amount) {
|
|
14
|
+
if (!Number.isFinite(amount))
|
|
15
|
+
return "$0";
|
|
16
|
+
const ap = Math.abs(amount);
|
|
17
|
+
const digits = ap >= 100 ? 0 : ap >= 1 ? 2 : 4;
|
|
18
|
+
return formatUsdWithCommas(amount, digits);
|
|
19
|
+
}
|
|
20
|
+
function fmtDex(dex) {
|
|
21
|
+
const s = typeof dex === "string" ? dex.trim() : String(dex ?? "").trim();
|
|
22
|
+
if (s === "" || s.toLowerCase() === "main")
|
|
23
|
+
return "";
|
|
24
|
+
return ` (${s})`;
|
|
25
|
+
}
|
|
26
|
+
function fmtLeverage(leverage) {
|
|
27
|
+
const n = Number.isFinite(leverage) && leverage > 0 ? leverage : 1;
|
|
28
|
+
return `${Number.isInteger(n) ? n : n.toFixed(1)}x`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Human-readable line(s) for a successful open-order submit (after Senpi accepts the order).
|
|
32
|
+
*
|
|
33
|
+
* @param data - Fields from the hook event `data` object
|
|
34
|
+
* @returns Multi-line plain text suitable for Telegram
|
|
35
|
+
*/
|
|
36
|
+
export function formatOrderSubmitted(data) {
|
|
37
|
+
const dex = fmtDex(data.dex);
|
|
38
|
+
const lev = fmtLeverage(data.leverage);
|
|
39
|
+
const margin = fmtMargin(data.marginAmount ?? 0);
|
|
40
|
+
const line1 = `Opened ${data.asset}${dex} ${data.direction} · ${lev} · ${margin} margin`;
|
|
41
|
+
const r = typeof data.reasoning === "string" ? data.reasoning.trim() : "";
|
|
42
|
+
if (r.length > 0) {
|
|
43
|
+
return `${line1}\nReason: ${r}`;
|
|
44
|
+
}
|
|
45
|
+
return line1;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolves the subtitle after the em dash for a position close notification.
|
|
49
|
+
*/
|
|
50
|
+
function closeSubtitle(data) {
|
|
51
|
+
const cr = typeof data.closeReason === "string" ? data.closeReason.trim() : "";
|
|
52
|
+
if (cr.length > 0)
|
|
53
|
+
return cr;
|
|
54
|
+
const r = typeof data.reason === "string" ? data.reason.trim() : "";
|
|
55
|
+
if (r.length > 0)
|
|
56
|
+
return r;
|
|
57
|
+
return "Position closed";
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Human-readable line for a position closed via the action layer (or other non-tracker sources).
|
|
61
|
+
*
|
|
62
|
+
* @param data - Fields from the hook event `data` object
|
|
63
|
+
*/
|
|
64
|
+
export function formatPositionClosed(data) {
|
|
65
|
+
const dex = fmtDex(data.dex);
|
|
66
|
+
return `Closed ${data.asset}${dex} — ${closeSubtitle(data)}`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../src/actions/notifications/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribes to action hook events on the bus and forwards formatted strings to NotificationService.
|
|
3
|
+
*/
|
|
4
|
+
import type { SenpiEventBus } from "../../types/event-bus.js";
|
|
5
|
+
import type { NotificationService } from "../../types/notification.js";
|
|
6
|
+
export type { ActionOrderSubmittedData, ActionPositionClosedData } from "./formatter.js";
|
|
7
|
+
export interface ActionNotificationOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Recipe name to prefix every notification message (e.g. "[my-recipe] Opened ...").
|
|
10
|
+
* When omitted, no prefix is added.
|
|
11
|
+
*/
|
|
12
|
+
strategyName?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ActionNotificationSubscriber {
|
|
15
|
+
dispose(): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* When `notifications.action_lifecycle` is `false`, do not register the subscriber; callers should
|
|
19
|
+
* skip {@link createActionNotificationSubscriber} entirely. This helper documents the default
|
|
20
|
+
* (`true` when the key is omitted).
|
|
21
|
+
*
|
|
22
|
+
* @param notifications - Top-level YAML `notifications` object, if any
|
|
23
|
+
* @returns `false` only when `action_lifecycle` is explicitly `false`
|
|
24
|
+
*/
|
|
25
|
+
export declare function isActionLifecycleNotificationsEnabled(notifications?: Record<string, unknown>): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Listens for `on_open_order_submitted` and `on_position_closed` on the runtime bus and sends
|
|
28
|
+
* Telegram notifications. Position-tracker closes (`data.reason === 'position_tracker'`) are
|
|
29
|
+
* suppressed so DSL / tracker copy stays authoritative for those paths.
|
|
30
|
+
*
|
|
31
|
+
* @param bus - Runtime event bus
|
|
32
|
+
* @param notifier - Telegram notification service
|
|
33
|
+
* @param options - Optional recipe name prefix
|
|
34
|
+
* @returns Handle with `dispose()` to remove listeners
|
|
35
|
+
*/
|
|
36
|
+
export declare function createActionNotificationSubscriber(bus: SenpiEventBus, notifier: NotificationService, options?: ActionNotificationOptions): ActionNotificationSubscriber;
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/notifications/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAavE,YAAY,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEzF,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,IAAI,IAAI,CAAC;CACjB;AAwBD;;;;;;;GAOG;AACH,wBAAgB,qCAAqC,CACnD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,OAAO,CAET;AAED;;;;;;;;;GASG;AACH,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,CAAC,EAAE,yBAAyB,GAClC,4BAA4B,CAwC9B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribes to action hook events on the bus and forwards formatted strings to NotificationService.
|
|
3
|
+
*/
|
|
4
|
+
import { HOOK_EVENT } from "../../types/hooks.js";
|
|
5
|
+
import { isHookEvent } from "../../dsl/events/guards.js";
|
|
6
|
+
import { createLogger } from "../../utils/logger.js";
|
|
7
|
+
import { formatOrderSubmitted, formatPositionClosed, } from "./formatter.js";
|
|
8
|
+
const logger = createLogger("[senpi-core][action-notifications]");
|
|
9
|
+
function safeNotify(notifier, message) {
|
|
10
|
+
try {
|
|
11
|
+
const result = notifier.notify(message);
|
|
12
|
+
if (result != null && typeof result.then === "function") {
|
|
13
|
+
void result.catch((err) => logger.warn("[action-notifications] notify rejected", { err, message }));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
logger.warn("[action-notifications] notify threw synchronously", { err, message });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Ensures formatter + notify never throw back into `bus.emit` (would break hook emitters). */
|
|
21
|
+
function runNotificationHandler(fn) {
|
|
22
|
+
try {
|
|
23
|
+
fn();
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
logger.warn("[action-notifications] handler error (isolated from hooks)", { err });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* When `notifications.action_lifecycle` is `false`, do not register the subscriber; callers should
|
|
31
|
+
* skip {@link createActionNotificationSubscriber} entirely. This helper documents the default
|
|
32
|
+
* (`true` when the key is omitted).
|
|
33
|
+
*
|
|
34
|
+
* @param notifications - Top-level YAML `notifications` object, if any
|
|
35
|
+
* @returns `false` only when `action_lifecycle` is explicitly `false`
|
|
36
|
+
*/
|
|
37
|
+
export function isActionLifecycleNotificationsEnabled(notifications) {
|
|
38
|
+
return notifications?.action_lifecycle !== false;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Listens for `on_open_order_submitted` and `on_position_closed` on the runtime bus and sends
|
|
42
|
+
* Telegram notifications. Position-tracker closes (`data.reason === 'position_tracker'`) are
|
|
43
|
+
* suppressed so DSL / tracker copy stays authoritative for those paths.
|
|
44
|
+
*
|
|
45
|
+
* @param bus - Runtime event bus
|
|
46
|
+
* @param notifier - Telegram notification service
|
|
47
|
+
* @param options - Optional recipe name prefix
|
|
48
|
+
* @returns Handle with `dispose()` to remove listeners
|
|
49
|
+
*/
|
|
50
|
+
export function createActionNotificationSubscriber(bus, notifier, options) {
|
|
51
|
+
const prefix = options?.strategyName ? `[${options.strategyName}] ` : "";
|
|
52
|
+
function notify(message) {
|
|
53
|
+
safeNotify(notifier, `${prefix}${message}`);
|
|
54
|
+
}
|
|
55
|
+
const onOpenSubmitted = (payload) => {
|
|
56
|
+
runNotificationHandler(() => {
|
|
57
|
+
// Only HookSystem-fired envelopes; ignore any other shape on this bus name.
|
|
58
|
+
if (!isHookEvent(payload) || payload.type !== HOOK_EVENT.ON_OPEN_ORDER_SUBMITTED)
|
|
59
|
+
return;
|
|
60
|
+
const data = payload.data;
|
|
61
|
+
notify(formatOrderSubmitted(data));
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const onPositionClosed = (payload) => {
|
|
65
|
+
runNotificationHandler(() => {
|
|
66
|
+
/**
|
|
67
|
+
* The same event name is reused for two payload shapes: (1) HookEvent from actions /
|
|
68
|
+
* position-tracker via `hookSystem.fire`, and (2) flat objects from the DSL monitor and
|
|
69
|
+
* reconcile paths via `bus.emit(EVENTS.POSITION_CLOSED, { ... })`. Only (1) is
|
|
70
|
+
* action-layer Telegram; (2) is covered by `dsl.closed` + DSL notification subscriber.
|
|
71
|
+
*/
|
|
72
|
+
if (!isHookEvent(payload) || payload.type !== HOOK_EVENT.ON_POSITION_CLOSED)
|
|
73
|
+
return;
|
|
74
|
+
const data = payload.data;
|
|
75
|
+
if (data.reason === "position_tracker")
|
|
76
|
+
return;
|
|
77
|
+
notify(formatPositionClosed(data));
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
bus.on(HOOK_EVENT.ON_OPEN_ORDER_SUBMITTED, onOpenSubmitted);
|
|
81
|
+
bus.on(HOOK_EVENT.ON_POSITION_CLOSED, onPositionClosed);
|
|
82
|
+
return {
|
|
83
|
+
dispose() {
|
|
84
|
+
bus.off(HOOK_EVENT.ON_OPEN_ORDER_SUBMITTED, onOpenSubmitted);
|
|
85
|
+
bus.off(HOOK_EVENT.ON_POSITION_CLOSED, onPositionClosed);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/notifications/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export declare class OpenPositionAction implements Action {
|
|
|
7
7
|
readonly actionType: "OPEN_POSITION";
|
|
8
8
|
private decisionEngine;
|
|
9
9
|
constructor(config: ActionConfig, context: RuntimeContext);
|
|
10
|
+
private trackingCtx;
|
|
10
11
|
handle(event: HookEvent): Promise<ActionResult>;
|
|
11
12
|
private normalizeSignals;
|
|
12
13
|
private handleSignals;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-position.action.d.ts","sourceRoot":"","sources":["../../../src/actions/open-position/open-position.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,
|
|
1
|
+
{"version":3,"file":"open-position.action.d.ts","sourceRoot":"","sources":["../../../src/actions/open-position/open-position.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EAEZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EAEV,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAgCtD,qBAAa,kBAAmB,YAAW,MAAM;IAO7C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IAPjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAG,eAAe,CAAU;IAE/C,OAAO,CAAC,cAAc,CAAiB;gBAG7B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,cAAc;IASjC,OAAO,CAAC,WAAW;IAWb,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAwKrD,OAAO,CAAC,gBAAgB;YAaV,aAAa;CAgM5B;AAID,eAAO,MAAM,mBAAmB,EAAE,aACO,CAAC;AAE1C,eAAO,MAAM,oBAAoB,EAAE,cAMlC,CAAC"}
|