@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
@@ -659,6 +659,236 @@ export function registerSenpiCli(program) {
659
659
  console.log("");
660
660
  }
661
661
  });
662
+ senpi
663
+ .command("scanner")
664
+ .description("Per-scanner supervisor health: runs, errors, liveness, barren detection")
665
+ .option("-r, --runtime <id>", "Filter by runtime id")
666
+ .option("--json", "Print raw JSON from the gateway")
667
+ .action(async (opts) => {
668
+ const params = {};
669
+ if (typeof opts.runtime === "string" && opts.runtime.length > 0)
670
+ params.runtimeId = opts.runtime;
671
+ const data = callGatewayJson("senpi.getSystemState", params);
672
+ if (!data) {
673
+ return;
674
+ }
675
+ if (data.ok === false) {
676
+ const err = data.error;
677
+ console.error(err?.message ?? "Request failed.");
678
+ process.exitCode = 1;
679
+ return;
680
+ }
681
+ const payload = (data.payload ?? data);
682
+ const states = selectMany(payload.state, payload.states ?? []);
683
+ if (opts.json) {
684
+ const scanners = states.map((s) => ({
685
+ runtimeId: s.runtimeId ?? s.runtimeName,
686
+ scanners: s.components?.scanners?.state?.scanners ?? [],
687
+ }));
688
+ console.log(JSON.stringify({ ok: true, scanners }, null, 2));
689
+ return;
690
+ }
691
+ if (states.length === 0) {
692
+ console.log("No running runtime scanners.");
693
+ return;
694
+ }
695
+ for (const state of states) {
696
+ printScanners(state);
697
+ if (states.length > 1)
698
+ console.log("");
699
+ }
700
+ });
701
+ const riskCmd = senpi.command("risk");
702
+ riskCmd
703
+ .description("Risk eligibility + per-gate status — am I allowed to trade, and why not")
704
+ .option("-r, --runtime <id>", "Filter by runtime id")
705
+ .option("--json", "Print raw JSON from the gateway")
706
+ .action(async (opts) => {
707
+ const params = {};
708
+ if (typeof opts.runtime === "string" && opts.runtime.length > 0)
709
+ params.runtimeId = opts.runtime;
710
+ const data = callGatewayJson("senpi.getHealthStatus", params);
711
+ if (!data) {
712
+ return;
713
+ }
714
+ if (data.ok === false) {
715
+ const err = data.error;
716
+ console.error(err?.message ?? "Request failed.");
717
+ process.exitCode = 1;
718
+ return;
719
+ }
720
+ const payload = (data.payload ?? data);
721
+ const statuses = selectMany(payload.status, payload.statuses ?? []);
722
+ if (opts.json) {
723
+ const risk = statuses.map((s) => ({
724
+ runtimeId: s.runtimeId ?? s.runtimeName,
725
+ risk: s.components?.risk ?? null,
726
+ }));
727
+ console.log(JSON.stringify({ ok: true, risk }, null, 2));
728
+ return;
729
+ }
730
+ if (statuses.length === 0) {
731
+ console.log("No running runtime risk status.");
732
+ return;
733
+ }
734
+ for (const status of statuses) {
735
+ printRisk(status);
736
+ if (statuses.length > 1)
737
+ console.log("");
738
+ }
739
+ });
740
+ riskCmd
741
+ .command("audit")
742
+ .description("Risk gate-check audit log — per-evaluation pass/CLOSED/COOLDOWN history")
743
+ .option("-r, --runtime <id>", "Runtime id (required)")
744
+ .option("-a, --address <addr>", "Strategy address (defaults to runtime wallet)")
745
+ .option("--since <iso>", "ISO 8601 lower bound on entry time")
746
+ .option("-l, --limit <n>", "Max entries (default 100)")
747
+ .option("--json", "Print raw JSON from the gateway")
748
+ .action(async (opts) => {
749
+ if (!opts.runtime) {
750
+ console.error("--runtime <id> is required.");
751
+ process.exitCode = 1;
752
+ return;
753
+ }
754
+ const params = { runtimeId: opts.runtime };
755
+ if (opts.address)
756
+ params.address = opts.address;
757
+ const limit = opts.limit ? Number.parseInt(opts.limit, 10) : 100;
758
+ if (Number.isFinite(limit))
759
+ params.limit = limit;
760
+ const data = callGatewayJson("senpi.getRiskAudit", params);
761
+ if (!data) {
762
+ return;
763
+ }
764
+ if (data.ok === false) {
765
+ const err = data.error;
766
+ console.error(err?.message ?? "Request failed.");
767
+ process.exitCode = 1;
768
+ return;
769
+ }
770
+ const inner = (data.payload ?? data);
771
+ let entries = inner.entries ?? [];
772
+ // ISO 8601 UTC timestamps sort lexicographically, so a string compare
773
+ // is a correct lower-bound filter.
774
+ if (opts.since)
775
+ entries = entries.filter((e) => e.ts >= opts.since);
776
+ if (opts.json) {
777
+ console.log(JSON.stringify({ ok: true, entries }, null, 2));
778
+ return;
779
+ }
780
+ console.log(renderRiskAuditDigest(entries));
781
+ });
782
+ senpi
783
+ .command("audit")
784
+ .description("Backend trade-audit trail (MCP tool calls + AI reasoning)")
785
+ .option("-r, --runtime <id>", "Runtime id (required)")
786
+ .option("--tool <name>", "Filter by exact tool name")
787
+ .option("--action-type <type>", "Filter by action type (read|create|update|delete)")
788
+ .option("--success <bool>", "Filter by success (true|false)")
789
+ .option("--since <iso>", "ISO 8601 lower bound on request time")
790
+ .option("--until <iso>", "ISO 8601 upper bound on request time")
791
+ .option("-l, --limit <n>", "Max rows (default 50)")
792
+ .option("--json", "Print raw JSON from the gateway")
793
+ .action(async (opts) => {
794
+ if (!opts.runtime) {
795
+ console.error("--runtime <id> is required.");
796
+ process.exitCode = 1;
797
+ return;
798
+ }
799
+ const params = { runtimeId: opts.runtime };
800
+ if (opts.tool)
801
+ params.tool_name = opts.tool;
802
+ if (opts.actionType)
803
+ params.action_type = opts.actionType;
804
+ if (opts.success === "true")
805
+ params.success = true;
806
+ else if (opts.success === "false")
807
+ params.success = false;
808
+ if (opts.since)
809
+ params.start_time = opts.since;
810
+ if (opts.until)
811
+ params.end_time = opts.until;
812
+ const limit = opts.limit ? Number.parseInt(opts.limit, 10) : 50;
813
+ if (Number.isFinite(limit))
814
+ params.limit = limit;
815
+ const data = callGatewayJson("senpi.auditQuery", params);
816
+ if (!data) {
817
+ return;
818
+ }
819
+ if (data.ok === false) {
820
+ const err = data.error;
821
+ console.error(err?.message ?? "Request failed.");
822
+ process.exitCode = 1;
823
+ return;
824
+ }
825
+ const inner = (data.payload ?? data);
826
+ const result = inner.result ?? { entries: [], count: 0, total: 0, has_more: false };
827
+ if (opts.json) {
828
+ console.log(JSON.stringify({ ok: true, result }, null, 2));
829
+ return;
830
+ }
831
+ if (result.entries.length === 0) {
832
+ console.log("No audit entries.");
833
+ return;
834
+ }
835
+ console.log("Time\tTool\tType\tOK\tDur(ms)\tReasoning");
836
+ for (const e of result.entries) {
837
+ // A malformed backend timestamp makes toISOString() throw RangeError; show a placeholder.
838
+ const parsed = new Date(e.timestamp);
839
+ const t = Number.isNaN(parsed.getTime()) ? "—" : parsed.toISOString().slice(11, 19);
840
+ const dur = e.duration_ms == null ? "—" : String(e.duration_ms);
841
+ const reason = (e.ai_reasoning ?? "").replace(/\s+/g, " ").slice(0, 60);
842
+ console.log([t, e.tool, e.action_type, e.success ? "ok" : "FAIL", dur, reason].join("\t"));
843
+ }
844
+ if (result.has_more) {
845
+ console.log(`… more (showing ${result.count} of ~${result.total}; raise -l or use --json)`);
846
+ }
847
+ });
848
+ senpi
849
+ .command("events")
850
+ .description("Local domain-event log — the trade narrative (position/dsl/order/signal events)")
851
+ .option("-r, --runtime <id>", "Runtime id (required)")
852
+ .option("-a, --address <addr>", "Strategy address (defaults to runtime wallet)")
853
+ .option("--name <event>", "Filter by exact event name (e.g. position.opened)")
854
+ .option("--asset <symbol>", "Filter by asset (e.g. BTC)")
855
+ .option("--level <level>", "Filter by severity (debug|info|warn|error)")
856
+ .option("--since <iso>", "ISO 8601 lower bound on event time")
857
+ .option("--until <iso>", "ISO 8601 upper bound on event time")
858
+ .option("-l, --limit <n>", "Max events (default 200)")
859
+ .option("--json", "Print raw JSON from the gateway")
860
+ .action(async (opts) => {
861
+ const entries = await fetchEvents(opts);
862
+ if (entries === null)
863
+ return;
864
+ if (opts.json) {
865
+ console.log(JSON.stringify({ ok: true, entries }, null, 2));
866
+ return;
867
+ }
868
+ console.log(renderEventsDigest(entries));
869
+ });
870
+ senpi
871
+ .command("explain <asset>")
872
+ .description("Stitch one asset's position lifecycle from the local event log (opened → dsl → closed)")
873
+ .option("-r, --runtime <id>", "Runtime id (required)")
874
+ .option("-a, --address <addr>", "Strategy address (defaults to runtime wallet)")
875
+ .option("-l, --limit <n>", "Max events to scan (default 500)")
876
+ .option("--json", "Print raw JSON from the gateway")
877
+ .action(async (asset, opts) => {
878
+ const entries = await fetchEvents({
879
+ runtime: opts.runtime,
880
+ address: opts.address,
881
+ asset,
882
+ limit: opts.limit ?? "500",
883
+ });
884
+ if (entries === null)
885
+ return;
886
+ if (opts.json) {
887
+ console.log(JSON.stringify({ ok: true, asset, entries }, null, 2));
888
+ return;
889
+ }
890
+ console.log(renderExplain(asset, entries));
891
+ });
662
892
  // ── Skills subcommand ────────────────────────────────────────────────────────
