@evalops/maestro 0.10.23 → 0.10.25

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 (376) hide show
  1. package/README.md +4 -4
  2. package/dist/agent/agent.d.ts +2 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +1 -1
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/keys.d.ts +2 -5
  7. package/dist/agent/keys.d.ts.map +1 -1
  8. package/dist/agent/keys.js +4 -5
  9. package/dist/agent/keys.js.map +1 -1
  10. package/dist/agent/modes.d.ts +2 -2
  11. package/dist/agent/modes.d.ts.map +1 -1
  12. package/dist/agent/modes.js +6 -7
  13. package/dist/agent/modes.js.map +1 -1
  14. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  15. package/dist/agent/providers/anthropic.js +4 -4
  16. package/dist/agent/providers/anthropic.js.map +1 -1
  17. package/dist/agent/providers/google.js +1 -1
  18. package/dist/agent/swarm/executor.d.ts +2 -0
  19. package/dist/agent/swarm/executor.d.ts.map +1 -1
  20. package/dist/agent/swarm/executor.js +208 -35
  21. package/dist/agent/swarm/executor.js.map +1 -1
  22. package/dist/agent/swarm/types.d.ts +2 -0
  23. package/dist/agent/swarm/types.d.ts.map +1 -1
  24. package/dist/agent/swarm/types.js.map +1 -1
  25. package/dist/agent/tool-capability-types.d.ts +36 -0
  26. package/dist/agent/tool-capability-types.d.ts.map +1 -0
  27. package/dist/agent/tool-capability-types.js +2 -0
  28. package/dist/agent/tool-capability-types.js.map +1 -0
  29. package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
  30. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  31. package/dist/agent/transport/tool-execution-bridge.js +28 -15
  32. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  33. package/dist/agent/transport/transport-utils.d.ts.map +1 -1
  34. package/dist/agent/transport/transport-utils.js +2 -3
  35. package/dist/agent/transport/transport-utils.js.map +1 -1
  36. package/dist/agent/transport.js +1 -1
  37. package/dist/agent/transport.js.map +1 -1
  38. package/dist/agent/type-guards.d.ts +1 -1
  39. package/dist/agent/type-guards.js +1 -1
  40. package/dist/agent/type-guards.js.map +1 -1
  41. package/dist/agent/types.d.ts +5 -3
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js +2 -2
  44. package/dist/agent/types.js.map +1 -1
  45. package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
  46. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
  47. package/dist/app-server/daemon-lifecycle-api.js +259 -0
  48. package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
  49. package/dist/app-server/external-agent-import-api.d.ts +30 -0
  50. package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
  51. package/dist/app-server/external-agent-import-api.js +553 -0
  52. package/dist/app-server/external-agent-import-api.js.map +1 -0
  53. package/dist/app-server/host-control-api.d.ts +30 -0
  54. package/dist/app-server/host-control-api.d.ts.map +1 -0
  55. package/dist/app-server/host-control-api.js +343 -0
  56. package/dist/app-server/host-control-api.js.map +1 -0
  57. package/dist/app-server/in-process-client.d.ts +2 -2
  58. package/dist/app-server/in-process-client.d.ts.map +1 -1
  59. package/dist/app-server/in-process-client.js.map +1 -1
  60. package/dist/app-server/network-governance-api.d.ts +26 -0
  61. package/dist/app-server/network-governance-api.d.ts.map +1 -0
  62. package/dist/app-server/network-governance-api.js +476 -0
  63. package/dist/app-server/network-governance-api.js.map +1 -0
  64. package/dist/app-server/plugin-bundle-api.d.ts +17 -0
  65. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
  66. package/dist/app-server/plugin-bundle-api.js +219 -0
  67. package/dist/app-server/plugin-bundle-api.js.map +1 -0
  68. package/dist/app-server/policy-control-api.d.ts +14 -0
  69. package/dist/app-server/policy-control-api.d.ts.map +1 -0
  70. package/dist/app-server/policy-control-api.js +200 -0
  71. package/dist/app-server/policy-control-api.js.map +1 -0
  72. package/dist/app-server/protocol-modes-api.d.ts +22 -0
  73. package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
  74. package/dist/app-server/protocol-modes-api.js +124 -0
  75. package/dist/app-server/protocol-modes-api.js.map +1 -0
  76. package/dist/app-server/sandbox-proof-api.d.ts +21 -0
  77. package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
  78. package/dist/app-server/sandbox-proof-api.js +127 -0
  79. package/dist/app-server/sandbox-proof-api.js.map +1 -0
  80. package/dist/app-server/session-api.d.ts +93 -3
  81. package/dist/app-server/session-api.d.ts.map +1 -1
  82. package/dist/app-server/session-api.js +706 -18
  83. package/dist/app-server/session-api.js.map +1 -1
  84. package/dist/audit/logger.d.ts +1 -1
  85. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  86. package/dist/bootstrap/auth-setup.js +17 -2
  87. package/dist/bootstrap/auth-setup.js.map +1 -1
  88. package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
  89. package/dist/bootstrap/model-resolution-setup.js +19 -4
  90. package/dist/bootstrap/model-resolution-setup.js.map +1 -1
  91. package/dist/cli/args.d.ts +2 -2
  92. package/dist/cli/args.d.ts.map +1 -1
  93. package/dist/cli/args.js +2 -2
  94. package/dist/cli/args.js.map +1 -1
  95. package/dist/cli/commands/a2a.d.ts.map +1 -1
  96. package/dist/cli/commands/a2a.js +226 -14
  97. package/dist/cli/commands/a2a.js.map +1 -1
  98. package/dist/cli/commands/anthropic.d.ts +1 -1
  99. package/dist/cli/commands/anthropic.d.ts.map +1 -1
  100. package/dist/cli/commands/anthropic.js +3 -68
  101. package/dist/cli/commands/anthropic.js.map +1 -1
  102. package/dist/cli/commands/modes.js +1 -1
  103. package/dist/cli/commands/modes.js.map +1 -1
  104. package/dist/cli/help.d.ts.map +1 -1
  105. package/dist/cli/help.js +5 -7
  106. package/dist/cli/help.js.map +1 -1
  107. package/dist/cli/rpc-mode.d.ts +1 -1
  108. package/dist/cli/rpc-mode.js +1 -1
  109. package/dist/cli/rpc-mode.js.map +1 -1
  110. package/dist/cli/session.js +1 -1
  111. package/dist/cli/session.js.map +1 -1
  112. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  113. package/dist/cli-tui/commands/command-catalog.js +7 -12
  114. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  115. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
  116. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
  117. package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
  118. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
  119. package/dist/cli-tui/custom-editor.d.ts +1 -1
  120. package/dist/cli-tui/custom-editor.js +2 -2
  121. package/dist/cli-tui/custom-editor.js.map +1 -1
  122. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  123. package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
  124. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  125. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  126. package/dist/cli-tui/selectors/model-selector.js +0 -1
  127. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  128. package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
  129. package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
  130. package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
  131. package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
  132. package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
  133. package/dist/cli-tui/selectors/oauth-selector.js +3 -4
  134. package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
  135. package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
  136. package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
  137. package/dist/cli-tui/tui-renderer.js +2 -2
  138. package/dist/cli-tui/tui-renderer.js.map +1 -1
  139. package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
  140. package/dist/cli-tui/utils/footer-utils.js +1 -1
  141. package/dist/cli-tui/utils/footer-utils.js.map +1 -1
  142. package/dist/cli.js +15156 -14232
  143. package/dist/commands/prompts.d.ts +1 -1
  144. package/dist/commands/prompts.js +1 -1
  145. package/dist/commands/prompts.js.map +1 -1
  146. package/dist/config/constants.d.ts +2 -2
  147. package/dist/config/constants.d.ts.map +1 -1
  148. package/dist/config/constants.js +2 -2
  149. package/dist/config/constants.js.map +1 -1
  150. package/dist/config/index.d.ts +1 -1
  151. package/dist/config/index.js +1 -1
  152. package/dist/config/index.js.map +1 -1
  153. package/dist/config/toml-config.js +3 -3
  154. package/dist/config/toml-config.js.map +1 -1
  155. package/dist/db/client.d.ts +2 -2
  156. package/dist/db/client.js +2 -2
  157. package/dist/db/client.js.map +1 -1
  158. package/dist/db/migrate.d.ts +1 -1
  159. package/dist/db/migrate.js +1 -1
  160. package/dist/db/migrate.js.map +1 -1
  161. package/dist/db/schema.d.ts +2 -2
  162. package/dist/db/schema.js +1 -1
  163. package/dist/db/schema.js.map +1 -1
  164. package/dist/errors/index.d.ts +2 -2
  165. package/dist/errors/index.js +2 -2
  166. package/dist/errors/index.js.map +1 -1
  167. package/dist/main.d.ts +4 -5
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +17 -14
  170. package/dist/main.js.map +1 -1
  171. package/dist/mcp/config.d.ts +15 -2
  172. package/dist/mcp/config.d.ts.map +1 -1
  173. package/dist/mcp/config.js +50 -26
  174. package/dist/mcp/config.js.map +1 -1
  175. package/dist/mcp/fathom-cua.d.ts.map +1 -1
  176. package/dist/mcp/fathom-cua.js +10 -0
  177. package/dist/mcp/fathom-cua.js.map +1 -1
  178. package/dist/mcp/manager.d.ts.map +1 -1
  179. package/dist/mcp/manager.js +32 -1
  180. package/dist/mcp/manager.js.map +1 -1
  181. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  182. package/dist/mcp/tool-bridge.js +12 -3
  183. package/dist/mcp/tool-bridge.js.map +1 -1
  184. package/dist/mcp/tool-capabilities.d.ts +5 -0
  185. package/dist/mcp/tool-capabilities.d.ts.map +1 -0
  186. package/dist/mcp/tool-capabilities.js +271 -0
  187. package/dist/mcp/tool-capabilities.js.map +1 -0
  188. package/dist/mcp/types.d.ts +6 -1
  189. package/dist/mcp/types.d.ts.map +1 -1
  190. package/dist/mcp/types.js.map +1 -1
  191. package/dist/models/config-loader.d.ts +1 -1
  192. package/dist/models/factory-integration.d.ts +1 -1
  193. package/dist/models/factory-integration.js +1 -1
  194. package/dist/models/factory-integration.js.map +1 -1
  195. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +3 -3
  196. package/dist/node_modules/@evalops/contracts/dist/index.js +2 -2
  197. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  198. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
  199. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
  200. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
  201. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
  202. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  203. package/dist/node_modules/@evalops/tui/package.json +1 -1
  204. package/dist/oauth/connectors.d.ts +2 -2
  205. package/dist/oauth/connectors.d.ts.map +1 -1
  206. package/dist/oauth/connectors.js +3 -5
  207. package/dist/oauth/connectors.js.map +1 -1
  208. package/dist/oauth/github-copilot.d.ts +1 -1
  209. package/dist/oauth/github-copilot.js +1 -1
  210. package/dist/oauth/github-copilot.js.map +1 -1
  211. package/dist/oauth/index.d.ts +10 -8
  212. package/dist/oauth/index.d.ts.map +1 -1
  213. package/dist/oauth/index.js +54 -31
  214. package/dist/oauth/index.js.map +1 -1
  215. package/dist/oauth/openai.d.ts +1 -1
  216. package/dist/oauth/openai.js +2 -2
  217. package/dist/oauth/openai.js.map +1 -1
  218. package/dist/platform/a2a-completion-audit.d.ts +41 -0
  219. package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
  220. package/dist/platform/a2a-completion-audit.js +177 -0
  221. package/dist/platform/a2a-completion-audit.js.map +1 -0
  222. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  223. package/dist/platform/a2a-task-ledger.js +17 -0
  224. package/dist/platform/a2a-task-ledger.js.map +1 -1
  225. package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
  226. package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
  227. package/dist/platform/a2a-telemetry-inspect.js +224 -0
  228. package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
  229. package/dist/platform/agent-registry-client.d.ts +8 -0
  230. package/dist/platform/agent-registry-client.d.ts.map +1 -1
  231. package/dist/platform/agent-registry-client.js +9 -1
  232. package/dist/platform/agent-registry-client.js.map +1 -1
  233. package/dist/providers/api-keys.d.ts +2 -2
  234. package/dist/providers/api-keys.js +2 -2
  235. package/dist/providers/api-keys.js.map +1 -1
  236. package/dist/providers/auth.d.ts +3 -6
  237. package/dist/providers/auth.d.ts.map +1 -1
  238. package/dist/providers/auth.js +1 -40
  239. package/dist/providers/auth.js.map +1 -1
  240. package/dist/rpc/index.d.ts +2 -2
  241. package/dist/rpc/index.js +2 -2
  242. package/dist/rpc/index.js.map +1 -1
  243. package/dist/rpc/rpc-types.d.ts +1 -1
  244. package/dist/rpc/rpc-types.js +1 -1
  245. package/dist/rpc/rpc-types.js.map +1 -1
  246. package/dist/safety/nested-agent-guard.js +1 -1
  247. package/dist/safety/nested-agent-guard.js.map +1 -1
  248. package/dist/safety/policy.d.ts +2 -2
  249. package/dist/safety/policy.js +2 -2
  250. package/dist/safety/policy.js.map +1 -1
  251. package/dist/safety/validators/network-policy-validator.d.ts +8 -0
  252. package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
  253. package/dist/safety/validators/network-policy-validator.js +29 -4
  254. package/dist/safety/validators/network-policy-validator.js.map +1 -1
  255. package/dist/sandbox/local-sandbox.d.ts +1 -1
  256. package/dist/sandbox/local-sandbox.js +1 -1
  257. package/dist/sandbox/local-sandbox.js.map +1 -1
  258. package/dist/server/app-context.d.ts +2 -0
  259. package/dist/server/app-context.d.ts.map +1 -1
  260. package/dist/server/app-context.js.map +1 -1
  261. package/dist/server/handlers/attachments.d.ts.map +1 -1
  262. package/dist/server/handlers/attachments.js +1 -0
  263. package/dist/server/handlers/attachments.js.map +1 -1
  264. package/dist/server/handlers/models.d.ts.map +1 -1
  265. package/dist/server/handlers/models.js +3 -1
  266. package/dist/server/handlers/models.js.map +1 -1
  267. package/dist/server/handlers/session-attachments.d.ts.map +1 -1
  268. package/dist/server/handlers/session-attachments.js +2 -0
  269. package/dist/server/handlers/session-attachments.js.map +1 -1
  270. package/dist/server/handlers/sessions.js +1 -1
  271. package/dist/server/handlers/sessions.js.map +1 -1
  272. package/dist/server/handlers/status.d.ts +2 -0
  273. package/dist/server/handlers/status.d.ts.map +1 -1
  274. package/dist/server/handlers/status.js +3 -2
  275. package/dist/server/handlers/status.js.map +1 -1
  276. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  277. package/dist/server/headless-runtime-service.js +32 -3
  278. package/dist/server/headless-runtime-service.js.map +1 -1
  279. package/dist/server/hosted-session-manager.d.ts +2 -0
  280. package/dist/server/hosted-session-manager.d.ts.map +1 -1
  281. package/dist/server/hosted-session-manager.js +9 -0
  282. package/dist/server/hosted-session-manager.js.map +1 -1
  283. package/dist/server/model-selection.d.ts.map +1 -1
  284. package/dist/server/model-selection.js +9 -1
  285. package/dist/server/model-selection.js.map +1 -1
  286. package/dist/server/rate-limiter.d.ts +1 -1
  287. package/dist/server/rate-limiter.js +1 -1
  288. package/dist/server/rate-limiter.js.map +1 -1
  289. package/dist/server/router.d.ts +2 -2
  290. package/dist/server/router.js.map +1 -1
  291. package/dist/server/session-serialization.d.ts +9 -9
  292. package/dist/server/session-serialization.js +15 -15
  293. package/dist/server/session-serialization.js.map +1 -1
  294. package/dist/session/manager.d.ts +5 -0
  295. package/dist/session/manager.d.ts.map +1 -1
  296. package/dist/session/manager.js +56 -8
  297. package/dist/session/manager.js.map +1 -1
  298. package/dist/session/session-catalog.d.ts +2 -0
  299. package/dist/session/session-catalog.d.ts.map +1 -1
  300. package/dist/session/session-catalog.js +6 -0
  301. package/dist/session/session-catalog.js.map +1 -1
  302. package/dist/session/session-context.d.ts +2 -0
  303. package/dist/session/session-context.d.ts.map +1 -1
  304. package/dist/session/session-context.js +15 -0
  305. package/dist/session/session-context.js.map +1 -1
  306. package/dist/session/types.d.ts +7 -0
  307. package/dist/session/types.d.ts.map +1 -1
  308. package/dist/session/types.js.map +1 -1
  309. package/dist/session/wire-format.generated.d.ts +1 -0
  310. package/dist/session/wire-format.generated.d.ts.map +1 -1
  311. package/dist/session/wire-format.generated.js +1 -0
  312. package/dist/session/wire-format.generated.js.map +1 -1
  313. package/dist/shared-memory/contract.d.ts +4 -4
  314. package/dist/shared-memory/contract.js +2 -2
  315. package/dist/shared-memory/contract.js.map +1 -1
  316. package/dist/telemetry/index.d.ts +2 -2
  317. package/dist/telemetry/index.d.ts.map +1 -1
  318. package/dist/telemetry/index.js +2 -2
  319. package/dist/telemetry/index.js.map +1 -1
  320. package/dist/telemetry/maestro-event-bus.d.ts +57 -0
  321. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  322. package/dist/telemetry/maestro-event-bus.js +59 -1
  323. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  324. package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
  325. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  326. package/dist/telemetry/maestro-event-catalog.js +24 -0
  327. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  328. package/dist/telemetry/mcp-beacon.d.ts +2 -0
  329. package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
  330. package/dist/telemetry/mcp-beacon.js +15 -0
  331. package/dist/telemetry/mcp-beacon.js.map +1 -1
  332. package/dist/telemetry/metrics.d.ts +62 -0
  333. package/dist/telemetry/metrics.d.ts.map +1 -1
  334. package/dist/telemetry/metrics.js +84 -0
  335. package/dist/telemetry/metrics.js.map +1 -1
  336. package/dist/telemetry.d.ts +44 -0
  337. package/dist/telemetry.d.ts.map +1 -1
  338. package/dist/telemetry.js +84 -2
  339. package/dist/telemetry.js.map +1 -1
  340. package/dist/theme/theme-loader.js +2 -2
  341. package/dist/theme/theme-loader.js.map +1 -1
  342. package/dist/theme/theme-schema.json +2 -2
  343. package/dist/theme/theme.d.ts +1 -1
  344. package/dist/theme/theme.js.map +1 -1
  345. package/dist/tools/background/task-types.d.ts +1 -1
  346. package/dist/tools/extract-document.d.ts +1 -0
  347. package/dist/tools/extract-document.d.ts.map +1 -1
  348. package/dist/tools/extract-document.js +2 -1
  349. package/dist/tools/extract-document.js.map +1 -1
  350. package/dist/tools/index.d.ts +55 -55
  351. package/dist/tools/index.js +1 -1
  352. package/dist/tools/index.js.map +1 -1
  353. package/dist/tools/tool-dsl.d.ts +1 -1
  354. package/dist/tools/tool-dsl.js +1 -1
  355. package/dist/tools/tool-dsl.js.map +1 -1
  356. package/dist/utils/document-extractor.d.ts +1 -0
  357. package/dist/utils/document-extractor.d.ts.map +1 -1
  358. package/dist/utils/document-extractor.js +320 -40
  359. package/dist/utils/document-extractor.js.map +1 -1
  360. package/dist/utils/logger.d.ts +1 -1
  361. package/dist/utils/logger.js +1 -1
  362. package/dist/utils/logger.js.map +1 -1
  363. package/dist/version.json +2 -2
  364. package/dist/web-server.d.ts +1 -1
  365. package/dist/web-server.d.ts.map +1 -1
  366. package/dist/web-server.js +12 -8
  367. package/dist/web-server.js.map +1 -1
  368. package/package.json +4 -2
  369. package/dist/oauth/anthropic.d.ts +0 -17
  370. package/dist/oauth/anthropic.d.ts.map +0 -1
  371. package/dist/oauth/anthropic.js +0 -81
  372. package/dist/oauth/anthropic.js.map +0 -1
  373. package/dist/providers/anthropic-auth.d.ts +0 -75
  374. package/dist/providers/anthropic-auth.d.ts.map +0 -1
  375. package/dist/providers/anthropic-auth.js +0 -221
  376. package/dist/providers/anthropic-auth.js.map +0 -1
