@senpi/runtime 1.1.0-dev.runtime-phase-2.20260609123448 → 1.1.0-dev.runtime-phase-2.20260609132603
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/dist/actions/close-position/close-position.action.d.ts +16 -0
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +299 -38
- package/dist/actions/close-position/close-position.action.js.map +1 -1
- package/dist/actions/decision-engine.d.ts +2 -0
- package/dist/actions/decision-engine.d.ts.map +1 -1
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/llm-decision/factory.d.ts +3 -0
- package/dist/actions/llm-decision/factory.d.ts.map +1 -1
- package/dist/actions/llm-decision/factory.js +1 -0
- package/dist/actions/llm-decision/factory.js.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +13 -0
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.js +195 -68
- package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts +12 -0
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +356 -109
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/otel-helpers.d.ts +65 -0
- package/dist/actions/otel-helpers.d.ts.map +1 -0
- package/dist/actions/otel-helpers.js +122 -0
- package/dist/actions/otel-helpers.js.map +1 -0
- package/dist/actions/position-tracker/position-tracker.action.d.ts +6 -0
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +48 -0
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/otel/context.d.ts +24 -0
- package/dist/otel/context.d.ts.map +1 -0
- package/dist/otel/context.js +29 -0
- package/dist/otel/context.js.map +1 -0
- package/dist/otel/emitter.d.ts +73 -0
- package/dist/otel/emitter.d.ts.map +1 -0
- package/dist/otel/emitter.js +248 -0
- package/dist/otel/emitter.js.map +1 -0
- package/dist/otel/encode.d.ts +48 -0
- package/dist/otel/encode.d.ts.map +1 -0
- package/dist/otel/encode.js +100 -0
- package/dist/otel/encode.js.map +1 -0
- package/dist/otel/index.d.ts +13 -0
- package/dist/otel/index.d.ts.map +1 -0
- package/dist/otel/index.js +10 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/otel/transport.d.ts +57 -0
- package/dist/otel/transport.d.ts.map +1 -0
- package/dist/otel/transport.js +208 -0
- package/dist/otel/transport.js.map +1 -0
- package/dist/otel/types.d.ts +62 -0
- package/dist/otel/types.d.ts.map +1 -0
- package/dist/otel/types.js +2 -0
- package/dist/otel/types.js.map +1 -0
- package/dist/runtime/create-actions.d.ts.map +1 -1
- package/dist/runtime/create-actions.js +2 -0
- package/dist/runtime/create-actions.js.map +1 -1
- package/dist/runtime/create-runtime-context.d.ts +2 -0
- package/dist/runtime/create-runtime-context.d.ts.map +1 -1
- package/dist/runtime/create-runtime-context.js +1 -0
- package/dist/runtime/create-runtime-context.js.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +1 -1
- package/dist/runtime/create-scanner-module.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.js +2 -1
- package/dist/runtime/create-scanner-module.js.map +1 -1
- package/dist/runtime/risk-guard.d.ts +10 -0
- package/dist/runtime/risk-guard.d.ts.map +1 -1
- package/dist/runtime/risk-guard.js +6 -12
- package/dist/runtime/risk-guard.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +24 -0
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +1 -0
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +5 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +140 -4
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/strategy-lifecycle.d.ts +45 -0
- package/dist/runtime/strategy-lifecycle.d.ts.map +1 -0
- package/dist/runtime/strategy-lifecycle.js +117 -0
- package/dist/runtime/strategy-lifecycle.js.map +1 -0
- package/dist/scanners/engine/data-providers.d.ts +2 -0
- package/dist/scanners/engine/data-providers.d.ts.map +1 -1
- package/dist/scanners/engine/data-providers.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +68 -9
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts +2 -0
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +1 -0
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/senpi/client.d.ts +2 -2
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +120 -20
- package/dist/senpi/client.js.map +1 -1
- package/dist/senpi/types.d.ts +68 -1
- package/dist/senpi/types.d.ts.map +1 -1
- package/dist/strategy/strategy-state.d.ts +1 -1
- package/dist/strategy/strategy-state.d.ts.map +1 -1
- package/dist/tracking/spans/plugin-span-tracker.d.ts.map +1 -1
- package/dist/tracking/spans/plugin-span-tracker.js +4 -24
- package/dist/tracking/spans/plugin-span-tracker.js.map +1 -1
- package/dist/tracking/spans/redact-pii.d.ts +10 -0
- package/dist/tracking/spans/redact-pii.d.ts.map +1 -1
- package/dist/tracking/spans/redact-pii.js +80 -2
- package/dist/tracking/spans/redact-pii.js.map +1 -1
- package/dist/types/hooks.d.ts +1 -0
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +1 -0
- package/dist/types/hooks.js.map +1 -1
- package/dist/types/runtime.d.ts +3 -0
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +2 -2
- package/dist/types/strategy.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw-llm-decision.d.ts","sourceRoot":"","sources":["../../../src/actions/llm-decision/openclaw-llm-decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openclaw-llm-decision.d.ts","sourceRoot":"","sources":["../../../src/actions/llm-decision/openclaw-llm-decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAaxF,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,qBAAqB,CAAC;AAUvE,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAUnE;AA6BD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CASjG;AAED,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAc;gBAExB,OAAO,CAAC,EAAE,0BAA0B;IAO1C,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAyL9E"}
|
|
@@ -9,6 +9,46 @@ const MAX_DECISION_RETRIES = 2;
|
|
|
9
9
|
/** Fixed delay between retry attempts (ms). Backoff is intentionally simple for now. */
|
|
10
10
|
const DECISION_RETRY_DELAY_MS = 1_000;
|
|
11
11
|
const logger = createLogger('[llm-decision][openclaw]');
|
|
12
|
+
/**
|
|
13
|
+
* Parse an HTTP `Retry-After` header value into milliseconds.
|
|
14
|
+
*
|
|
15
|
+
* Per RFC 7231 §7.1.3 the value is either delta-seconds (a non-negative integer)
|
|
16
|
+
* or an HTTP-date. We preserve `Retry-After: 0` as a legitimate "retry now"
|
|
17
|
+
* signal — the previous `Number(v) * 1000 || undefined` form silently lost it.
|
|
18
|
+
*
|
|
19
|
+
* Returns `null` only when the header is genuinely absent or unparseable.
|
|
20
|
+
*/
|
|
21
|
+
export function parseRetryAfter(value) {
|
|
22
|
+
if (value == null)
|
|
23
|
+
return null;
|
|
24
|
+
const asNum = Number(value);
|
|
25
|
+
if (!Number.isNaN(asNum))
|
|
26
|
+
return asNum * 1000; // delta-seconds, including 0
|
|
27
|
+
const asDate = Date.parse(value); // HTTP-date form
|
|
28
|
+
if (!Number.isNaN(asDate)) {
|
|
29
|
+
const delta = asDate - Date.now();
|
|
30
|
+
return delta > 0 ? delta : 0;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Emit a `gen_ai.message` log with consistent attribute shape across all three
|
|
36
|
+
* roles (system / user / assistant). Extras let the assistant variant add
|
|
37
|
+
* `gen_ai.usage.total_tokens` without duplicating the base shape.
|
|
38
|
+
*/
|
|
39
|
+
function emitGenAiMessage(otel, parent, role, model, provider, body, extras) {
|
|
40
|
+
otel?.emitLog({
|
|
41
|
+
eventName: 'gen_ai.message',
|
|
42
|
+
parent,
|
|
43
|
+
attrs: {
|
|
44
|
+
'gen_ai.role': role,
|
|
45
|
+
'gen_ai.model': model,
|
|
46
|
+
'gen_ai.system': provider,
|
|
47
|
+
...(extras ?? {}),
|
|
48
|
+
},
|
|
49
|
+
body,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
12
52
|
/**
|
|
13
53
|
* Normalize a `decision_model` string into a `{ provider, model }` pair for the
|
|
14
54
|
* OpenClaw `llm-task` call.
|
|
@@ -50,10 +90,12 @@ export class OpenClawLlmDecision {
|
|
|
50
90
|
gatewayUrl;
|
|
51
91
|
gatewayToken;
|
|
52
92
|
defaultModel;
|
|
93
|
+
otel;
|
|
53
94
|
constructor(options) {
|
|
54
95
|
this.gatewayUrl = options?.gatewayUrl ?? 'http://127.0.0.1:18789';
|
|
55
96
|
this.gatewayToken = options?.gatewayToken;
|
|
56
97
|
this.defaultModel = options?.defaultModel;
|
|
98
|
+
this.otel = options?.otel;
|
|
57
99
|
}
|
|
58
100
|
async decide(request) {
|
|
59
101
|
const start = Date.now();
|
|
@@ -61,78 +103,163 @@ export class OpenClawLlmDecision {
|
|
|
61
103
|
if (!token) {
|
|
62
104
|
throw new Error('OpenClaw gateway token not configured (set OPENCLAW_GATEWAY_TOKEN)');
|
|
63
105
|
}
|
|
64
|
-
const args = {
|
|
65
|
-
prompt: `${SYSTEM_PROMPT}\n\n## Task\n${request.prompt}`,
|
|
66
|
-
input: request.context,
|
|
67
|
-
schema: ACTION_DECISION_SCHEMA,
|
|
68
|
-
// OpenClaw's llm-task plugin falls back to 30 s when the caller omits
|
|
69
|
-
// `timeoutMs`. Gemini's tail latency exceeds that during load (Roach
|
|
70
|
-
// Runtime 2.0 5xx incident), so we explicitly override to 90 s.
|
|
71
|
-
// Resolution chain in OpenClaw: params.timeoutMs ?? pluginCfg.timeoutMs ?? 30_000
|
|
72
|
-
// (extensions/llm-task/src/llm-task-tool.ts).
|
|
73
|
-
timeoutMs: 90_000,
|
|
74
|
-
};
|
|
75
106
|
const { provider, model } = splitProviderModel(request.model ?? this.defaultModel);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
107
|
+
const promptText = `${SYSTEM_PROMPT}\n\n## Task\n${request.prompt}`;
|
|
108
|
+
const agentSpan = this.otel?.startSpan('agent.run', {
|
|
109
|
+
attrs: {
|
|
110
|
+
'agent.model': model,
|
|
111
|
+
'agent.provider': provider,
|
|
112
|
+
'agent.max_tokens': request.maxTokens,
|
|
113
|
+
'agent.temperature': request.temperature,
|
|
114
|
+
'agent.input_keys': Object.keys(request.context ?? {}),
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
// Wrap the entire agentSpan lifetime in try/finally so a parse-throw in the
|
|
118
|
+
// post-retry extractDecision call still ends the span. The C2 default in
|
|
119
|
+
// OtelSpanHandle.end() promotes StatusCode to 'Error' when recordException
|
|
120
|
+
// was called, so no explicit status flag is needed in the catch arm.
|
|
121
|
+
try {
|
|
122
|
+
if (agentSpan) {
|
|
123
|
+
emitGenAiMessage(this.otel, agentSpan, 'system', model, provider, promptText);
|
|
124
|
+
emitGenAiMessage(this.otel, agentSpan, 'user', model, provider, request.context);
|
|
125
|
+
}
|
|
126
|
+
const args = {
|
|
127
|
+
prompt: promptText,
|
|
128
|
+
input: request.context,
|
|
129
|
+
schema: ACTION_DECISION_SCHEMA,
|
|
130
|
+
// OpenClaw's llm-task plugin falls back to 30 s when the caller omits
|
|
131
|
+
// `timeoutMs`. Gemini's tail latency exceeds that during load (Roach
|
|
132
|
+
// Runtime 2.0 5xx incident), so we explicitly override to 90 s.
|
|
133
|
+
// Resolution chain in OpenClaw: params.timeoutMs ?? pluginCfg.timeoutMs ?? 30_000
|
|
134
|
+
// (extensions/llm-task/src/llm-task-tool.ts).
|
|
135
|
+
timeoutMs: 90_000,
|
|
136
|
+
};
|
|
137
|
+
if (provider)
|
|
138
|
+
args.provider = provider;
|
|
139
|
+
if (model)
|
|
140
|
+
args.model = model;
|
|
141
|
+
if (request.maxTokens != null)
|
|
142
|
+
args.maxTokens = request.maxTokens;
|
|
143
|
+
if (request.temperature != null)
|
|
144
|
+
args.temperature = request.temperature;
|
|
145
|
+
// Selective retry: only failure modes the error classifier marks retryable
|
|
146
|
+
// (transient provider errors, empty output) are retried. Config/author bugs
|
|
147
|
+
// and timeouts fail fast — a timeout already burned 90s and signal processing
|
|
148
|
+
// is strictly serial, so retrying would stall the runtime's whole queue.
|
|
149
|
+
//
|
|
150
|
+
// Returns the successful llmSpan alongside the parsed body so the post-retry
|
|
151
|
+
// assistant gen_ai.message log can parent under the *winning* attempt — the
|
|
152
|
+
// trace then answers "which retry produced the final response".
|
|
153
|
+
const { result, llmSpan: successfulLlmSpan } = await withRetry(async () => {
|
|
154
|
+
const llmSpan = this.otel?.startSpan('llm.call', {
|
|
155
|
+
parent: agentSpan,
|
|
156
|
+
attrs: {
|
|
157
|
+
'gen_ai.system': provider,
|
|
158
|
+
'gen_ai.model': model,
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
let res;
|
|
162
|
+
try {
|
|
163
|
+
res = await fetch(`${this.gatewayUrl}/tools/invoke`, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: {
|
|
166
|
+
'Authorization': `Bearer ${token}`,
|
|
167
|
+
'Content-Type': 'application/json',
|
|
168
|
+
...buildSenpiTrackingHeaders(),
|
|
169
|
+
},
|
|
170
|
+
body: JSON.stringify({ tool: 'llm-task', args }),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (fetchErr) {
|
|
174
|
+
llmSpan?.recordException(fetchErr);
|
|
175
|
+
llmSpan?.setAttr('llm.success', false);
|
|
176
|
+
llmSpan?.end({ statusCode: 'Error' });
|
|
177
|
+
throw fetchErr;
|
|
178
|
+
}
|
|
179
|
+
if (!res.ok) {
|
|
180
|
+
const text = await res.text();
|
|
181
|
+
const httpError = new Error(`OpenClaw gateway error (${res.status}): ${text}`);
|
|
182
|
+
if (res.status === 429) {
|
|
183
|
+
// B5 — rate-limit signal is a span event on the failed attempt,
|
|
184
|
+
// not a separate log. HyperDX renders span events on the timeline
|
|
185
|
+
// and the {retry_after_ms, provider, model} payload stays bound
|
|
186
|
+
// to the specific attempt that hit the limit. The `llm.rate_limited`
|
|
187
|
+
// event substitutes for the generic `exception` event here.
|
|
188
|
+
const retryAfterMs = parseRetryAfter(res.headers.get('retry-after'));
|
|
189
|
+
llmSpan?.addEvent('llm.rate_limited', {
|
|
190
|
+
...(retryAfterMs !== null ? { retry_after_ms: retryAfterMs } : {}),
|
|
191
|
+
provider,
|
|
192
|
+
model,
|
|
193
|
+
});
|
|
194
|
+
llmSpan?.setAttr('exception.type', 'RateLimited');
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// Non-429 HTTP errors get the standard `exception` span event so
|
|
198
|
+
// the errored-span contract holds uniformly (see implementation
|
|
199
|
+
// notes "On any errored span: Events contains exception").
|
|
200
|
+
llmSpan?.recordException(httpError);
|
|
201
|
+
}
|
|
202
|
+
llmSpan?.setAttrs({
|
|
203
|
+
'llm.success': false,
|
|
204
|
+
'llm.error_code': `http_${res.status}`,
|
|
205
|
+
});
|
|
206
|
+
llmSpan?.end({ statusCode: 'Error' });
|
|
207
|
+
throw httpError;
|
|
208
|
+
}
|
|
209
|
+
const parsed = await res.json();
|
|
210
|
+
if (!parsed.ok) {
|
|
211
|
+
const rejectError = new Error(`OpenClaw gateway rejected request: ${parsed.error ?? JSON.stringify(parsed)}`);
|
|
212
|
+
llmSpan?.recordException(rejectError);
|
|
213
|
+
llmSpan?.setAttrs({
|
|
214
|
+
'llm.success': false,
|
|
215
|
+
'llm.error_code': parsed.error ?? 'unknown',
|
|
216
|
+
});
|
|
217
|
+
llmSpan?.end({ statusCode: 'Error' });
|
|
218
|
+
throw rejectError;
|
|
219
|
+
}
|
|
220
|
+
llmSpan?.setAttr('llm.success', true);
|
|
221
|
+
llmSpan?.end({ statusCode: 'Ok' });
|
|
222
|
+
return { result: parsed, llmSpan };
|
|
223
|
+
}, {
|
|
224
|
+
retries: MAX_DECISION_RETRIES,
|
|
225
|
+
delayMs: DECISION_RETRY_DELAY_MS,
|
|
226
|
+
label: 'llm-task',
|
|
227
|
+
shouldRetry: isRetryableDecisionError,
|
|
228
|
+
onRetry: (attempt, retriesRemaining, error) => {
|
|
229
|
+
logger.warn('llm-task failed; retrying', {
|
|
230
|
+
attempt,
|
|
231
|
+
retriesRemaining,
|
|
232
|
+
error: error instanceof Error ? error.message : String(error),
|
|
233
|
+
});
|
|
102
234
|
},
|
|
103
|
-
body: JSON.stringify({ tool: 'llm-task', args }),
|
|
104
235
|
});
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
const parsed =
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
delayMs: DECISION_RETRY_DELAY_MS,
|
|
117
|
-
label: 'llm-task',
|
|
118
|
-
shouldRetry: isRetryableDecisionError,
|
|
119
|
-
onRetry: (attempt, retriesRemaining, error) => {
|
|
120
|
-
logger.warn('llm-task failed; retrying', {
|
|
121
|
-
attempt,
|
|
122
|
-
retriesRemaining,
|
|
123
|
-
error: error instanceof Error ? error.message : String(error),
|
|
236
|
+
const latencyMs = Date.now() - start;
|
|
237
|
+
logger.debug('llm-task raw result', {
|
|
238
|
+
keys: result.result && typeof result.result === 'object' ? Object.keys(result.result) : typeof result.result,
|
|
239
|
+
});
|
|
240
|
+
const parsed = extractDecision(result.result);
|
|
241
|
+
if (agentSpan) {
|
|
242
|
+
// B10 — parent the assistant message under the winning llm.call attempt
|
|
243
|
+
// (falls back to agentSpan if span emission was disabled).
|
|
244
|
+
emitGenAiMessage(this.otel, successfulLlmSpan ?? agentSpan, 'assistant', model, provider, result.result, parsed.tokensUsed != null ? { 'gen_ai.usage.total_tokens': parsed.tokensUsed } : undefined);
|
|
245
|
+
agentSpan.setAttrs({
|
|
246
|
+
...(parsed.tokensUsed != null ? { 'gen_ai.usage.total_tokens': parsed.tokensUsed } : {}),
|
|
124
247
|
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
decision: parsed.decision,
|
|
251
|
+
rawResponse: JSON.stringify(result.result),
|
|
252
|
+
tokensUsed: parsed.tokensUsed,
|
|
253
|
+
latencyMs,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
agentSpan?.recordException(err);
|
|
258
|
+
throw err;
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
agentSpan?.end();
|
|
262
|
+
}
|
|
136
263
|
}
|
|
137
264
|
}
|
|
138
265
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw-llm-decision.js","sourceRoot":"","sources":["../../../src/actions/llm-decision/openclaw-llm-decision.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"openclaw-llm-decision.js","sourceRoot":"","sources":["../../../src/actions/llm-decision/openclaw-llm-decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,18 @@ export declare class OpenPositionAction implements Action {
|
|
|
11
11
|
handle(event: HookEvent): Promise<ActionResult>;
|
|
12
12
|
private normalizeSignals;
|
|
13
13
|
private handleSignals;
|
|
14
|
+
/**
|
|
15
|
+
* Process one signal end-to-end: gates → leverage/margin resolution →
|
|
16
|
+
* senpi.createPosition → hook fire. Opens a per-signal `signal.evaluated`
|
|
17
|
+
* funnel span (via `withSignalSpanScope`) and stamps the per-signal `position.id`
|
|
18
|
+
* on mint. Returns an outcome the caller applies to counters + results.
|
|
19
|
+
*
|
|
20
|
+
* The exception path inside the senpi.createPosition try/catch sets a
|
|
21
|
+
* 'failed' outcome and lets `withSignalSpanScope` complete normally — the
|
|
22
|
+
* outer for-loop's catch in `handleSignals` only fires on truly unexpected
|
|
23
|
+
* throws.
|
|
24
|
+
*/
|
|
25
|
+
private processOpenSignal;
|
|
14
26
|
}
|
|
15
27
|
export declare const openPositionFactory: ActionFactory;
|
|
16
28
|
export declare const openPositionManifest: ActionManifest;
|
|
@@ -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,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EAEV,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA+EtD,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;IA+NrD,OAAO,CAAC,gBAAgB;YAaV,aAAa;IAsH3B;;;;;;;;;;OAUG;YACW,iBAAiB;CAsThC;AAID,eAAO,MAAM,mBAAmB,EAAE,aACO,CAAC;AAE1C,eAAO,MAAM,oBAAoB,EAAE,cAMlC,CAAC"}
|