663
893
  const skills = senpi.command("skills");
664
894
  skills.description("Manage Senpi skills (status, update)");
@@ -702,15 +932,18 @@ export function registerSenpiCli(program) {
702
932
  : "0";
703
933
  const installedCell = (s) => s.installedVersion ?? "—";
704
934
  const latestCell = (s) => s.latestVersion ?? "—";
935
+ const majorCell = (s) => (s.majorPending ? "available" : "—");
705
936
  // Column widths: at least as wide as the header label, otherwise the
706
937
  // header would visually run into the next column on short-data rows.
707
938
  const nameW = Math.max("name".length, ...rows.map((r) => r.name.length));
708
939
  const instW = Math.max("installed".length, ...rows.map((r) => installedCell(r).length));
709
940
  const lateW = Math.max("latest".length, ...rows.map((r) => latestCell(r).length));
941
+ const majorW = Math.max("major".length, ...rows.map((r) => majorCell(r).length));
710
942
  const headerCols = [
711
943
  "name".padEnd(nameW),
712
944
  "installed".padEnd(instW),
713
945
  "latest".padEnd(lateW),
946
+ "major".padEnd(majorW),
714
947
  "failures",
715
948
  ];
716
949
  console.log(`\n${headerCols.join(" ")}`);
@@ -719,6 +952,7 @@ export function registerSenpiCli(program) {
719
952
  s.name.padEnd(nameW),
720
953
  installedCell(s).padEnd(instW),
721
954
  latestCell(s).padEnd(lateW),
955
+ majorCell(s).padEnd(majorW),
722
956
  failuresCell(s),
723
957
  ];
724
958
  console.log(cols.join(" "));
@@ -891,12 +1125,23 @@ function printHealthStatus(status) {
891
1125
  const scannerSummary = scanners?.summary ?? "Scanner summary unavailable.";
892
1126
  const enabled = typeof scanners?.totals?.enabled === "number" ? scanners.totals.enabled : "?";
893
1127
  const registered = typeof scanners?.totals?.registered === "number" ? scanners.totals.registered : "?";
1128
+ const degraded = typeof scanners?.totals?.degraded === "number" ? scanners.totals.degraded : 0;
1129
+ const degradedSuffix = degraded > 0 ? `, ${degraded} degraded` : "";
894
1130
  console.log(`Runtime: ${status.runtimeId ?? status.runtimeName ?? "unknown"}`);
895
1131
  console.log(`Overall Health: ${status.health ?? "unknown"}`);
896
1132
  console.log(`Log Level: ${status.logLevel ?? "unknown"}`);
897
- console.log(`Scanners: ${scannerSummary} (enabled ${enabled}/${registered})`);
1133
+ console.log(`Scanners: ${scannerSummary} (enabled ${enabled}/${registered}${degradedSuffix})`);
898
1134
  if (dsl?.summary) {
899
1135
  console.log(`DSL: ${dsl.summary}`);
1136
+ const monitor = dsl.monitor;
1137
+ if (monitor) {
1138
+ const flight = monitor.inFlight ? " (tick in flight)" : "";
1139
+ const next = monitor.nextTickAt
1140
+ ? `, next tick ${new Date(monitor.nextTickAt).toISOString().slice(11, 19)}`
1141
+ : "";
1142
+ const err = monitor.lastTickError ? ` — last tick error: ${monitor.lastTickError}` : "";
1143
+ console.log(` Monitor: ${monitor.running ? "running" : "stopped"}${flight}${next}${err}`);
1144
+ }
900
1145
  }
901
1146
  if (actions?.summary) {
902
1147
  const ar = typeof actions.totals?.registered === "number" ? actions.totals.registered : "?";
@@ -904,7 +1149,7 @@ function printHealthStatus(status) {
904
1149
  console.log(`Actions: ${actions.summary} (registered ${ar}, ${ae} enabled)`);
905
1150
  }
906
1151
  if (risk && risk.enabled) {
907
- console.log(`Risk Health: ${risk.health}`);
1152
+ console.log(`Risk Eligibility: ${risk.eligibility} | Health: ${risk.health}`);
908
1153
  console.log("Risk Gates:");
909
1154
  for (const gate of risk.gates) {
910
1155
  const label = gate.gateName.padEnd(22);
@@ -913,6 +1158,117 @@ function printHealthStatus(status) {
913
1158
  }
914
1159
  }
915
1160
  }
1161
+ function printRisk(status) {
1162
+ const risk = status.components?.risk;
1163
+ console.log(`Runtime: ${status.runtimeId ?? status.runtimeName ?? "unknown"}`);
1164
+ if (!risk || !risk.enabled) {
1165
+ console.log("Risk guardrails: disabled.");
1166
+ return;
1167
+ }
1168
+ console.log(`Eligibility: ${risk.eligibility} | Health: ${risk.health}`);
1169
+ const t = risk.totals;
1170
+ console.log(`Gates: ${t.open} open, ${t.cooldown} cooldown, ${t.closed} closed (${t.fallbackCount} fallback, ${t.failedCount} failed)`);
1171
+ for (const g of risk.gates) {
1172
+ const label = g.gateName.padEnd(22);
1173
+ const reason = g.reason && g.status !== "OPEN" ? ` — ${g.reason}` : "";
1174
+ // Surface evaluation faults the status summary hides: a gate that errored
1175
+ // and the fallback it fell back to.
1176
+ const flag = !g.evaluationOk ? ` [${g.failureKind}${g.fallbackApplied ? ",fallback" : ""}]` : "";
1177
+ console.log(` ${label}${g.status}${reason}${flag}`);
1178
+ }
1179
+ }
1180
+ /**
1181
+ * Render the risk audit log as a tab-separated digest (newest entries last,
1182
+ * as returned). Each row: time, source, then `guardrail=result` per
1183
+ * evaluation (with the reason appended for non-pass results).
1184
+ */
1185
+ export function renderRiskAuditDigest(entries) {
1186
+ if (entries.length === 0)
1187
+ return "No risk audit.";
1188
+ const lines = ["Time\tSource\tEvaluations"];
1189
+ for (const e of entries) {
1190
+ const t = new Date(e.ts).toISOString().slice(11, 19);
1191
+ const evals = (e.evaluations ?? [])
1192
+ .map((ev) => `${ev.guardrail}=${ev.result}${ev.reason && ev.result !== "pass" ? `(${ev.reason})` : ""}`)
1193
+ .join(" ");
1194
+ lines.push([t, e.source, evals || "—"].join("\t"));
1195
+ }
1196
+ return lines.join("\n");
1197
+ }
1198
+ /**
1199
+ * Shared fetch for `senpi events` / `senpi explain`: validate --runtime, call senpi.getEvents, and
1200
+ * return the entries. Returns `null` (and sets exitCode/prints) on a missing runtime, transport
1201
+ * failure, or a gateway error — the caller stops.
1202
+ */
1203
+ function fetchEvents(opts) {
1204
+ if (!opts.runtime) {
1205
+ console.error("--runtime <id> is required.");
1206
+ process.exitCode = 1;
1207
+ return null;
1208
+ }
1209
+ const params = { runtimeId: opts.runtime };
1210
+ if (opts.address)
1211
+ params.address = opts.address;
1212
+ if (opts.name)
1213
+ params.name = opts.name;
1214
+ if (opts.asset)
1215
+ params.asset = opts.asset;
1216
+ if (opts.level)
1217
+ params.level = opts.level;
1218
+ if (opts.since)
1219
+ params.since = opts.since;
1220
+ if (opts.until)
1221
+ params.until = opts.until;
1222
+ if (opts.limit) {
1223
+ const limit = Number.parseInt(opts.limit, 10);
1224
+ if (Number.isFinite(limit))
1225
+ params.limit = limit;
1226
+ }
1227
+ const data = callGatewayJson("senpi.getEvents", params);
1228
+ if (!data)
1229
+ return null;
1230
+ if (data.ok === false) {
1231
+ const err = data.error;
1232
+ console.error(err?.message ?? "Request failed.");
1233
+ process.exitCode = 1;
1234
+ return null;
1235
+ }
1236
+ const inner = (data.payload ?? data);
1237
+ return inner.entries ?? [];
1238
+ }
1239
+ /** The asset an event concerns, if any (position/dsl carry `senpi.asset`; signals carry `senpi.signal.asset`). */
1240
+ function eventAsset(e) {
1241
+ const a = e.attrs?.["senpi.asset"] ?? e.attrs?.["senpi.signal.asset"];
1242
+ return typeof a === "string" ? a : undefined;
1243
+ }
1244
+ export function renderEventsDigest(entries) {
1245
+ if (entries.length === 0)
1246
+ return "No events.";
1247
+ const lines = ["Time\tLevel\tEvent\tAsset\tDetail"];
1248
+ for (const e of entries) {
1249
+ const t = new Date(e.ts).toISOString().slice(11, 19);
1250
+ const detail = (e.body ?? "").replace(/\s+/g, " ").slice(0, 60);
1251
+ lines.push([t, e.level, e.name, eventAsset(e) ?? "—", detail].join("\t"));
1252
+ }
1253
+ return lines.join("\n");
1254
+ }
1255
+ /**
1256
+ * Stitch an asset's lifecycle: events oldest-first, each line tagged with its position id where one is
1257
+ * present, so a reader can follow opened → dsl transitions → close across one or more positions.
1258
+ */
1259
+ export function renderExplain(asset, entries) {
1260
+ if (entries.length === 0)
1261
+ return `No events for ${asset}.`;
1262
+ const lines = [`${asset} — ${entries.length} event(s)`];
1263
+ for (const e of entries) {
1264
+ const t = new Date(e.ts).toISOString().slice(11, 19);
1265
+ const pos = typeof e.attrs?.["senpi.position.id"] === "string" ? e.attrs["senpi.position.id"] : undefined;
1266
+ const tag = pos ? ` [pos ${truncateAddr(String(pos))}]` : "";
1267
+ const detail = (e.body ?? "").replace(/\s+/g, " ");
1268
+ lines.push(` ${t} ${e.name}\t${detail}${tag}`);
1269
+ }
1270
+ return lines.join("\n");
1271
+ }
916
1272
  function printSystemState(state) {
917
1273
  const scanners = state.components?.scanners?.state;
918
1274
  const dsl = state.components?.dsl;
@@ -983,4 +1339,36 @@ function printSystemState(state) {
983
1339
  }
984
1340
  }
985
1341
  }
1342
+ function printScanners(state) {
1343
+ const rows = state.components?.scanners?.state?.scanners ?? [];
1344
+ console.log(`Runtime: ${state.runtimeId ?? state.runtimeName ?? "unknown"}`);
1345
+ console.log(`Scanners: ${rows.length}`);
1346
+ for (const s of rows) {
1347
+ // Barren = wired and running but never emitted a signal — a real "alive but producing nothing" gap.
1348
+ const barren = s.health !== "disabled" && (s.runCount ?? 0) > 0 && (s.signalsProduced ?? 0) === 0;
1349
+ // Liveness clock is external-only: n/a for interval scanners, — for an external one not yet heard from.
1350
+ const alive = s.lastAliveAt != null
1351
+ ? String(s.lastAliveAt)
1352
+ : s.scheduleMode === "external"
1353
+ ? "—"
1354
+ : "n/a";
1355
+ console.log([
1356
+ " scanner",
1357
+ s.scannerId ?? "—",
1358
+ `mode=${s.scheduleMode ?? "—"}`,
1359
+ `health=${s.health ?? "unknown"}`,
1360
+ `enabled=${String(s.enabled ?? false)}`,
1361
+ `inFlight=${String(s.inFlight ?? false)}`,
1362
+ `runs=${s.runCount ?? 0}`,
1363
+ `errors=${s.errorCount ?? 0}`,
1364
+ `consec_errors=${s.consecutiveErrorCount ?? 0}`,
1365
+ `signals=${s.signalsProduced ?? 0}`,
1366
+ `alive=${alive}`,
1367
+ `next=${s.nextRunAt == null ? "—" : String(s.nextRunAt)}`,
1368
+ `last=${s.lastRunStatus ?? "—"}`,
1369
+ ...(s.lastRunReason ? [`reason=${s.lastRunReason}`] : []),
1370
+ ...(barren ? ["BARREN"] : []),
1371
+ ].join(" "));
1372
+ }
1373
+ }
986
1374
  //# sourceMappingURL=senpi-commands.js.map