package/dist/telemetry.js CHANGED
@@ -4,10 +4,11 @@ import { SpanStatusCode } from "@opentelemetry/api";
4
4
  import { PATHS } from "./config/constants.js";
5
5
  import { getTelemetryTracer, isOpenTelemetryEnabled, } from "./opentelemetry.js";
6
6
  import { isInternalTelemetryDisabled } from "./telemetry/disablement.js";
7
- import { mirrorTelemetryToMaestroEventBus, resolveMaestroEventBusConfig, } from "./telemetry/maestro-event-bus.js";
7
+ import { mirrorTelemetryToMaestroEventBus, recordMaestroA2ADelegationEvent, resolveMaestroEventBusConfig, } from "./telemetry/maestro-event-bus.js";
8
+ import { MaestroBusEventType } from "./telemetry/maestro-event-catalog.js";
8
9
  import { normalizeTelemetryMetadataInputs } from "./telemetry/metadata-normalization.js";
9
10
  import { hasRemoteMeterDestination, mirrorCanonicalTurnEventToMeter, } from "./telemetry/meter-service-client.js";
10
- import { recordCompactionMetric, recordSubagentDispatchMetric, recordToolInvocationMetric, } from "./telemetry/metrics.js";
11
+ import { recordA2ADelegationMetric, recordA2APeerExclusionMetric, recordA2APolicyDenialMetric, recordCompactionMetric, recordSubagentDispatchMetric, recordToolInvocationMetric, } from "./telemetry/metrics.js";
11
12
  import { setDefaultTelemetryRecorder, } from "./telemetry/wide-events.js";
12
13
  import { resolveEnvPath } from "./utils/path-expansion.js";
13
14
  import { sanitizeOptionalWithStaticMask, sanitizeWithStaticMask, } from "./utils/secret-redactor.js";
@@ -33,6 +34,16 @@ const initialTelemetryEnabled = shouldEnableTelemetry();
33
34
  let telemetryEnabled = initialTelemetryEnabled;
34
35
  let telemetryOverride = null;
35
36
  let telemetryOverrideReason;
37
+ const A2A_PHASE_EVENT_TYPES = {
38
+ peer_selected: MaestroBusEventType.A2APeerSelected,
39
+ task_dispatched: MaestroBusEventType.A2ATaskDispatched,
40
+ task_progress: MaestroBusEventType.A2ATaskProgress,
41
+ task_completed: MaestroBusEventType.A2ATaskCompleted,
42
+ task_failed: MaestroBusEventType.A2ATaskFailed,
43
+ task_cancelled: MaestroBusEventType.A2ATaskCancelled,
44
+ push_received: MaestroBusEventType.A2APushReceived,
45
+ evidence_completed: MaestroBusEventType.A2AEvidenceCompleted,
46
+ };
36
47
  const parseSamplingRate = () => {
37
48
  const raw = telemetrySampleEnv;
38
49
  if (!raw) {
@@ -709,6 +720,77 @@ export function recordSubagentDispatch(event) {
709
720
  timestamp: new Date().toISOString(),
710
721
  });
711
722
  }
