@senpi/runtime 3.0.6-dev.skill-manager-v2.20260629194505 → 3.0.9-dev.runtime-phase-2.20260707070820

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/dist/actions/action-events.d.ts +67 -0
  2. package/dist/actions/action-events.d.ts.map +1 -0
  3. package/dist/actions/action-events.js +164 -0
  4. package/dist/actions/action-events.js.map +1 -0
  5. package/dist/actions/close-position/close-position.action.d.ts +1 -1
  6. package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
  7. package/dist/actions/close-position/close-position.action.js +108 -86
  8. package/dist/actions/close-position/close-position.action.js.map +1 -1
  9. package/dist/actions/decision-engine.d.ts.map +1 -1
  10. package/dist/actions/decision-engine.js +40 -28
  11. package/dist/actions/decision-engine.js.map +1 -1
  12. package/dist/actions/event-derivation.d.ts +61 -0
  13. package/dist/actions/event-derivation.d.ts.map +1 -0
  14. package/dist/actions/event-derivation.js +180 -0
  15. package/dist/actions/event-derivation.js.map +1 -0
  16. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +5 -9
  17. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -1
  18. package/dist/actions/llm-decision/anthropic-llm-decision.js +6 -87
  19. package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -1
  20. package/dist/actions/llm-decision/factory.d.ts +0 -6
  21. package/dist/actions/llm-decision/factory.d.ts.map +1 -1
  22. package/dist/actions/llm-decision/factory.js +0 -2
  23. package/dist/actions/llm-decision/factory.js.map +1 -1
  24. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
  25. package/dist/actions/llm-decision/openclaw-llm-decision.js +26 -7
  26. package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
  27. package/dist/actions/open-position/open-position.action.d.ts +1 -1
  28. package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
  29. package/dist/actions/open-position/open-position.action.js +282 -224
  30. package/dist/actions/open-position/open-position.action.js.map +1 -1
  31. package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
  32. package/dist/actions/position-tracker/position-tracker.action.js +3 -6
  33. package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
  34. package/dist/cli/guide-commands.d.ts.map +1 -1
  35. package/dist/cli/guide-commands.js +61 -0
  36. package/dist/cli/guide-commands.js.map +1 -1
  37. package/dist/cli/senpi-commands.d.ts +14 -0
  38. package/dist/cli/senpi-commands.d.ts.map +1 -1
  39. package/dist/cli/senpi-commands.js +390 -2
  40. package/dist/cli/senpi-commands.js.map +1 -1
  41. package/dist/dsl/engine-client/event-mapping.d.ts.map +1 -1
  42. package/dist/dsl/engine-client/event-mapping.js +0 -3
  43. package/dist/dsl/engine-client/event-mapping.js.map +1 -1
  44. package/dist/dsl/events/build-closed-event.d.ts.map +1 -1
  45. package/dist/dsl/events/build-closed-event.js +0 -1
  46. package/dist/dsl/events/build-closed-event.js.map +1 -1
  47. package/dist/dsl/events/handlers.d.ts.map +1 -1
  48. package/dist/dsl/events/handlers.js +2 -4
  49. package/dist/dsl/events/handlers.js.map +1 -1
  50. package/dist/dsl/events/initial-state.d.ts.map +1 -1
  51. package/dist/dsl/events/initial-state.js +1 -0
  52. package/dist/dsl/events/initial-state.js.map +1 -1
  53. package/dist/dsl/monitor/create-monitor.d.ts +3 -0
  54. package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
  55. package/dist/dsl/monitor/create-monitor.js +76 -58
  56. package/dist/dsl/monitor/create-monitor.js.map +1 -1
  57. package/dist/dsl/monitor/dsl-failure-events.d.ts +42 -0
  58. package/dist/dsl/monitor/dsl-failure-events.d.ts.map +1 -0
  59. package/dist/dsl/monitor/dsl-failure-events.js +73 -0
  60. package/dist/dsl/monitor/dsl-failure-events.js.map +1 -0
  61. package/dist/dsl/monitor/process-one-position.d.ts +2 -1
  62. package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
  63. package/dist/dsl/monitor/process-one-position.js +130 -196
  64. package/dist/dsl/monitor/process-one-position.js.map +1 -1
  65. package/dist/dsl/plugin/index.d.ts +10 -0
  66. package/dist/dsl/plugin/index.d.ts.map +1 -1
  67. package/dist/dsl/plugin/index.js +48 -4
  68. package/dist/dsl/plugin/index.js.map +1 -1
  69. package/dist/dsl/plugin/options.d.ts +3 -0
  70. package/dist/dsl/plugin/options.d.ts.map +1 -1
  71. package/dist/health/types.d.ts +14 -0
  72. package/dist/health/types.d.ts.map +1 -1
  73. package/dist/health/types.js.map +1 -1
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +255 -77
  77. package/dist/index.js.map +1 -1
  78. package/dist/risk/risk-audit-log.d.ts +7 -0
  79. package/dist/risk/risk-audit-log.d.ts.map +1 -1
  80. package/dist/risk/risk-audit-log.js +48 -1
  81. package/dist/risk/risk-audit-log.js.map +1 -1
  82. package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts +2 -0
  83. package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts.map +1 -1
  84. package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js +24 -3
  85. package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js.map +1 -1
  86. package/dist/runtime/auto-update/coordinator.js +2 -2
  87. package/dist/runtime/auto-update/coordinator.js.map +1 -1
  88. package/dist/runtime/create-actions.d.ts.map +1 -1
  89. package/dist/runtime/create-actions.js +40 -15
  90. package/dist/runtime/create-actions.js.map +1 -1
  91. package/dist/runtime/create-runtime-context.d.ts +1 -1
  92. package/dist/runtime/create-runtime-context.d.ts.map +1 -1
  93. package/dist/runtime/create-scanner-module.d.ts +2 -1
  94. package/dist/runtime/create-scanner-module.d.ts.map +1 -1
  95. package/dist/runtime/create-scanner-module.js +2 -1
  96. package/dist/runtime/create-scanner-module.js.map +1 -1
  97. package/dist/runtime/domain-events.d.ts +43 -0
  98. package/dist/runtime/domain-events.d.ts.map +1 -0
  99. package/dist/runtime/domain-events.js +181 -0
  100. package/dist/runtime/domain-events.js.map +1 -0
  101. package/dist/runtime/lifecycle-events.d.ts +86 -0
  102. package/dist/runtime/lifecycle-events.d.ts.map +1 -0
  103. package/dist/runtime/lifecycle-events.js +200 -0
  104. package/dist/runtime/lifecycle-events.js.map +1 -0
  105. package/dist/runtime/notifications.js +2 -2
  106. package/dist/runtime/notifications.js.map +1 -1
  107. package/dist/{tracking → runtime}/position-id-registry.d.ts +14 -1
  108. package/dist/runtime/position-id-registry.d.ts.map +1 -0
  109. package/dist/{tracking → runtime}/position-id-registry.js +20 -3
  110. package/dist/runtime/position-id-registry.js.map +1 -0
  111. package/dist/runtime/run.d.ts +2 -4
  112. package/dist/runtime/run.d.ts.map +1 -1
  113. package/dist/runtime/run.js.map +1 -1
  114. package/dist/runtime/runtime-schema.d.ts +276 -588
  115. package/dist/runtime/runtime-schema.d.ts.map +1 -1
  116. package/dist/runtime/runtime-schema.js +8 -28
  117. package/dist/runtime/runtime-schema.js.map +1 -1
  118. package/dist/runtime/runtime.d.ts +23 -9
  119. package/dist/runtime/runtime.d.ts.map +1 -1
  120. package/dist/runtime/runtime.js +276 -248
  121. package/dist/runtime/runtime.js.map +1 -1
  122. package/dist/runtime/strategy-lifecycle.d.ts.map +1 -1
  123. package/dist/runtime/strategy-lifecycle.js +13 -1
  124. package/dist/runtime/strategy-lifecycle.js.map +1 -1
  125. package/dist/runtime/supervisor/long-running-supervisor.d.ts +3 -0
  126. package/dist/runtime/supervisor/long-running-supervisor.d.ts.map +1 -1
  127. package/dist/runtime/supervisor/long-running-supervisor.js +27 -53
  128. package/dist/runtime/supervisor/long-running-supervisor.js.map +1 -1
  129. package/dist/runtime-api/intake/intake-events.d.ts +44 -0
  130. package/dist/runtime-api/intake/intake-events.d.ts.map +1 -0
  131. package/dist/runtime-api/intake/intake-events.js +131 -0
  132. package/dist/runtime-api/intake/intake-events.js.map +1 -0
  133. package/dist/runtime-api/intake/scanner-launcher.d.ts +2 -0
  134. package/dist/runtime-api/intake/scanner-launcher.d.ts.map +1 -1
  135. package/dist/runtime-api/intake/scanner-launcher.js +58 -15
  136. package/dist/runtime-api/intake/scanner-launcher.js.map +1 -1
  137. package/dist/runtime-api/intake/scanner-registry.d.ts +3 -0
  138. package/dist/runtime-api/intake/scanner-registry.d.ts.map +1 -1
  139. package/dist/runtime-api/intake/scanner-registry.js +3 -0
  140. package/dist/runtime-api/intake/scanner-registry.js.map +1 -1
  141. package/dist/runtime-api/intake/supervisor-events.d.ts +61 -0
  142. package/dist/runtime-api/intake/supervisor-events.d.ts.map +1 -0
  143. package/dist/runtime-api/intake/supervisor-events.js +173 -0
  144. package/dist/runtime-api/intake/supervisor-events.js.map +1 -0
  145. package/dist/runtime-api/routes/signals.d.ts +1 -1
  146. package/dist/runtime-api/routes/signals.d.ts.map +1 -1
  147. package/dist/runtime-api/routes/signals.js +121 -35
  148. package/dist/runtime-api/routes/signals.js.map +1 -1
  149. package/dist/runtime-api/server.d.ts.map +1 -1
  150. package/dist/runtime-api/server.js +10 -1
  151. package/dist/runtime-api/server.js.map +1 -1
  152. package/dist/scanners/engine/data-providers.d.ts +3 -0
  153. package/dist/scanners/engine/data-providers.d.ts.map +1 -1
  154. package/dist/scanners/engine/data-providers.js.map +1 -1
  155. package/dist/scanners/engine/engine.d.ts +18 -0
  156. package/dist/scanners/engine/engine.d.ts.map +1 -1
  157. package/dist/scanners/engine/engine.js +96 -2
  158. package/dist/scanners/engine/engine.js.map +1 -1
  159. package/dist/scanners/engine/input-resolver.d.ts.map +1 -1
  160. package/dist/scanners/engine/input-resolver.js +9 -7
  161. package/dist/scanners/engine/input-resolver.js.map +1 -1
  162. package/dist/scanners/runtime-module.d.ts +3 -0
  163. package/dist/scanners/runtime-module.d.ts.map +1 -1
  164. package/dist/scanners/runtime-module.js +7 -0
  165. package/dist/scanners/runtime-module.js.map +1 -1
  166. package/dist/senpi/client.d.ts +10 -0
  167. package/dist/senpi/client.d.ts.map +1 -1
  168. package/dist/senpi/client.js +113 -46
  169. package/dist/senpi/client.js.map +1 -1
  170. package/dist/skills-manager/bootstrap.d.ts.map +1 -1
  171. package/dist/skills-manager/bootstrap.js +22 -33
  172. package/dist/skills-manager/bootstrap.js.map +1 -1
  173. package/dist/skills-manager/clone-groups.d.ts +20 -0
  174. package/dist/skills-manager/clone-groups.d.ts.map +1 -0
  175. package/dist/skills-manager/clone-groups.js +45 -0
  176. package/dist/skills-manager/clone-groups.js.map +1 -0
  177. package/dist/skills-manager/coordinator.d.ts.map +1 -1
  178. package/dist/skills-manager/coordinator.js +111 -75
  179. package/dist/skills-manager/coordinator.js.map +1 -1
  180. package/dist/skills-manager/manifest.d.ts +24 -0
  181. package/dist/skills-manager/manifest.d.ts.map +1 -1
  182. package/dist/skills-manager/manifest.js +23 -10
  183. package/dist/skills-manager/manifest.js.map +1 -1
  184. package/dist/skills-manager/skills-manifest.json +12 -7
  185. package/dist/skills-manager/types.d.ts +12 -0
  186. package/dist/skills-manager/types.d.ts.map +1 -1
  187. package/dist/state/state-events.d.ts +13 -0
  188. package/dist/state/state-events.d.ts.map +1 -0
  189. package/dist/state/state-events.js +22 -0
  190. package/dist/state/state-events.js.map +1 -0
  191. package/dist/state/state-manager.d.ts.map +1 -1
  192. package/dist/state/state-manager.js +14 -1
  193. package/dist/state/state-manager.js.map +1 -1
  194. package/dist/telemetry/attributes.d.ts +13 -0
  195. package/dist/telemetry/attributes.d.ts.map +1 -0
  196. package/dist/telemetry/attributes.js +22 -0
  197. package/dist/telemetry/attributes.js.map +1 -0
  198. package/dist/{tracking → telemetry}/context.d.ts +12 -5
  199. package/dist/telemetry/context.d.ts.map +1 -0
  200. package/dist/{tracking → telemetry}/context.js +4 -4
  201. package/dist/telemetry/context.js.map +1 -0
  202. package/dist/{recording/records.d.ts → telemetry/event-builders.d.ts} +145 -33
  203. package/dist/telemetry/event-builders.d.ts.map +1 -0
  204. package/dist/{recording/wiring/record-builders.js → telemetry/event-builders.js} +94 -40
  205. package/dist/telemetry/event-builders.js.map +1 -0
  206. package/dist/telemetry/event-store.d.ts +66 -0
  207. package/dist/telemetry/event-store.d.ts.map +1 -0
  208. package/dist/telemetry/event-store.js +202 -0
  209. package/dist/telemetry/event-store.js.map +1 -0
  210. package/dist/telemetry/identity.d.ts +72 -0
  211. package/dist/telemetry/identity.d.ts.map +1 -0
  212. package/dist/{recording/wiring → telemetry}/identity.js +6 -2
  213. package/dist/telemetry/identity.js.map +1 -0
  214. package/dist/telemetry/metrics.d.ts +169 -0
  215. package/dist/telemetry/metrics.d.ts.map +1 -0
  216. package/dist/telemetry/metrics.js +437 -0
  217. package/dist/telemetry/metrics.js.map +1 -0
  218. package/dist/telemetry/otel-sdk.d.ts +93 -0
  219. package/dist/telemetry/otel-sdk.d.ts.map +1 -0
  220. package/dist/telemetry/otel-sdk.js +297 -0
  221. package/dist/telemetry/otel-sdk.js.map +1 -0
  222. package/dist/telemetry/spans/constants.d.ts +12 -0
  223. package/dist/telemetry/spans/constants.d.ts.map +1 -0
  224. package/dist/telemetry/spans/constants.js +12 -0
  225. package/dist/telemetry/spans/constants.js.map +1 -0
  226. package/dist/telemetry/spans/gen-ai.d.ts +74 -0
  227. package/dist/telemetry/spans/gen-ai.d.ts.map +1 -0
  228. package/dist/telemetry/spans/gen-ai.js +339 -0
  229. package/dist/telemetry/spans/gen-ai.js.map +1 -0
  230. package/dist/telemetry/spans/index.d.ts +11 -0
  231. package/dist/telemetry/spans/index.d.ts.map +1 -0
  232. package/dist/telemetry/spans/index.js +11 -0
  233. package/dist/telemetry/spans/index.js.map +1 -0
  234. package/dist/{tracking → telemetry}/spans/redact-pii.d.ts +19 -21
  235. package/dist/telemetry/spans/redact-pii.d.ts.map +1 -0
  236. package/dist/{tracking → telemetry}/spans/redact-pii.js +35 -32
  237. package/dist/telemetry/spans/redact-pii.js.map +1 -0
  238. package/dist/telemetry/spans/sanitize-payload.d.ts.map +1 -0
  239. package/dist/telemetry/spans/sanitize-payload.js.map +1 -0
  240. package/dist/telemetry/spans/span-hooks.d.ts +18 -0
  241. package/dist/telemetry/spans/span-hooks.d.ts.map +1 -0
  242. package/dist/telemetry/spans/span-hooks.js +764 -0
  243. package/dist/telemetry/spans/span-hooks.js.map +1 -0
  244. package/dist/telemetry/tool-plane.d.ts +31 -0
  245. package/dist/telemetry/tool-plane.d.ts.map +1 -0
  246. package/dist/telemetry/tool-plane.js +70 -0
  247. package/dist/telemetry/tool-plane.js.map +1 -0
  248. package/dist/telemetry/trace-identity.d.ts +32 -0
  249. package/dist/telemetry/trace-identity.d.ts.map +1 -0
  250. package/dist/telemetry/trace-identity.js +62 -0
  251. package/dist/telemetry/trace-identity.js.map +1 -0
  252. package/dist/telemetry/tracing.d.ts +33 -0
  253. package/dist/telemetry/tracing.d.ts.map +1 -0
  254. package/dist/telemetry/tracing.js +70 -0
  255. package/dist/telemetry/tracing.js.map +1 -0
  256. package/dist/types/dsl/index.d.ts +8 -9
  257. package/dist/types/dsl/index.d.ts.map +1 -1
  258. package/dist/types/runtime.d.ts +1 -1
  259. package/dist/types/runtime.d.ts.map +1 -1
  260. package/dist/types/scanner.d.ts +2 -0
  261. package/dist/types/scanner.d.ts.map +1 -1
  262. package/dist/utils/event-catalog.d.ts +506 -0
  263. package/dist/utils/event-catalog.d.ts.map +1 -0
  264. package/dist/utils/event-catalog.js +142 -0
  265. package/dist/utils/event-catalog.js.map +1 -0
  266. package/dist/utils/logger.d.ts +63 -5
  267. package/dist/utils/logger.d.ts.map +1 -1
  268. package/dist/utils/logger.js +360 -27
  269. package/dist/utils/logger.js.map +1 -1
  270. package/dist/utils/wallet-address.d.ts +3 -0
  271. package/dist/utils/wallet-address.d.ts.map +1 -0
  272. package/dist/utils/wallet-address.js +17 -0
  273. package/dist/utils/wallet-address.js.map +1 -0
  274. package/openclaw.plugin.json +20 -6
  275. package/package.json +10 -2
  276. package/dist/actions/tracking-helpers.d.ts +0 -28
  277. package/dist/actions/tracking-helpers.d.ts.map +0 -1
  278. package/dist/actions/tracking-helpers.js +0 -93
  279. package/dist/actions/tracking-helpers.js.map +0 -1
  280. package/dist/recording/emitter.d.ts +0 -27
  281. package/dist/recording/emitter.d.ts.map +0 -1
  282. package/dist/recording/emitter.js +0 -2
  283. package/dist/recording/emitter.js.map +0 -1
  284. package/dist/recording/identity.d.ts +0 -34
  285. package/dist/recording/identity.d.ts.map +0 -1
  286. package/dist/recording/identity.js +0 -2
  287. package/dist/recording/identity.js.map +0 -1
  288. package/dist/recording/index.d.ts +0 -11
  289. package/dist/recording/index.d.ts.map +0 -1
  290. package/dist/recording/index.js +0 -2
  291. package/dist/recording/index.js.map +0 -1
  292. package/dist/recording/noop-emitter.d.ts +0 -23
  293. package/dist/recording/noop-emitter.d.ts.map +0 -1
  294. package/dist/recording/noop-emitter.js +0 -22
  295. package/dist/recording/noop-emitter.js.map +0 -1
  296. package/dist/recording/otel/attributes.d.ts +0 -35
  297. package/dist/recording/otel/attributes.d.ts.map +0 -1
  298. package/dist/recording/otel/attributes.js +0 -131
  299. package/dist/recording/otel/attributes.js.map +0 -1
  300. package/dist/recording/otel/constants.d.ts +0 -123
  301. package/dist/recording/otel/constants.d.ts.map +0 -1
  302. package/dist/recording/otel/constants.js +0 -172
  303. package/dist/recording/otel/constants.js.map +0 -1
  304. package/dist/recording/otel/ids.d.ts +0 -25
  305. package/dist/recording/otel/ids.d.ts.map +0 -1
  306. package/dist/recording/otel/ids.js +0 -37
  307. package/dist/recording/otel/ids.js.map +0 -1
  308. package/dist/recording/otel/index.d.ts +0 -13
  309. package/dist/recording/otel/index.d.ts.map +0 -1
  310. package/dist/recording/otel/index.js +0 -9
  311. package/dist/recording/otel/index.js.map +0 -1
  312. package/dist/recording/otel/mappers.d.ts +0 -100
  313. package/dist/recording/otel/mappers.d.ts.map +0 -1
  314. package/dist/recording/otel/mappers.js +0 -683
  315. package/dist/recording/otel/mappers.js.map +0 -1
  316. package/dist/recording/otel/otel-emitter.d.ts +0 -43
  317. package/dist/recording/otel/otel-emitter.d.ts.map +0 -1
  318. package/dist/recording/otel/otel-emitter.js +0 -99
  319. package/dist/recording/otel/otel-emitter.js.map +0 -1
  320. package/dist/recording/otel/redaction.d.ts +0 -47
  321. package/dist/recording/otel/redaction.d.ts.map +0 -1
  322. package/dist/recording/otel/redaction.js +0 -88
  323. package/dist/recording/otel/redaction.js.map +0 -1
  324. package/dist/recording/records.d.ts.map +0 -1
  325. package/dist/recording/records.js +0 -14
  326. package/dist/recording/records.js.map +0 -1
  327. package/dist/recording/transport/batcher.d.ts +0 -59
  328. package/dist/recording/transport/batcher.d.ts.map +0 -1
  329. package/dist/recording/transport/batcher.js +0 -234
  330. package/dist/recording/transport/batcher.js.map +0 -1
  331. package/dist/recording/transport/client.d.ts +0 -41
  332. package/dist/recording/transport/client.d.ts.map +0 -1
  333. package/dist/recording/transport/client.js +0 -69
  334. package/dist/recording/transport/client.js.map +0 -1
  335. package/dist/recording/transport/config.d.ts +0 -53
  336. package/dist/recording/transport/config.d.ts.map +0 -1
  337. package/dist/recording/transport/config.js +0 -41
  338. package/dist/recording/transport/config.js.map +0 -1
  339. package/dist/recording/transport/index.d.ts +0 -16
  340. package/dist/recording/transport/index.d.ts.map +0 -1
  341. package/dist/recording/transport/index.js +0 -12
  342. package/dist/recording/transport/index.js.map +0 -1
  343. package/dist/recording/transport/rows.d.ts +0 -88
  344. package/dist/recording/transport/rows.d.ts.map +0 -1
  345. package/dist/recording/transport/rows.js +0 -15
  346. package/dist/recording/transport/rows.js.map +0 -1
  347. package/dist/recording/wiring/emitter-factory.d.ts +0 -39
  348. package/dist/recording/wiring/emitter-factory.d.ts.map +0 -1
  349. package/dist/recording/wiring/emitter-factory.js +0 -62
  350. package/dist/recording/wiring/emitter-factory.js.map +0 -1
  351. package/dist/recording/wiring/identity.d.ts +0 -27
  352. package/dist/recording/wiring/identity.d.ts.map +0 -1
  353. package/dist/recording/wiring/identity.js.map +0 -1
  354. package/dist/recording/wiring/index.d.ts +0 -12
  355. package/dist/recording/wiring/index.d.ts.map +0 -1
  356. package/dist/recording/wiring/index.js +0 -9
  357. package/dist/recording/wiring/index.js.map +0 -1
  358. package/dist/recording/wiring/record-builders.d.ts +0 -107
  359. package/dist/recording/wiring/record-builders.d.ts.map +0 -1
  360. package/dist/recording/wiring/record-builders.js.map +0 -1
  361. package/dist/recording/wiring/subscriber.d.ts +0 -28
  362. package/dist/recording/wiring/subscriber.d.ts.map +0 -1
  363. package/dist/recording/wiring/subscriber.js +0 -173
  364. package/dist/recording/wiring/subscriber.js.map +0 -1
  365. package/dist/recording/wiring/values.d.ts +0 -19
  366. package/dist/recording/wiring/values.d.ts.map +0 -1
  367. package/dist/recording/wiring/values.js +0 -49
  368. package/dist/recording/wiring/values.js.map +0 -1
  369. package/dist/tracking/build-rehydrate-items.d.ts +0 -15
  370. package/dist/tracking/build-rehydrate-items.d.ts.map +0 -1
  371. package/dist/tracking/build-rehydrate-items.js +0 -19
  372. package/dist/tracking/build-rehydrate-items.js.map +0 -1
  373. package/dist/tracking/constants.d.ts +0 -24
  374. package/dist/tracking/constants.d.ts.map +0 -1
  375. package/dist/tracking/constants.js +0 -52
  376. package/dist/tracking/constants.js.map +0 -1
  377. package/dist/tracking/context.d.ts.map +0 -1
  378. package/dist/tracking/context.js.map +0 -1
  379. package/dist/tracking/index.d.ts +0 -16
  380. package/dist/tracking/index.d.ts.map +0 -1
  381. package/dist/tracking/index.js +0 -11
  382. package/dist/tracking/index.js.map +0 -1
  383. package/dist/tracking/plugin-event-tracker.d.ts +0 -13
  384. package/dist/tracking/plugin-event-tracker.d.ts.map +0 -1
  385. package/dist/tracking/plugin-event-tracker.js +0 -27
  386. package/dist/tracking/plugin-event-tracker.js.map +0 -1
  387. package/dist/tracking/position-id-registry.d.ts.map +0 -1
  388. package/dist/tracking/position-id-registry.js.map +0 -1
  389. package/dist/tracking/spans/constants.d.ts +0 -19
  390. package/dist/tracking/spans/constants.d.ts.map +0 -1
  391. package/dist/tracking/spans/constants.js +0 -31
  392. package/dist/tracking/spans/constants.js.map +0 -1
  393. package/dist/tracking/spans/fan-out-span-transport.d.ts +0 -22
  394. package/dist/tracking/spans/fan-out-span-transport.d.ts.map +0 -1
  395. package/dist/tracking/spans/fan-out-span-transport.js +0 -49
  396. package/dist/tracking/spans/fan-out-span-transport.js.map +0 -1
  397. package/dist/tracking/spans/index.d.ts +0 -13
  398. package/dist/tracking/spans/index.d.ts.map +0 -1
  399. package/dist/tracking/spans/index.js +0 -16
  400. package/dist/tracking/spans/index.js.map +0 -1
  401. package/dist/tracking/spans/otel/fit-row-budget.d.ts +0 -22
  402. package/dist/tracking/spans/otel/fit-row-budget.d.ts.map +0 -1
  403. package/dist/tracking/spans/otel/fit-row-budget.js +0 -91
  404. package/dist/tracking/spans/otel/fit-row-budget.js.map +0 -1
  405. package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts +0 -16
  406. package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts.map +0 -1
  407. package/dist/tracking/spans/otel/map-span-to-trace-row.js +0 -227
  408. package/dist/tracking/spans/otel/map-span-to-trace-row.js.map +0 -1
  409. package/dist/tracking/spans/otel/recording-span-transport.d.ts +0 -43
  410. package/dist/tracking/spans/otel/recording-span-transport.d.ts.map +0 -1
  411. package/dist/tracking/spans/otel/recording-span-transport.js +0 -67
  412. package/dist/tracking/spans/otel/recording-span-transport.js.map +0 -1
  413. package/dist/tracking/spans/otel/span-ids.d.ts +0 -22
  414. package/dist/tracking/spans/otel/span-ids.d.ts.map +0 -1
  415. package/dist/tracking/spans/otel/span-ids.js +0 -32
  416. package/dist/tracking/spans/otel/span-ids.js.map +0 -1
  417. package/dist/tracking/spans/plugin-span-tracker.d.ts +0 -9
  418. package/dist/tracking/spans/plugin-span-tracker.d.ts.map +0 -1
  419. package/dist/tracking/spans/plugin-span-tracker.js +0 -115
  420. package/dist/tracking/spans/plugin-span-tracker.js.map +0 -1
  421. package/dist/tracking/spans/redact-pii.d.ts.map +0 -1
  422. package/dist/tracking/spans/redact-pii.js.map +0 -1
  423. package/dist/tracking/spans/sanitize-payload.d.ts.map +0 -1
  424. package/dist/tracking/spans/sanitize-payload.js.map +0 -1
  425. package/dist/tracking/spans/span-hooks.d.ts +0 -28
  426. package/dist/tracking/spans/span-hooks.d.ts.map +0 -1
  427. package/dist/tracking/spans/span-hooks.js +0 -409
  428. package/dist/tracking/spans/span-hooks.js.map +0 -1
  429. package/dist/tracking/spans/span-tracker.d.ts +0 -133
  430. package/dist/tracking/spans/span-tracker.d.ts.map +0 -1
  431. package/dist/tracking/spans/span-tracker.js +0 -721
  432. package/dist/tracking/spans/span-tracker.js.map +0 -1
  433. package/dist/tracking/spans/span-transport.d.ts +0 -71
  434. package/dist/tracking/spans/span-transport.d.ts.map +0 -1
  435. package/dist/tracking/spans/span-transport.js +0 -240
  436. package/dist/tracking/spans/span-transport.js.map +0 -1
  437. package/dist/tracking/spans/types.d.ts +0 -101
  438. package/dist/tracking/spans/types.d.ts.map +0 -1
  439. package/dist/tracking/spans/types.js +0 -6
  440. package/dist/tracking/spans/types.js.map +0 -1
  441. package/dist/tracking/tracker.d.ts +0 -30
  442. package/dist/tracking/tracker.d.ts.map +0 -1
  443. package/dist/tracking/tracker.js +0 -66
  444. package/dist/tracking/tracker.js.map +0 -1
  445. package/dist/tracking/tracking-handler.d.ts +0 -12
  446. package/dist/tracking/tracking-handler.d.ts.map +0 -1
  447. package/dist/tracking/tracking-handler.js +0 -148
  448. package/dist/tracking/tracking-handler.js.map +0 -1
  449. package/dist/tracking/transport.d.ts +0 -35
  450. package/dist/tracking/transport.d.ts.map +0 -1
  451. package/dist/tracking/transport.js +0 -133
  452. package/dist/tracking/transport.js.map +0 -1
  453. package/dist/tracking/types.d.ts +0 -21
  454. package/dist/tracking/types.d.ts.map +0 -1
  455. package/dist/tracking/types.js +0 -6
  456. package/dist/tracking/types.js.map +0 -1
  457. /package/dist/{tracking → telemetry}/spans/sanitize-payload.d.ts +0 -0
  458. /package/dist/{tracking → telemetry}/spans/sanitize-payload.js +0 -0