723
+ export function recordA2ADelegationTelemetry(event) {
724
+ if (isInternalTelemetryDisabled()) {
725
+ return;
726
+ }
727
+ try {
728
+ recordA2ADelegationMetric({
729
+ phase: event.phase,
730
+ source: event.source,
731
+ status: event.status,
732
+ success: event.success,
733
+ skillId: event.skillId,
734
+ taskClass: event.taskClass,
735
+ latencyMs: event.latencyMs,
736
+ taskDurationMs: event.taskDurationMs ?? event.durationMs,
737
+ pushLagMs: event.pushLagMs,
738
+ });
739
+ recordMaestroA2ADelegationEvent({
740
+ event_type: A2A_PHASE_EVENT_TYPES[event.phase],
741
+ swarm_id: event.swarmId,
742
+ lane_id: event.laneId,
743
+ parent_task_id: event.parentTaskId,
744
+ a2a_task_id: event.a2aTaskId,
745
+ a2a_message_id: event.a2aMessageId,
746
+ context_id: event.contextId,
747
+ peer_agent_id: event.peerAgentId,
748
+ peer_name: event.peerName,
749
+ peer_endpoint_url: event.peerEndpointUrl,
750
+ peer_endpoint_hash: event.peerEndpointHash,
751
+ peer_endpoint_kind: event.peerEndpointKind,
752
+ skill_id: event.skillId,
753
+ task_class: event.taskClass,
754
+ source: event.source,
755
+ status: event.status,
756
+ terminal: event.terminal,
757
+ success: event.success,
758
+ latency_ms: event.latencyMs,
759
+ duration_ms: event.taskDurationMs ?? event.durationMs,
760
+ push_lag_ms: event.pushLagMs,
761
+ evidence: event.evidence,
762
+ metadata: event.metadata,
763
+ correlation: event.correlation,
764
+ occurred_at: event.occurredAt,
765
+ env: event.env,
766
+ });
767
+ }
768
+ catch {
769
+ // Telemetry must never affect A2A delegation runtime behavior.
770
+ }
771
+ }
772
+ export function recordA2APolicyDenialTelemetry(event) {
773
+ if (isInternalTelemetryDisabled()) {
774
+ return;
775
+ }
776
+ try {
777
+ recordA2APolicyDenialMetric(event);
778
+ }
779
+ catch {
780
+ // Best-effort only.
781
+ }
782
+ }
783
+ export function recordA2APeerExclusionTelemetry(event) {
784
+ if (isInternalTelemetryDisabled()) {
785
+ return;
786
+ }
787
+ try {
788
+ recordA2APeerExclusionMetric(event);
789
+ }
790
+ catch {
791
+ // Best-effort only.
792
+ }
793
+ }
712
794
  /**
713
795
  * Record session migration stats.
714
796
  */
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { type Span, SpanStatusCode } from \"@opentelemetry/api\";\n\nimport { PATHS } from \"./config/constants.js\";\nimport {\n\tgetTelemetryTracer,\n\tinitOpenTelemetry,\n\tisOpenTelemetryEnabled,\n} from \"./opentelemetry.js\";\nimport { isInternalTelemetryDisabled } from \"./telemetry/disablement.js\";\nimport {\n\ttype MaestroCorrelation,\n\tmirrorTelemetryToMaestroEventBus,\n\tresolveMaestroEventBusConfig,\n} from \"./telemetry/maestro-event-bus.js\";\nimport { normalizeTelemetryMetadataInputs } from \"./telemetry/metadata-normalization.js\";\nimport {\n\thasRemoteMeterDestination,\n\tmirrorCanonicalTurnEventToMeter,\n} from \"./telemetry/meter-service-client.js\";\nimport {\n\trecordCompactionMetric,\n\trecordSubagentDispatchMetric,\n\trecordToolInvocationMetric,\n} from \"./telemetry/metrics.js\";\nimport {\n\ttype CanonicalTurnEvent,\n\tsetDefaultTelemetryRecorder,\n} from \"./telemetry/wide-events.js\";\nimport { resolveEnvPath } from \"./utils/path-expansion.js\";\nimport {\n\tsanitizeOptionalWithStaticMask,\n\tsanitizeWithStaticMask,\n} from \"./utils/secret-redactor.js\";\n\nexport { splitTelemetryMetadata } from \"./telemetry/metadata-normalization.js\";\n\ntype BaseTelemetryEvent = {\n\ttype:\n\t\t| \"tool-execution\"\n\t\t| \"evaluation\"\n\t\t| \"loader-stage\"\n\t\t| \"sse\"\n\t\t| \"background-task\"\n\t\t| \"api-request\"\n\t\t| \"business-metric\"\n\t\t| \"staged-rollout-surface\"\n\t\t| \"sandbox-violation\"\n\t\t| \"subagent-dispatch\";\n\ttimestamp: string;\n\tsensitiveMetadata?: Record<string, unknown>;\n};\n\nexport interface ApiRequestTelemetry extends BaseTelemetryEvent {\n\ttype: \"api-request\";\n\tmethod: string;\n\tpath: string;\n\tstatusCode: number;\n\tdurationMs: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface ToolExecutionTelemetry extends BaseTelemetryEvent {\n\ttype: \"tool-execution\";\n\ttoolName: string;\n\tsuccess: boolean;\n\tdurationMs: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface EvaluationTelemetry extends BaseTelemetryEvent {\n\ttype: \"evaluation\";\n\tscenario: string;\n\tsuccess: boolean;\n\tdetails?: Record<string, unknown>;\n}\n\nexport interface LoaderStageTelemetry extends BaseTelemetryEvent {\n\ttype: \"loader-stage\";\n\tstage: string;\n\tdurationMs: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface SseTelemetry extends BaseTelemetryEvent {\n\ttype: \"sse\";\n\tevent: \"skip\";\n\tsent: number;\n\tskipped: number;\n\tmetadata?: Record<string, unknown>;\n}\n\ntype BackgroundTaskStatusTelemetry =\n\t| \"running\"\n\t| \"restarting\"\n\t| \"failed\"\n\t| \"exited\"\n\t| \"stopped\";\n\nexport interface BackgroundTaskTelemetry extends BaseTelemetryEvent {\n\ttype: \"background-task\";\n\tevent: \"started\" | \"restarted\" | \"exited\" | \"failed\" | \"stopped\";\n\ttaskId: string;\n\tstatus: BackgroundTaskStatusTelemetry;\n\tcommand: string;\n\tshellMode: \"shell\" | \"exec\";\n\tcwd?: string;\n\trestartAttempts: number;\n\tlogTruncated: boolean;\n\texitCode?: number | null;\n\tsignal?: string | null;\n\tresourceUsage?: {\n\t\tmaxRssKb?: number;\n\t\tuserMs?: number;\n\t\tsystemMs?: number;\n\t};\n\tfailureReason?: string;\n\tlimitBreach?: {\n\t\tkind: \"memory\" | \"cpu\";\n\t\tlimit: number;\n\t\tactual: number;\n\t};\n}\n\n/**\n * Business metrics for tracking usage patterns.\n * Inspired by Claude Code's telemetry events.\n */\nexport interface BusinessMetricTelemetry extends BaseTelemetryEvent {\n\ttype: \"business-metric\";\n\tmetric:\n\t\t| \"session.count\"\n\t\t| \"session.duration\"\n\t\t| \"session.migration\"\n\t\t| \"lines_of_code.count\"\n\t\t| \"tokens.input\"\n\t\t| \"tokens.output\"\n\t\t| \"tokens.cache_read\"\n\t\t| \"tokens.cache_write\"\n\t\t| \"cost.usd\"\n\t\t| \"compaction.triggered\"\n\t\t| \"model.switch\";\n\tvalue: number;\n\tmetadata?: {\n\t\tsessionId?: string;\n\t\tmodel?: string;\n\t\tprovider?: string;\n\t\tgitBranch?: string;\n\t\tgitCommitSha?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\nexport interface StagedRolloutSurfaceTelemetry extends BaseTelemetryEvent {\n\ttype: \"staged-rollout-surface\";\n\tevent: \"hidden_flag_used\" | \"hidden_mode_used\" | \"internal_gate_used\";\n\tsurfaceId: string;\n\tsurfaceType: \"cli_flag\" | \"mode\" | \"internal_gate\" | \"protocol_capability\";\n\tmetadata?: {\n\t\towner?: string;\n\t\tsource?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\n/**\n * Sandbox violation tracking for security auditing.\n */\nexport interface SandboxViolationTelemetry extends BaseTelemetryEvent {\n\ttype: \"sandbox-violation\";\n\tevent: \"blocked\" | \"warned\" | \"allowed\";\n\ttool: string;\n\taction: string;\n\treason: string;\n\tpath?: string;\n\tcommand?: string;\n\tmetadata?: {\n\t\tsessionId?: string;\n\t\tuserId?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\n/**\n * Subagent dispatch tracking for multi-agent routing and audit.\n */\nexport interface SubagentDispatchTelemetry extends BaseTelemetryEvent {\n\ttype: \"subagent-dispatch\";\n\tevent: \"subagent_dispatched\";\n\tmode: string;\n\tsubagentType: string;\n\tmodel: string;\n\tprovider: string;\n\treasoningEffort: string;\n\tlatencyMs: number;\n\tsuccess: boolean;\n\tsource?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Canonical Turn Event - Wide event emitted once per agent turn.\n * Re-exported from telemetry/wide-events.ts for type union.\n */\nexport interface CanonicalTurnEventBase {\n\ttype: \"canonical-turn\";\n\ttimestamp: string;\n\tsessionId: string;\n\tturnId: string;\n\tturnNumber: number;\n\t[key: string]: unknown;\n}\n\ntype TelemetryEvent =\n\t| ToolExecutionTelemetry\n\t| EvaluationTelemetry\n\t| LoaderStageTelemetry\n\t| SseTelemetry\n\t| BackgroundTaskTelemetry\n\t| ApiRequestTelemetry\n\t| BusinessMetricTelemetry\n\t| StagedRolloutSurfaceTelemetry\n\t| SandboxViolationTelemetry\n\t| SubagentDispatchTelemetry\n\t| CanonicalTurnEventBase\n\t| CanonicalTurnEvent;\n\nconst telemetryFlag =\n\tprocess.env.MAESTRO_TELEMETRY ?? process.env.PLAYWRIGHT_TELEMETRY;\n\nconst telemetryFileEnv =\n\tresolveEnvPath(process.env.MAESTRO_TELEMETRY_FILE) ??\n\tresolveEnvPath(process.env.PLAYWRIGHT_TELEMETRY_FILE);\n\nconst telemetryEndpointEnv =\n\tprocess.env.MAESTRO_TELEMETRY_ENDPOINT ??\n\tprocess.env.PLAYWRIGHT_TELEMETRY_ENDPOINT;\n\nconst telemetrySampleEnv =\n\tprocess.env.MAESTRO_TELEMETRY_SAMPLE ??\n\tprocess.env.PLAYWRIGHT_TELEMETRY_SAMPLE;\n\nconst shouldEnableTelemetry = (): boolean => {\n\tconst flag = telemetryFlag?.toLowerCase();\n\tif (flag === \"0\" || flag === \"false\") {\n\t\treturn false;\n\t}\n\tif (flag === \"1\" || flag === \"true\") {\n\t\treturn true;\n\t}\n\treturn Boolean(\n\t\ttelemetryEndpointEnv || telemetryFileEnv || hasRemoteMeterDestination(),\n\t);\n};\nconst initialTelemetryEnabled = shouldEnableTelemetry();\nlet telemetryEnabled = initialTelemetryEnabled;\nlet telemetryOverride: boolean | null = null;\nlet telemetryOverrideReason: string | undefined;\n\nconst parseSamplingRate = (): number => {\n\tconst raw = telemetrySampleEnv;\n\tif (!raw) {\n\t\treturn 1;\n\t}\n\tconst rate = Number.parseFloat(raw);\n\tif (Number.isNaN(rate)) {\n\t\treturn 1;\n\t}\n\treturn Math.min(Math.max(rate, 0), 1);\n};\n\nconst samplingRate = parseSamplingRate();\n\nconst defaultTelemetryFile = PATHS.TELEMETRY_LOG;\nconst toolFailureLogFile = PATHS.TOOL_FAILURE_LOG;\nconst BACKGROUND_TASK_HISTORY_LIMIT = 50;\nconst backgroundTaskHistory: BackgroundTaskTelemetry[] = [];\n\nexport interface TelemetryStatus {\n\tenabled: boolean;\n\treason: string;\n\tendpoint?: string;\n\tfilePath?: string;\n\tsampleRate: number;\n\tflagValue?: string;\n\truntimeOverride?: \"enabled\" | \"disabled\";\n\toverrideReason?: string;\n}\n\nexport function getTelemetryStatus(): TelemetryStatus {\n\tlet reason = \"disabled\";\n\tconst baseEnabled = initialTelemetryEnabled && samplingRate > 0;\n\tif (!shouldEnableTelemetry()) {\n\t\treason = \"flag disabled\";\n\t} else if (samplingRate === 0) {\n\t\treason = \"sampling=0\";\n\t} else if (telemetryEndpointEnv) {\n\t\treason = \"endpoint\";\n\t} else if (hasRemoteMeterDestination()) {\n\t\treason = \"meter\";\n\t} else if (telemetryFileEnv || baseEnabled) {\n\t\treason = \"file\";\n\t}\n\tconst runtimeOverride =\n\t\ttelemetryOverride === null\n\t\t\t? undefined\n\t\t\t: telemetryOverride\n\t\t\t\t? \"enabled\"\n\t\t\t\t: \"disabled\";\n\n\treturn {\n\t\tenabled: telemetryEnabled && samplingRate > 0,\n\t\treason,\n\t\tendpoint: telemetryEndpointEnv,\n\t\tfilePath: telemetryFileEnv || defaultTelemetryFile,\n\t\tsampleRate: samplingRate,\n\t\tflagValue: telemetryFlag,\n\t\truntimeOverride,\n\t\toverrideReason: telemetryOverrideReason,\n\t};\n}\n\nexport function setTelemetryRuntimeOverride(\n\tenabled: boolean | null,\n\treason?: string,\n): void {\n\ttelemetryOverride = enabled;\n\ttelemetryOverrideReason = reason;\n\ttelemetryEnabled = enabled === null ? initialTelemetryEnabled : enabled;\n}\n\nfunction normalizeTelemetryEventMetadata(\n\tevent: TelemetryEvent,\n): TelemetryEvent {\n\tif (!(\"metadata\" in event) && !(\"sensitiveMetadata\" in event)) {\n\t\treturn event;\n\t}\n\tconst existingMetadata =\n\t\t\"metadata\" in event ? stringRecord(event.metadata) : undefined;\n\tconst existingSensitiveMetadata =\n\t\t\"sensitiveMetadata\" in event\n\t\t\t? stringRecord(event.sensitiveMetadata)\n\t\t\t: undefined;\n\tconst { metadata, sensitiveMetadata } = normalizeTelemetryMetadataInputs(\n\t\texistingMetadata,\n\t\texistingSensitiveMetadata,\n\t);\n\tconst normalized = { ...event };\n\tif (\"metadata\" in normalized) {\n\t\tif (metadata) {\n\t\t\tnormalized.metadata = metadata;\n\t\t} else {\n\t\t\tdelete normalized.metadata;\n\t\t}\n\t}\n\tif (sensitiveMetadata) {\n\t\tnormalized.sensitiveMetadata = sensitiveMetadata;\n\t} else {\n\t\tdelete normalized.sensitiveMetadata;\n\t}\n\treturn normalized;\n}\n\nfunction isCanonicalTurnTelemetryEvent(\n\tevent: TelemetryEvent,\n): event is CanonicalTurnEvent {\n\treturn (\n\t\tevent.type === \"canonical-turn\" && \"model\" in event && \"tokens\" in event\n\t);\n}\n\nasync function writeToFile(payload: string) {\n\tconst filePath = telemetryFileEnv || defaultTelemetryFile;\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tawait appendFile(filePath, `${payload}\\n`, \"utf-8\");\n}\n\nasync function appendToolFailure(payload: string): Promise<void> {\n\tawait mkdir(dirname(toolFailureLogFile), { recursive: true });\n\tawait appendFile(toolFailureLogFile, `${payload}\\n`, \"utf-8\");\n}\n\nasync function postToEndpoint(payload: string) {\n\tconst endpoint = telemetryEndpointEnv;\n\tif (!endpoint) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait fetch(endpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\tbody: payload,\n\t\t});\n\t} catch (_error) {\n\t\t// Swallow telemetry transport errors\n\t}\n}\n\nfunction recordOpenTelemetrySpan(event: TelemetryEvent): void {\n\ttry {\n\t\tconst correlationAttributes = maestroCorrelationSpanAttributes(event);\n\t\tconst tracer = getTelemetryTracer();\n\t\ttracer.startActiveSpan(`telemetry.${event.type}`, (span: Span) => {\n\t\t\tspan.setAttributes({\n\t\t\t\t...correlationAttributes,\n\t\t\t\t\"maestro.telemetry.type\": event.type,\n\t\t\t\t\"maestro.telemetry.timestamp\": event.timestamp,\n\t\t\t});\n\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"tool-execution\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.tool.name\": event.toolName,\n\t\t\t\t\t\t\"maestro.tool.success\": event.success,\n\t\t\t\t\t\t\"maestro.tool.duration_ms\": event.durationMs,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode: event.success ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"evaluation\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.eval.scenario\": event.scenario,\n\t\t\t\t\t\t\"maestro.eval.success\": event.success,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode: event.success ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"loader-stage\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.loader.stage\": event.stage,\n\t\t\t\t\t\t\"maestro.loader.duration_ms\": event.durationMs,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sse\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.sse.sent\": event.sent,\n\t\t\t\t\t\t\"maestro.sse.skipped\": event.skipped,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"background-task\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.background.id\": event.taskId,\n\t\t\t\t\t\t\"maestro.background.event\": event.event,\n\t\t\t\t\t\t\"maestro.background.status\": event.status,\n\t\t\t\t\t\t\"maestro.background.restart_attempts\": event.restartAttempts,\n\t\t\t\t\t\t\"maestro.background.exit_code\": event.exitCode ?? -1,\n\t\t\t\t\t\t\"maestro.background.shell_mode\": event.shellMode,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus(\n\t\t\t\t\t\tevent.failureReason || event.status === \"failed\"\n\t\t\t\t\t\t\t? { code: SpanStatusCode.ERROR, message: event.failureReason }\n\t\t\t\t\t\t\t: { code: SpanStatusCode.OK },\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"api-request\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"http.method\": event.method,\n\t\t\t\t\t\t\"http.route\": event.path,\n\t\t\t\t\t\t\"http.status_code\": event.statusCode,\n\t\t\t\t\t\t\"maestro.api.duration_ms\": event.durationMs,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode:\n\t\t\t\t\t\t\tevent.statusCode >= 500\n\t\t\t\t\t\t\t\t? SpanStatusCode.ERROR\n\t\t\t\t\t\t\t\t: SpanStatusCode.OK,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"business-metric\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.metric.name\": event.metric,\n\t\t\t\t\t\t\"maestro.metric.value\": event.value,\n\t\t\t\t\t});\n\t\t\t\t\tif (event.metadata?.model) {\n\t\t\t\t\t\tspan.setAttribute(\"maestro.metric.model\", event.metadata.model);\n\t\t\t\t\t}\n\t\t\t\t\tif (event.metadata?.provider) {\n\t\t\t\t\t\tspan.setAttribute(\n\t\t\t\t\t\t\t\"maestro.metric.provider\",\n\t\t\t\t\t\t\tevent.metadata.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"staged-rollout-surface\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.staged_rollout.event\": event.event,\n\t\t\t\t\t\t\"maestro.staged_rollout.surface_id\": event.surfaceId,\n\t\t\t\t\t\t\"maestro.staged_rollout.surface_type\": event.surfaceType,\n\t\t\t\t\t});\n\t\t\t\t\tif (event.metadata?.owner) {\n\t\t\t\t\t\tspan.setAttribute(\n\t\t\t\t\t\t\t\"maestro.staged_rollout.owner\",\n\t\t\t\t\t\t\tString(event.metadata.owner),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sandbox-violation\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.sandbox.event\": event.event,\n\t\t\t\t\t\t\"maestro.sandbox.tool\": event.tool,\n\t\t\t\t\t\t\"maestro.sandbox.action\": event.action,\n\t\t\t\t\t\t\"maestro.sandbox.reason\": event.reason,\n\t\t\t\t\t});\n\t\t\t\t\tif (event.path) {\n\t\t\t\t\t\tspan.setAttribute(\"maestro.sandbox.path\", event.path);\n\t\t\t\t\t}\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode:\n\t\t\t\t\t\t\tevent.event === \"blocked\"\n\t\t\t\t\t\t\t\t? SpanStatusCode.ERROR\n\t\t\t\t\t\t\t\t: SpanStatusCode.OK,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"subagent-dispatch\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.subagent.event\": event.event,\n\t\t\t\t\t\t\"maestro.subagent.mode\": event.mode,\n\t\t\t\t\t\t\"maestro.subagent.type\": event.subagentType,\n\t\t\t\t\t\t\"maestro.subagent.reasoning_effort\": event.reasoningEffort,\n\t\t\t\t\t\t\"maestro.subagent.source\": event.source ?? \"unknown\",\n\t\t\t\t\t\t\"maestro.subagent.success\": event.success,\n\t\t\t\t\t\t\"maestro.subagent.latency_ms\": event.latencyMs,\n\t\t\t\t\t\t\"llm.model.id\": event.model,\n\t\t\t\t\t\t\"llm.model.provider\": event.provider,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode: event.success ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"canonical-turn\": {\n\t\t\t\t\tconst canonicalTurn = isCanonicalTurnTelemetryEvent(event)\n\t\t\t\t\t\t? event\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.turn.id\": event.turnId,\n\t\t\t\t\t\t\"maestro.turn.number\": event.turnNumber,\n\t\t\t\t\t\t\"maestro.turn.session_id\": event.sessionId,\n\t\t\t\t\t\t\"agent.session.id\": event.sessionId,\n\t\t\t\t\t\t...(canonicalTurn\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\"llm.model.id\": canonicalTurn.model.id,\n\t\t\t\t\t\t\t\t\t\"llm.model.provider\": canonicalTurn.model.provider,\n\t\t\t\t\t\t\t\t\t\"llm.usage.input_tokens\": canonicalTurn.tokens.input,\n\t\t\t\t\t\t\t\t\t\"llm.usage.output_tokens\": canonicalTurn.tokens.output,\n\t\t\t\t\t\t\t\t\t\"llm.usage.cache_read_tokens\": canonicalTurn.tokens.cacheRead,\n\t\t\t\t\t\t\t\t\t\"llm.usage.cache_write_tokens\":\n\t\t\t\t\t\t\t\t\t\tcanonicalTurn.tokens.cacheWrite,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\"maestro.turn.status\": String(\n\t\t\t\t\t\t\t\"status\" in event ? event.status : \"unknown\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.tool_count\": Number(\n\t\t\t\t\t\t\t\"toolCount\" in event ? event.toolCount : 0,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.total_duration_ms\": Number(\n\t\t\t\t\t\t\t\"totalDurationMs\" in event ? event.totalDurationMs : 0,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.cost_usd\": Number(\n\t\t\t\t\t\t\t\"costUsd\" in event ? event.costUsd : 0,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.sampled\": Boolean(\n\t\t\t\t\t\t\t\"sampled\" in event ? event.sampled : true,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode:\n\t\t\t\t\t\t\t\"status\" in event && event.status === \"error\"\n\t\t\t\t\t\t\t\t? SpanStatusCode.ERROR\n\t\t\t\t\t\t\t\t: SpanStatusCode.OK,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.UNSET });\n\t\t\t}\n\n\t\t\tif (\"metadata\" in event && event.metadata) {\n\t\t\t\tspan.setAttributes({ \"maestro.telemetry.has_metadata\": true });\n\t\t\t}\n\n\t\t\tspan.end();\n\t\t});\n\t} catch {\n\t\t// Never let tracing failures affect runtime\n\t}\n}\n\nfunction recordOpenTelemetryMetric(event: TelemetryEvent): void {\n\ttry {\n\t\tswitch (event.type) {\n\t\t\tcase \"tool-execution\":\n\t\t\t\trecordToolInvocationMetric({\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\tdurationMs: event.durationMs,\n\t\t\t\t\tsuccess: event.success,\n\t\t\t\t\tagentRunId: metadataString(event.metadata, [\n\t\t\t\t\t\t\"agentRunId\",\n\t\t\t\t\t\t\"agent_run_id\",\n\t\t\t\t\t]),\n\t\t\t\t\tskillName: skillNameFromMetadata(event.metadata),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"business-metric\":\n\t\t\t\tif (event.metric === \"compaction.triggered\") {\n\t\t\t\t\trecordCompactionMetric({\n\t\t\t\t\t\t\"maestro.session_id\": event.metadata?.sessionId,\n\t\t\t\t\t\t\"llm.model.id\": event.metadata?.model,\n\t\t\t\t\t\t\"llm.model.provider\": event.metadata?.provider,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"subagent-dispatch\":\n\t\t\t\trecordSubagentDispatchMetric({\n\t\t\t\t\tmode: event.mode,\n\t\t\t\t\tsubagentType: event.subagentType,\n\t\t\t\t\tprovider: event.provider,\n\t\t\t\t\tmodel: event.model,\n\t\t\t\t\treasoningEffort: event.reasoningEffort,\n\t\t\t\t\tsource: event.source,\n\t\t\t\t\tsuccess: event.success,\n\t\t\t\t\tlatencyMs: event.latencyMs,\n\t\t\t\t\tagentRunId: metadataString(event.metadata, [\n\t\t\t\t\t\t\"agentRunId\",\n\t\t\t\t\t\t\"agent_run_id\",\n\t\t\t\t\t]),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t} catch {\n\t\t// Never let metric recording affect runtime behavior.\n\t}\n}\n\nfunction stringRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction skillNameFromMetadata(\n\tmetadata: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn (\n\t\tmetadataString(metadata, [\"skillName\", \"skill_name\"]) ??\n\t\tmetadataString(stringRecord(metadata?.skillMetadata), [\"name\"]) ??\n\t\tmetadataString(stringRecord(metadata?.skill_metadata), [\"name\"])\n\t);\n}\n\nfunction metadataString(\n\trecord: Record<string, unknown> | undefined,\n\tkeys: string[],\n): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = record?.[key];\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction eventCorrelationOverrides(\n\tevent: TelemetryEvent,\n): Partial<MaestroCorrelation> {\n\tconst metadata = stringRecord(\n\t\t\"metadata\" in event ? event.metadata : undefined,\n\t);\n\tconst topLevelTraceId =\n\t\t\"traceId\" in event &&\n\t\ttypeof event.traceId === \"string\" &&\n\t\tevent.traceId.trim().length > 0\n\t\t\t? event.traceId\n\t\t\t: undefined;\n\treturn {\n\t\torganization_id: metadataString(metadata, [\n\t\t\t\"organizationId\",\n\t\t\t\"organization_id\",\n\t\t\t\"orgId\",\n\t\t\t\"org_id\",\n\t\t]),\n\t\tuser_id: metadataString(metadata, [\"userId\", \"user_id\"]),\n\t\tworkspace_id: metadataString(metadata, [\"workspaceId\", \"workspace_id\"]),\n\t\tsession_id:\n\t\t\t(\"sessionId\" in event && typeof event.sessionId === \"string\"\n\t\t\t\t? event.sessionId\n\t\t\t\t: undefined) ??\n\t\t\tmetadataString(metadata, [\n\t\t\t\t\"sessionId\",\n\t\t\t\t\"session_id\",\n\t\t\t\t\"maestroSessionId\",\n\t\t\t\t\"maestro_session_id\",\n\t\t\t]),\n\t\tagent_run_id: metadataString(metadata, [\"agentRunId\", \"agent_run_id\"]),\n\t\tagent_run_step_id: metadataString(metadata, [\n\t\t\t\"agentRunStepId\",\n\t\t\t\"agent_run_step_id\",\n\t\t\t\"toolCallId\",\n\t\t\t\"tool_call_id\",\n\t\t]),\n\t\tagent_id: metadataString(metadata, [\"agentId\", \"agent_id\"]),\n\t\tactor_id: metadataString(metadata, [\"actorId\", \"actor_id\"]),\n\t\tprincipal_id: metadataString(metadata, [\"principalId\", \"principal_id\"]),\n\t\ttrace_id:\n\t\t\ttopLevelTraceId ?? metadataString(metadata, [\"traceId\", \"trace_id\"]),\n\t\ttraceparent: metadataString(metadata, [\"traceparent\", \"trace_parent\"]),\n\t\ttracestate: metadataString(metadata, [\"tracestate\", \"trace_state\"]),\n\t\trequest_id: metadataString(metadata, [\"requestId\", \"request_id\"]),\n\t\tremote_runner_session_id: metadataString(metadata, [\n\t\t\t\"remoteRunnerSessionId\",\n\t\t\t\"remote_runner_session_id\",\n\t\t]),\n\t\tobjective_id: metadataString(metadata, [\"objectiveId\", \"objective_id\"]),\n\t\tconversation_id: metadataString(metadata, [\n\t\t\t\"conversationId\",\n\t\t\t\"conversation_id\",\n\t\t]),\n\t};\n}\n\nfunction maestroCorrelationSpanAttributes(\n\tevent: TelemetryEvent,\n): Record<string, string> {\n\tconst config = resolveMaestroEventBusConfig();\n\tconst overrides = eventCorrelationOverrides(event);\n\tconst correlation = {\n\t\t...config.defaultCorrelation,\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(overrides).filter(([, value]) => value !== undefined),\n\t\t),\n\t};\n\tconst principal = config.defaultPrincipal;\n\tconst attributes: Record<string, string | undefined> = {\n\t\t\"enduser.id\": correlation.user_id ?? principal?.user_id,\n\t\t\"user.id\": correlation.user_id ?? principal?.user_id,\n\t\t\"agent.user.id\": correlation.user_id ?? principal?.user_id,\n\t\t\"organization.id\":\n\t\t\tcorrelation.organization_id ?? principal?.organization_id,\n\t\t\"evalops.organization_id\":\n\t\t\tcorrelation.organization_id ?? principal?.organization_id,\n\t\t\"workspace.id\": correlation.workspace_id ?? principal?.workspace_id,\n\t\t\"evalops.workspace_id\": correlation.workspace_id ?? principal?.workspace_id,\n\t\t\"maestro.session_id\": correlation.session_id,\n\t\t\"agent.id\": correlation.agent_id,\n\t\t\"agent.actor.id\": correlation.actor_id,\n\t\t\"evalops.principal_id\": correlation.principal_id,\n\t\t\"maestro.agent_run_id\": correlation.agent_run_id,\n\t\t\"maestro.agent_run_step_id\": correlation.agent_run_step_id,\n\t\t\"trace.id\": correlation.trace_id,\n\t\ttraceparent: correlation.traceparent,\n\t\ttracestate: correlation.tracestate,\n\t\t\"request.id\": correlation.request_id,\n\t\t\"evalops.remote_runner_session_id\": correlation.remote_runner_session_id,\n\t\t\"evalops.objective_id\": correlation.objective_id,\n\t\t\"evalops.conversation_id\": correlation.conversation_id,\n\t\t\"maestro.surface\": config.defaultSurface,\n\t};\n\n\treturn Object.fromEntries(\n\t\tObject.entries(attributes).filter(\n\t\t\t(entry): entry is [string, string] =>\n\t\t\t\ttypeof entry[1] === \"string\" &&\n\t\t\t\tentry[1].trim().length > 0 &&\n\t\t\t\tentry[1] !== \"unknown\",\n\t\t),\n\t);\n}\n\nasync function persistTelemetry(event: TelemetryEvent) {\n\tconst payload = JSON.stringify(event);\n\tconst tasks: Promise<void>[] = [];\n\n\tif (isCanonicalTurnTelemetryEvent(event)) {\n\t\ttasks.push(mirrorCanonicalTurnEventToMeter(event).then(() => undefined));\n\t}\n\n\tif (telemetryEndpointEnv) {\n\t\ttasks.push(postToEndpoint(payload));\n\t}\n\n\tif (telemetryEndpointEnv === undefined) {\n\t\t// Default to file storage when no endpoint is configured\n\t\ttasks.push(writeToFile(payload));\n\t} else if (telemetryFileEnv) {\n\t\ttasks.push(writeToFile(payload));\n\t}\n\n\tawait Promise.all(tasks);\n}\n\nfunction cloneBackgroundTaskTelemetry(\n\tevent: BackgroundTaskTelemetry,\n): BackgroundTaskTelemetry {\n\treturn {\n\t\t...event,\n\t\tresourceUsage: event.resourceUsage ? { ...event.resourceUsage } : undefined,\n\t\tlimitBreach: event.limitBreach ? { ...event.limitBreach } : undefined,\n\t};\n}\n\nfunction recordBackgroundHistory(event: BackgroundTaskTelemetry): void {\n\tbackgroundTaskHistory.push(cloneBackgroundTaskTelemetry(event));\n\tif (backgroundTaskHistory.length > BACKGROUND_TASK_HISTORY_LIMIT) {\n\t\tbackgroundTaskHistory.shift();\n\t}\n}\n\nexport function getBackgroundTaskHistory(\n\tlimit = 10,\n): BackgroundTaskTelemetry[] {\n\tif (limit <= 0) {\n\t\treturn [];\n\t}\n\treturn backgroundTaskHistory\n\t\t.slice(-limit)\n\t\t.map((entry) => cloneBackgroundTaskTelemetry(entry));\n}\n\nexport async function recordTelemetry(event: TelemetryEvent): Promise<void> {\n\tif (isInternalTelemetryDisabled()) {\n\t\treturn;\n\t}\n\n\tconst normalizedEvent = normalizeTelemetryEventMetadata(event);\n\tconst openTelemetryEnabled = isOpenTelemetryEnabled();\n\tif (openTelemetryEnabled) {\n\t\trecordOpenTelemetrySpan(normalizedEvent);\n\t\trecordOpenTelemetryMetric(normalizedEvent);\n\t}\n\tconst eventBusTask = mirrorTelemetryToMaestroEventBus(normalizedEvent);\n\n\tconst legacyEnabled = telemetryEnabled && samplingRate > 0;\n\tif (!legacyEnabled) {\n\t\tawait eventBusTask;\n\t\treturn;\n\t}\n\n\tif (samplingRate < 1 && Math.random() > samplingRate) {\n\t\tawait eventBusTask;\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait Promise.all([persistTelemetry(normalizedEvent), eventBusTask]);\n\t} catch (_error) {\n\t\t// Ignore telemetry persistence failures\n\t}\n}\n\nexport function recordToolExecution(\n\ttoolName: string,\n\tsuccess: boolean,\n\tdurationMs: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"tool-execution\",\n\t\ttimestamp: new Date().toISOString(),\n\t\ttoolName,\n\t\tsuccess,\n\t\tdurationMs,\n\t\tmetadata,\n\t});\n}\n\nexport function recordEvaluationResult(\n\tscenario: string,\n\tsuccess: boolean,\n\tdetails?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"evaluation\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tscenario,\n\t\tsuccess,\n\t\tdetails,\n\t});\n}\n\nexport function recordLoaderStage(\n\tstage: string,\n\tdurationMs: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"loader-stage\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tstage,\n\t\tdurationMs,\n\t\tmetadata,\n\t});\n}\n\nexport function recordSseSkip(\n\tsent: number,\n\tskipped: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"sse\",\n\t\tevent: \"skip\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tsent,\n\t\tskipped,\n\t\tmetadata,\n\t});\n}\n\nexport function logToolFailure(\n\ttoolName: string,\n\terrorMessage: string,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tconst payload = {\n\t\ttool: toolName,\n\t\terror: errorMessage,\n\t\tmetadata,\n\t\ttimestamp: new Date().toISOString(),\n\t};\n\tvoid appendToolFailure(JSON.stringify(payload));\n}\n\nexport function recordBackgroundTaskEvent(\n\tevent: Omit<BackgroundTaskTelemetry, \"type\" | \"timestamp\">,\n): void {\n\tconst sanitizedCommand = sanitizeWithStaticMask(event.command);\n\tconst sanitizedFailure = sanitizeOptionalWithStaticMask(event.failureReason);\n\tconst payload: BackgroundTaskTelemetry = {\n\t\t...event,\n\t\tcommand: sanitizedCommand,\n\t\tfailureReason: sanitizedFailure,\n\t\ttype: \"background-task\",\n\t\ttimestamp: new Date().toISOString(),\n\t};\n\trecordBackgroundHistory(payload);\n\tvoid recordTelemetry(payload);\n}\n\nexport function recordApiRequest(\n\tmethod: string,\n\tpath: string,\n\tstatusCode: number,\n\tdurationMs: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"api-request\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tmethod,\n\t\tpath,\n\t\tstatusCode,\n\t\tdurationMs,\n\t\tmetadata,\n\t});\n}\n\n/**\n * Record a business metric for usage tracking.\n */\nexport function recordBusinessMetric(\n\tmetric: BusinessMetricTelemetry[\"metric\"],\n\tvalue: number,\n\tmetadata?: BusinessMetricTelemetry[\"metadata\"],\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"business-metric\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tmetric,\n\t\tvalue,\n\t\tmetadata,\n\t});\n}\n\n/**\n * Record session start.\n */\nexport function recordSessionStart(\n\tsessionId: string,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"session.count\", 1, { ...metadata, sessionId });\n}\n\n/**\n * Record session duration on end.\n */\nexport function recordSessionDuration(\n\tsessionId: string,\n\tdurationMs: number,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): Promise<void> {\n\treturn recordTelemetry({\n\t\ttype: \"business-metric\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tmetric: \"session.duration\",\n\t\tvalue: durationMs,\n\t\tmetadata: {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t},\n\t});\n}\n\n/**\n * Record token usage metrics.\n */\nexport function recordTokenUsage(\n\tsessionId: string,\n\ttokens: {\n\t\tinput?: number;\n\t\toutput?: number;\n\t\tcacheRead?: number;\n\t\tcacheWrite?: number;\n\t},\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\tif (tokens.input !== undefined && tokens.input > 0) {\n\t\trecordBusinessMetric(\"tokens.input\", tokens.input, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n\tif (tokens.output !== undefined && tokens.output > 0) {\n\t\trecordBusinessMetric(\"tokens.output\", tokens.output, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n\tif (tokens.cacheRead !== undefined && tokens.cacheRead > 0) {\n\t\trecordBusinessMetric(\"tokens.cache_read\", tokens.cacheRead, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n\tif (tokens.cacheWrite !== undefined && tokens.cacheWrite > 0) {\n\t\trecordBusinessMetric(\"tokens.cache_write\", tokens.cacheWrite, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n}\n\n/**\n * Record cost in USD.\n */\nexport function recordCost(\n\tsessionId: string,\n\tcostUsd: number,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"cost.usd\", costUsd, { ...metadata, sessionId });\n}\n\n/**\n * Record compaction event.\n */\nexport function recordCompaction(\n\tsessionId: string,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"compaction.triggered\", 1, { ...metadata, sessionId });\n}\n\n/**\n * Record model switch.\n */\nexport function recordModelSwitch(\n\tsessionId: string,\n\tfromModel: string,\n\ttoModel: string,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"model.switch\", 1, {\n\t\t...metadata,\n\t\tsessionId,\n\t\tmodel: toModel,\n\t\tpreviousModel: fromModel,\n\t});\n}\n\nexport function recordStagedRolloutSurfaceUsage(\n\tevent: StagedRolloutSurfaceTelemetry[\"event\"],\n\toptions: {\n\t\tsurfaceId: string;\n\t\tsurfaceType: StagedRolloutSurfaceTelemetry[\"surfaceType\"];\n\t\towner?: string;\n\t\tsource?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t},\n): Promise<void> {\n\treturn recordTelemetry({\n\t\ttype: \"staged-rollout-surface\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tevent,\n\t\tsurfaceId: options.surfaceId,\n\t\tsurfaceType: options.surfaceType,\n\t\tmetadata: {\n\t\t\t...options.metadata,\n\t\t\towner: options.owner,\n\t\t\tsource: options.source,\n\t\t},\n\t});\n}\n\nexport function recordSubagentDispatch(\n\tevent: Omit<SubagentDispatchTelemetry, \"type\" | \"timestamp\" | \"event\">,\n): void {\n\tvoid recordTelemetry({\n\t\t...event,\n\t\ttype: \"subagent-dispatch\",\n\t\tevent: \"subagent_dispatched\",\n\t\ttimestamp: new Date().toISOString(),\n\t});\n}\n\n/**\n * Record session migration stats.\n */\nexport function recordSessionMigration(stats: {\n\ttotal: number;\n\tmigrated: number;\n\tskipped: number;\n\tfailures: number;\n\tversion: number;\n}): void {\n\trecordBusinessMetric(\"session.migration\", stats.total, {\n\t\tmigrated: stats.migrated,\n\t\tskipped: stats.skipped,\n\t\tfailures: stats.failures,\n\t\tversion: stats.version,\n\t});\n}\n\n/**\n * Record a sandbox violation event.\n */\nexport function recordSandboxViolation(\n\tevent: SandboxViolationTelemetry[\"event\"],\n\ttool: string,\n\taction: string,\n\treason: string,\n\toptions?: {\n\t\tpath?: string;\n\t\tcommand?: string;\n\t\tsessionId?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t},\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"sandbox-violation\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tevent,\n\t\ttool,\n\t\taction,\n\t\treason,\n\t\tpath: options?.path,\n\t\tcommand: options?.command\n\t\t\t? sanitizeWithStaticMask(options.command)\n\t\t\t: undefined,\n\t\tmetadata: options?.metadata\n\t\t\t? { ...options.metadata, sessionId: options.sessionId }\n\t\t\t: options?.sessionId\n\t\t\t\t? { sessionId: options.sessionId }\n\t\t\t\t: undefined,\n\t});\n}\n\n// Initialize the wide-events telemetry recorder to break circular dependency\nsetDefaultTelemetryRecorder(recordTelemetry);\n"]}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { type Span, SpanStatusCode } from \"@opentelemetry/api\";\n\nimport { PATHS } from \"./config/constants.js\";\nimport {\n\tgetTelemetryTracer,\n\tinitOpenTelemetry,\n\tisOpenTelemetryEnabled,\n} from \"./opentelemetry.js\";\nimport { isInternalTelemetryDisabled } from \"./telemetry/disablement.js\";\nimport {\n\ttype MaestroCorrelation,\n\tmirrorTelemetryToMaestroEventBus,\n\trecordMaestroA2ADelegationEvent,\n\tresolveMaestroEventBusConfig,\n} from \"./telemetry/maestro-event-bus.js\";\nimport { MaestroBusEventType } from \"./telemetry/maestro-event-catalog.js\";\nimport { normalizeTelemetryMetadataInputs } from \"./telemetry/metadata-normalization.js\";\nimport {\n\thasRemoteMeterDestination,\n\tmirrorCanonicalTurnEventToMeter,\n} from \"./telemetry/meter-service-client.js\";\nimport {\n\trecordA2ADelegationMetric,\n\trecordA2APeerExclusionMetric,\n\trecordA2APolicyDenialMetric,\n\trecordCompactionMetric,\n\trecordSubagentDispatchMetric,\n\trecordToolInvocationMetric,\n} from \"./telemetry/metrics.js\";\nimport {\n\ttype CanonicalTurnEvent,\n\tsetDefaultTelemetryRecorder,\n} from \"./telemetry/wide-events.js\";\nimport { resolveEnvPath } from \"./utils/path-expansion.js\";\nimport {\n\tsanitizeOptionalWithStaticMask,\n\tsanitizeWithStaticMask,\n} from \"./utils/secret-redactor.js\";\n\nexport { splitTelemetryMetadata } from \"./telemetry/metadata-normalization.js\";\n\ntype BaseTelemetryEvent = {\n\ttype:\n\t\t| \"tool-execution\"\n\t\t| \"evaluation\"\n\t\t| \"loader-stage\"\n\t\t| \"sse\"\n\t\t| \"background-task\"\n\t\t| \"api-request\"\n\t\t| \"business-metric\"\n\t\t| \"staged-rollout-surface\"\n\t\t| \"sandbox-violation\"\n\t\t| \"subagent-dispatch\";\n\ttimestamp: string;\n\tsensitiveMetadata?: Record<string, unknown>;\n};\n\nexport interface ApiRequestTelemetry extends BaseTelemetryEvent {\n\ttype: \"api-request\";\n\tmethod: string;\n\tpath: string;\n\tstatusCode: number;\n\tdurationMs: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface ToolExecutionTelemetry extends BaseTelemetryEvent {\n\ttype: \"tool-execution\";\n\ttoolName: string;\n\tsuccess: boolean;\n\tdurationMs: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface EvaluationTelemetry extends BaseTelemetryEvent {\n\ttype: \"evaluation\";\n\tscenario: string;\n\tsuccess: boolean;\n\tdetails?: Record<string, unknown>;\n}\n\nexport interface LoaderStageTelemetry extends BaseTelemetryEvent {\n\ttype: \"loader-stage\";\n\tstage: string;\n\tdurationMs: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface SseTelemetry extends BaseTelemetryEvent {\n\ttype: \"sse\";\n\tevent: \"skip\";\n\tsent: number;\n\tskipped: number;\n\tmetadata?: Record<string, unknown>;\n}\n\ntype BackgroundTaskStatusTelemetry =\n\t| \"running\"\n\t| \"restarting\"\n\t| \"failed\"\n\t| \"exited\"\n\t| \"stopped\";\n\nexport interface BackgroundTaskTelemetry extends BaseTelemetryEvent {\n\ttype: \"background-task\";\n\tevent: \"started\" | \"restarted\" | \"exited\" | \"failed\" | \"stopped\";\n\ttaskId: string;\n\tstatus: BackgroundTaskStatusTelemetry;\n\tcommand: string;\n\tshellMode: \"shell\" | \"exec\";\n\tcwd?: string;\n\trestartAttempts: number;\n\tlogTruncated: boolean;\n\texitCode?: number | null;\n\tsignal?: string | null;\n\tresourceUsage?: {\n\t\tmaxRssKb?: number;\n\t\tuserMs?: number;\n\t\tsystemMs?: number;\n\t};\n\tfailureReason?: string;\n\tlimitBreach?: {\n\t\tkind: \"memory\" | \"cpu\";\n\t\tlimit: number;\n\t\tactual: number;\n\t};\n}\n\n/**\n * Business metrics for tracking usage patterns.\n * Inspired by Claude Code's telemetry events.\n */\nexport interface BusinessMetricTelemetry extends BaseTelemetryEvent {\n\ttype: \"business-metric\";\n\tmetric:\n\t\t| \"session.count\"\n\t\t| \"session.duration\"\n\t\t| \"session.migration\"\n\t\t| \"lines_of_code.count\"\n\t\t| \"tokens.input\"\n\t\t| \"tokens.output\"\n\t\t| \"tokens.cache_read\"\n\t\t| \"tokens.cache_write\"\n\t\t| \"cost.usd\"\n\t\t| \"compaction.triggered\"\n\t\t| \"model.switch\";\n\tvalue: number;\n\tmetadata?: {\n\t\tsessionId?: string;\n\t\tmodel?: string;\n\t\tprovider?: string;\n\t\tgitBranch?: string;\n\t\tgitCommitSha?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\nexport interface StagedRolloutSurfaceTelemetry extends BaseTelemetryEvent {\n\ttype: \"staged-rollout-surface\";\n\tevent: \"hidden_flag_used\" | \"hidden_mode_used\" | \"internal_gate_used\";\n\tsurfaceId: string;\n\tsurfaceType: \"cli_flag\" | \"mode\" | \"internal_gate\" | \"protocol_capability\";\n\tmetadata?: {\n\t\towner?: string;\n\t\tsource?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\n/**\n * Sandbox violation tracking for security auditing.\n */\nexport interface SandboxViolationTelemetry extends BaseTelemetryEvent {\n\ttype: \"sandbox-violation\";\n\tevent: \"blocked\" | \"warned\" | \"allowed\";\n\ttool: string;\n\taction: string;\n\treason: string;\n\tpath?: string;\n\tcommand?: string;\n\tmetadata?: {\n\t\tsessionId?: string;\n\t\tuserId?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\n/**\n * Subagent dispatch tracking for multi-agent routing and audit.\n */\nexport interface SubagentDispatchTelemetry extends BaseTelemetryEvent {\n\ttype: \"subagent-dispatch\";\n\tevent: \"subagent_dispatched\";\n\tmode: string;\n\tsubagentType: string;\n\tmodel: string;\n\tprovider: string;\n\treasoningEffort: string;\n\tlatencyMs: number;\n\tsuccess: boolean;\n\tsource?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport type A2ADelegationTelemetryPhase =\n\t| \"peer_selected\"\n\t| \"task_dispatched\"\n\t| \"task_progress\"\n\t| \"task_completed\"\n\t| \"task_failed\"\n\t| \"task_cancelled\"\n\t| \"push_received\"\n\t| \"evidence_completed\";\n\nexport interface A2ADelegationTelemetryInput {\n\tphase: A2ADelegationTelemetryPhase;\n\tswarmId: string;\n\tlaneId: string;\n\tparentTaskId: string;\n\ta2aTaskId?: string;\n\ta2aMessageId?: string;\n\tcontextId?: string;\n\tpeerAgentId?: string;\n\tpeerName?: string;\n\tpeerEndpointUrl?: string;\n\tpeerEndpointHash?: string;\n\tpeerEndpointKind?: string;\n\tskillId?: string;\n\ttaskClass?: string;\n\tsource?: string;\n\tstatus?: string;\n\tterminal?: boolean;\n\tsuccess?: boolean;\n\tlatencyMs?: number;\n\tdurationMs?: number;\n\ttaskDurationMs?: number;\n\tpushLagMs?: number;\n\tevidence?: Record<string, unknown>;\n\tmetadata?: Record<string, unknown>;\n\tcorrelation?: Partial<MaestroCorrelation>;\n\toccurredAt?: string;\n\tenv?: NodeJS.ProcessEnv;\n}\n\n/**\n * Canonical Turn Event - Wide event emitted once per agent turn.\n * Re-exported from telemetry/wide-events.ts for type union.\n */\nexport interface CanonicalTurnEventBase {\n\ttype: \"canonical-turn\";\n\ttimestamp: string;\n\tsessionId: string;\n\tturnId: string;\n\tturnNumber: number;\n\t[key: string]: unknown;\n}\n\ntype TelemetryEvent =\n\t| ToolExecutionTelemetry\n\t| EvaluationTelemetry\n\t| LoaderStageTelemetry\n\t| SseTelemetry\n\t| BackgroundTaskTelemetry\n\t| ApiRequestTelemetry\n\t| BusinessMetricTelemetry\n\t| StagedRolloutSurfaceTelemetry\n\t| SandboxViolationTelemetry\n\t| SubagentDispatchTelemetry\n\t| CanonicalTurnEventBase\n\t| CanonicalTurnEvent;\n\nconst telemetryFlag =\n\tprocess.env.MAESTRO_TELEMETRY ?? process.env.PLAYWRIGHT_TELEMETRY;\n\nconst telemetryFileEnv =\n\tresolveEnvPath(process.env.MAESTRO_TELEMETRY_FILE) ??\n\tresolveEnvPath(process.env.PLAYWRIGHT_TELEMETRY_FILE);\n\nconst telemetryEndpointEnv =\n\tprocess.env.MAESTRO_TELEMETRY_ENDPOINT ??\n\tprocess.env.PLAYWRIGHT_TELEMETRY_ENDPOINT;\n\nconst telemetrySampleEnv =\n\tprocess.env.MAESTRO_TELEMETRY_SAMPLE ??\n\tprocess.env.PLAYWRIGHT_TELEMETRY_SAMPLE;\n\nconst shouldEnableTelemetry = (): boolean => {\n\tconst flag = telemetryFlag?.toLowerCase();\n\tif (flag === \"0\" || flag === \"false\") {\n\t\treturn false;\n\t}\n\tif (flag === \"1\" || flag === \"true\") {\n\t\treturn true;\n\t}\n\treturn Boolean(\n\t\ttelemetryEndpointEnv || telemetryFileEnv || hasRemoteMeterDestination(),\n\t);\n};\nconst initialTelemetryEnabled = shouldEnableTelemetry();\nlet telemetryEnabled = initialTelemetryEnabled;\nlet telemetryOverride: boolean | null = null;\nlet telemetryOverrideReason: string | undefined;\n\nconst A2A_PHASE_EVENT_TYPES: Record<\n\tA2ADelegationTelemetryPhase,\n\tMaestroBusEventType\n> = {\n\tpeer_selected: MaestroBusEventType.A2APeerSelected,\n\ttask_dispatched: MaestroBusEventType.A2ATaskDispatched,\n\ttask_progress: MaestroBusEventType.A2ATaskProgress,\n\ttask_completed: MaestroBusEventType.A2ATaskCompleted,\n\ttask_failed: MaestroBusEventType.A2ATaskFailed,\n\ttask_cancelled: MaestroBusEventType.A2ATaskCancelled,\n\tpush_received: MaestroBusEventType.A2APushReceived,\n\tevidence_completed: MaestroBusEventType.A2AEvidenceCompleted,\n};\n\nconst parseSamplingRate = (): number => {\n\tconst raw = telemetrySampleEnv;\n\tif (!raw) {\n\t\treturn 1;\n\t}\n\tconst rate = Number.parseFloat(raw);\n\tif (Number.isNaN(rate)) {\n\t\treturn 1;\n\t}\n\treturn Math.min(Math.max(rate, 0), 1);\n};\n\nconst samplingRate = parseSamplingRate();\n\nconst defaultTelemetryFile = PATHS.TELEMETRY_LOG;\nconst toolFailureLogFile = PATHS.TOOL_FAILURE_LOG;\nconst BACKGROUND_TASK_HISTORY_LIMIT = 50;\nconst backgroundTaskHistory: BackgroundTaskTelemetry[] = [];\n\nexport interface TelemetryStatus {\n\tenabled: boolean;\n\treason: string;\n\tendpoint?: string;\n\tfilePath?: string;\n\tsampleRate: number;\n\tflagValue?: string;\n\truntimeOverride?: \"enabled\" | \"disabled\";\n\toverrideReason?: string;\n}\n\nexport function getTelemetryStatus(): TelemetryStatus {\n\tlet reason = \"disabled\";\n\tconst baseEnabled = initialTelemetryEnabled && samplingRate > 0;\n\tif (!shouldEnableTelemetry()) {\n\t\treason = \"flag disabled\";\n\t} else if (samplingRate === 0) {\n\t\treason = \"sampling=0\";\n\t} else if (telemetryEndpointEnv) {\n\t\treason = \"endpoint\";\n\t} else if (hasRemoteMeterDestination()) {\n\t\treason = \"meter\";\n\t} else if (telemetryFileEnv || baseEnabled) {\n\t\treason = \"file\";\n\t}\n\tconst runtimeOverride =\n\t\ttelemetryOverride === null\n\t\t\t? undefined\n\t\t\t: telemetryOverride\n\t\t\t\t? \"enabled\"\n\t\t\t\t: \"disabled\";\n\n\treturn {\n\t\tenabled: telemetryEnabled && samplingRate > 0,\n\t\treason,\n\t\tendpoint: telemetryEndpointEnv,\n\t\tfilePath: telemetryFileEnv || defaultTelemetryFile,\n\t\tsampleRate: samplingRate,\n\t\tflagValue: telemetryFlag,\n\t\truntimeOverride,\n\t\toverrideReason: telemetryOverrideReason,\n\t};\n}\n\nexport function setTelemetryRuntimeOverride(\n\tenabled: boolean | null,\n\treason?: string,\n): void {\n\ttelemetryOverride = enabled;\n\ttelemetryOverrideReason = reason;\n\ttelemetryEnabled = enabled === null ? initialTelemetryEnabled : enabled;\n}\n\nfunction normalizeTelemetryEventMetadata(\n\tevent: TelemetryEvent,\n): TelemetryEvent {\n\tif (!(\"metadata\" in event) && !(\"sensitiveMetadata\" in event)) {\n\t\treturn event;\n\t}\n\tconst existingMetadata =\n\t\t\"metadata\" in event ? stringRecord(event.metadata) : undefined;\n\tconst existingSensitiveMetadata =\n\t\t\"sensitiveMetadata\" in event\n\t\t\t? stringRecord(event.sensitiveMetadata)\n\t\t\t: undefined;\n\tconst { metadata, sensitiveMetadata } = normalizeTelemetryMetadataInputs(\n\t\texistingMetadata,\n\t\texistingSensitiveMetadata,\n\t);\n\tconst normalized = { ...event };\n\tif (\"metadata\" in normalized) {\n\t\tif (metadata) {\n\t\t\tnormalized.metadata = metadata;\n\t\t} else {\n\t\t\tdelete normalized.metadata;\n\t\t}\n\t}\n\tif (sensitiveMetadata) {\n\t\tnormalized.sensitiveMetadata = sensitiveMetadata;\n\t} else {\n\t\tdelete normalized.sensitiveMetadata;\n\t}\n\treturn normalized;\n}\n\nfunction isCanonicalTurnTelemetryEvent(\n\tevent: TelemetryEvent,\n): event is CanonicalTurnEvent {\n\treturn (\n\t\tevent.type === \"canonical-turn\" && \"model\" in event && \"tokens\" in event\n\t);\n}\n\nasync function writeToFile(payload: string) {\n\tconst filePath = telemetryFileEnv || defaultTelemetryFile;\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tawait appendFile(filePath, `${payload}\\n`, \"utf-8\");\n}\n\nasync function appendToolFailure(payload: string): Promise<void> {\n\tawait mkdir(dirname(toolFailureLogFile), { recursive: true });\n\tawait appendFile(toolFailureLogFile, `${payload}\\n`, \"utf-8\");\n}\n\nasync function postToEndpoint(payload: string) {\n\tconst endpoint = telemetryEndpointEnv;\n\tif (!endpoint) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait fetch(endpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\tbody: payload,\n\t\t});\n\t} catch (_error) {\n\t\t// Swallow telemetry transport errors\n\t}\n}\n\nfunction recordOpenTelemetrySpan(event: TelemetryEvent): void {\n\ttry {\n\t\tconst correlationAttributes = maestroCorrelationSpanAttributes(event);\n\t\tconst tracer = getTelemetryTracer();\n\t\ttracer.startActiveSpan(`telemetry.${event.type}`, (span: Span) => {\n\t\t\tspan.setAttributes({\n\t\t\t\t...correlationAttributes,\n\t\t\t\t\"maestro.telemetry.type\": event.type,\n\t\t\t\t\"maestro.telemetry.timestamp\": event.timestamp,\n\t\t\t});\n\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"tool-execution\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.tool.name\": event.toolName,\n\t\t\t\t\t\t\"maestro.tool.success\": event.success,\n\t\t\t\t\t\t\"maestro.tool.duration_ms\": event.durationMs,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode: event.success ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"evaluation\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.eval.scenario\": event.scenario,\n\t\t\t\t\t\t\"maestro.eval.success\": event.success,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode: event.success ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"loader-stage\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.loader.stage\": event.stage,\n\t\t\t\t\t\t\"maestro.loader.duration_ms\": event.durationMs,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sse\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.sse.sent\": event.sent,\n\t\t\t\t\t\t\"maestro.sse.skipped\": event.skipped,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"background-task\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.background.id\": event.taskId,\n\t\t\t\t\t\t\"maestro.background.event\": event.event,\n\t\t\t\t\t\t\"maestro.background.status\": event.status,\n\t\t\t\t\t\t\"maestro.background.restart_attempts\": event.restartAttempts,\n\t\t\t\t\t\t\"maestro.background.exit_code\": event.exitCode ?? -1,\n\t\t\t\t\t\t\"maestro.background.shell_mode\": event.shellMode,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus(\n\t\t\t\t\t\tevent.failureReason || event.status === \"failed\"\n\t\t\t\t\t\t\t? { code: SpanStatusCode.ERROR, message: event.failureReason }\n\t\t\t\t\t\t\t: { code: SpanStatusCode.OK },\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"api-request\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"http.method\": event.method,\n\t\t\t\t\t\t\"http.route\": event.path,\n\t\t\t\t\t\t\"http.status_code\": event.statusCode,\n\t\t\t\t\t\t\"maestro.api.duration_ms\": event.durationMs,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode:\n\t\t\t\t\t\t\tevent.statusCode >= 500\n\t\t\t\t\t\t\t\t? SpanStatusCode.ERROR\n\t\t\t\t\t\t\t\t: SpanStatusCode.OK,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"business-metric\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.metric.name\": event.metric,\n\t\t\t\t\t\t\"maestro.metric.value\": event.value,\n\t\t\t\t\t});\n\t\t\t\t\tif (event.metadata?.model) {\n\t\t\t\t\t\tspan.setAttribute(\"maestro.metric.model\", event.metadata.model);\n\t\t\t\t\t}\n\t\t\t\t\tif (event.metadata?.provider) {\n\t\t\t\t\t\tspan.setAttribute(\n\t\t\t\t\t\t\t\"maestro.metric.provider\",\n\t\t\t\t\t\t\tevent.metadata.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"staged-rollout-surface\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.staged_rollout.event\": event.event,\n\t\t\t\t\t\t\"maestro.staged_rollout.surface_id\": event.surfaceId,\n\t\t\t\t\t\t\"maestro.staged_rollout.surface_type\": event.surfaceType,\n\t\t\t\t\t});\n\t\t\t\t\tif (event.metadata?.owner) {\n\t\t\t\t\t\tspan.setAttribute(\n\t\t\t\t\t\t\t\"maestro.staged_rollout.owner\",\n\t\t\t\t\t\t\tString(event.metadata.owner),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sandbox-violation\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.sandbox.event\": event.event,\n\t\t\t\t\t\t\"maestro.sandbox.tool\": event.tool,\n\t\t\t\t\t\t\"maestro.sandbox.action\": event.action,\n\t\t\t\t\t\t\"maestro.sandbox.reason\": event.reason,\n\t\t\t\t\t});\n\t\t\t\t\tif (event.path) {\n\t\t\t\t\t\tspan.setAttribute(\"maestro.sandbox.path\", event.path);\n\t\t\t\t\t}\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode:\n\t\t\t\t\t\t\tevent.event === \"blocked\"\n\t\t\t\t\t\t\t\t? SpanStatusCode.ERROR\n\t\t\t\t\t\t\t\t: SpanStatusCode.OK,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"subagent-dispatch\":\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.subagent.event\": event.event,\n\t\t\t\t\t\t\"maestro.subagent.mode\": event.mode,\n\t\t\t\t\t\t\"maestro.subagent.type\": event.subagentType,\n\t\t\t\t\t\t\"maestro.subagent.reasoning_effort\": event.reasoningEffort,\n\t\t\t\t\t\t\"maestro.subagent.source\": event.source ?? \"unknown\",\n\t\t\t\t\t\t\"maestro.subagent.success\": event.success,\n\t\t\t\t\t\t\"maestro.subagent.latency_ms\": event.latencyMs,\n\t\t\t\t\t\t\"llm.model.id\": event.model,\n\t\t\t\t\t\t\"llm.model.provider\": event.provider,\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode: event.success ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"canonical-turn\": {\n\t\t\t\t\tconst canonicalTurn = isCanonicalTurnTelemetryEvent(event)\n\t\t\t\t\t\t? event\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tspan.setAttributes({\n\t\t\t\t\t\t\"maestro.turn.id\": event.turnId,\n\t\t\t\t\t\t\"maestro.turn.number\": event.turnNumber,\n\t\t\t\t\t\t\"maestro.turn.session_id\": event.sessionId,\n\t\t\t\t\t\t\"agent.session.id\": event.sessionId,\n\t\t\t\t\t\t...(canonicalTurn\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\"llm.model.id\": canonicalTurn.model.id,\n\t\t\t\t\t\t\t\t\t\"llm.model.provider\": canonicalTurn.model.provider,\n\t\t\t\t\t\t\t\t\t\"llm.usage.input_tokens\": canonicalTurn.tokens.input,\n\t\t\t\t\t\t\t\t\t\"llm.usage.output_tokens\": canonicalTurn.tokens.output,\n\t\t\t\t\t\t\t\t\t\"llm.usage.cache_read_tokens\": canonicalTurn.tokens.cacheRead,\n\t\t\t\t\t\t\t\t\t\"llm.usage.cache_write_tokens\":\n\t\t\t\t\t\t\t\t\t\tcanonicalTurn.tokens.cacheWrite,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\"maestro.turn.status\": String(\n\t\t\t\t\t\t\t\"status\" in event ? event.status : \"unknown\",\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.tool_count\": Number(\n\t\t\t\t\t\t\t\"toolCount\" in event ? event.toolCount : 0,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.total_duration_ms\": Number(\n\t\t\t\t\t\t\t\"totalDurationMs\" in event ? event.totalDurationMs : 0,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.cost_usd\": Number(\n\t\t\t\t\t\t\t\"costUsd\" in event ? event.costUsd : 0,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t\"maestro.turn.sampled\": Boolean(\n\t\t\t\t\t\t\t\"sampled\" in event ? event.sampled : true,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\tcode:\n\t\t\t\t\t\t\t\"status\" in event && event.status === \"error\"\n\t\t\t\t\t\t\t\t? SpanStatusCode.ERROR\n\t\t\t\t\t\t\t\t: SpanStatusCode.OK,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tspan.setStatus({ code: SpanStatusCode.UNSET });\n\t\t\t}\n\n\t\t\tif (\"metadata\" in event && event.metadata) {\n\t\t\t\tspan.setAttributes({ \"maestro.telemetry.has_metadata\": true });\n\t\t\t}\n\n\t\t\tspan.end();\n\t\t});\n\t} catch {\n\t\t// Never let tracing failures affect runtime\n\t}\n}\n\nfunction recordOpenTelemetryMetric(event: TelemetryEvent): void {\n\ttry {\n\t\tswitch (event.type) {\n\t\t\tcase \"tool-execution\":\n\t\t\t\trecordToolInvocationMetric({\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\tdurationMs: event.durationMs,\n\t\t\t\t\tsuccess: event.success,\n\t\t\t\t\tagentRunId: metadataString(event.metadata, [\n\t\t\t\t\t\t\"agentRunId\",\n\t\t\t\t\t\t\"agent_run_id\",\n\t\t\t\t\t]),\n\t\t\t\t\tskillName: skillNameFromMetadata(event.metadata),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"business-metric\":\n\t\t\t\tif (event.metric === \"compaction.triggered\") {\n\t\t\t\t\trecordCompactionMetric({\n\t\t\t\t\t\t\"maestro.session_id\": event.metadata?.sessionId,\n\t\t\t\t\t\t\"llm.model.id\": event.metadata?.model,\n\t\t\t\t\t\t\"llm.model.provider\": event.metadata?.provider,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"subagent-dispatch\":\n\t\t\t\trecordSubagentDispatchMetric({\n\t\t\t\t\tmode: event.mode,\n\t\t\t\t\tsubagentType: event.subagentType,\n\t\t\t\t\tprovider: event.provider,\n\t\t\t\t\tmodel: event.model,\n\t\t\t\t\treasoningEffort: event.reasoningEffort,\n\t\t\t\t\tsource: event.source,\n\t\t\t\t\tsuccess: event.success,\n\t\t\t\t\tlatencyMs: event.latencyMs,\n\t\t\t\t\tagentRunId: metadataString(event.metadata, [\n\t\t\t\t\t\t\"agentRunId\",\n\t\t\t\t\t\t\"agent_run_id\",\n\t\t\t\t\t]),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t} catch {\n\t\t// Never let metric recording affect runtime behavior.\n\t}\n}\n\nfunction stringRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction skillNameFromMetadata(\n\tmetadata: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn (\n\t\tmetadataString(metadata, [\"skillName\", \"skill_name\"]) ??\n\t\tmetadataString(stringRecord(metadata?.skillMetadata), [\"name\"]) ??\n\t\tmetadataString(stringRecord(metadata?.skill_metadata), [\"name\"])\n\t);\n}\n\nfunction metadataString(\n\trecord: Record<string, unknown> | undefined,\n\tkeys: string[],\n): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = record?.[key];\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction eventCorrelationOverrides(\n\tevent: TelemetryEvent,\n): Partial<MaestroCorrelation> {\n\tconst metadata = stringRecord(\n\t\t\"metadata\" in event ? event.metadata : undefined,\n\t);\n\tconst topLevelTraceId =\n\t\t\"traceId\" in event &&\n\t\ttypeof event.traceId === \"string\" &&\n\t\tevent.traceId.trim().length > 0\n\t\t\t? event.traceId\n\t\t\t: undefined;\n\treturn {\n\t\torganization_id: metadataString(metadata, [\n\t\t\t\"organizationId\",\n\t\t\t\"organization_id\",\n\t\t\t\"orgId\",\n\t\t\t\"org_id\",\n\t\t]),\n\t\tuser_id: metadataString(metadata, [\"userId\", \"user_id\"]),\n\t\tworkspace_id: metadataString(metadata, [\"workspaceId\", \"workspace_id\"]),\n\t\tsession_id:\n\t\t\t(\"sessionId\" in event && typeof event.sessionId === \"string\"\n\t\t\t\t? event.sessionId\n\t\t\t\t: undefined) ??\n\t\t\tmetadataString(metadata, [\n\t\t\t\t\"sessionId\",\n\t\t\t\t\"session_id\",\n\t\t\t\t\"maestroSessionId\",\n\t\t\t\t\"maestro_session_id\",\n\t\t\t]),\n\t\tagent_run_id: metadataString(metadata, [\"agentRunId\", \"agent_run_id\"]),\n\t\tagent_run_step_id: metadataString(metadata, [\n\t\t\t\"agentRunStepId\",\n\t\t\t\"agent_run_step_id\",\n\t\t\t\"toolCallId\",\n\t\t\t\"tool_call_id\",\n\t\t]),\n\t\tagent_id: metadataString(metadata, [\"agentId\", \"agent_id\"]),\n\t\tactor_id: metadataString(metadata, [\"actorId\", \"actor_id\"]),\n\t\tprincipal_id: metadataString(metadata, [\"principalId\", \"principal_id\"]),\n\t\ttrace_id:\n\t\t\ttopLevelTraceId ?? metadataString(metadata, [\"traceId\", \"trace_id\"]),\n\t\ttraceparent: metadataString(metadata, [\"traceparent\", \"trace_parent\"]),\n\t\ttracestate: metadataString(metadata, [\"tracestate\", \"trace_state\"]),\n\t\trequest_id: metadataString(metadata, [\"requestId\", \"request_id\"]),\n\t\tremote_runner_session_id: metadataString(metadata, [\n\t\t\t\"remoteRunnerSessionId\",\n\t\t\t\"remote_runner_session_id\",\n\t\t]),\n\t\tobjective_id: metadataString(metadata, [\"objectiveId\", \"objective_id\"]),\n\t\tconversation_id: metadataString(metadata, [\n\t\t\t\"conversationId\",\n\t\t\t\"conversation_id\",\n\t\t]),\n\t};\n}\n\nfunction maestroCorrelationSpanAttributes(\n\tevent: TelemetryEvent,\n): Record<string, string> {\n\tconst config = resolveMaestroEventBusConfig();\n\tconst overrides = eventCorrelationOverrides(event);\n\tconst correlation = {\n\t\t...config.defaultCorrelation,\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(overrides).filter(([, value]) => value !== undefined),\n\t\t),\n\t};\n\tconst principal = config.defaultPrincipal;\n\tconst attributes: Record<string, string | undefined> = {\n\t\t\"enduser.id\": correlation.user_id ?? principal?.user_id,\n\t\t\"user.id\": correlation.user_id ?? principal?.user_id,\n\t\t\"agent.user.id\": correlation.user_id ?? principal?.user_id,\n\t\t\"organization.id\":\n\t\t\tcorrelation.organization_id ?? principal?.organization_id,\n\t\t\"evalops.organization_id\":\n\t\t\tcorrelation.organization_id ?? principal?.organization_id,\n\t\t\"workspace.id\": correlation.workspace_id ?? principal?.workspace_id,\n\t\t\"evalops.workspace_id\": correlation.workspace_id ?? principal?.workspace_id,\n\t\t\"maestro.session_id\": correlation.session_id,\n\t\t\"agent.id\": correlation.agent_id,\n\t\t\"agent.actor.id\": correlation.actor_id,\n\t\t\"evalops.principal_id\": correlation.principal_id,\n\t\t\"maestro.agent_run_id\": correlation.agent_run_id,\n\t\t\"maestro.agent_run_step_id\": correlation.agent_run_step_id,\n\t\t\"trace.id\": correlation.trace_id,\n\t\ttraceparent: correlation.traceparent,\n\t\ttracestate: correlation.tracestate,\n\t\t\"request.id\": correlation.request_id,\n\t\t\"evalops.remote_runner_session_id\": correlation.remote_runner_session_id,\n\t\t\"evalops.objective_id\": correlation.objective_id,\n\t\t\"evalops.conversation_id\": correlation.conversation_id,\n\t\t\"maestro.surface\": config.defaultSurface,\n\t};\n\n\treturn Object.fromEntries(\n\t\tObject.entries(attributes).filter(\n\t\t\t(entry): entry is [string, string] =>\n\t\t\t\ttypeof entry[1] === \"string\" &&\n\t\t\t\tentry[1].trim().length > 0 &&\n\t\t\t\tentry[1] !== \"unknown\",\n\t\t),\n\t);\n}\n\nasync function persistTelemetry(event: TelemetryEvent) {\n\tconst payload = JSON.stringify(event);\n\tconst tasks: Promise<void>[] = [];\n\n\tif (isCanonicalTurnTelemetryEvent(event)) {\n\t\ttasks.push(mirrorCanonicalTurnEventToMeter(event).then(() => undefined));\n\t}\n\n\tif (telemetryEndpointEnv) {\n\t\ttasks.push(postToEndpoint(payload));\n\t}\n\n\tif (telemetryEndpointEnv === undefined) {\n\t\t// Default to file storage when no endpoint is configured\n\t\ttasks.push(writeToFile(payload));\n\t} else if (telemetryFileEnv) {\n\t\ttasks.push(writeToFile(payload));\n\t}\n\n\tawait Promise.all(tasks);\n}\n\nfunction cloneBackgroundTaskTelemetry(\n\tevent: BackgroundTaskTelemetry,\n): BackgroundTaskTelemetry {\n\treturn {\n\t\t...event,\n\t\tresourceUsage: event.resourceUsage ? { ...event.resourceUsage } : undefined,\n\t\tlimitBreach: event.limitBreach ? { ...event.limitBreach } : undefined,\n\t};\n}\n\nfunction recordBackgroundHistory(event: BackgroundTaskTelemetry): void {\n\tbackgroundTaskHistory.push(cloneBackgroundTaskTelemetry(event));\n\tif (backgroundTaskHistory.length > BACKGROUND_TASK_HISTORY_LIMIT) {\n\t\tbackgroundTaskHistory.shift();\n\t}\n}\n\nexport function getBackgroundTaskHistory(\n\tlimit = 10,\n): BackgroundTaskTelemetry[] {\n\tif (limit <= 0) {\n\t\treturn [];\n\t}\n\treturn backgroundTaskHistory\n\t\t.slice(-limit)\n\t\t.map((entry) => cloneBackgroundTaskTelemetry(entry));\n}\n\nexport async function recordTelemetry(event: TelemetryEvent): Promise<void> {\n\tif (isInternalTelemetryDisabled()) {\n\t\treturn;\n\t}\n\n\tconst normalizedEvent = normalizeTelemetryEventMetadata(event);\n\tconst openTelemetryEnabled = isOpenTelemetryEnabled();\n\tif (openTelemetryEnabled) {\n\t\trecordOpenTelemetrySpan(normalizedEvent);\n\t\trecordOpenTelemetryMetric(normalizedEvent);\n\t}\n\tconst eventBusTask = mirrorTelemetryToMaestroEventBus(normalizedEvent);\n\n\tconst legacyEnabled = telemetryEnabled && samplingRate > 0;\n\tif (!legacyEnabled) {\n\t\tawait eventBusTask;\n\t\treturn;\n\t}\n\n\tif (samplingRate < 1 && Math.random() > samplingRate) {\n\t\tawait eventBusTask;\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait Promise.all([persistTelemetry(normalizedEvent), eventBusTask]);\n\t} catch (_error) {\n\t\t// Ignore telemetry persistence failures\n\t}\n}\n\nexport function recordToolExecution(\n\ttoolName: string,\n\tsuccess: boolean,\n\tdurationMs: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"tool-execution\",\n\t\ttimestamp: new Date().toISOString(),\n\t\ttoolName,\n\t\tsuccess,\n\t\tdurationMs,\n\t\tmetadata,\n\t});\n}\n\nexport function recordEvaluationResult(\n\tscenario: string,\n\tsuccess: boolean,\n\tdetails?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"evaluation\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tscenario,\n\t\tsuccess,\n\t\tdetails,\n\t});\n}\n\nexport function recordLoaderStage(\n\tstage: string,\n\tdurationMs: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"loader-stage\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tstage,\n\t\tdurationMs,\n\t\tmetadata,\n\t});\n}\n\nexport function recordSseSkip(\n\tsent: number,\n\tskipped: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"sse\",\n\t\tevent: \"skip\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tsent,\n\t\tskipped,\n\t\tmetadata,\n\t});\n}\n\nexport function logToolFailure(\n\ttoolName: string,\n\terrorMessage: string,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tconst payload = {\n\t\ttool: toolName,\n\t\terror: errorMessage,\n\t\tmetadata,\n\t\ttimestamp: new Date().toISOString(),\n\t};\n\tvoid appendToolFailure(JSON.stringify(payload));\n}\n\nexport function recordBackgroundTaskEvent(\n\tevent: Omit<BackgroundTaskTelemetry, \"type\" | \"timestamp\">,\n): void {\n\tconst sanitizedCommand = sanitizeWithStaticMask(event.command);\n\tconst sanitizedFailure = sanitizeOptionalWithStaticMask(event.failureReason);\n\tconst payload: BackgroundTaskTelemetry = {\n\t\t...event,\n\t\tcommand: sanitizedCommand,\n\t\tfailureReason: sanitizedFailure,\n\t\ttype: \"background-task\",\n\t\ttimestamp: new Date().toISOString(),\n\t};\n\trecordBackgroundHistory(payload);\n\tvoid recordTelemetry(payload);\n}\n\nexport function recordApiRequest(\n\tmethod: string,\n\tpath: string,\n\tstatusCode: number,\n\tdurationMs: number,\n\tmetadata?: Record<string, unknown>,\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"api-request\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tmethod,\n\t\tpath,\n\t\tstatusCode,\n\t\tdurationMs,\n\t\tmetadata,\n\t});\n}\n\n/**\n * Record a business metric for usage tracking.\n */\nexport function recordBusinessMetric(\n\tmetric: BusinessMetricTelemetry[\"metric\"],\n\tvalue: number,\n\tmetadata?: BusinessMetricTelemetry[\"metadata\"],\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"business-metric\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tmetric,\n\t\tvalue,\n\t\tmetadata,\n\t});\n}\n\n/**\n * Record session start.\n */\nexport function recordSessionStart(\n\tsessionId: string,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"session.count\", 1, { ...metadata, sessionId });\n}\n\n/**\n * Record session duration on end.\n */\nexport function recordSessionDuration(\n\tsessionId: string,\n\tdurationMs: number,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): Promise<void> {\n\treturn recordTelemetry({\n\t\ttype: \"business-metric\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tmetric: \"session.duration\",\n\t\tvalue: durationMs,\n\t\tmetadata: {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t},\n\t});\n}\n\n/**\n * Record token usage metrics.\n */\nexport function recordTokenUsage(\n\tsessionId: string,\n\ttokens: {\n\t\tinput?: number;\n\t\toutput?: number;\n\t\tcacheRead?: number;\n\t\tcacheWrite?: number;\n\t},\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\tif (tokens.input !== undefined && tokens.input > 0) {\n\t\trecordBusinessMetric(\"tokens.input\", tokens.input, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n\tif (tokens.output !== undefined && tokens.output > 0) {\n\t\trecordBusinessMetric(\"tokens.output\", tokens.output, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n\tif (tokens.cacheRead !== undefined && tokens.cacheRead > 0) {\n\t\trecordBusinessMetric(\"tokens.cache_read\", tokens.cacheRead, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n\tif (tokens.cacheWrite !== undefined && tokens.cacheWrite > 0) {\n\t\trecordBusinessMetric(\"tokens.cache_write\", tokens.cacheWrite, {\n\t\t\t...metadata,\n\t\t\tsessionId,\n\t\t});\n\t}\n}\n\n/**\n * Record cost in USD.\n */\nexport function recordCost(\n\tsessionId: string,\n\tcostUsd: number,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"cost.usd\", costUsd, { ...metadata, sessionId });\n}\n\n/**\n * Record compaction event.\n */\nexport function recordCompaction(\n\tsessionId: string,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"compaction.triggered\", 1, { ...metadata, sessionId });\n}\n\n/**\n * Record model switch.\n */\nexport function recordModelSwitch(\n\tsessionId: string,\n\tfromModel: string,\n\ttoModel: string,\n\tmetadata?: Omit<BusinessMetricTelemetry[\"metadata\"], \"sessionId\">,\n): void {\n\trecordBusinessMetric(\"model.switch\", 1, {\n\t\t...metadata,\n\t\tsessionId,\n\t\tmodel: toModel,\n\t\tpreviousModel: fromModel,\n\t});\n}\n\nexport function recordStagedRolloutSurfaceUsage(\n\tevent: StagedRolloutSurfaceTelemetry[\"event\"],\n\toptions: {\n\t\tsurfaceId: string;\n\t\tsurfaceType: StagedRolloutSurfaceTelemetry[\"surfaceType\"];\n\t\towner?: string;\n\t\tsource?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t},\n): Promise<void> {\n\treturn recordTelemetry({\n\t\ttype: \"staged-rollout-surface\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tevent,\n\t\tsurfaceId: options.surfaceId,\n\t\tsurfaceType: options.surfaceType,\n\t\tmetadata: {\n\t\t\t...options.metadata,\n\t\t\towner: options.owner,\n\t\t\tsource: options.source,\n\t\t},\n\t});\n}\n\nexport function recordSubagentDispatch(\n\tevent: Omit<SubagentDispatchTelemetry, \"type\" | \"timestamp\" | \"event\">,\n): void {\n\tvoid recordTelemetry({\n\t\t...event,\n\t\ttype: \"subagent-dispatch\",\n\t\tevent: \"subagent_dispatched\",\n\t\ttimestamp: new Date().toISOString(),\n\t});\n}\n\nexport function recordA2ADelegationTelemetry(\n\tevent: A2ADelegationTelemetryInput,\n): void {\n\tif (isInternalTelemetryDisabled()) {\n\t\treturn;\n\t}\n\ttry {\n\t\trecordA2ADelegationMetric({\n\t\t\tphase: event.phase,\n\t\t\tsource: event.source,\n\t\t\tstatus: event.status,\n\t\t\tsuccess: event.success,\n\t\t\tskillId: event.skillId,\n\t\t\ttaskClass: event.taskClass,\n\t\t\tlatencyMs: event.latencyMs,\n\t\t\ttaskDurationMs: event.taskDurationMs ?? event.durationMs,\n\t\t\tpushLagMs: event.pushLagMs,\n\t\t});\n\t\trecordMaestroA2ADelegationEvent({\n\t\t\tevent_type: A2A_PHASE_EVENT_TYPES[event.phase],\n\t\t\tswarm_id: event.swarmId,\n\t\t\tlane_id: event.laneId,\n\t\t\tparent_task_id: event.parentTaskId,\n\t\t\ta2a_task_id: event.a2aTaskId,\n\t\t\ta2a_message_id: event.a2aMessageId,\n\t\t\tcontext_id: event.contextId,\n\t\t\tpeer_agent_id: event.peerAgentId,\n\t\t\tpeer_name: event.peerName,\n\t\t\tpeer_endpoint_url: event.peerEndpointUrl,\n\t\t\tpeer_endpoint_hash: event.peerEndpointHash,\n\t\t\tpeer_endpoint_kind: event.peerEndpointKind,\n\t\t\tskill_id: event.skillId,\n\t\t\ttask_class: event.taskClass,\n\t\t\tsource: event.source,\n\t\t\tstatus: event.status,\n\t\t\tterminal: event.terminal,\n\t\t\tsuccess: event.success,\n\t\t\tlatency_ms: event.latencyMs,\n\t\t\tduration_ms: event.taskDurationMs ?? event.durationMs,\n\t\t\tpush_lag_ms: event.pushLagMs,\n\t\t\tevidence: event.evidence,\n\t\t\tmetadata: event.metadata,\n\t\t\tcorrelation: event.correlation,\n\t\t\toccurred_at: event.occurredAt,\n\t\t\tenv: event.env,\n\t\t});\n\t} catch {\n\t\t// Telemetry must never affect A2A delegation runtime behavior.\n\t}\n}\n\nexport function recordA2APolicyDenialTelemetry(event: {\n\tsource?: string;\n\treason: string;\n\ttaskClass?: string;\n\tskillId?: string;\n}): void {\n\tif (isInternalTelemetryDisabled()) {\n\t\treturn;\n\t}\n\ttry {\n\t\trecordA2APolicyDenialMetric(event);\n\t} catch {\n\t\t// Best-effort only.\n\t}\n}\n\nexport function recordA2APeerExclusionTelemetry(event: {\n\tsource?: string;\n\treason: string;\n\ttaskClass?: string;\n\tskillId?: string;\n}): void {\n\tif (isInternalTelemetryDisabled()) {\n\t\treturn;\n\t}\n\ttry {\n\t\trecordA2APeerExclusionMetric(event);\n\t} catch {\n\t\t// Best-effort only.\n\t}\n}\n\n/**\n * Record session migration stats.\n */\nexport function recordSessionMigration(stats: {\n\ttotal: number;\n\tmigrated: number;\n\tskipped: number;\n\tfailures: number;\n\tversion: number;\n}): void {\n\trecordBusinessMetric(\"session.migration\", stats.total, {\n\t\tmigrated: stats.migrated,\n\t\tskipped: stats.skipped,\n\t\tfailures: stats.failures,\n\t\tversion: stats.version,\n\t});\n}\n\n/**\n * Record a sandbox violation event.\n */\nexport function recordSandboxViolation(\n\tevent: SandboxViolationTelemetry[\"event\"],\n\ttool: string,\n\taction: string,\n\treason: string,\n\toptions?: {\n\t\tpath?: string;\n\t\tcommand?: string;\n\t\tsessionId?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t},\n): void {\n\tvoid recordTelemetry({\n\t\ttype: \"sandbox-violation\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tevent,\n\t\ttool,\n\t\taction,\n\t\treason,\n\t\tpath: options?.path,\n\t\tcommand: options?.command\n\t\t\t? sanitizeWithStaticMask(options.command)\n\t\t\t: undefined,\n\t\tmetadata: options?.metadata\n\t\t\t? { ...options.metadata, sessionId: options.sessionId }\n\t\t\t: options?.sessionId\n\t\t\t\t? { sessionId: options.sessionId }\n\t\t\t\t: undefined,\n\t});\n}\n\n// Initialize the wide-events telemetry recorder to break circular dependency\nsetDefaultTelemetryRecorder(recordTelemetry);\n"]}
@@ -167,8 +167,8 @@ function normalizeThemeJson(raw) {
167
167
  if (!isRecord(raw.colors))
168
168
  return raw;
169
169
  // pi-mono compatibility / forward-compat:
170
- // - Composer requires `accentWarm`; fall back to `accent` when missing.
171
- // - pi-mono includes `thinkingXhigh` and `bashMode` which Composer does not use.
170
+ // - Maestro requires `accentWarm`; fall back to `accent` when missing.
171
+ // - pi-mono includes `thinkingXhigh` and `bashMode` which Maestro does not use.
172
172
  const { bashMode: _bashMode, thinkingXhigh: _thinkingXhigh, ...restColors } = raw.colors;
173
173
  const colors = { ...restColors };
174
174
  if (colors.accentWarm === undefined && colors.accent !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../src/theme/theme-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getAgentDir } from \"../config/constants.js\";\nimport { loadConfiguredPackageResources } from \"../packages/runtime.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { embeddedThemes } from \"./embedded-themes.js\";\nimport { type ThemeJson, validateThemeJson } from \"./theme-schema.js\";\n\nexport { embeddedThemes } from \"./embedded-themes.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst logger = createLogger(\"theme\");\n\nfunction getBuiltinThemeCandidateDirs(): string[] {\n\tconst candidates = [\n\t\t__dirname,\n\t\tpath.resolve(__dirname, \"..\", \"..\", \"src\", \"theme\"),\n\t\tpath.resolve(process.cwd(), \"src\", \"theme\"),\n\t];\n\tconst seen = new Set<string>();\n\tconst dirs: string[] = [];\n\tfor (const dir of candidates) {\n\t\tconst normalized = path.resolve(dir);\n\t\tif (seen.has(normalized)) continue;\n\t\tseen.add(normalized);\n\t\tdirs.push(normalized);\n\t}\n\treturn dirs;\n}\n\nlet BUILTIN_THEMES: Record<string, ThemeJson> | undefined;\n\nfunction getBuiltinThemes(): Record<string, ThemeJson> {\n\tif (!BUILTIN_THEMES) {\n\t\tconst loadBuiltinTheme = (\n\t\t\tname: \"dark\" | \"light\" | \"high-contrast\",\n\t\t): ThemeJson => {\n\t\t\tfor (const dir of getBuiltinThemeCandidateDirs()) {\n\t\t\t\tconst themePath = path.join(dir, `${name}.json`);\n\t\t\t\tif (!fs.existsSync(themePath)) continue;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = normalizeThemeJson(\n\t\t\t\t\t\tJSON.parse(fs.readFileSync(themePath, \"utf-8\")) as unknown,\n\t\t\t\t\t);\n\t\t\t\t\tif (validateThemeJson.Check(parsed)) {\n\t\t\t\t\t\treturn parsed as ThemeJson;\n\t\t\t\t\t}\n\t\t\t\t\tlogger.warn(\"Invalid built-in theme JSON; using embedded theme\", {\n\t\t\t\t\t\tthemePath,\n\t\t\t\t\t\tname,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\"Failed to load built-in theme JSON; using embedded theme\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthemePath,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn embeddedThemes[name];\n\t\t};\n\n\t\tBUILTIN_THEMES = {\n\t\t\tdark: loadBuiltinTheme(\"dark\"),\n\t\t\tlight: loadBuiltinTheme(\"light\"),\n\t\t\t\"high-contrast\": loadBuiltinTheme(\"high-contrast\"),\n\t\t};\n\t}\n\treturn BUILTIN_THEMES;\n}\n\nexport function getThemesDir(): string {\n\tconst override = resolveEnvPath(process.env.MAESTRO_THEMES_DIR);\n\tif (override) return override;\n\treturn path.resolve(getAgentDir(), \"themes\");\n}\n\nfunction getConfiguredThemeDirectories(workspaceDir: string): string[] {\n\tconst packageResources = loadConfiguredPackageResources(workspaceDir);\n\treturn [...packageResources.themes.user, ...packageResources.themes.project];\n}\n\nfunction getThemeNamesFromPackageDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst stat = fs.statSync(dir);\n\t\tif (!stat.isDirectory()) {\n\t\t\treturn [];\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\tconst resourceName = path.basename(dir);\n\tconst matchingNamedFile = path.join(dir, `${resourceName}.json`);\n\tif (fs.existsSync(matchingNamedFile)) {\n\t\treturn [resourceName];\n\t}\n\n\tconst themeJsonFile = path.join(dir, \"theme.json\");\n\tif (fs.existsSync(themeJsonFile)) {\n\t\treturn [resourceName];\n\t}\n\n\ttry {\n\t\treturn fs\n\t\t\t.readdirSync(dir)\n\t\t\t.filter((file) => file.endsWith(\".json\"))\n\t\t\t.map((file) => file.slice(0, -5));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction resolveThemeFileFromPackageDir(\n\tdir: string,\n\tname: string,\n): string | null {\n\tconst namedFile = path.join(dir, `${name}.json`);\n\tif (fs.existsSync(namedFile)) {\n\t\treturn namedFile;\n\t}\n\n\tconst resourceName = path.basename(dir);\n\tconst themeJsonFile = path.join(dir, \"theme.json\");\n\tif (resourceName === name && fs.existsSync(themeJsonFile)) {\n\t\treturn themeJsonFile;\n\t}\n\n\treturn null;\n}\n\nexport function resolveThemeFilePath(\n\tname: string,\n\tworkspaceDir = process.cwd(),\n): string | null {\n\tconst projectThemeDirs =\n\t\tloadConfiguredPackageResources(workspaceDir).themes.project;\n\tfor (const dir of [...projectThemeDirs].reverse()) {\n\t\tconst filePath = resolveThemeFileFromPackageDir(dir, name);\n\t\tif (filePath) {\n\t\t\treturn filePath;\n\t\t}\n\t}\n\n\tconst themesDir = getThemesDir();\n\tconst homeThemePath = path.join(themesDir, `${name}.json`);\n\tif (fs.existsSync(homeThemePath)) {\n\t\treturn homeThemePath;\n\t}\n\n\tconst userThemeDirs =\n\t\tloadConfiguredPackageResources(workspaceDir).themes.user;\n\tfor (const dir of [...userThemeDirs].reverse()) {\n\t\tconst filePath = resolveThemeFileFromPackageDir(dir, name);\n\t\tif (filePath) {\n\t\t\treturn filePath;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport function getAvailableThemes(workspaceDir = process.cwd()): string[] {\n\tconst themes = new Set<string>(Object.keys(getBuiltinThemes()));\n\tconst themesDir = getThemesDir();\n\tconst configuredThemeDirs = getConfiguredThemeDirectories(workspaceDir);\n\n\tfor (const dir of configuredThemeDirs) {\n\t\tfor (const themeName of getThemeNamesFromPackageDir(dir)) {\n\t\t\tthemes.add(themeName);\n\t\t}\n\t}\n\n\tif (fs.existsSync(themesDir)) {\n\t\tconst files = fs.readdirSync(themesDir);\n\t\tfor (const file of files) {\n\t\t\tif (file.endsWith(\".json\")) {\n\t\t\t\tthemes.add(file.slice(0, -5));\n\t\t\t}\n\t\t}\n\t}\n\treturn Array.from(themes).sort();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeThemeJson(raw: unknown): unknown {\n\tif (!isRecord(raw)) return raw;\n\tif (!isRecord(raw.colors)) return raw;\n\n\t// pi-mono compatibility / forward-compat:\n\t// - Composer requires `accentWarm`; fall back to `accent` when missing.\n\t// - pi-mono includes `thinkingXhigh` and `bashMode` which Composer does not use.\n\tconst {\n\t\tbashMode: _bashMode,\n\t\tthinkingXhigh: _thinkingXhigh,\n\t\t...restColors\n\t} = raw.colors;\n\n\tconst colors: Record<string, unknown> = { ...restColors };\n\n\tif (colors.accentWarm === undefined && colors.accent !== undefined) {\n\t\tcolors.accentWarm = colors.accent;\n\t}\n\n\tconst setIfMissing = (key: string, fallback: unknown): void => {\n\t\tif (colors[key] === undefined && fallback !== undefined) {\n\t\t\tcolors[key] = fallback;\n\t\t}\n\t};\n\n\t// Ensure thinking-level colors exist (older themes may not specify them).\n\tsetIfMissing(\n\t\t\"thinkingOff\",\n\t\tcolors.borderMuted ??\n\t\t\tcolors.dim ??\n\t\t\tcolors.muted ??\n\t\t\tcolors.border ??\n\t\t\tcolors.accent,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingMinimal\",\n\t\tcolors.dim ??\n\t\t\tcolors.muted ??\n\t\t\tcolors.borderMuted ??\n\t\t\tcolors.border ??\n\t\t\tcolors.accent,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingLow\",\n\t\tcolors.border ?? colors.accent ?? colors.borderAccent,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingMedium\",\n\t\tcolors.accent ?? colors.borderAccent ?? colors.border ?? colors.muted,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingHigh\",\n\t\tcolors.borderAccent ?? colors.accent ?? colors.border ?? colors.warning,\n\t);\n\n\treturn { ...raw, colors };\n}\n\nexport function loadThemeJson(\n\tname: string,\n\tworkspaceDir = process.cwd(),\n): ThemeJson {\n\tconst builtinThemes = getBuiltinThemes();\n\tif (name in builtinThemes) {\n\t\treturn builtinThemes[name]!;\n\t}\n\tconst themePath = resolveThemeFilePath(name, workspaceDir);\n\tif (!themePath) {\n\t\tthrow new Error(`Theme not found: ${name}`);\n\t}\n\tconst content = fs.readFileSync(themePath, \"utf-8\");\n\tlet json: unknown;\n\ttry {\n\t\tjson = JSON.parse(content);\n\t} catch (error) {\n\t\tthrow new Error(`Failed to parse theme ${name}: ${error}`);\n\t}\n\tconst normalized = normalizeThemeJson(json);\n\tif (!validateThemeJson.Check(normalized)) {\n\t\tconst errors = Array.from(validateThemeJson.Errors(normalized));\n\t\tconst errorMessages = errors\n\t\t\t.map((e) => ` - ${e.path}: ${e.message}`)\n\t\t\t.join(\"\\n\");\n\t\tthrow new Error(`Invalid theme ${name}:\\n${errorMessages}`);\n\t}\n\treturn normalized as ThemeJson;\n}\n"]}
1
+ {"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../src/theme/theme-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getAgentDir } from \"../config/constants.js\";\nimport { loadConfiguredPackageResources } from \"../packages/runtime.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { embeddedThemes } from \"./embedded-themes.js\";\nimport { type ThemeJson, validateThemeJson } from \"./theme-schema.js\";\n\nexport { embeddedThemes } from \"./embedded-themes.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst logger = createLogger(\"theme\");\n\nfunction getBuiltinThemeCandidateDirs(): string[] {\n\tconst candidates = [\n\t\t__dirname,\n\t\tpath.resolve(__dirname, \"..\", \"..\", \"src\", \"theme\"),\n\t\tpath.resolve(process.cwd(), \"src\", \"theme\"),\n\t];\n\tconst seen = new Set<string>();\n\tconst dirs: string[] = [];\n\tfor (const dir of candidates) {\n\t\tconst normalized = path.resolve(dir);\n\t\tif (seen.has(normalized)) continue;\n\t\tseen.add(normalized);\n\t\tdirs.push(normalized);\n\t}\n\treturn dirs;\n}\n\nlet BUILTIN_THEMES: Record<string, ThemeJson> | undefined;\n\nfunction getBuiltinThemes(): Record<string, ThemeJson> {\n\tif (!BUILTIN_THEMES) {\n\t\tconst loadBuiltinTheme = (\n\t\t\tname: \"dark\" | \"light\" | \"high-contrast\",\n\t\t): ThemeJson => {\n\t\t\tfor (const dir of getBuiltinThemeCandidateDirs()) {\n\t\t\t\tconst themePath = path.join(dir, `${name}.json`);\n\t\t\t\tif (!fs.existsSync(themePath)) continue;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = normalizeThemeJson(\n\t\t\t\t\t\tJSON.parse(fs.readFileSync(themePath, \"utf-8\")) as unknown,\n\t\t\t\t\t);\n\t\t\t\t\tif (validateThemeJson.Check(parsed)) {\n\t\t\t\t\t\treturn parsed as ThemeJson;\n\t\t\t\t\t}\n\t\t\t\t\tlogger.warn(\"Invalid built-in theme JSON; using embedded theme\", {\n\t\t\t\t\t\tthemePath,\n\t\t\t\t\t\tname,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\"Failed to load built-in theme JSON; using embedded theme\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthemePath,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn embeddedThemes[name];\n\t\t};\n\n\t\tBUILTIN_THEMES = {\n\t\t\tdark: loadBuiltinTheme(\"dark\"),\n\t\t\tlight: loadBuiltinTheme(\"light\"),\n\t\t\t\"high-contrast\": loadBuiltinTheme(\"high-contrast\"),\n\t\t};\n\t}\n\treturn BUILTIN_THEMES;\n}\n\nexport function getThemesDir(): string {\n\tconst override = resolveEnvPath(process.env.MAESTRO_THEMES_DIR);\n\tif (override) return override;\n\treturn path.resolve(getAgentDir(), \"themes\");\n}\n\nfunction getConfiguredThemeDirectories(workspaceDir: string): string[] {\n\tconst packageResources = loadConfiguredPackageResources(workspaceDir);\n\treturn [...packageResources.themes.user, ...packageResources.themes.project];\n}\n\nfunction getThemeNamesFromPackageDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst stat = fs.statSync(dir);\n\t\tif (!stat.isDirectory()) {\n\t\t\treturn [];\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\tconst resourceName = path.basename(dir);\n\tconst matchingNamedFile = path.join(dir, `${resourceName}.json`);\n\tif (fs.existsSync(matchingNamedFile)) {\n\t\treturn [resourceName];\n\t}\n\n\tconst themeJsonFile = path.join(dir, \"theme.json\");\n\tif (fs.existsSync(themeJsonFile)) {\n\t\treturn [resourceName];\n\t}\n\n\ttry {\n\t\treturn fs\n\t\t\t.readdirSync(dir)\n\t\t\t.filter((file) => file.endsWith(\".json\"))\n\t\t\t.map((file) => file.slice(0, -5));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction resolveThemeFileFromPackageDir(\n\tdir: string,\n\tname: string,\n): string | null {\n\tconst namedFile = path.join(dir, `${name}.json`);\n\tif (fs.existsSync(namedFile)) {\n\t\treturn namedFile;\n\t}\n\n\tconst resourceName = path.basename(dir);\n\tconst themeJsonFile = path.join(dir, \"theme.json\");\n\tif (resourceName === name && fs.existsSync(themeJsonFile)) {\n\t\treturn themeJsonFile;\n\t}\n\n\treturn null;\n}\n\nexport function resolveThemeFilePath(\n\tname: string,\n\tworkspaceDir = process.cwd(),\n): string | null {\n\tconst projectThemeDirs =\n\t\tloadConfiguredPackageResources(workspaceDir).themes.project;\n\tfor (const dir of [...projectThemeDirs].reverse()) {\n\t\tconst filePath = resolveThemeFileFromPackageDir(dir, name);\n\t\tif (filePath) {\n\t\t\treturn filePath;\n\t\t}\n\t}\n\n\tconst themesDir = getThemesDir();\n\tconst homeThemePath = path.join(themesDir, `${name}.json`);\n\tif (fs.existsSync(homeThemePath)) {\n\t\treturn homeThemePath;\n\t}\n\n\tconst userThemeDirs =\n\t\tloadConfiguredPackageResources(workspaceDir).themes.user;\n\tfor (const dir of [...userThemeDirs].reverse()) {\n\t\tconst filePath = resolveThemeFileFromPackageDir(dir, name);\n\t\tif (filePath) {\n\t\t\treturn filePath;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport function getAvailableThemes(workspaceDir = process.cwd()): string[] {\n\tconst themes = new Set<string>(Object.keys(getBuiltinThemes()));\n\tconst themesDir = getThemesDir();\n\tconst configuredThemeDirs = getConfiguredThemeDirectories(workspaceDir);\n\n\tfor (const dir of configuredThemeDirs) {\n\t\tfor (const themeName of getThemeNamesFromPackageDir(dir)) {\n\t\t\tthemes.add(themeName);\n\t\t}\n\t}\n\n\tif (fs.existsSync(themesDir)) {\n\t\tconst files = fs.readdirSync(themesDir);\n\t\tfor (const file of files) {\n\t\t\tif (file.endsWith(\".json\")) {\n\t\t\t\tthemes.add(file.slice(0, -5));\n\t\t\t}\n\t\t}\n\t}\n\treturn Array.from(themes).sort();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeThemeJson(raw: unknown): unknown {\n\tif (!isRecord(raw)) return raw;\n\tif (!isRecord(raw.colors)) return raw;\n\n\t// pi-mono compatibility / forward-compat:\n\t// - Maestro requires `accentWarm`; fall back to `accent` when missing.\n\t// - pi-mono includes `thinkingXhigh` and `bashMode` which Maestro does not use.\n\tconst {\n\t\tbashMode: _bashMode,\n\t\tthinkingXhigh: _thinkingXhigh,\n\t\t...restColors\n\t} = raw.colors;\n\n\tconst colors: Record<string, unknown> = { ...restColors };\n\n\tif (colors.accentWarm === undefined && colors.accent !== undefined) {\n\t\tcolors.accentWarm = colors.accent;\n\t}\n\n\tconst setIfMissing = (key: string, fallback: unknown): void => {\n\t\tif (colors[key] === undefined && fallback !== undefined) {\n\t\t\tcolors[key] = fallback;\n\t\t}\n\t};\n\n\t// Ensure thinking-level colors exist (older themes may not specify them).\n\tsetIfMissing(\n\t\t\"thinkingOff\",\n\t\tcolors.borderMuted ??\n\t\t\tcolors.dim ??\n\t\t\tcolors.muted ??\n\t\t\tcolors.border ??\n\t\t\tcolors.accent,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingMinimal\",\n\t\tcolors.dim ??\n\t\t\tcolors.muted ??\n\t\t\tcolors.borderMuted ??\n\t\t\tcolors.border ??\n\t\t\tcolors.accent,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingLow\",\n\t\tcolors.border ?? colors.accent ?? colors.borderAccent,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingMedium\",\n\t\tcolors.accent ?? colors.borderAccent ?? colors.border ?? colors.muted,\n\t);\n\tsetIfMissing(\n\t\t\"thinkingHigh\",\n\t\tcolors.borderAccent ?? colors.accent ?? colors.border ?? colors.warning,\n\t);\n\n\treturn { ...raw, colors };\n}\n\nexport function loadThemeJson(\n\tname: string,\n\tworkspaceDir = process.cwd(),\n): ThemeJson {\n\tconst builtinThemes = getBuiltinThemes();\n\tif (name in builtinThemes) {\n\t\treturn builtinThemes[name]!;\n\t}\n\tconst themePath = resolveThemeFilePath(name, workspaceDir);\n\tif (!themePath) {\n\t\tthrow new Error(`Theme not found: ${name}`);\n\t}\n\tconst content = fs.readFileSync(themePath, \"utf-8\");\n\tlet json: unknown;\n\ttry {\n\t\tjson = JSON.parse(content);\n\t} catch (error) {\n\t\tthrow new Error(`Failed to parse theme ${name}: ${error}`);\n\t}\n\tconst normalized = normalizeThemeJson(json);\n\tif (!validateThemeJson.Check(normalized)) {\n\t\tconst errors = Array.from(validateThemeJson.Errors(normalized));\n\t\tconst errorMessages = errors\n\t\t\t.map((e) => ` - ${e.path}: ${e.message}`)\n\t\t\t.join(\"\\n\");\n\t\tthrow new Error(`Invalid theme ${name}:\\n${errorMessages}`);\n\t}\n\treturn normalized as ThemeJson;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "title": "Composer Theme",
4
- "description": "Theme schema for Composer (terminal UI).",
3
+ "title": "Maestro Theme",
4
+ "description": "Theme schema for Maestro (terminal UI).",
5
5
  "type": "object",
6
6
  "required": ["name", "colors"],
7
7
  "properties": {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Theme System for Composer
2
+ * Theme System for Maestro
3
3
  *
4
4
  * Adapted from pi-mono (MIT License)
5
5
  * Copyright (c) 2025 Mario Zechner
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/theme/theme.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEN,MAAM,EACN,eAAe,EACf,MAAM,GACN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACN,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAM,OAAO,KAAK;IAKjB,YACC,QAA6C,EAC7C,QAA0C,EAC1C,IAAe;QAEf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAG/C,EAAE,CAAC;YACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAG/C,EAAE,CAAC;YACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC;IAED,EAAE,CAAC,KAAiB,EAAE,IAAY;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAC5D,OAAO,GAAG,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,8BAA8B;IAChE,CAAC;IAED,EAAE,CAAC,KAAc,EAAE,IAAY;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QACvE,OAAO,GAAG,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,8BAA8B;IAChE,CAAC;IAED,IAAI,CAAC,IAAY;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAY;QAClB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,IAAY;QACrB,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS,CAAC,KAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,SAAS,CAAC,KAAc;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,YAAY;QACX,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,sBAAsB,CACrB,KAAoD;QAEpD,gDAAgD;QAChD,QAAQ,KAAK,EAAE,CAAC;YACf,KAAK,KAAK;gBACT,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACrD,KAAK,SAAS;gBACb,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACzD,KAAK,KAAK;gBACT,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACrD,KAAK,QAAQ;gBACZ,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;YACxD,KAAK,MAAM;gBACV,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACtD;gBACC,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;CACD;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,SAAS,WAAW,CAAC,SAAoB,EAAE,IAAgB;IAC1D,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAgB;IAChD,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,wBAAwB;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACjD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBACzC,OAAO,MAAM,CAAC;YACf,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,eAAe;IACvB,OAAO,wBAAwB,EAAE,CAAC;AACnC,CAAC;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,SAAS,gBAAgB;IACxB,IAAI,CAAC;QACJ,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,IAAI,KAAK,GAAU,gBAAgB,EAAE,CAAC;AAC7C,IAAI,gBAAoC,CAAC;AACzC,IAAI,qBAA+C,CAAC;AAEpD,SAAS,mBAAmB;IAC3B,OAAO;QACN,WAAW,CAAC,IAAY;YACvB,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,qBAAqB,EAAE,CAAC;gBAC3B,qBAAqB,EAAE,CAAC;YACzB,CAAC;QACF,CAAC;QACD,kBAAkB;YACjB,gBAAgB,GAAG,MAAM,CAAC;YAC1B,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,qBAAqB,EAAE,CAAC;gBAC3B,qBAAqB,EAAE,CAAC;YACzB,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAkB;IAC3C,MAAM,IAAI,GAAG,SAAS,IAAI,eAAe,EAAE,CAAC;IAC5C,gBAAgB,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC;QACJ,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,iBAAiB,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,sDAAsD;QACtD,gBAAgB,GAAG,MAAM,CAAC;QAC1B,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1B,yCAAyC;IAC1C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,gBAAgB,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC;QACJ,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,iBAAiB,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,6CAA6C;QAC7C,gBAAgB,GAAG,MAAM,CAAC;QAC1B,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1B,yCAAyC;QACzC,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAoB;IACjD,qBAAqB,GAAG,QAAQ,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,mBAAmB;IAClC,OAAO,gBAAgB,IAAI,MAAM,CAAC;AACnC,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAE/E,MAAM,UAAU,gBAAgB;IAC/B,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC","sourcesContent":["/**\n * Theme System for Composer\n *\n * Adapted from pi-mono (MIT License)\n * Copyright (c) 2025 Mario Zechner\n * https://github.com/badlogic/pi-mono\n */\nimport type { EditorTheme, MarkdownTheme, SelectListTheme } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport {\n\ttype ColorMode,\n\tbgAnsi,\n\tdetectColorMode,\n\tfgAnsi,\n} from \"./color-utils.js\";\nimport { embeddedThemes, loadThemeJson } from \"./theme-loader.js\";\nimport { resolveThemePalette } from \"./theme-resolver.js\";\nimport type { ThemeBg, ThemeColor, ThemeJson } from \"./theme-schema.js\";\nimport { startThemeWatcher } from \"./theme-watcher.js\";\nimport {\n\tcreateEditorTheme,\n\tcreateMarkdownTheme,\n\tcreateSelectListTheme,\n} from \"./tui-theme-helpers.js\";\n\n// ============================================================================\n// Types & Schema\n// ============================================================================\n\nexport type { ThemeBg, ThemeColor } from \"./theme-schema.js\";\nexport { getAvailableThemes } from \"./theme-loader.js\";\n\n// ============================================================================\n// Theme Class\n// ============================================================================\n\nexport class Theme {\n\tprivate fgColors: Map<ThemeColor, string>;\n\tprivate bgColors: Map<ThemeBg, string>;\n\tprivate mode: ColorMode;\n\n\tconstructor(\n\t\tfgColors: Record<ThemeColor, string | number>,\n\t\tbgColors: Record<ThemeBg, string | number>,\n\t\tmode: ColorMode,\n\t) {\n\t\tthis.mode = mode;\n\t\tthis.fgColors = new Map();\n\t\tfor (const [key, value] of Object.entries(fgColors) as [\n\t\t\tThemeColor,\n\t\t\tstring | number,\n\t\t][]) {\n\t\t\tthis.fgColors.set(key, fgAnsi(value, mode));\n\t\t}\n\t\tthis.bgColors = new Map();\n\t\tfor (const [key, value] of Object.entries(bgColors) as [\n\t\t\tThemeBg,\n\t\t\tstring | number,\n\t\t][]) {\n\t\t\tthis.bgColors.set(key, bgAnsi(value, mode));\n\t\t}\n\t}\n\n\tfg(color: ThemeColor, text: string): string {\n\t\tconst ansi = this.fgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme color: ${color}`);\n\t\treturn `${ansi}${text}\\x1b[39m`; // Reset only foreground color\n\t}\n\n\tbg(color: ThemeBg, text: string): string {\n\t\tconst ansi = this.bgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme background color: ${color}`);\n\t\treturn `${ansi}${text}\\x1b[49m`; // Reset only background color\n\t}\n\n\tbold(text: string): string {\n\t\treturn chalk.bold(text);\n\t}\n\n\titalic(text: string): string {\n\t\treturn chalk.italic(text);\n\t}\n\n\tunderline(text: string): string {\n\t\treturn chalk.underline(text);\n\t}\n\n\tgetFgAnsi(color: ThemeColor): string {\n\t\tconst ansi = this.fgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme color: ${color}`);\n\t\treturn ansi;\n\t}\n\n\tgetBgAnsi(color: ThemeBg): string {\n\t\tconst ansi = this.bgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme background color: ${color}`);\n\t\treturn ansi;\n\t}\n\n\tgetColorMode(): ColorMode {\n\t\treturn this.mode;\n\t}\n\n\tgetThinkingBorderColor(\n\t\tlevel: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\",\n\t): (str: string) => string {\n\t\t// Map thinking levels to dedicated theme colors\n\t\tswitch (level) {\n\t\t\tcase \"off\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingOff\", str);\n\t\t\tcase \"minimal\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingMinimal\", str);\n\t\t\tcase \"low\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingLow\", str);\n\t\t\tcase \"medium\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingMedium\", str);\n\t\t\tcase \"high\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingHigh\", str);\n\t\t\tdefault:\n\t\t\t\treturn (str: string) => this.fg(\"thinkingOff\", str);\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Theme Loading\n// ============================================================================\n\nfunction createTheme(themeJson: ThemeJson, mode?: ColorMode): Theme {\n\tconst palette = resolveThemePalette(themeJson, mode);\n\treturn new Theme(palette.fgColors, palette.bgColors, palette.mode);\n}\n\nfunction loadTheme(name: string, mode?: ColorMode): Theme {\n\tconst themeJson = loadThemeJson(name);\n\treturn createTheme(themeJson, mode);\n}\n\nfunction detectTerminalBackground(): \"dark\" | \"light\" {\n\tconst colorfgbg = process.env.COLORFGBG || \"\";\n\tif (colorfgbg) {\n\t\tconst parts = colorfgbg.split(\";\");\n\t\tif (parts.length >= 2 && parts[1] !== undefined) {\n\t\t\tconst bg = Number.parseInt(parts[1], 10);\n\t\t\tif (!Number.isNaN(bg)) {\n\t\t\t\tconst result = bg < 8 ? \"dark\" : \"light\";\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\treturn \"dark\";\n}\n\nfunction getDefaultTheme(): string {\n\treturn detectTerminalBackground();\n}\n\n// ============================================================================\n// Global Theme Instance\n// ============================================================================\n\nfunction loadInitialTheme(): Theme {\n\ttry {\n\t\treturn loadTheme(\"dark\");\n\t} catch (error) {\n\t\treturn createTheme(embeddedThemes.dark, detectColorMode());\n\t}\n}\n\n// Initialize theme with dark as default\nexport let theme: Theme = loadInitialTheme();\nlet currentThemeName: string | undefined;\nlet onThemeChangeCallback: (() => void) | undefined;\n\nfunction getWatcherCallbacks() {\n\treturn {\n\t\treloadTheme(name: string) {\n\t\t\ttheme = loadTheme(name);\n\t\t\tif (onThemeChangeCallback) {\n\t\t\t\tonThemeChangeCallback();\n\t\t\t}\n\t\t},\n\t\thandleThemeDeleted() {\n\t\t\tcurrentThemeName = \"dark\";\n\t\t\ttheme = loadTheme(\"dark\");\n\t\t\tif (onThemeChangeCallback) {\n\t\t\t\tonThemeChangeCallback();\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function initTheme(themeName?: string): void {\n\tconst name = themeName ?? getDefaultTheme();\n\tcurrentThemeName = name;\n\ttry {\n\t\ttheme = loadTheme(name);\n\t\tstartThemeWatcher(currentThemeName, getWatcherCallbacks());\n\t} catch (error) {\n\t\t// Theme is invalid - fall back to dark theme silently\n\t\tcurrentThemeName = \"dark\";\n\t\ttheme = loadTheme(\"dark\");\n\t\t// Don't start watcher for fallback theme\n\t}\n}\n\nexport function setTheme(name: string): { success: boolean; error?: string } {\n\tcurrentThemeName = name;\n\ttry {\n\t\ttheme = loadTheme(name);\n\t\tstartThemeWatcher(currentThemeName, getWatcherCallbacks());\n\t\treturn { success: true };\n\t} catch (error) {\n\t\t// Theme is invalid - fall back to dark theme\n\t\tcurrentThemeName = \"dark\";\n\t\ttheme = loadTheme(\"dark\");\n\t\t// Don't start watcher for fallback theme\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t};\n\t}\n}\n\nexport function onThemeChange(callback: () => void): void {\n\tonThemeChangeCallback = callback;\n}\n\nexport function getCurrentThemeName(): string {\n\treturn currentThemeName ?? \"dark\";\n}\n\nexport { stopThemeWatcher } from \"./theme-watcher.js\";\n\n// ============================================================================\n// TUI Helpers (delegating to pure functions)\n// ============================================================================\n\nexport function getMarkdownTheme(): MarkdownTheme {\n\treturn createMarkdownTheme(theme);\n}\n\nexport function getSelectListTheme(): SelectListTheme {\n\treturn createSelectListTheme(theme);\n}\n\nexport function getEditorTheme(): EditorTheme {\n\treturn createEditorTheme(theme);\n}\n"]}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/theme/theme.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Theme System for Maestro\n *\n * Adapted from pi-mono (MIT License)\n * Copyright (c) 2025 Mario Zechner\n * https://github.com/badlogic/pi-mono\n */\nimport type { EditorTheme, MarkdownTheme, SelectListTheme } from \"@evalops/tui\";\nimport chalk from \"chalk\";\nimport {\n\ttype ColorMode,\n\tbgAnsi,\n\tdetectColorMode,\n\tfgAnsi,\n} from \"./color-utils.js\";\nimport { embeddedThemes, loadThemeJson } from \"./theme-loader.js\";\nimport { resolveThemePalette } from \"./theme-resolver.js\";\nimport type { ThemeBg, ThemeColor, ThemeJson } from \"./theme-schema.js\";\nimport { startThemeWatcher } from \"./theme-watcher.js\";\nimport {\n\tcreateEditorTheme,\n\tcreateMarkdownTheme,\n\tcreateSelectListTheme,\n} from \"./tui-theme-helpers.js\";\n\n// ============================================================================\n// Types & Schema\n// ============================================================================\n\nexport type { ThemeBg, ThemeColor } from \"./theme-schema.js\";\nexport { getAvailableThemes } from \"./theme-loader.js\";\n\n// ============================================================================\n// Theme Class\n// ============================================================================\n\nexport class Theme {\n\tprivate fgColors: Map<ThemeColor, string>;\n\tprivate bgColors: Map<ThemeBg, string>;\n\tprivate mode: ColorMode;\n\n\tconstructor(\n\t\tfgColors: Record<ThemeColor, string | number>,\n\t\tbgColors: Record<ThemeBg, string | number>,\n\t\tmode: ColorMode,\n\t) {\n\t\tthis.mode = mode;\n\t\tthis.fgColors = new Map();\n\t\tfor (const [key, value] of Object.entries(fgColors) as [\n\t\t\tThemeColor,\n\t\t\tstring | number,\n\t\t][]) {\n\t\t\tthis.fgColors.set(key, fgAnsi(value, mode));\n\t\t}\n\t\tthis.bgColors = new Map();\n\t\tfor (const [key, value] of Object.entries(bgColors) as [\n\t\t\tThemeBg,\n\t\t\tstring | number,\n\t\t][]) {\n\t\t\tthis.bgColors.set(key, bgAnsi(value, mode));\n\t\t}\n\t}\n\n\tfg(color: ThemeColor, text: string): string {\n\t\tconst ansi = this.fgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme color: ${color}`);\n\t\treturn `${ansi}${text}\\x1b[39m`; // Reset only foreground color\n\t}\n\n\tbg(color: ThemeBg, text: string): string {\n\t\tconst ansi = this.bgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme background color: ${color}`);\n\t\treturn `${ansi}${text}\\x1b[49m`; // Reset only background color\n\t}\n\n\tbold(text: string): string {\n\t\treturn chalk.bold(text);\n\t}\n\n\titalic(text: string): string {\n\t\treturn chalk.italic(text);\n\t}\n\n\tunderline(text: string): string {\n\t\treturn chalk.underline(text);\n\t}\n\n\tgetFgAnsi(color: ThemeColor): string {\n\t\tconst ansi = this.fgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme color: ${color}`);\n\t\treturn ansi;\n\t}\n\n\tgetBgAnsi(color: ThemeBg): string {\n\t\tconst ansi = this.bgColors.get(color);\n\t\tif (!ansi) throw new Error(`Unknown theme background color: ${color}`);\n\t\treturn ansi;\n\t}\n\n\tgetColorMode(): ColorMode {\n\t\treturn this.mode;\n\t}\n\n\tgetThinkingBorderColor(\n\t\tlevel: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\",\n\t): (str: string) => string {\n\t\t// Map thinking levels to dedicated theme colors\n\t\tswitch (level) {\n\t\t\tcase \"off\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingOff\", str);\n\t\t\tcase \"minimal\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingMinimal\", str);\n\t\t\tcase \"low\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingLow\", str);\n\t\t\tcase \"medium\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingMedium\", str);\n\t\t\tcase \"high\":\n\t\t\t\treturn (str: string) => this.fg(\"thinkingHigh\", str);\n\t\t\tdefault:\n\t\t\t\treturn (str: string) => this.fg(\"thinkingOff\", str);\n\t\t}\n\t}\n}\n\n// ============================================================================\n// Theme Loading\n// ============================================================================\n\nfunction createTheme(themeJson: ThemeJson, mode?: ColorMode): Theme {\n\tconst palette = resolveThemePalette(themeJson, mode);\n\treturn new Theme(palette.fgColors, palette.bgColors, palette.mode);\n}\n\nfunction loadTheme(name: string, mode?: ColorMode): Theme {\n\tconst themeJson = loadThemeJson(name);\n\treturn createTheme(themeJson, mode);\n}\n\nfunction detectTerminalBackground(): \"dark\" | \"light\" {\n\tconst colorfgbg = process.env.COLORFGBG || \"\";\n\tif (colorfgbg) {\n\t\tconst parts = colorfgbg.split(\";\");\n\t\tif (parts.length >= 2 && parts[1] !== undefined) {\n\t\t\tconst bg = Number.parseInt(parts[1], 10);\n\t\t\tif (!Number.isNaN(bg)) {\n\t\t\t\tconst result = bg < 8 ? \"dark\" : \"light\";\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\treturn \"dark\";\n}\n\nfunction getDefaultTheme(): string {\n\treturn detectTerminalBackground();\n}\n\n// ============================================================================\n// Global Theme Instance\n// ============================================================================\n\nfunction loadInitialTheme(): Theme {\n\ttry {\n\t\treturn loadTheme(\"dark\");\n\t} catch (error) {\n\t\treturn createTheme(embeddedThemes.dark, detectColorMode());\n\t}\n}\n\n// Initialize theme with dark as default\nexport let theme: Theme = loadInitialTheme();\nlet currentThemeName: string | undefined;\nlet onThemeChangeCallback: (() => void) | undefined;\n\nfunction getWatcherCallbacks() {\n\treturn {\n\t\treloadTheme(name: string) {\n\t\t\ttheme = loadTheme(name);\n\t\t\tif (onThemeChangeCallback) {\n\t\t\t\tonThemeChangeCallback();\n\t\t\t}\n\t\t},\n\t\thandleThemeDeleted() {\n\t\t\tcurrentThemeName = \"dark\";\n\t\t\ttheme = loadTheme(\"dark\");\n\t\t\tif (onThemeChangeCallback) {\n\t\t\t\tonThemeChangeCallback();\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function initTheme(themeName?: string): void {\n\tconst name = themeName ?? getDefaultTheme();\n\tcurrentThemeName = name;\n\ttry {\n\t\ttheme = loadTheme(name);\n\t\tstartThemeWatcher(currentThemeName, getWatcherCallbacks());\n\t} catch (error) {\n\t\t// Theme is invalid - fall back to dark theme silently\n\t\tcurrentThemeName = \"dark\";\n\t\ttheme = loadTheme(\"dark\");\n\t\t// Don't start watcher for fallback theme\n\t}\n}\n\nexport function setTheme(name: string): { success: boolean; error?: string } {\n\tcurrentThemeName = name;\n\ttry {\n\t\ttheme = loadTheme(name);\n\t\tstartThemeWatcher(currentThemeName, getWatcherCallbacks());\n\t\treturn { success: true };\n\t} catch (error) {\n\t\t// Theme is invalid - fall back to dark theme\n\t\tcurrentThemeName = \"dark\";\n\t\ttheme = loadTheme(\"dark\");\n\t\t// Don't start watcher for fallback theme\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t};\n\t}\n}\n\nexport function onThemeChange(callback: () => void): void {\n\tonThemeChangeCallback = callback;\n}\n\nexport function getCurrentThemeName(): string {\n\treturn currentThemeName ?? \"dark\";\n}\n\nexport { stopThemeWatcher } from \"./theme-watcher.js\";\n\n// ============================================================================\n// TUI Helpers (delegating to pure functions)\n// ============================================================================\n\nexport function getMarkdownTheme(): MarkdownTheme {\n\treturn createMarkdownTheme(theme);\n}\n\nexport function getSelectListTheme(): SelectListTheme {\n\treturn createSelectListTheme(theme);\n}\n\nexport function getEditorTheme(): EditorTheme {\n\treturn createEditorTheme(theme);\n}\n"]}
@@ -121,7 +121,7 @@ export declare function buildTaskDetail(task: BackgroundTask): {
121
121
  status: BackgroundTaskStatus;
122
122
  command: string;
123
123
  logPath: string;
124
- shellMode: "exec" | "shell";
124
+ shellMode: "shell" | "exec";
125
125
  logTruncated: boolean;
126
126
  restartAttempts: number;
127
127
  restartMaxAttempts: number;
@@ -3,6 +3,7 @@ export interface ExtractDocumentDetails {
3
3
  fileName: string;
4
4
  mimeType?: string;
5
5
  format: string;
6
+ extractor: string;
6
7
  sizeBytes: number;
7
8
  truncated: boolean;
8
9
  }