@@ -1,683 +0,0 @@
1
- /**
2
- * The mapper: `RecordingRecord → TraceRow[] | LogRow[]`. Pure functions given their deps (identity,
3
- * an injected {@link IdGenerator}, scope) — that is what makes the golden `record → row` tests
4
- * deterministic. No `@opentelemetry/*`: this builds wire rows, it is not a span SDK.
5
- *
6
- * Per-record key maps and the trace-vs-log routing are pinned in {@link ./constants} and appended
7
- * to the Task 2 brief. Order within a row: redact (typed-field) → flatten → cap.
8
- */
9
- import { AttrBuilder, durationNs, msToNs } from "./attributes.js";
10
- import { EXCEPTION_EVENT_NAME, eventNameFor, ROUTING, severityFor, SPAN_NAME, TRACE_FLAGS_SAMPLED, } from "./constants.js";
11
- import { deterministicSpanId, deterministicTraceId } from "./ids.js";
12
- import { redactBody, redactRuntimeError, redactRuntimeState, redactSignalEvaluated, } from "./redaction.js";
13
- import { createLogger } from "../../utils/logger.js";
14
- const logger = createLogger("[recording][otel][mapper]");
15
- /**
16
- * Identity → `ResourceAttributes` (server-required `service.name` included) + the derived `address`.
17
- * Built once per emitter and shared (frozen) across every row it produces. `address` is derived from
18
- * `identity.strategyAddress` directly — not read back from the attribute map — so a future attr-budget
19
- * edge can never silently empty the ownership/keying field.
20
- */
21
- export function buildResource(identity) {
22
- const resourceAttributes = new AttrBuilder()
23
- .put("service.name", identity.service)
24
- .put("strategy.address", identity.strategyAddress)
25
- .put("recipe", identity.recipe)
26
- .put("recipe.version", identity.recipeVersion)
27
- .put("runtime", identity.runtime)
28
- .put("boot.id", identity.bootId)
29
- .put("config.hash", identity.configHash)
30
- .build();
31
- // Frozen: the single resource object is shared by reference across all of an emitter's rows, so
32
- // any accidental mutation would corrupt every row at once.
33
- Object.freeze(resourceAttributes);
34
- return Object.freeze({
35
- resourceAttributes,
36
- address: (identity.strategyAddress ?? "").toLowerCase(),
37
- });
38
- }
39
- function spanKindFor(type) {
40
- const route = ROUTING[type];
41
- return route.kind === "trace" ? route.spanKind : "Internal";
42
- }
43
- function makeTraceRow(deps, f) {
44
- return {
45
- Timestamp: msToNs(f.timestampMs),
46
- TraceId: f.traceId,
47
- SpanId: f.spanId,
48
- ParentSpanId: f.parentSpanId ?? "",
49
- TraceState: "",
50
- SpanName: f.spanName,
51
- SpanKind: f.spanKind,
52
- ServiceName: deps.identity.service,
53
- Duration: durationNs(f.startedAt, f.endedAt),
54
- StatusCode: f.statusCode,
55
- StatusMessage: f.statusMessage ?? "",
56
- SpanAttributes: f.attrs,
57
- ResourceAttributes: deps.resource.resourceAttributes,
58
- Events: f.events ?? [],
59
- ScopeName: deps.scopeName,
60
- ScopeVersion: deps.scopeVersion,
61
- TraceFlags: TRACE_FLAGS_SAMPLED,
62
- address: deps.resource.address,
63
- };
64
- }
65
- /**
66
- * Build the single log row for a record: severity/event-name are derived from the record and the
67
- * caller supplies the timestamp (`occurredAt` for the point-in-time records, `endedAt` for the
68
- * skipped scanner run), so each log mapper only adds its `Body` and flattened attrs. Each log gets
69
- * fresh, self-rooted ids (minimal per-record correlation; cross-record threading is deferred).
70
- */
71
- function logRowFor(deps, record, timestampMs, body, attrs) {
72
- const severity = severityFor(record);
73
- return {
74
- Timestamp: msToNs(timestampMs),
75
- TraceId: deps.ids.traceId(),
76
- SpanId: deps.ids.spanId(),
77
- TraceFlags: TRACE_FLAGS_SAMPLED,
78
- SeverityText: severity.text,
79
- SeverityNumber: severity.number,
80
- ServiceName: deps.identity.service,
81
- Body: body,
82
- ResourceAttributes: deps.resource.resourceAttributes,
83
- ScopeName: deps.scopeName,
84
- ScopeVersion: deps.scopeVersion,
85
- LogAttributes: attrs,
86
- EventName: eventNameFor(record),
87
- address: deps.resource.address,
88
- };
89
- }
90
- /**
91
- * Clamp a child window into its parent: never negative, never outside `[lo, hi]`; a window
92
- * entirely before the parent pins to its start.
93
- */
94
- function clampWindow(start, end, lo, hi) {
95
- if (start < lo)
96
- start = lo;
97
- if (end > hi)
98
- end = hi;
99
- if (end < lo)
100
- end = lo; // window entirely before the parent → pin to its start
101
- if (end < start)
102
- start = end;
103
- return { start, end };
104
- }
105
- /** OTEL `exception` span event — the idiomatic home for the error-grouping key on a span. */
106
- function exceptionEvent(timestampMs, errorName, message) {
107
- const attrs = new AttrBuilder()
108
- .put("exception.type", errorName)
109
- .put("exception.message", message)
110
- .build();
111
- return { Timestamp: msToNs(timestampMs), Name: EXCEPTION_EVENT_NAME, Attributes: attrs };
112
- }
113
- // ── scanner_run → one span (complete/error) or one skip log ───────────────────
114
- /** Shared `scanner.*` attrs — identical keys whether the run routes to a span or to a skip log. */
115
- function scannerRunAttrs(record) {
116
- // Individual `signals[]` are omitted here — counts + summary capture the run's shape, and
117
- // per-signal detail lives on `signal_evaluated` children (avoids re-flattening signal meta).
118
- return new AttrBuilder()
119
- .put("scanner.id", record.scannerId)
120
- .put("scan.run_id", record.runId)
121
- .put("scanner.outcome", record.outcome)
122
- .put("scanner.status_detail", record.statusDetail)
123
- .put("scanner.scanned_count", record.scannedCount)
124
- .put("scanner.actionable_count", record.actionableCount)
125
- .put("scanner.signal_count", record.signalCount)
126
- .put("scanner.reason", record.reason)
127
- .put("scanner.error", record.error)
128
- .put("scanner.error_name", record.errorName)
129
- .putBag("scanner.summary", record.summary)
130
- .build();
131
- }
132
- /** A run that actually ran (`complete`/`error`) → one span. Skips go to {@link mapScannerRunSkipped}. */
133
- export function mapScannerRun(record, deps) {
134
- const attrs = scannerRunAttrs(record);
135
- const isError = record.outcome === "error";
136
- // Deterministic ids from the run id thread scan → pass into one trace; absent (older payloads)
137
- // → fresh self-rooted ids as before.
138
- return [
139
- makeTraceRow(deps, {
140
- timestampMs: record.startedAt,
141
- traceId: record.runId !== undefined ? deterministicTraceId(record.runId) : deps.ids.traceId(),
142
- spanId: record.runId !== undefined ? deterministicSpanId(record.runId) : deps.ids.spanId(),
143
- spanName: SPAN_NAME.scannerRun,
144
- spanKind: spanKindFor("scanner_run"),
145
- startedAt: record.startedAt,
146
- endedAt: record.endedAt,
147
- statusCode: isError ? "Error" : "Ok",
148
- statusMessage: isError ? (record.error ?? "") : "",
149
- attrs,
150
- events: isError ? [exceptionEvent(record.endedAt, record.errorName, record.error)] : [],
151
- }),
152
- ];
153
- }
154
- /**
155
- * The {@link ROUTING} exception: a skipped run (`outcome === "skipped"` — engine statuses
156
- * skipped/disabled/halted) is a discrete "didn't run" fact, not work, so it becomes an INFO log
157
- * (`scanner_run.skipped`) instead of a zero-duration span. Same `scanner.*` attrs as the span
158
- * (counts are simply absent on skip payloads); `Timestamp` from `endedAt` (the builder synthesizes
159
- * `startedAt = endedAt` for skips — only the end is observed).
160
- */
161
- export function mapScannerRunSkipped(record, deps) {
162
- const reason = record.reason ? `: ${record.reason}` : "";
163
- const body = `scanner skipped ${record.scannerId}${reason}`;
164
- return [logRowFor(deps, record, record.endedAt, body, scannerRunAttrs(record))];
165
- }
166
- // ── signal_evaluated → pass-span root + llm.decision child + one child span per evaluation ──
167
- export function mapSignalEvaluated(record, deps) {
168
- const red = redactSignalEvaluated(record);
169
- // Deterministic ids from the scan run id thread the pass under its scanner.run span (same
170
- // TraceId, ParentSpanId = the scanner.run SpanId); absent runId → fresh self-rooted ids as
171
- // before. Intentional: the pass child starts after its parent ends (queue wait, visible as the
172
- // gap) — never "fixed" by faking timestamps.
173
- const traceId = red.runId !== undefined ? deterministicTraceId(red.runId) : deps.ids.traceId();
174
- const rootSpanId = deps.ids.spanId();
175
- const parentSpanId = red.runId !== undefined ? deterministicSpanId(red.runId) : undefined;
176
- const errored = red.evaluations.filter((ev) => ev.outcome.result === "error");
177
- const rootAttrs = new AttrBuilder()
178
- .put("scanner.id", red.scannerId)
179
- .put("scan.run_id", red.runId)
180
- .put("signal.evaluation_count", red.evaluations.length)
181
- .put("signal.error_count", errored.length);
182
- const rows = [
183
- makeTraceRow(deps, {
184
- timestampMs: red.startedAt,
185
- traceId,
186
- spanId: rootSpanId,
187
- parentSpanId,
188
- spanName: SPAN_NAME.signalPass,
189
- spanKind: spanKindFor("signal_evaluated"),
190
- startedAt: red.startedAt,
191
- endedAt: red.endedAt,
192
- // Status propagates: any errored evaluation child fails the pass root (filterable even
193
- // when the trace root is the always-Ok scanner.run span).
194
- statusCode: errored.length > 0 ? "Error" : "Ok",
195
- statusMessage: errored.length > 0 ? (errored[0].outcome.error ?? "") : "",
196
- attrs: rootAttrs.build(),
197
- }),
198
- ];
199
- // The decision phase as its own child span (carries the decision.* attrs). Mapped defensively,
200
- // like the evaluation children: a bad decision must not sink the pass span or its siblings.
201
- if (red.decision) {
202
- try {
203
- rows.push(mapLlmDecisionChild(red.decision, deps, traceId, rootSpanId, red.startedAt, red.endedAt));
204
- }
205
- catch (err) {
206
- logger.warn("dropping llm.decision child (mapping error)", {
207
- err: err instanceof Error ? err.message : String(err),
208
- });
209
- }
210
- }
211
- // One child span per evaluation, sharing the root's TraceId (intra-record parenting). Each child
212
- // is mapped defensively: a single bad evaluation must not sink the pass span or its siblings.
213
- for (const ev of red.evaluations) {
214
- try {
215
- rows.push(mapEvaluationChild(ev, deps, traceId, rootSpanId, red.startedAt, red.endedAt));
216
- }
217
- catch (err) {
218
- logger.warn("dropping signal evaluation child (mapping error)", {
219
- err: err instanceof Error ? err.message : String(err),
220
- });
221
- }
222
- }
223
- return rows;
224
- }
225
- /**
226
- * The `llm.decision` child span: the pass's decision phase, window
227
- * `[decision.endedAt − durationMs, decision.endedAt]` — the gap after the pass start is context
228
- * building, deliberately visible. Defensive fallback when `endedAt` is absent (older payloads):
229
- * start at the pass start. The window is then clamped into the pass (`start` up to the pass start,
230
- * `end` down to the pass end, and `start = end` when that inverts) so it is never negative and
231
- * never outside the pass.
232
- */
233
- function mapLlmDecisionChild(d, deps, traceId, parentSpanId, passStartedAt, passEndedAt) {
234
- const attrs = new AttrBuilder()
235
- .put("decision.execute", d.execute)
236
- .put("decision.action_type", d.actionType)
237
- .put("decision.action_name", d.actionName)
238
- .put("decision.mode", d.mode)
239
- .put("decision.confidence", d.confidence)
240
- .put("decision.confidence_threshold", d.confidenceThreshold)
241
- .put("decision.reasoning", d.reasoning) // kept (length-capped) — high-value agent rationale
242
- .put("decision.model", d.model)
243
- .put("decision.tokens_used", d.tokensUsed)
244
- .put("decision.duration_ms", d.durationMs)
245
- // The record no longer carries the raw LLM payload (dropped when the pass was single-sourced
246
- // from `_decisionMeta`); its bounded content lands on the per-signal child spans.
247
- .build();
248
- const durationMs = d.durationMs ?? 0;
249
- const rawEnd = d.endedAt ?? passStartedAt + durationMs;
250
- const { start, end } = clampWindow(rawEnd - durationMs, rawEnd, passStartedAt, passEndedAt);
251
- return makeTraceRow(deps, {
252
- timestampMs: start,
253
- traceId,
254
- spanId: deps.ids.spanId(),
255
- parentSpanId,
256
- spanName: SPAN_NAME.llmDecision,
257
- spanKind: "Internal",
258
- startedAt: start,
259
- endedAt: end,
260
- statusCode: "Ok",
261
- attrs,
262
- });
263
- }
264
- function mapEvaluationChild(ev, deps, traceId, parentSpanId,
265
- // The action loop stamps a real per-signal window (`startedAt`/`endedAt`) on each result entry;
266
- // when present it is the child's measured extent, clamped into the pass like the llm.decision
267
- // child. Absent (older payloads) → point-in-time at the pass start, Duration 0, as before.
268
- passStartedAt, passEndedAt) {
269
- const { signal, outcome } = ev;
270
- // position.id is the flat cross-record group-by key (V2 read layer); TraceId stays
271
- // per-pass — never derived from positionId.
272
- const attrs = new AttrBuilder()
273
- .put("position.id", outcome.positionId)
274
- .put("signal.type", signal.signalType)
275
- .put("signal.asset", signal.asset)
276
- .put("signal.direction", signal.direction)
277
- .put("signal.score", signal.score)
278
- .put("signal.timestamp", signal.timestamp)
279
- .putFactors("signal.factor", signal.factors)
280
- // signal.meta is dropped by redaction upstream.
281
- .put("outcome.result", outcome.result)
282
- .put("outcome.summary", outcome.summary)
283
- .put("outcome.reason_code", outcome.reasonCode)
284
- .put("outcome.reason", outcome.reason)
285
- .put("outcome.error", outcome.error)
286
- .put("outcome.error_name", outcome.errorName)
287
- .put("outcome.leverage", outcome.leverage)
288
- .put("outcome.margin_amount", outcome.marginAmount)
289
- .put("outcome.notional_value", outcome.notionalValue)
290
- .put("outcome.order_id", outcome.orderId)
291
- .put("outcome.entry_price", outcome.entryPrice)
292
- .put("outcome.size", outcome.size)
293
- .put("outcome.filled", outcome.filled)
294
- .put("outcome.execution_as_maker", outcome.executionAsMaker)
295
- .put("outcome.required_margin_amount", outcome.requiredMarginAmount)
296
- .put("outcome.available_margin_amount", outcome.availableMarginAmount)
297
- .build();
298
- const hasWindow = ev.startedAt !== undefined && ev.endedAt !== undefined;
299
- const { start, end } = clampWindow(hasWindow ? ev.startedAt : passStartedAt, hasWindow ? ev.endedAt : passStartedAt, passStartedAt, passEndedAt);
300
- const isError = outcome.result === "error";
301
- return makeTraceRow(deps, {
302
- timestampMs: start,
303
- traceId,
304
- spanId: deps.ids.spanId(),
305
- parentSpanId,
306
- spanName: SPAN_NAME.signalEvaluation,
307
- spanKind: spanKindFor("signal_evaluated"),
308
- startedAt: start,
309
- endedAt: end,
310
- statusCode: isError ? "Error" : "Ok",
311
- statusMessage: isError ? (outcome.error ?? "") : "",
312
- attrs,
313
- events: isError ? [exceptionEvent(end, outcome.errorName, outcome.error)] : [],
314
- });
315
- }
316
- // ── position_lifecycle → one log ─────────────────────────────────────────────────
317
- export function mapPositionLifecycle(record, deps) {
318
- // No bag/PII to scrub here: `reasoning` is kept (length-capped) as high-value agent rationale.
319
- const attrs = new AttrBuilder()
320
- .put("position.id", record.positionId)
321
- .put("position.event", record.event)
322
- .put("position.asset", record.asset)
323
- .put("position.dex", record.dex)
324
- .put("position.direction", record.direction)
325
- .put("position.entry_price", record.entryPrice)
326
- .put("position.size", record.size)
327
- .put("position.leverage", record.leverage)
328
- .put("position.leverage_type", record.leverageType)
329
- .put("position.margin", record.margin)
330
- .put("position.unrealized_pnl", record.unrealizedPnl)
331
- .put("position.roe", record.roe)
332
- .put("position.liquidation_price", record.liquidationPrice)
333
- .put("position.reason", record.reason)
334
- .put("position.close_reason", record.closeReason)
335
- .put("position.closed_price", record.closedPrice)
336
- .put("position.closed_size", record.closedSize)
337
- .put("position.execution_as_maker", record.executionAsMaker)
338
- .put("position.previous_entry_price", record.previousEntryPrice)
339
- .put("position.previous_size", record.previousSize)
340
- .put("position.size_delta", record.sizeDelta)
341
- .put("position.new_asset", record.newAsset)
342
- .put("position.order_id", record.orderId)
343
- .put("position.order_type", record.orderType)
344
- .put("position.margin_amount", record.marginAmount)
345
- .put("position.filled", record.filled)
346
- .put("position.reasoning", record.reasoning) // kept (length-capped)
347
- .put("position.reconciliation_source", record.reconciliationSource) // opened only; absent elsewhere
348
- .build();
349
- const dir = record.direction ? ` ${record.direction}` : "";
350
- return [logRowFor(deps, record, record.occurredAt, `position ${record.event} ${record.asset}${dir}`, attrs)];
351
- }
352
- // ── dsl_transition → one log ─────────────────────────────────────────────────────
353
- export function mapDslTransition(record, deps) {
354
- const attrs = new AttrBuilder()
355
- .put("position.id", record.positionId)
356
- .put("dsl.transition", record.transition)
357
- .put("dsl.asset", record.asset)
358
- .put("dsl.dex", record.dex)
359
- .put("dsl.trigger_reason", record.triggerReason)
360
- .put("dsl.preset", record.preset)
361
- .putJson("dsl.tiers", record.tiers)
362
- .put("dsl.direction", record.direction)
363
- .put("dsl.entry_price", record.entryPrice)
364
- .put("dsl.leverage", record.leverage)
365
- .put("dsl.margin", record.margin)
366
- .put("dsl.size", record.size)
367
- .put("dsl.floor_price", record.floorPrice)
368
- .put("dsl.new_floor_price", record.newFloorPrice)
369
- .put("dsl.phase", record.phase)
370
- .put("dsl.tier_index", record.tierIndex)
371
- .put("dsl.lock_hw_pct", record.lockHwPct)
372
- .put("dsl.trigger_pct", record.triggerPct)
373
- .put("dsl.locked_profit_pct", record.lockedProfitPct)
374
- .put("dsl.new_sl_price", record.newSLPrice)
375
- .put("dsl.sl_order_id", record.slOrderId)
376
- .put("dsl.reason", record.reason)
377
- .put("dsl.close_reason", record.closeReason)
378
- .put("dsl.created_at", record.createdAt)
379
- .put("dsl.current_roe", record.currentROE)
380
- .put("dsl.high_water_roe", record.highWaterRoe)
381
- .put("dsl.high_water_price", record.highWaterPrice)
382
- .put("dsl.peak_roe", record.peakROE)
383
- .put("dsl.last_price", record.lastPrice)
384
- .put("dsl.attempt", record.attempt)
385
- .putJson("dsl.updated", record.updated)
386
- .put("dsl.backend_dsl_position_id", record.backendDslPositionId)
387
- .build();
388
- return [logRowFor(deps, record, record.occurredAt, `dsl ${record.transition} ${record.asset}`, attrs)];
389
- }
390
- // ── dsl_tick → one span per work unit (deterministic-id threaded tick family) ─────
391
- /**
392
- * Maps one DSL-tick work unit to its span. No buffering or pairing: each record maps
393
- * independently, and the deterministic ids derived from `bootId:tickId` (and
394
- * `bootId:tickId:positionKey`) thread the units into one trace — root `dsl.tick`, `dsl.position`
395
- * children, and `dsl.close_attempt`/`dsl.sl_update` under their position. `tick.id` rides every
396
- * span (the cross-store join key); `position.id` rides the position-grain spans. A child unit
397
- * missing its `positionKey` (defensive) parents to the tick root so the row still joins the trace.
398
- */
399
- export function mapDslTick(record, deps) {
400
- // The seeds are scoped by the emitter's bootId: tickId is a ms-resolution wall-clock string, so
401
- // two runtimes ticking in the same millisecond (or a restart re-deriving the same ms) would
402
- // otherwise collide and merge unrelated tick families into one trace with duplicate span ids.
403
- // The `tick.id` ATTRIBUTE stays the raw tickId — it is the join key to the monitor's logs.
404
- const tickSeed = `${deps.identity.bootId}:${record.tickId}`;
405
- const traceId = deterministicTraceId(tickSeed);
406
- const rootSpanId = deterministicSpanId(tickSeed);
407
- if (record.unit === "tick") {
408
- const attrs = new AttrBuilder()
409
- .put("tick.id", record.tickId)
410
- .put("dsl.strategy_count", record.strategyCount)
411
- .put("dsl.active_position_count", record.activePositionCount)
412
- .put("dsl.positions_processed", record.positionsProcessed)
413
- .build();
414
- const rows = [
415
- makeTraceRow(deps, {
416
- timestampMs: record.startedAt,
417
- traceId,
418
- spanId: rootSpanId,
419
- spanName: SPAN_NAME.dslTick,
420
- spanKind: spanKindFor("dsl_tick"),
421
- startedAt: record.startedAt,
422
- endedAt: record.endedAt,
423
- statusCode: "Ok",
424
- attrs,
425
- }),
426
- ];
427
- // The batched price fetch as an intra-record child of the tick root — only when both stamps
428
- // were observed (a half window is fabricated extent), clamped into the tick window like the
429
- // other intra-record children.
430
- if (record.pricesStartedAt !== undefined && record.pricesEndedAt !== undefined) {
431
- const { start, end } = clampWindow(record.pricesStartedAt, record.pricesEndedAt, record.startedAt, record.endedAt);
432
- rows.push(makeTraceRow(deps, {
433
- timestampMs: start,
434
- traceId,
435
- spanId: deps.ids.spanId(),
436
- parentSpanId: rootSpanId,
437
- spanName: SPAN_NAME.dslPrices,
438
- spanKind: spanKindFor("dsl_tick"),
439
- startedAt: start,
440
- endedAt: end,
441
- statusCode: "Ok",
442
- attrs: new AttrBuilder().put("tick.id", record.tickId).build(),
443
- }));
444
- }
445
- return rows;
446
- }
447
- // The per-position span id is seeded from `bootId:tickId:positionKey`, so the position span and
448
- // its close/SL children agree on it without any pairing state.
449
- const positionSpanId = record.positionKey !== undefined
450
- ? deterministicSpanId(`${tickSeed}:${record.positionKey}`)
451
- : undefined;
452
- if (record.unit === "position") {
453
- const attrs = new AttrBuilder()
454
- .put("tick.id", record.tickId)
455
- .put("position.id", record.positionId)
456
- .put("dsl.asset", record.asset)
457
- .put("dsl.dex", record.dex)
458
- .build();
459
- return [
460
- makeTraceRow(deps, {
461
- timestampMs: record.startedAt,
462
- traceId,
463
- spanId: positionSpanId ?? deps.ids.spanId(),
464
- parentSpanId: rootSpanId,
465
- spanName: SPAN_NAME.dslPosition,
466
- spanKind: spanKindFor("dsl_tick"),
467
- startedAt: record.startedAt,
468
- endedAt: record.endedAt,
469
- statusCode: "Ok",
470
- attrs,
471
- }),
472
- ];
473
- }
474
- // close_attempt / sl_update — the venue calls, nested under their position span.
475
- const isError = record.outcome === "error";
476
- const attrs = new AttrBuilder()
477
- .put("tick.id", record.tickId)
478
- .put("position.id", record.positionId)
479
- .put("dsl.asset", record.asset)
480
- .put("dsl.dex", record.dex)
481
- .put("dsl.error", record.error);
482
- if (record.unit === "close_attempt") {
483
- attrs.put("dsl.close_reason", record.closeReason).put("dsl.attempt", record.attempt);
484
- }
485
- else {
486
- attrs
487
- .put("dsl.new_sl_price", record.newSLPrice)
488
- .put("dsl.sl_order_id", record.slOrderId)
489
- .put("dsl.sync_reason", record.syncReason);
490
- }
491
- return [
492
- makeTraceRow(deps, {
493
- timestampMs: record.startedAt,
494
- traceId,
495
- spanId: deps.ids.spanId(),
496
- // Defensive fallback: no positionKey → parent to the tick root so the row still joins.
497
- parentSpanId: positionSpanId ?? rootSpanId,
498
- spanName: record.unit === "close_attempt" ? SPAN_NAME.dslCloseAttempt : SPAN_NAME.dslSlUpdate,
499
- spanKind: spanKindFor("dsl_tick"),
500
- startedAt: record.startedAt,
501
- endedAt: record.endedAt,
502
- statusCode: isError ? "Error" : "Ok",
503
- statusMessage: isError ? (record.error ?? "") : "",
504
- attrs: attrs.build(),
505
- // No error class name at the emit site — exception.type is omitted, message kept.
506
- events: isError ? [exceptionEvent(record.endedAt, undefined, record.error)] : [],
507
- }),
508
- ];
509
- }
510
- // ── decision.made → one log (Task 8) ──────────────────────────────────────────────
511
- /**
512
- * The pass's judgment as a discrete log. Attributes are the queryable scalars; the **Body is the
513
- * LLM reasoning prose, uncapped** (the catalog calls for full reasoning — no per-value cap applied
514
- * to it) and routed through {@link redactBody}, which passes a flat string through verbatim (a
515
- * string has no keys to scrub) while still keeping the redaction seam over both Bodies. When
516
- * reasoning is absent, a short templated Body stands in. Market-context keys are reserved and
517
- * absent in 8a (see the brief's impl notes).
518
- */
519
- export function mapDecisionMade(record, deps) {
520
- const attrs = new AttrBuilder()
521
- .put("decision.mode", record.mode)
522
- .put("decision.by_llm", record.byLlm)
523
- .put("decision.model", record.model)
524
- .put("decision.tokens_used", record.tokensUsed)
525
- .put("decision.confidence", record.confidence)
526
- .put("decision.confidence_threshold", record.confidenceThreshold)
527
- .put("decision.duration_ms", record.durationMs)
528
- .put("decision.action_intent", record.actionIntent)
529
- .put("decision.funding_regime", record.fundingRegime)
530
- .put("decision.market_regime", record.marketRegime)
531
- .put("decision.mark_price", record.markPrice)
532
- .build();
533
- // Body = the reasoning prose (uncapped), through the Body redaction seam. A string has no
534
- // sensitive keys, so it survives verbatim; the short fallback keeps a non-empty, useful Body.
535
- const reasoning = record.reasoning ? String(redactBody(record.reasoning)) : "";
536
- const body = reasoning || `decision ${record.actionIntent} (${record.mode ?? "none"})`;
537
- return [logRowFor(deps, record, record.occurredAt, body, attrs)];
538
- }
539
- // ── signal.outcome → one log (Task 8) ──────────────────────────────────────────────
540
- /**
541
- * One considered signal's disposition as a discrete log. Attributes are the queryable raw-signal
542
- * scalars, factors, disposition, and sizing; the **Body is the raw scanner evidence**
543
- * (`JSON.stringify(redactBody(rawSignal))`) — the variable-shaped payload whose arbitrary scanner
544
- * `meta` Task 2 dropped from attributes and Task 8 keeps here, scrubbed by key name. Empty Body when
545
- * there is no rawSignal.
546
- */
547
- export function mapSignalOutcome(record, deps) {
548
- const attrs = new AttrBuilder()
549
- .put("scanner.id", record.scannerId)
550
- .put("signal.type", record.signalType)
551
- .put("signal.asset", record.asset)
552
- .put("signal.direction", record.direction)
553
- .put("signal.score", record.score)
554
- .put("signal.timestamp", record.signalTs)
555
- .putFactors("signal.factor", record.factors)
556
- .put("outcome.result", record.result)
557
- .put("outcome.reason_code", record.reasonCode)
558
- .put("position.id", record.positionId)
559
- .put("outcome.margin_amount", record.marginAmount)
560
- .put("outcome.leverage", record.leverage)
561
- .put("outcome.notional_value", record.notionalValue)
562
- .put("outcome.size", record.size)
563
- .put("outcome.margin_source", record.marginSource)
564
- .put("outcome.order_id", record.orderId)
565
- .put("outcome.error_name", record.errorName)
566
- .build();
567
- const body = record.rawSignal ? JSON.stringify(redactBody(record.rawSignal)) : "";
568
- return [logRowFor(deps, record, record.occurredAt, body, attrs)];
569
- }
570
- // ── scanner.summary → one log (Task 8 anti-spam funnel) ─────────────────────────────
571
- /**
572
- * One scan's funnel roll-up as a discrete log — ONE row, never one per drop. Attributes are the
573
- * queryable aggregate surface (counts, per-reason counts via `putBag`, the survivors' assets as a
574
- * single JSON array). The **Body is the dropped-candidate array**
575
- * (`JSON.stringify(redactBody(droppedCandidates))`) — variable-shaped scanner data, scrubbed by
576
- * key name, read only after the row is selected. Empty Body when nothing was dropped.
577
- */
578
- export function mapScannerSummary(record, deps) {
579
- const attrs = new AttrBuilder()
580
- .put("scanner.id", record.scannerId)
581
- .put("scanner.scanned_count", record.scannedCount)
582
- .put("scanner.passed_count", record.passedCount)
583
- .put("scanner.dropped_count", record.droppedCount)
584
- .putBag("scanner.dropped_by_reason", record.droppedByReason)
585
- .putJson("scanner.passed_assets", record.passedAssets)
586
- .build();
587
- const dropped = record.droppedCandidates;
588
- const body = dropped && dropped.length > 0 ? JSON.stringify(redactBody(dropped)) : "";
589
- return [
590
- logRowFor(deps, record, record.occurredAt, body, attrs),
591
- ];
592
- }
593
- // ── dsl.close_attempt → one log (Task 8) ────────────────────────────────────────────
594
- /**
595
- * One DSL exit attempt as a discrete log (the second consumer of `tracking.dsl_close_attempt`,
596
- * alongside the tick trace). No Body — the attempt is fully described by its scalars. No
597
- * `error_name`: only `String(e)` is available at the producer emit site.
598
- */
599
- export function mapDslCloseAttempt(record, deps) {
600
- const attrs = new AttrBuilder()
601
- .put("position.id", record.positionId)
602
- .put("dsl.asset", record.asset)
603
- .put("dsl.dex", record.dex)
604
- .put("dsl.reason", record.reason)
605
- .put("dsl.attempt", record.attempt)
606
- .put("dsl.result", record.result)
607
- .build();
608
- return [logRowFor(deps, record, record.occurredAt, `dsl close_attempt ${record.asset ?? ""} ${record.result}`, attrs)];
609
- }
610
- /**
611
- * One order-execution event as a discrete log under the `order.*` namespace — the execution
612
- * granularity `position_lifecycle` can't carry. Null/undefined attrs are omitted by the builder, so
613
- * each event subtype naturally carries only its own fields (placed: order/size; filled: fill; failed:
614
- * reason/error_name). `position.id` is the cross-flow join key (coexists with `outcome.order_id` /
615
- * `position.order_id`; 8b coalesces). **Body** = the venue raw response on `failed`
616
- * (`JSON.stringify(redactBody(error))`); `placed`/`filled` carry no Body (short templated message).
617
- */
618
- export function mapOrderEvent(record, deps) {
619
- const attrs = new AttrBuilder()
620
- .put("order.id", record.orderId)
621
- .put("order.type", record.orderType)
622
- .put("order.asset", record.asset)
623
- .put("order.direction", record.direction)
624
- .put("order.size", record.size)
625
- .put("order.limit_price", record.limitPrice)
626
- .put("order.reduce_only", record.reduceOnly)
627
- .put("order.fill_price", record.fillPrice)
628
- .put("order.fill_size", record.fillSize)
629
- .put("order.execution_as_maker", record.executionAsMaker)
630
- .put("order.fees", record.fees)
631
- .put("order.partial", record.partial)
632
- .put("order.reason", record.reason)
633
- .put("order.error_name", record.errorName)
634
- .put("position.id", record.positionId)
635
- .build();
636
- const body = record.event === "failed" && record.error ? JSON.stringify(redactBody(record.error)) : "";
637
- const dir = record.direction ? ` ${record.direction}` : "";
638
- const fallback = `order ${record.event} ${record.asset}${dir}`;
639
- return [logRowFor(deps, record, record.occurredAt, body || fallback, attrs)];
640
- }
641
- // ── runtime_error → one log ───────────────────────────────────────────────────────
642
- export function mapRuntimeError(record, deps) {
643
- const red = redactRuntimeError(record);
644
- const attrs = new AttrBuilder()
645
- .put("runtime.phase", red.phase)
646
- .put("runtime.message", red.message)
647
- .put("runtime.error_name", red.errorName)
648
- .put("runtime.asset", red.asset)
649
- .put("runtime.scanner_id", red.scannerId)
650
- .put("scan.run_id", red.runId)
651
- .put("runtime.stack", red.stack)
652
- .build();
653
- return [logRowFor(deps, red, red.occurredAt, `${red.phase}: ${red.message}`, attrs)];
654
- }
655
- // ── runtime_lifecycle → one log ───────────────────────────────────────────────────
656
- export function mapRuntimeLifecycle(record, deps) {
657
- const attrs = new AttrBuilder()
658
- .put("runtime.phase", record.phase)
659
- .put("runtime.version", record.runtimeVersion)
660
- .put("runtime.has_dsl", record.hasDsl)
661
- .put("runtime.scanner_count", record.scannerCount)
662
- .put("runtime.action_count", record.actionCount)
663
- .put("runtime.uptime_ms", record.uptimeMs)
664
- // Unresolved config blob: single JSON key, size-capped, never flattened (no secrets to scrub).
665
- .putConfig("runtime.config", record.config)
666
- .build();
667
- return [logRowFor(deps, record, record.occurredAt, `runtime ${record.phase}`, attrs)];
668
- }
669
- // ── runtime_state → one log ───────────────────────────────────────────────────────
670
- export function mapRuntimeState(record, deps) {
671
- const red = redactRuntimeState(record);
672
- const attrs = new AttrBuilder()
673
- .put("runtime.phase", red.phase)
674
- .put("runtime.gate_id", red.gateId)
675
- .put("runtime.gate_name", red.gateName)
676
- .put("runtime.source", red.source)
677
- .put("runtime.reason", red.reason)
678
- // runtime.metrics dropped by redaction upstream.
679
- .build();
680
- // `|| gateId` (not `??`): an empty-string gateName must still fall back to the stable id.
681
- return [logRowFor(deps, red, red.occurredAt, `trading ${red.phase}: ${red.gateName || red.gateId}`, attrs)];
682
- }
683
- //# sourceMappingURL=mappers.js.map