@probelabs/visor 0.1.182-ee → 0.1.183-ee

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 (205) hide show
  1. package/defaults/assistant.yaml +2 -1
  2. package/defaults/code-talk.yaml +6 -0
  3. package/defaults/skills/task-progress.yaml +39 -0
  4. package/dist/agent-protocol/task-evaluator.d.ts +2 -1
  5. package/dist/agent-protocol/task-evaluator.d.ts.map +1 -1
  6. package/dist/agent-protocol/task-progress-tool.d.ts +29 -0
  7. package/dist/agent-protocol/task-progress-tool.d.ts.map +1 -0
  8. package/dist/agent-protocol/task-store.d.ts +8 -0
  9. package/dist/agent-protocol/task-store.d.ts.map +1 -1
  10. package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
  11. package/dist/agent-protocol/trace-serializer.d.ts +5 -2
  12. package/dist/agent-protocol/trace-serializer.d.ts.map +1 -1
  13. package/dist/agent-protocol/track-execution.d.ts +1 -1
  14. package/dist/agent-protocol/track-execution.d.ts.map +1 -1
  15. package/dist/ai-review-service.d.ts.map +1 -1
  16. package/dist/cli-main.d.ts.map +1 -1
  17. package/dist/debug-visualizer/trace-reader.d.ts.map +1 -1
  18. package/dist/defaults/assistant.yaml +2 -1
  19. package/dist/defaults/code-talk.yaml +6 -0
  20. package/dist/defaults/skills/task-progress.yaml +39 -0
  21. package/dist/docs/telemetry-live-spans-plan.md +510 -0
  22. package/dist/generated/config-schema.json +43 -6
  23. package/dist/index.js +3545 -701
  24. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  25. package/dist/providers/git-checkout-provider.d.ts.map +1 -1
  26. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  27. package/dist/reviewer.d.ts +2 -0
  28. package/dist/reviewer.d.ts.map +1 -1
  29. package/dist/runners/process-cli-handler.d.ts +2 -0
  30. package/dist/runners/process-cli-handler.d.ts.map +1 -0
  31. package/dist/runners/process-discovery.d.ts +29 -0
  32. package/dist/runners/process-discovery.d.ts.map +1 -0
  33. package/dist/sandbox/check-runner.d.ts.map +1 -1
  34. package/dist/sandbox/sandbox-telemetry.d.ts +7 -0
  35. package/dist/sandbox/sandbox-telemetry.d.ts.map +1 -1
  36. package/dist/sandbox/trace-ingester.d.ts +28 -15
  37. package/dist/sandbox/trace-ingester.d.ts.map +1 -1
  38. package/dist/scheduler/schedule-tool.d.ts +5 -0
  39. package/dist/scheduler/schedule-tool.d.ts.map +1 -1
  40. package/dist/sdk/{a2a-frontend-MU5EO2HZ.mjs → a2a-frontend-5YDHFQXD.mjs} +47 -8
  41. package/dist/sdk/{a2a-frontend-MU5EO2HZ.mjs.map → a2a-frontend-5YDHFQXD.mjs.map} +1 -1
  42. package/dist/sdk/{a2a-frontend-4LP3MLTS.mjs → a2a-frontend-6LWBIPMS.mjs} +19 -3
  43. package/dist/sdk/a2a-frontend-6LWBIPMS.mjs.map +1 -0
  44. package/dist/sdk/check-provider-registry-WSEVHJEV.mjs +31 -0
  45. package/dist/sdk/{check-provider-registry-I4BCWKRU.mjs → check-provider-registry-YRADEEQY.mjs} +6 -6
  46. package/dist/sdk/chunk-4BN2XI4X.mjs +459 -0
  47. package/dist/sdk/chunk-4BN2XI4X.mjs.map +1 -0
  48. package/dist/sdk/chunk-54KOAC4W.mjs +665 -0
  49. package/dist/sdk/chunk-54KOAC4W.mjs.map +1 -0
  50. package/dist/sdk/chunk-6C3R6E42.mjs +1700 -0
  51. package/dist/sdk/chunk-6C3R6E42.mjs.map +1 -0
  52. package/dist/sdk/{chunk-4I3TJ7UJ.mjs → chunk-7W5QCO4Y.mjs} +47 -10
  53. package/dist/sdk/chunk-7W5QCO4Y.mjs.map +1 -0
  54. package/dist/sdk/chunk-B2OUZAWY.mjs +237 -0
  55. package/dist/sdk/chunk-B2OUZAWY.mjs.map +1 -0
  56. package/dist/sdk/chunk-FWWLD555.mjs +244 -0
  57. package/dist/sdk/chunk-FWWLD555.mjs.map +1 -0
  58. package/dist/sdk/{chunk-QXT47ZHR.mjs → chunk-G7GSN3SK.mjs} +2 -2
  59. package/dist/sdk/{chunk-QXT47ZHR.mjs.map → chunk-G7GSN3SK.mjs.map} +1 -1
  60. package/dist/sdk/{chunk-DHETLQIX.mjs → chunk-GA2TYKSR.mjs} +5 -5
  61. package/dist/sdk/{chunk-6DPPP7LD.mjs → chunk-IDL3AA3G.mjs} +203 -42
  62. package/dist/sdk/chunk-IDL3AA3G.mjs.map +1 -0
  63. package/dist/sdk/chunk-MEB2TTIE.mjs +157 -0
  64. package/dist/sdk/chunk-MEB2TTIE.mjs.map +1 -0
  65. package/dist/sdk/{chunk-3JFK6KCD.mjs → chunk-MFXPJUUE.mjs} +150 -280
  66. package/dist/sdk/chunk-MFXPJUUE.mjs.map +1 -0
  67. package/dist/sdk/{chunk-KBGQJKIZ.mjs → chunk-NPSLGKXB.mjs} +3 -3
  68. package/dist/sdk/chunk-P2K4VOMU.mjs +825 -0
  69. package/dist/sdk/chunk-P2K4VOMU.mjs.map +1 -0
  70. package/dist/sdk/chunk-RI4ONH5X.mjs +482 -0
  71. package/dist/sdk/chunk-RI4ONH5X.mjs.map +1 -0
  72. package/dist/sdk/chunk-S5FSRHMY.mjs +139 -0
  73. package/dist/sdk/chunk-S5FSRHMY.mjs.map +1 -0
  74. package/dist/sdk/{chunk-7ERVRLDV.mjs → chunk-TFUQ2D5L.mjs} +13 -2
  75. package/dist/sdk/chunk-TFUQ2D5L.mjs.map +1 -0
  76. package/dist/sdk/{chunk-TQQNSHQV.mjs → chunk-UXB4XWEE.mjs} +1044 -179
  77. package/dist/sdk/chunk-UXB4XWEE.mjs.map +1 -0
  78. package/dist/sdk/{chunk-U6K5SK7X.mjs → chunk-V45TITKX.mjs} +2 -2
  79. package/dist/sdk/{chunk-ANUT54HW.mjs → chunk-WKLJ57WF.mjs} +6 -6
  80. package/dist/sdk/chunk-XOAEKFKB.mjs +1150 -0
  81. package/dist/sdk/chunk-XOAEKFKB.mjs.map +1 -0
  82. package/dist/sdk/chunk-ZPYODGYA.mjs +251 -0
  83. package/dist/sdk/chunk-ZPYODGYA.mjs.map +1 -0
  84. package/dist/sdk/command-executor-YNJOS77A.mjs +14 -0
  85. package/dist/sdk/{config-2STD74CJ.mjs → config-PCP6O6Y6.mjs} +4 -4
  86. package/dist/sdk/{failure-condition-evaluator-FFWJRAEQ.mjs → failure-condition-evaluator-H3PBFBYT.mjs} +4 -4
  87. package/dist/sdk/failure-condition-evaluator-IRFKTYZD.mjs +18 -0
  88. package/dist/sdk/github-auth-BJQBLK2V.mjs +196 -0
  89. package/dist/sdk/github-auth-BJQBLK2V.mjs.map +1 -0
  90. package/dist/sdk/{github-frontend-L3F5JXPJ.mjs → github-frontend-DECYOBRN.mjs} +8 -8
  91. package/dist/sdk/{github-frontend-KGV2R5Z6.mjs → github-frontend-TZRBOQCN.mjs} +4 -4
  92. package/dist/sdk/{host-QBJ7TOWG.mjs → host-CFM2ASDI.mjs} +4 -4
  93. package/dist/sdk/{host-X5ZZCEWN.mjs → host-T4LNVU2H.mjs} +3 -3
  94. package/dist/sdk/{knex-store-QCEW4I4R.mjs → knex-store-OEWSZEBY.mjs} +3 -3
  95. package/dist/sdk/lazy-otel-5RDTVS5L.mjs +24 -0
  96. package/dist/sdk/liquid-extensions-E3AKRX7P.mjs +25 -0
  97. package/dist/sdk/{loader-ZNKKJEZ3.mjs → loader-WRGI244P.mjs} +5 -5
  98. package/dist/sdk/memory-store-OHUIXCWJ.mjs +12 -0
  99. package/dist/sdk/metrics-MYUPQBBV.mjs +41 -0
  100. package/dist/sdk/{opa-policy-engine-QCSSIMUF.mjs → opa-policy-engine-IVMCGVNA.mjs} +3 -3
  101. package/dist/sdk/prompt-state-LN57DQF3.mjs +16 -0
  102. package/dist/sdk/renderer-schema-BT2IXMLW.mjs +51 -0
  103. package/dist/sdk/renderer-schema-BT2IXMLW.mjs.map +1 -0
  104. package/dist/sdk/routing-H2PQ57OA.mjs +26 -0
  105. package/dist/sdk/{routing-CVQT4KHX.mjs → routing-JMZ7HDCC.mjs} +5 -5
  106. package/dist/sdk/schedule-tool-2DPNSU63.mjs +37 -0
  107. package/dist/sdk/{schedule-tool-AECLFHSY.mjs → schedule-tool-4M45RK3E.mjs} +6 -6
  108. package/dist/sdk/{schedule-tool-handler-6QLZRTQA.mjs → schedule-tool-handler-KLHE2SOW.mjs} +6 -6
  109. package/dist/sdk/schedule-tool-handler-KLHE2SOW.mjs.map +1 -0
  110. package/dist/sdk/{schedule-tool-handler-J4NUETJ6.mjs → schedule-tool-handler-NBEO46RV.mjs} +16 -16
  111. package/dist/sdk/schedule-tool-handler-NBEO46RV.mjs.map +1 -0
  112. package/dist/sdk/sdk.d.mts +2 -0
  113. package/dist/sdk/sdk.d.ts +2 -0
  114. package/dist/sdk/sdk.js +3125 -666
  115. package/dist/sdk/sdk.js.map +1 -1
  116. package/dist/sdk/sdk.mjs +15 -15
  117. package/dist/sdk/slack-frontend-DF5VL4OF.mjs +929 -0
  118. package/dist/sdk/slack-frontend-DF5VL4OF.mjs.map +1 -0
  119. package/dist/sdk/{task-evaluator-HLNXKKVV.mjs → task-evaluator-GQYDOSGT.mjs} +138 -24
  120. package/dist/sdk/task-evaluator-GQYDOSGT.mjs.map +1 -0
  121. package/dist/sdk/task-evaluator-OVMG7S56.mjs +263 -0
  122. package/dist/sdk/task-evaluator-OVMG7S56.mjs.map +1 -0
  123. package/dist/sdk/{trace-helpers-WJXYVV4S.mjs → trace-helpers-26ZCAE2V.mjs} +7 -5
  124. package/dist/sdk/trace-helpers-26ZCAE2V.mjs.map +1 -0
  125. package/dist/sdk/{trace-helpers-3FFAI7X3.mjs → trace-helpers-XV5GAX5L.mjs} +3 -3
  126. package/dist/sdk/trace-helpers-XV5GAX5L.mjs.map +1 -0
  127. package/dist/sdk/{trace-reader-ZY77OFNM.mjs → trace-reader-OVE4DL2D.mjs} +6 -2
  128. package/dist/sdk/trace-reader-OVE4DL2D.mjs.map +1 -0
  129. package/dist/sdk/trace-serializer-KKBJHM7J.mjs +24 -0
  130. package/dist/sdk/trace-serializer-KKBJHM7J.mjs.map +1 -0
  131. package/dist/sdk/{track-execution-AMQQNXKE.mjs → track-execution-3EC24C2X.mjs} +68 -7
  132. package/dist/sdk/track-execution-3EC24C2X.mjs.map +1 -0
  133. package/dist/sdk/{track-execution-MKIQXP2C.mjs → track-execution-66RLL6QT.mjs} +10 -3
  134. package/dist/sdk/track-execution-66RLL6QT.mjs.map +1 -0
  135. package/dist/sdk/utcp-check-provider-WI3QZ3W6.mjs +16 -0
  136. package/dist/sdk/utcp-check-provider-WI3QZ3W6.mjs.map +1 -0
  137. package/dist/sdk/workflow-check-provider-X2UREEH7.mjs +31 -0
  138. package/dist/sdk/workflow-check-provider-X2UREEH7.mjs.map +1 -0
  139. package/dist/sdk/{workflow-check-provider-EXMC6JIS.mjs → workflow-check-provider-YXALZNAQ.mjs} +6 -6
  140. package/dist/sdk/workflow-check-provider-YXALZNAQ.mjs.map +1 -0
  141. package/dist/sdk/workflow-registry-YCZ3FCJC.mjs +12 -0
  142. package/dist/sdk/workflow-registry-YCZ3FCJC.mjs.map +1 -0
  143. package/dist/slack/socket-runner.d.ts.map +1 -1
  144. package/dist/state-machine/dispatch/sandbox-routing.d.ts.map +1 -1
  145. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
  146. package/dist/telemetry/fallback-ndjson.d.ts +21 -0
  147. package/dist/telemetry/fallback-ndjson.d.ts.map +1 -1
  148. package/dist/telemetry/lazy-otel.d.ts +2 -0
  149. package/dist/telemetry/lazy-otel.d.ts.map +1 -1
  150. package/dist/telemetry/opentelemetry.d.ts +5 -0
  151. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  152. package/dist/telemetry/trace-helpers.d.ts +10 -0
  153. package/dist/telemetry/trace-helpers.d.ts.map +1 -1
  154. package/dist/test-runner/conversation-sugar.d.ts +7 -0
  155. package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
  156. package/dist/test-runner/core/flow-stage.d.ts.map +1 -1
  157. package/dist/test-runner/index.d.ts.map +1 -1
  158. package/dist/test-runner/validator.d.ts.map +1 -1
  159. package/dist/types/git-checkout.d.ts +2 -0
  160. package/dist/types/git-checkout.d.ts.map +1 -1
  161. package/dist/utils/script-tool-environment.d.ts.map +1 -1
  162. package/package.json +2 -2
  163. package/dist/sdk/a2a-frontend-4LP3MLTS.mjs.map +0 -1
  164. package/dist/sdk/check-provider-registry-RRWCXSTG.mjs +0 -31
  165. package/dist/sdk/chunk-3JFK6KCD.mjs.map +0 -1
  166. package/dist/sdk/chunk-4I3TJ7UJ.mjs.map +0 -1
  167. package/dist/sdk/chunk-6DPPP7LD.mjs.map +0 -1
  168. package/dist/sdk/chunk-6VVXKXTI.mjs +0 -164
  169. package/dist/sdk/chunk-6VVXKXTI.mjs.map +0 -1
  170. package/dist/sdk/chunk-7ERVRLDV.mjs.map +0 -1
  171. package/dist/sdk/chunk-TQQNSHQV.mjs.map +0 -1
  172. package/dist/sdk/failure-condition-evaluator-5DZYMCGW.mjs +0 -18
  173. package/dist/sdk/routing-XALEDC2G.mjs +0 -26
  174. package/dist/sdk/schedule-tool-Z6QYL2B3.mjs +0 -37
  175. package/dist/sdk/task-evaluator-HLNXKKVV.mjs.map +0 -1
  176. package/dist/sdk/trace-reader-ZY77OFNM.mjs.map +0 -1
  177. package/dist/sdk/track-execution-AMQQNXKE.mjs.map +0 -1
  178. package/dist/sdk/track-execution-MKIQXP2C.mjs.map +0 -1
  179. package/dist/sdk/workflow-check-provider-VKYGI5GK.mjs +0 -31
  180. /package/dist/sdk/{check-provider-registry-I4BCWKRU.mjs.map → check-provider-registry-WSEVHJEV.mjs.map} +0 -0
  181. /package/dist/sdk/{check-provider-registry-RRWCXSTG.mjs.map → check-provider-registry-YRADEEQY.mjs.map} +0 -0
  182. /package/dist/sdk/{chunk-DHETLQIX.mjs.map → chunk-GA2TYKSR.mjs.map} +0 -0
  183. /package/dist/sdk/{chunk-ANUT54HW.mjs.map → chunk-NPSLGKXB.mjs.map} +0 -0
  184. /package/dist/sdk/{chunk-U6K5SK7X.mjs.map → chunk-V45TITKX.mjs.map} +0 -0
  185. /package/dist/sdk/{chunk-KBGQJKIZ.mjs.map → chunk-WKLJ57WF.mjs.map} +0 -0
  186. /package/dist/sdk/{config-2STD74CJ.mjs.map → command-executor-YNJOS77A.mjs.map} +0 -0
  187. /package/dist/sdk/{failure-condition-evaluator-5DZYMCGW.mjs.map → config-PCP6O6Y6.mjs.map} +0 -0
  188. /package/dist/sdk/{failure-condition-evaluator-FFWJRAEQ.mjs.map → failure-condition-evaluator-H3PBFBYT.mjs.map} +0 -0
  189. /package/dist/sdk/{routing-CVQT4KHX.mjs.map → failure-condition-evaluator-IRFKTYZD.mjs.map} +0 -0
  190. /package/dist/sdk/{github-frontend-KGV2R5Z6.mjs.map → github-frontend-DECYOBRN.mjs.map} +0 -0
  191. /package/dist/sdk/{github-frontend-L3F5JXPJ.mjs.map → github-frontend-TZRBOQCN.mjs.map} +0 -0
  192. /package/dist/sdk/{host-QBJ7TOWG.mjs.map → host-CFM2ASDI.mjs.map} +0 -0
  193. /package/dist/sdk/{host-X5ZZCEWN.mjs.map → host-T4LNVU2H.mjs.map} +0 -0
  194. /package/dist/sdk/{knex-store-QCEW4I4R.mjs.map → knex-store-OEWSZEBY.mjs.map} +0 -0
  195. /package/dist/sdk/{routing-XALEDC2G.mjs.map → lazy-otel-5RDTVS5L.mjs.map} +0 -0
  196. /package/dist/sdk/{schedule-tool-AECLFHSY.mjs.map → liquid-extensions-E3AKRX7P.mjs.map} +0 -0
  197. /package/dist/sdk/{loader-ZNKKJEZ3.mjs.map → loader-WRGI244P.mjs.map} +0 -0
  198. /package/dist/sdk/{schedule-tool-Z6QYL2B3.mjs.map → memory-store-OHUIXCWJ.mjs.map} +0 -0
  199. /package/dist/sdk/{schedule-tool-handler-6QLZRTQA.mjs.map → metrics-MYUPQBBV.mjs.map} +0 -0
  200. /package/dist/sdk/{opa-policy-engine-QCSSIMUF.mjs.map → opa-policy-engine-IVMCGVNA.mjs.map} +0 -0
  201. /package/dist/sdk/{schedule-tool-handler-J4NUETJ6.mjs.map → prompt-state-LN57DQF3.mjs.map} +0 -0
  202. /package/dist/sdk/{trace-helpers-3FFAI7X3.mjs.map → routing-H2PQ57OA.mjs.map} +0 -0
  203. /package/dist/sdk/{trace-helpers-WJXYVV4S.mjs.map → routing-JMZ7HDCC.mjs.map} +0 -0
  204. /package/dist/sdk/{workflow-check-provider-EXMC6JIS.mjs.map → schedule-tool-2DPNSU63.mjs.map} +0 -0
  205. /package/dist/sdk/{workflow-check-provider-VKYGI5GK.mjs.map → schedule-tool-4M45RK3E.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/telemetry/fallback-ndjson.ts","../../src/telemetry/file-span-exporter.ts","../../src/telemetry/trace-report-exporter.ts","../../src/debug-visualizer/debug-span-exporter.ts","../../src/telemetry/opentelemetry.ts","../../src/telemetry/trace-helpers.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n\nlet CURRENT_FILE: string | null = null;\nlet dirReady = false;\nlet writeChain: Promise<void> = Promise.resolve();\nfunction resolveTargetPath(outDir: string): string {\n if (process.env.VISOR_FALLBACK_TRACE_FILE) {\n CURRENT_FILE = process.env.VISOR_FALLBACK_TRACE_FILE;\n return CURRENT_FILE;\n }\n if (CURRENT_FILE) return CURRENT_FILE;\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n CURRENT_FILE = path.join(outDir, `${ts}.ndjson`);\n return CURRENT_FILE;\n}\n\nfunction isEnabled(): boolean {\n // Enable when CLI set a fallback file (serverless mode), or when explicit file sink is enabled\n if (process.env.VISOR_FALLBACK_TRACE_FILE) return true;\n return (\n process.env.VISOR_TELEMETRY_ENABLED === 'true' &&\n (process.env.VISOR_TELEMETRY_SINK || 'file') === 'file'\n );\n}\n\nfunction appendAsync(outDir: string, line: string): void {\n writeChain = writeChain\n .then(async () => {\n if (!dirReady) {\n try {\n await fs.promises.mkdir(outDir, { recursive: true });\n } catch {}\n dirReady = true;\n }\n const target = resolveTargetPath(outDir);\n await fs.promises.appendFile(target, line, 'utf8');\n })\n .catch(() => {});\n}\n\nexport async function flushNdjson(): Promise<void> {\n try {\n await writeChain;\n } catch {}\n}\n\nexport function emitNdjsonFallback(name: string, attrs: Record<string, unknown>): void {\n try {\n if (!isEnabled()) return;\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n const line = JSON.stringify({ name, attributes: attrs }) + '\\n';\n appendAsync(outDir, line);\n } catch {\n // ignore\n }\n}\n\nexport function emitNdjsonSpanWithEvents(\n name: string,\n attrs: Record<string, unknown>,\n events: Array<{ name: string; attrs?: Record<string, unknown> }>\n): void {\n try {\n if (!isEnabled()) return;\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n const line = JSON.stringify({ name, attributes: attrs, events }) + '\\n';\n appendAsync(outDir, line);\n } catch {\n // ignore\n }\n}\n\n/**\n * Emit a full span record to fallback NDJSON including traceId, spanId,\n * parentSpanId, and timing — compatible with the trace serializer's\n * parseLocalNDJSONSpans format.\n */\nexport function emitNdjsonFullSpan(record: {\n name: string;\n traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n startTime?: [number, number];\n endTime?: [number, number];\n attributes?: Record<string, unknown>;\n events?: Array<{ name: string; attributes?: Record<string, unknown> }>;\n status?: { code?: number };\n}): void {\n try {\n if (!isEnabled()) return;\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n const line = JSON.stringify(record) + '\\n';\n appendAsync(outDir, line);\n } catch {\n // ignore\n }\n}\n","// Minimal NDJSON SpanExporter for serverless mode.\n// Note: This file is only loaded when telemetry is enabled via opentelemetry.ts\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// Conditional imports - these packages are optional dependencies\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ReadableSpan = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExportResult = any;\n\n// Load OTel packages only if available\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet otelCore: any;\n\ntry {\n otelCore = (function (name: string) {\n return require(name);\n })('@opentelemetry/core');\n} catch {\n // OpenTelemetry not installed - this file won't be used\n otelCore = null;\n}\n\nexport interface FileSpanExporterOptions {\n dir?: string; // output directory\n runId?: string; // optional run id for file naming\n ndjson?: boolean; // when true, one span per line; default true\n}\n\nexport class FileSpanExporter {\n private filePath: string;\n private buffer: ReturnType<typeof serializeSpan>[] = [];\n private ndjson: boolean;\n\n constructor(opts: FileSpanExporterOptions = {}) {\n const outDir = opts.dir || path.join(process.cwd(), 'output', 'traces');\n this.ndjson = opts.ndjson !== false; // default true\n if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const run = opts.runId ? `${opts.runId}-` : '';\n const ext = this.ndjson ? 'ndjson' : 'json';\n // If CLI provided a fallback trace file path, prefer writing to it to unify outputs\n if (process.env.VISOR_FALLBACK_TRACE_FILE) {\n this.filePath = process.env.VISOR_FALLBACK_TRACE_FILE;\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n } else {\n this.filePath = path.join(outDir, `run-${run}${ts}.${ext}`);\n }\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const ExportResultCode = otelCore?.ExportResultCode || { SUCCESS: 0, FAILED: 1 };\n try {\n if (this.ndjson) {\n for (const s of spans) {\n const line = JSON.stringify(serializeSpan(s)) + '\\n';\n fs.appendFileSync(this.filePath, line, 'utf8');\n }\n } else {\n for (const s of spans) this.buffer.push(serializeSpan(s));\n }\n resultCallback({ code: ExportResultCode.SUCCESS } as ExportResult);\n } catch {\n resultCallback({ code: ExportResultCode.FAILED } as ExportResult);\n }\n }\n\n shutdown(): Promise<void> {\n return new Promise(resolve => {\n try {\n if (this.ndjson) {\n // already written incrementally\n } else {\n fs.writeFileSync(this.filePath, JSON.stringify({ spans: this.buffer }, null, 2), 'utf8');\n }\n } catch {\n // ignore\n }\n resolve();\n });\n }\n\n forceFlush(): Promise<void> {\n // No-op; we only write on shutdown for simplicity\n return Promise.resolve();\n }\n}\n\nfunction serializeSpan(s: ReadableSpan) {\n // Minimal subset for offline analysis; backends can transform to full OTLP if needed\n return {\n traceId: s.spanContext().traceId,\n spanId: s.spanContext().spanId,\n parentSpanId: (s as any).parentSpanContext?.spanId || (s as any).parentSpanId,\n name: s.name,\n startTime: s.startTime,\n endTime: s.endTime,\n status: s.status,\n attributes: s.attributes,\n events: s.events?.map((e: any) => ({ name: e.name, time: e.time, attributes: e.attributes })),\n resource: s.resource?.attributes,\n kind: s.kind,\n };\n}\n","// Trace Report Exporter - generates static HTML trace visualization\n// Note: This file is only loaded when telemetry is enabled via opentelemetry.ts\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// Conditional imports - these packages are optional dependencies\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ReadableSpan = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExportResult = any;\ntype HrTime = [number, number];\n\n// Load OTel packages only if available\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet otelCore: any;\n\ntry {\n otelCore = (function (name: string) {\n return require(name);\n })('@opentelemetry/core');\n} catch {\n // OpenTelemetry not installed - this file won't be used\n otelCore = null;\n}\n\nfunction hrTimeToMillis(t: HrTime): number {\n return t[0] * 1000 + Math.floor(t[1] / 1e6);\n}\n\nexport interface TraceReportExporterOptions {\n dir?: string;\n runId?: string;\n}\n\nexport class TraceReportExporter {\n private spans: ReadableSpan[] = [];\n private outDir: string;\n private runId?: string;\n\n constructor(opts: TraceReportExporterOptions = {}) {\n this.outDir = opts.dir || path.join(process.cwd(), 'output', 'traces');\n this.runId = opts.runId;\n if (!fs.existsSync(this.outDir)) fs.mkdirSync(this.outDir, { recursive: true });\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const ExportResultCode = otelCore?.ExportResultCode || { SUCCESS: 0, FAILED: 1 };\n try {\n this.spans.push(...spans);\n resultCallback({ code: ExportResultCode.SUCCESS } as ExportResult);\n } catch {\n resultCallback({ code: ExportResultCode.FAILED } as ExportResult);\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n if (this.spans.length === 0) return;\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const prefix = this.runId ? `run-${this.runId}-` : '';\n const jsonPath = path.join(this.outDir, `${prefix}${ts}.trace.json`);\n const htmlPath = path.join(this.outDir, `${prefix}${ts}.report.html`);\n const otlpPath = path.join(this.outDir, `${prefix}${ts}.otlp.json`);\n\n // Compute time bounds\n const starts = this.spans.map(s => hrTimeToMillis(s.startTime));\n const ends = this.spans.map(s => hrTimeToMillis(s.endTime));\n const minStart = Math.min(...starts);\n const maxEnd = Math.max(...ends);\n\n // Serialize rich JSON\n const flat = this.spans.map(s => ({\n name: s.name,\n start: hrTimeToMillis(s.startTime),\n end: hrTimeToMillis(s.endTime),\n duration: Math.max(0, hrTimeToMillis(s.endTime) - hrTimeToMillis(s.startTime)),\n offset: hrTimeToMillis(s.startTime) - minStart,\n attrs: s.attributes,\n events: s.events?.map((e: any) => ({\n name: e.name,\n time: hrTimeToMillis(e.time),\n attrs: e.attributes,\n })),\n traceId: s.spanContext().traceId,\n spanId: s.spanContext().spanId,\n parentSpanId: s.parentSpanId,\n }));\n fs.writeFileSync(jsonPath, JSON.stringify({ spans: flat }, null, 2), 'utf8');\n\n // Also emit OTLP JSON (ExportTraceServiceRequest) for ingestion in standard tools\n try {\n const req = this.toOtlpJson();\n fs.writeFileSync(otlpPath, JSON.stringify(req, null, 2), 'utf8');\n } catch {\n // ignore OTLP serialization errors\n }\n\n // Build richer single-file HTML with a collapsible tree and a simple timeline\n\n const html = `<!doctype html>\n<html>\n<head>\n <meta charset=\"utf-8\"/>\n <title>Visor Trace Report</title>\n <style>\n :root{--fg:#e6edf3;--bg:#0b0f14;--muted:#8b949e;--panel:#161b22;--border:#30363d;--accent:#1f6feb}\n body{font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif;margin:0;background:var(--bg);color:var(--fg)}\n .container{max-width:1200px;margin:0 auto;padding:16px}\n .summary{display:flex;gap:16px;color:var(--muted);font-size:12px;margin-bottom:8px;flex-wrap:wrap}\n .panel{background:var(--panel);border:1px solid var(--border);border-radius:6px;padding:8px}\n .tree .node{margin-left:12px;border-left:1px dashed var(--border);padding-left:8px}\n .tree .root{border:0;margin-left:0;padding-left:0}\n .node> .head{display:flex;align-items:center;gap:8px;cursor:pointer}\n .toggle{width:10px;height:10px;border:1px solid var(--border);display:inline-flex;align-items:center;justify-content:center;font-size:10px;border-radius:2px;color:var(--muted)}\n .name{font-weight:600}\n .meta{color:var(--muted);font-size:12px}\n .timeline{position:relative;height:8px;background:linear-gradient(90deg,transparent 0,var(--border) 0) left/100% 1px no-repeat;margin:6px 0 6px 18px}\n .bar{position:absolute;height:6px;background:var(--accent);border-radius:3px}\n .details{display:none;margin:4px 0 8px 18px}\n .details pre{white-space:pre-wrap;background:#0f141a;border:1px solid var(--border);padding:8px;border-radius:4px;color:var(--fg)}\n .legend{display:flex;justify-content:space-between;margin:8px 0;font-size:12px;color:var(--muted)}\n .grid{display:grid;grid-template-columns:360px 1fr;gap:12px}\n @media (max-width:900px){.grid{display:block}}\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h2>Visor Trace Report</h2>\n <div class=\"summary\">\n <div>Start: ${new Date(minStart).toISOString()}</div>\n <div>Total Duration: ${maxEnd - minStart} ms</div>\n <div>Spans: ${flat.length}</div>\n <div>Saved JSON: ${escapeHtml(path.basename(jsonPath))}</div>\n </div>\n <div class=\"grid\">\n <div class=\"panel\">\n <div class=\"legend\"><div>Trace Tree</div><div>click a span for details</div></div>\n <div id=\"tree\" class=\"tree\"></div>\n </div>\n <div class=\"panel\">\n <div class=\"legend\"><div>Timeline</div><div>${maxEnd - minStart} ms</div></div>\n <div id=\"timeline\" style=\"position:relative;height:${Math.max(120, flat.length * 16)}px\"></div>\n <div class=\"legend\"><div>0 ms</div><div>${maxEnd - minStart} ms</div></div>\n </div>\n </div>\n </div>\n <script id=\"trace-data\" type=\"application/json\">${escapeHtml(JSON.stringify({ spans: flat }))}</script>\n <script>\n const data = JSON.parse(document.getElementById('trace-data').textContent);\n const spans = data.spans || [];\n const byId = new Map(spans.map(s => [s.spanId, { span:s, children:[] }]));\n const roots = [];\n for (const n of byId.values()) { const p = n.span.parentSpanId && byId.get(n.span.parentSpanId); if (p) p.children.push(n); else roots.push(n); }\n for (const n of byId.values()) n.children.sort((a,b)=>a.span.start-b.span.start);\n roots.sort((a,b)=>a.span.start-b.span.start);\n const treeEl = document.getElementById('tree');\n const tlEl = document.getElementById('timeline');\n const total = Math.max(1, Math.max(...spans.map(s=>s.end)) - Math.min(...spans.map(s=>s.start)));\n function renderNode(n, parentEl, depth){\n const s=n.span;\n const node=document.createElement('div'); node.className='node'+(depth? '':' root');\n const head=document.createElement('div'); head.className='head';\n const t=document.createElement('span'); t.className='toggle'; t.textContent=n.children.length?'+':'';\n const name=document.createElement('span'); name.className='name'; name.textContent=s.name;\n const meta=document.createElement('span'); meta.className='meta'; meta.textContent=' '+s.duration+'ms';\n head.append(t,name,meta); node.append(head);\n const details=document.createElement('div'); details.className='details';\n details.innerHTML = '' + \n <div class=\"timeline\"><div class=\"bar\" style=\"left:' + ((s.offset/total)*100) + '%;width:' + Math.max(0.5,(s.duration/total)*100) + '%\"></div></div>\n <div class=\"meta\">start: ' + new Date(s.start).toISOString() + ' • end: ' + new Date(s.end).toISOString() + '</div>\n <div class=\"meta\">trace: ' + s.traceId + ' • span: ' + s.spanId + '' + (s.parentSpanId? ' • parent: '+s.parentSpanId:'' ) + '</div>\n <div class=\"meta\">attributes</div>\n <pre>' + JSON.stringify(s.attrs||{},null,2) + '</pre>\n <div class=\"meta\">events ' + ((s.events||[]).length) + '</div>\n <pre>' + JSON.stringify(s.events||[],null,2) + '</pre>';\n node.append(details);\n head.onclick=()=>{ const open=details.style.display!=='none'; details.style.display=open?'none':'block'; if(n.children.length) t.textContent=open?'+':'–'; };\n details.style.display='none';\n parentEl.append(node);\n const tlRow=document.createElement('div'); tlRow.style.position='relative'; tlRow.style.height='16px'; tlRow.style.margin='2px 0';\n const bar=document.createElement('div'); bar.className='bar'; bar.style.left=((s.offset/total)*100)+'%'; bar.style.width=(Math.max(0.5,(s.duration/total)*100))+'%'; bar.title=s.name+' ('+s.duration+'ms)'; tlRow.append(bar);\n tlEl.append(tlRow);\n for(const c of n.children) renderNode(c, node, depth+1);\n }\n roots.forEach(r=>renderNode(r, treeEl, 0));\n </script>\n</body>\n</html>`;\n\n fs.writeFileSync(htmlPath, html, 'utf8');\n } catch {\n // ignore\n }\n }\n\n private toOtlpJson(): unknown {\n // Build a minimal ExportTraceServiceRequest with ResourceSpans and ScopeSpans\n const resourceGroups = new Map<string, { resource: any; spans: ReadableSpan[] }>();\n for (const s of this.spans) {\n const resAttrs = (s.resource as any)?.attributes || {};\n const resKey = JSON.stringify(resAttrs);\n let g = resourceGroups.get(resKey);\n if (!g) {\n g = { resource: resAttrs, spans: [] };\n resourceGroups.set(resKey, g);\n }\n g.spans.push(s);\n }\n\n const resourceSpans = Array.from(resourceGroups.values()).map(g => ({\n resource: {\n attributes: toOtelAttributes(g.resource),\n },\n scopeSpans: [\n {\n scope: { name: 'visor', version: String(process.env.VISOR_VERSION || 'dev') },\n spans: g.spans.map(s => toOtelSpan(s)),\n },\n ],\n }));\n\n return { resourceSpans };\n\n function toOtelSpan(s: ReadableSpan): any {\n const startMs = hrTimeToMillis(s.startTime);\n const endMs = hrTimeToMillis(s.endTime);\n const toNs = (ms: number) => String(Math.max(0, Math.floor(ms * 1_000_000)));\n return {\n traceId: s.spanContext().traceId, // hex; many tools accept hex in JSON\n spanId: s.spanContext().spanId,\n parentSpanId: s.parentSpanId || undefined,\n name: s.name,\n kind: s.kind ?? 0,\n startTimeUnixNano: toNs(startMs),\n endTimeUnixNano: toNs(endMs),\n attributes: toOtelAttributes((s as any).attributes || {}),\n events: (s.events || []).map((e: any) => ({\n timeUnixNano: toNs(hrTimeToMillis(e.time)),\n name: e.name,\n attributes: toOtelAttributes(e.attributes || {}),\n })),\n status: (s as any).status\n ? {\n code: (s as any).status.code ?? 0,\n message: (s as any).status.message || undefined,\n }\n : undefined,\n };\n }\n\n function toOtelAttributes(obj: Record<string, unknown>): any[] {\n const out: any[] = [];\n for (const [key, value] of Object.entries(obj || {})) {\n out.push({ key, value: toAnyValue(value) });\n }\n return out;\n }\n\n function toAnyValue(v: unknown): any {\n const t = typeof v;\n if (v == null) return { stringValue: 'null' };\n if (t === 'string') return { stringValue: v };\n if (t === 'boolean') return { boolValue: v };\n if (t === 'number')\n return Number.isInteger(v as number) ? { intValue: String(v) } : { doubleValue: v };\n if (Array.isArray(v)) return { arrayValue: { values: v.map(toAnyValue) } };\n if (t === 'object')\n return { kvlistValue: { values: toOtelAttributes(v as Record<string, unknown>) } };\n return { stringValue: String(v) };\n }\n }\n\n async forceFlush(): Promise<void> {\n // no-op\n }\n}\n\nfunction escapeHtml(s: string) {\n return s.replace(\n /[&<>\"']/g,\n c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c]!\n );\n}\n","/**\n * Custom OpenTelemetry Span Exporter for Debug Visualizer\n *\n * Exports spans to the WebSocket server for live visualization\n * while also allowing them to be exported to other exporters (file, console, etc.)\n *\n * Milestone 4: Live Streaming Server\n * Note: This file is only loaded when telemetry is enabled via opentelemetry.ts\n */\n\nimport { DebugVisualizerServer, ProcessedSpan } from './ws-server';\n\n// Conditional imports - these packages are optional dependencies\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ReadableSpan = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExportResult = any;\n\n// Load OTel packages only if available\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet otelCore: any;\n\ntry {\n otelCore = (function (name: string) {\n return require(name);\n })('@opentelemetry/core');\n} catch {\n // OpenTelemetry not installed - this file won't be used\n otelCore = null;\n}\n\n/**\n * OTEL Span Exporter that streams spans to debug visualizer WebSocket server\n */\nexport class DebugSpanExporter {\n private server: DebugVisualizerServer;\n\n constructor(server: DebugVisualizerServer) {\n this.server = server;\n }\n\n /**\n * Export spans to WebSocket server\n */\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const ExportResultCode = otelCore?.ExportResultCode || { SUCCESS: 0, FAILED: 1 };\n console.log(`[debug-exporter] Export called with ${spans.length} spans`);\n try {\n for (const span of spans) {\n console.log(`[debug-exporter] Converting and emitting span: ${span.name}`);\n const processedSpan = this.convertSpan(span);\n this.server.emitSpan(processedSpan);\n }\n\n console.log(`[debug-exporter] Successfully exported ${spans.length} spans`);\n resultCallback({ code: ExportResultCode.SUCCESS });\n } catch (error) {\n console.error('[debug-exporter] Failed to export spans:', error);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Shutdown the exporter\n */\n async shutdown(): Promise<void> {\n // Server shutdown is handled separately\n console.log('[debug-exporter] Shutdown called');\n }\n\n /**\n * Force flush any buffered spans (no-op for this exporter)\n */\n async forceFlush(): Promise<void> {\n // No buffering in this exporter\n }\n\n /**\n * Convert OTEL ReadableSpan to ProcessedSpan format\n */\n private convertSpan(span: ReadableSpan): ProcessedSpan {\n const attributes: Record<string, any> = {};\n\n // Convert OTEL attributes to plain object\n for (const [key, value] of Object.entries(span.attributes)) {\n attributes[key] = value;\n }\n\n // Debug: Detailed parent span ID logging\n const rawParent = (span as any).parentSpanId;\n console.log(\n `[debug-exporter] Span: ${span.name}, parent: ${span.parentSpanId || 'NONE'} (type: ${typeof rawParent})`\n );\n\n // Convert events\n const events = span.events.map((event: any) => ({\n name: event.name,\n time: this.hrTimeToTuple(event.time),\n timestamp: new Date(this.hrTimeToMillis(event.time)).toISOString(),\n attributes: event.attributes ? { ...event.attributes } : {},\n }));\n\n // Determine status\n const status = span.status.code === 2 ? 'error' : 'ok';\n\n // Calculate duration\n const startMs = this.hrTimeToMillis(span.startTime);\n const endMs = this.hrTimeToMillis(span.endTime);\n const duration = endMs - startMs;\n\n return {\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n startTime: this.hrTimeToTuple(span.startTime),\n endTime: this.hrTimeToTuple(span.endTime),\n duration,\n attributes,\n events,\n status,\n };\n }\n\n /**\n * Convert OTEL HrTime to [seconds, nanoseconds] tuple\n */\n private hrTimeToTuple(hrTime: [number, number]): [number, number] {\n return hrTime;\n }\n\n /**\n * Convert OTEL HrTime to milliseconds\n */\n private hrTimeToMillis(hrTime: [number, number]): number {\n return hrTime[0] * 1000 + hrTime[1] / 1_000_000;\n }\n}\n\n/**\n * Create a debug span exporter for a given server\n */\nexport function createDebugSpanExporter(server: DebugVisualizerServer): DebugSpanExporter {\n return new DebugSpanExporter(server);\n}\n","/*\n * Visor OpenTelemetry bootstrap (lazy and optional).\n * - If OTel packages are present and telemetry is enabled, initialize NodeSDK.\n * - Supports OTLP HTTP exporter and serverless file exporter.\n * - Patches console to append trace context for log correlation (optional).\n */\n\nimport type { DebugVisualizerServer } from '../debug-visualizer/ws-server';\n\n// Import types conditionally to avoid bundling OTel packages\ntype SpanProcessor = any;\ntype MetricReader = any;\ntype NodeSDKType = any;\ntype Instrumentation = any;\n\nexport interface TelemetryInitOptions {\n enabled?: boolean;\n sink?: 'otlp' | 'file' | 'console';\n otlp?: { endpoint?: string; headers?: string; protocol?: 'http' | 'grpc' };\n file?: { dir?: string; ndjson?: boolean; runId?: string };\n ciAlwaysOn?: boolean; // default true\n patchConsole?: boolean; // default true\n autoInstrument?: boolean; // enable @opentelemetry/auto-instrumentations-node\n traceReport?: boolean; // write a static HTML trace report\n debugServer?: DebugVisualizerServer; // debug visualizer server for live streaming\n}\n\nlet sdk: NodeSDKType | null = null;\nlet patched = false;\nlet loggerProvider: any = null;\nlet flushTimer: NodeJS.Timeout | null = null;\nlet flushInFlight = false;\nlet lastFlushStartedAt = 0;\n\n/**\n * Reset telemetry state (for testing only).\n * This forcefully resets the SDK singleton.\n */\nexport function resetTelemetryForTesting(): void {\n sdk = null;\n patched = false;\n}\n\nexport async function initTelemetry(opts: TelemetryInitOptions = {}): Promise<void> {\n // Enable telemetry if explicitly enabled, env var is set, OR if debugServer is provided\n const enabled =\n !!opts.enabled || !!opts.debugServer || process.env.VISOR_TELEMETRY_ENABLED === 'true';\n // Avoid writing to stdout to keep CLI JSON output clean\n if (!enabled || sdk) return;\n\n try {\n // Let NodeSDK manage global context manager registration to avoid duplicate API registration errors.\n // Ensure @opentelemetry/api is available; defer other global registration to NodeSDK\n (function (name: string) {\n return require(name);\n })('@opentelemetry/api');\n\n const { NodeSDK } = (function (name: string) {\n return require(name);\n })('@opentelemetry/sdk-node');\n\n // Support both OpenTelemetry v1 and v2 APIs\n const resourcesModule = (function (name: string) {\n return require(name);\n })('@opentelemetry/resources');\n const semanticConventions = (function (name: string) {\n return require(name);\n })('@opentelemetry/semantic-conventions');\n\n const { BatchSpanProcessor, ConsoleSpanExporter } = (function (name: string) {\n return require(name);\n })('@opentelemetry/sdk-trace-base');\n\n const sink = (opts.sink || (process.env.VISOR_TELEMETRY_SINK as string) || 'file') as\n | 'otlp'\n | 'file'\n | 'console';\n\n const processors: SpanProcessor[] = [];\n\n // Prepare a single fallback NDJSON file per run when using file sink\n if (!process.env.VISOR_FALLBACK_TRACE_FILE && sink === 'file') {\n try {\n const fs = require('fs');\n const path = require('path');\n const outDir =\n opts.file?.dir ||\n process.env.VISOR_TRACE_DIR ||\n path.join(process.cwd(), 'output', 'traces');\n fs.mkdirSync(outDir, { recursive: true });\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n process.env.VISOR_FALLBACK_TRACE_FILE = path.join(outDir, `run-${ts}.ndjson`);\n } catch {}\n }\n\n if (sink === 'otlp') {\n const protocol = opts.otlp?.protocol || 'http';\n if (protocol === 'http') {\n const { OTLPTraceExporter } = (function (name: string) {\n return require(name);\n })('@opentelemetry/exporter-trace-otlp-http');\n // Only pass `url` for signal-specific endpoints; the SDK natively reads\n // OTEL_EXPORTER_OTLP_ENDPOINT and appends /v1/traces automatically.\n const traceUrl =\n opts.otlp?.endpoint || process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT || undefined;\n const exporter = new OTLPTraceExporter({\n ...(traceUrl ? { url: traceUrl } : {}),\n headers: opts.otlp?.headers || process.env.OTEL_EXPORTER_OTLP_HEADERS,\n });\n processors.push(new BatchSpanProcessor(exporter, batchParams()));\n } else {\n try {\n const { OTLPTraceExporter: GrpcExporter } = (function (name: string) {\n return require(name);\n })('@opentelemetry/exporter-trace-otlp-grpc');\n processors.push(new BatchSpanProcessor(new GrpcExporter({}), batchParams()));\n } catch {\n // fallback to console if grpc exporter not present\n processors.push(new BatchSpanProcessor(new ConsoleSpanExporter(), batchParams()));\n }\n }\n } else if (sink === 'console') {\n processors.push(new BatchSpanProcessor(new ConsoleSpanExporter(), batchParams()));\n } else {\n // file (serverless) exporter\n\n const { FileSpanExporter } = require('./file-span-exporter');\n const exporter = new FileSpanExporter({\n dir: opts.file?.dir || process.env.VISOR_TRACE_DIR,\n ndjson: opts.file?.ndjson,\n runId: opts.file?.runId,\n });\n processors.push(new BatchSpanProcessor(exporter, batchParams()));\n }\n\n // Create resource - support both v1 (new Resource()) and v2 (resourceFromAttributes())\n let resource;\n if (resourcesModule.Resource) {\n // OpenTelemetry v1 API\n resource = new resourcesModule.Resource({\n [semanticConventions.SemanticResourceAttributes.SERVICE_NAME]: 'visor',\n [semanticConventions.SemanticResourceAttributes.SERVICE_VERSION]:\n process.env.VISOR_VERSION || 'dev',\n 'deployment.environment': detectEnvironment(),\n });\n } else {\n // OpenTelemetry v2 API\n resource = resourcesModule.resourceFromAttributes({\n [semanticConventions.ATTR_SERVICE_NAME]: 'visor',\n [semanticConventions.ATTR_SERVICE_VERSION]: process.env.VISOR_VERSION || 'dev',\n 'deployment.environment': detectEnvironment(),\n });\n }\n\n // Configure Metrics OTLP exporter when using 'otlp' sink\n let metricReader: MetricReader | undefined;\n if (sink === 'otlp') {\n try {\n const { OTLPMetricExporter } = (function (name: string) {\n return require(name);\n })('@opentelemetry/exporter-metrics-otlp-http');\n const { PeriodicExportingMetricReader } = (function (name: string) {\n return require(name);\n })('@opentelemetry/sdk-metrics');\n const metricsUrl = process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT || undefined;\n const mExporter = new OTLPMetricExporter({\n ...(metricsUrl ? { url: metricsUrl } : {}),\n headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,\n });\n metricReader = new PeriodicExportingMetricReader({\n exporter: mExporter,\n exportIntervalMillis: 10000,\n exportTimeoutMillis: 10000,\n });\n } catch {\n // Metrics exporter not available; continue without metrics\n }\n }\n\n // Configure OTel Logs exporter when using 'otlp' sink\n if (sink === 'otlp') {\n try {\n const { LoggerProvider, BatchLogRecordProcessor } = (function (name: string) {\n return require(name);\n })('@opentelemetry/sdk-logs');\n const { OTLPLogExporter } = (function (name: string) {\n return require(name);\n })('@opentelemetry/exporter-logs-otlp-http');\n const { logs: logsApi } = (function (name: string) {\n return require(name);\n })('@opentelemetry/api-logs');\n const logsUrl = process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT || undefined;\n const logExporter = new OTLPLogExporter({\n ...(logsUrl ? { url: logsUrl } : {}),\n headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,\n });\n const logProcessor = new BatchLogRecordProcessor(logExporter);\n const lp = new LoggerProvider({ resource });\n // v0.203+ removed addLogRecordProcessor from public API;\n // register via internal shared state and global API\n lp._sharedState.registeredLogRecordProcessors.push(logProcessor);\n lp._sharedState.activeProcessor = logProcessor;\n logsApi.setGlobalLoggerProvider(lp);\n loggerProvider = lp;\n } catch {\n // Logs exporter not available; continue without OTel logs\n }\n }\n\n // Auto-instrumentations (optional)\n let instrumentations: Instrumentation[] | undefined;\n const autoInstr =\n opts.autoInstrument === true || process.env.VISOR_TELEMETRY_AUTO_INSTRUMENTATIONS === 'true';\n if (autoInstr) {\n try {\n const { getNodeAutoInstrumentations } = (function (name: string) {\n return require(name);\n })('@opentelemetry/auto-instrumentations-node');\n instrumentations = [getNodeAutoInstrumentations() as unknown as Instrumentation];\n } catch {\n // ignore if package not installed\n }\n }\n\n // Optional Trace Report exporter (writes static HTML) added as an extra span processor\n if (opts.traceReport === true || process.env.VISOR_TRACE_REPORT === 'true') {\n try {\n const { TraceReportExporter } = require('./trace-report-exporter');\n const { BatchSpanProcessor } = (function (name: string) {\n return require(name);\n })('@opentelemetry/sdk-trace-base');\n processors.push(\n new BatchSpanProcessor(\n new TraceReportExporter({\n dir: opts.file?.dir || process.env.VISOR_TRACE_DIR,\n runId: opts.file?.runId,\n })\n )\n );\n } catch {\n // ignore\n }\n }\n\n // Add debug span exporter for live streaming to WebSocket server\n if (opts.debugServer) {\n // Debug span exporter streams live spans to the visualizer server\n try {\n const { DebugSpanExporter } = require('../debug-visualizer/debug-span-exporter');\n const { SimpleSpanProcessor } = (function (name: string) {\n return require(name);\n })('@opentelemetry/sdk-trace-base');\n const debugExporter = new DebugSpanExporter(opts.debugServer);\n processors.push(new SimpleSpanProcessor(debugExporter));\n // console.debug('[telemetry] Debug span exporter added successfully, total processors:', processors.length);\n } catch (error) {\n console.error('[telemetry] Failed to initialize debug span exporter:', error);\n }\n }\n\n // Create a composite span processor if there are multiple processors\n let spanProcessor: SpanProcessor;\n if (processors.length > 1) {\n // Create a simple composite processor\n spanProcessor = {\n onStart: (span: any, context: any) => {\n processors.forEach(p => p.onStart?.(span, context));\n },\n onEnd: (span: any) => {\n processors.forEach(p => p.onEnd?.(span));\n },\n shutdown: async () => {\n await Promise.all(processors.map(p => p.shutdown()));\n },\n forceFlush: async () => {\n await Promise.all(processors.map(p => p.forceFlush()));\n },\n } as SpanProcessor;\n } else {\n spanProcessor = processors[0];\n }\n\n const nodeSdk: NodeSDKType = new NodeSDK({\n resource,\n spanProcessor,\n metricReader,\n instrumentations,\n // Context manager is already set globally above\n // Auto-instrumentations can be added later when desired\n });\n\n const otelApiForDiag = (function (name: string) {\n return require(name);\n })('@opentelemetry/api');\n const DiagConsoleLoggerClass = otelApiForDiag.DiagConsoleLogger;\n const diagLogLevel = otelApiForDiag.DiagLogLevel;\n otelApiForDiag.diag.setLogger(new DiagConsoleLoggerClass(), diagLogLevel.ERROR);\n await nodeSdk.start();\n sdk = nodeSdk;\n // console.debug('[telemetry] NodeSDK started successfully');\n\n if (opts.patchConsole !== false) patchConsole();\n } catch (error) {\n // OTel not installed or failed to init; continue silently\n if (process.env.VISOR_DEBUG === 'true' || process.env.DEBUG) {\n console.error('[telemetry] Failed to initialize OTel SDK:', error);\n }\n }\n}\n\n/**\n * Returns the OTel LoggerProvider if logs export is enabled, or null.\n * Used by the Visor logger to bridge log records to the OTel pipeline.\n */\nexport function getOtelLoggerProvider(): any {\n return loggerProvider;\n}\n\n/**\n * Force-flush all pending spans without shutting down the SDK.\n * Call after ending critical spans (e.g. visor.run) in long-running\n * processes to ensure they are exported before the next batch interval.\n */\nexport async function forceFlushTelemetry(): Promise<void> {\n if (!sdk) return;\n try {\n if (typeof sdk.forceFlush === 'function') {\n await sdk.forceFlush();\n }\n } catch {\n // ignore — best-effort flush\n }\n}\n\n/**\n * Best-effort non-blocking flush for lifecycle/helper spans.\n * Rate-limited to avoid exporter pressure in long-running processes.\n */\nexport function requestThrottledTelemetryFlush(): void {\n if (!sdk || flushInFlight || flushTimer) return;\n\n const minIntervalMs = Math.max(\n 250,\n parseInt(process.env.VISOR_TELEMETRY_FLUSH_INTERVAL_MS || '1500', 10) || 1500\n );\n const elapsed = Date.now() - lastFlushStartedAt;\n const delayMs = Math.max(0, minIntervalMs - elapsed);\n\n flushTimer = setTimeout(() => {\n flushTimer = null;\n if (!sdk || flushInFlight) return;\n flushInFlight = true;\n lastFlushStartedAt = Date.now();\n void (typeof sdk.forceFlush === 'function' ? sdk.forceFlush() : Promise.resolve())\n .catch(() => {\n // ignore — best-effort flush\n })\n .finally(() => {\n flushInFlight = false;\n });\n }, delayMs);\n\n if (typeof flushTimer.unref === 'function') flushTimer.unref();\n}\n\nexport async function shutdownTelemetry(): Promise<void> {\n if (!sdk) return;\n try {\n try {\n const { flushNdjson } = require('./fallback-ndjson');\n await flushNdjson();\n } catch {}\n if (loggerProvider) {\n try {\n await loggerProvider.shutdown();\n } catch {}\n loggerProvider = null;\n }\n await sdk.shutdown();\n } catch {\n // ignore\n } finally {\n sdk = null;\n try {\n if (process.env.VISOR_TRACE_REPORT === 'true') {\n const fs = require('fs');\n const path = require('path');\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const htmlPath = path.join(outDir, `${ts}.report.html`);\n if (!fs.existsSync(htmlPath)) {\n fs.writeFileSync(\n htmlPath,\n '<!doctype html><html><head><meta charset=\"utf-8\"/><title>Visor Trace Report</title></head><body><h2>Visor Trace Report</h2></body></html>',\n 'utf8'\n );\n }\n }\n } catch {}\n // Do not emit synthetic NDJSON lines here; real events are produced\n // from evaluators/providers and exported by the SDK.\n }\n}\n\nfunction detectEnvironment(): string {\n if (process.env.GITHUB_ACTIONS) return 'github-actions';\n if (process.env.CI) return 'ci';\n return 'local';\n}\n\nfunction batchParams() {\n return {\n maxQueueSize: 65536,\n maxExportBatchSize: 8192,\n scheduledDelayMillis: 1000,\n exportTimeoutMillis: 10000,\n };\n}\n\nfunction patchConsole() {\n if (patched) return;\n try {\n const { context, trace } = (function (name: string) {\n return require(name);\n })('@opentelemetry/api');\n const methods: Array<'log' | 'info' | 'warn' | 'error'> = ['log', 'info', 'warn', 'error'];\n const c = globalThis.console as Console;\n for (const m of methods) {\n const orig = (c[m] as (...a: unknown[]) => void).bind(c);\n (c as unknown as Record<string, unknown>)[m] = (...args: unknown[]) => {\n const span = trace.getSpan(context.active());\n const ctx = span?.spanContext();\n if (ctx) {\n try {\n const suffix = ` [trace_id=${ctx.traceId} span_id=${ctx.spanId}]`;\n if (typeof args[0] === 'string') args[0] = (args[0] as string) + suffix;\n else args.push(suffix);\n } catch {\n /* noop */\n }\n }\n return orig(...(args as [unknown]));\n };\n }\n patched = true;\n } catch {\n // ignore\n }\n}\n","import { context as otContext, Span, SpanStatusCode, trace, Attributes } from './lazy-otel';\nimport { getInstanceId } from '../utils/instance-id';\n\nexport function getTracer() {\n return trace.getTracer('visor');\n}\n\nexport async function withActiveSpan<T>(\n name: string,\n attrs: Record<string, unknown> | undefined,\n fn: (span: Span) => Promise<T>\n): Promise<T> {\n const tracer = getTracer();\n // Preserve parent context via tracer API; avoid logging parent IDs to stdout\n // Avoid noisy stdout logs that break JSON consumers\n return await new Promise<T>((resolve, reject) => {\n const callback = async (span: Span) => {\n // console.debug(`[trace] Span callback invoked for: [trace_id=${ctx.traceId} span_id=${ctx.spanId}] ${name} span: true`);\n try {\n const res = await fn(span);\n // console.debug('[trace] Span execution completed for:', name);\n resolve(res);\n } catch (err) {\n // console.debug('[trace] Span execution errored for:', name, err);\n try {\n if (err instanceof Error) span.recordException(err);\n span.setStatus({ code: SpanStatusCode.ERROR });\n } catch {}\n reject(err);\n } finally {\n try {\n // console.debug('[trace] Ending span:', name);\n span.end();\n } catch {}\n }\n };\n // startActiveSpan should use the current active context to set parent automatically\n const options = attrs ? { attributes: attrs as Attributes } : {};\n tracer.startActiveSpan(name, options, callback);\n });\n}\n\nexport function emitImmediateSpan(\n name: string,\n attrs?: Record<string, unknown>,\n options?: {\n events?: Array<{ name: string; attrs?: Record<string, unknown> }>;\n status?: { code?: number; message?: string };\n }\n): void {\n try {\n const startHr = process.hrtime();\n const tracer = getTracer();\n const span = tracer.startSpan(name, attrs ? { attributes: attrs as Attributes } : undefined);\n try {\n for (const evt of options?.events || []) {\n span.addEvent(evt.name, (evt.attrs || {}) as Attributes);\n }\n if (options?.status) {\n span.setStatus(options.status as never);\n }\n } finally {\n span.end();\n }\n try {\n const { emitNdjsonFullSpan } = require('./fallback-ndjson');\n const activeParent = trace.getSpan(otContext.active());\n const parentCtx = activeParent?.spanContext?.();\n const ctx = span.spanContext?.();\n const endHr = process.hrtime();\n emitNdjsonFullSpan({\n name,\n traceId: ctx?.traceId || parentCtx?.traceId || randomTraceId(),\n spanId: ctx?.spanId || randomSpanId(),\n parentSpanId: parentCtx?.spanId,\n startTime: [startHr[0], startHr[1]],\n endTime: [endHr[0], endHr[1]],\n attributes: attrs || {},\n events: (options?.events || []).map(evt => ({\n name: evt.name,\n attributes: evt.attrs || {},\n })),\n status: options?.status,\n });\n } catch {\n // ignore fallback emission errors\n }\n try {\n const { requestThrottledTelemetryFlush } = require('./opentelemetry');\n requestThrottledTelemetryFlush();\n } catch {\n // ignore best-effort flush scheduling errors\n }\n } catch {\n // ignore\n }\n}\n\nfunction randomSpanId(): string {\n return require('crypto').randomBytes(8).toString('hex');\n}\n\nfunction randomTraceId(): string {\n return require('crypto').randomBytes(16).toString('hex');\n}\n\nexport function addEvent(name: string, attrs?: Record<string, unknown>): void {\n const span = trace.getSpan(otContext.active());\n if (span) {\n try {\n span.addEvent(name, attrs as Attributes);\n } catch {\n // ignore\n }\n }\n // Fallback NDJSON emission for serverless/file sink when SDK may be inactive\n try {\n const { emitNdjsonSpanWithEvents } = require('./fallback-ndjson');\n emitNdjsonSpanWithEvents('visor.event', {}, [{ name, attrs }]);\n if (name === 'fail_if.triggered') {\n emitNdjsonSpanWithEvents('visor.event', {}, [\n { name: 'fail_if.evaluated', attrs },\n { name: 'fail_if.triggered', attrs },\n ]);\n }\n } catch {}\n}\n\nexport function setSpanAttributes(attrs: Record<string, unknown>): void {\n const span = trace.getSpan(otContext.active());\n if (!span) return;\n try {\n for (const [k, v] of Object.entries(attrs)) span.setAttribute(k, v as never);\n } catch {\n // ignore\n }\n}\n\nexport function setSpanError(err: unknown): void {\n const span = trace.getSpan(otContext.active());\n if (!span) return;\n try {\n if (err instanceof Error) span.recordException(err);\n span.setStatus({ code: SpanStatusCode.ERROR });\n } catch {\n // ignore\n }\n}\n\n/**\n * Return standard visor.* resource attributes for the root `visor.run` span.\n * Reads version from package.json / env and git commit short SHA from env.\n */\nexport function getVisorRunAttributes(): Record<string, string> {\n const attrs: Record<string, string> = {};\n try {\n attrs['visor.version'] =\n process.env.VISOR_VERSION || (require('../../package.json')?.version ?? 'dev');\n } catch {\n attrs['visor.version'] = 'dev';\n }\n const commitShort = process.env.VISOR_COMMIT_SHORT || '';\n const commitFull = process.env.VISOR_COMMIT_SHA || process.env.VISOR_COMMIT || '';\n if (commitShort) {\n attrs['visor.commit'] = commitShort;\n }\n if (commitFull) {\n attrs['visor.commit.sha'] = commitFull;\n }\n attrs['visor.instance_id'] = getInstanceId();\n return attrs;\n}\n\n/**\n * Wraps a visor.run span with automatic run metrics (counter + duration histogram).\n * Use this instead of raw `withActiveSpan('visor.run', ...)` to get metrics for free.\n */\nexport async function withVisorRun<T>(\n attrs: Record<string, unknown>,\n runMeta: {\n source?: string;\n userId?: string;\n userName?: string;\n workflowId?: string;\n },\n fn: (span: Span) => Promise<T>\n): Promise<T> {\n const {\n recordRunStart,\n recordRunDuration,\n resetRunAiCalls,\n recordRunAiCalls,\n getRunAiCalls,\n } = require('./metrics');\n const instanceId = getInstanceId();\n recordRunStart({\n source: runMeta.source,\n userId: runMeta.userId,\n userName: runMeta.userName,\n workflowId: runMeta.workflowId,\n instanceId,\n });\n resetRunAiCalls();\n const startMs = Date.now();\n let success = true;\n try {\n return await withActiveSpan('visor.run', attrs, async span => {\n try {\n return await fn(span);\n } finally {\n // Record AI call count as span attribute for trace visibility\n try {\n span.setAttribute('visor.run.ai_calls', getRunAiCalls());\n span.setAttribute('visor.run.duration_ms', Date.now() - startMs);\n } catch {}\n }\n });\n } catch (err) {\n success = false;\n throw err;\n } finally {\n recordRunAiCalls({\n source: runMeta.source,\n workflowId: runMeta.workflowId,\n });\n recordRunDuration(Date.now() - startMs, {\n source: runMeta.source,\n userId: runMeta.userId,\n workflowId: runMeta.workflowId,\n success,\n });\n }\n}\n\n// Internal helper for tests: write a minimal run marker to NDJSON when using file sink\nlet __ndjsonPath: string | null = null;\nexport function __getOrCreateNdjsonPath(): string | null {\n try {\n // If sink is explicitly set to non-file, skip. If unset, still allow when a trace dir/file is configured.\n if (process.env.VISOR_TELEMETRY_SINK && process.env.VISOR_TELEMETRY_SINK !== 'file')\n return null;\n const path = require('path');\n const fs = require('fs');\n // Prefer explicit fallback file path if set by the CLI\n if (process.env.VISOR_FALLBACK_TRACE_FILE) {\n __ndjsonPath = process.env.VISOR_FALLBACK_TRACE_FILE;\n const dir = path.dirname(__ndjsonPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n return __ndjsonPath;\n }\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });\n if (!__ndjsonPath) {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n __ndjsonPath = path.join(outDir, `${ts}.ndjson`);\n }\n return __ndjsonPath;\n } catch {\n return null;\n }\n}\nexport function _appendRunMarker(): void {\n try {\n const fs = require('fs');\n const p = __getOrCreateNdjsonPath();\n if (!p) return;\n const line = { name: 'visor.run', attributes: { started: true } };\n fs.appendFileSync(p, JSON.stringify(line) + '\\n', 'utf8');\n } catch {}\n}\n"],"mappings":"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","names":["fs","path","fs","path","otelCore","otelCore","fs","path","FileSpanExporter","TraceReportExporter","BatchSpanProcessor","DebugSpanExporter","context","flushNdjson","trace","emitNdjsonFullSpan","requestThrottledTelemetryFlush","emitNdjsonSpanWithEvents","path","fs"]}
@@ -0,0 +1,251 @@
1
+ import {
2
+ context,
3
+ init_lazy_otel,
4
+ trace
5
+ } from "./chunk-B2OUZAWY.mjs";
6
+ import {
7
+ __esm,
8
+ __export,
9
+ __require
10
+ } from "./chunk-J7LXIPZS.mjs";
11
+
12
+ // src/logger.ts
13
+ var logger_exports = {};
14
+ __export(logger_exports, {
15
+ configureLoggerFromCli: () => configureLoggerFromCli,
16
+ logger: () => logger
17
+ });
18
+ function levelToNumber(level) {
19
+ switch (level) {
20
+ case "silent":
21
+ return 0;
22
+ case "error":
23
+ return 10;
24
+ case "warn":
25
+ return 20;
26
+ case "info":
27
+ return 30;
28
+ case "verbose":
29
+ return 40;
30
+ case "debug":
31
+ return 50;
32
+ }
33
+ }
34
+ function configureLoggerFromCli(options) {
35
+ logger.configure({
36
+ outputFormat: options.output,
37
+ debug: options.debug,
38
+ verbose: options.verbose,
39
+ quiet: options.quiet
40
+ });
41
+ try {
42
+ if (options.output) process.env.VISOR_OUTPUT_FORMAT = String(options.output);
43
+ if (typeof options.debug === "boolean") {
44
+ process.env.VISOR_DEBUG = options.debug ? "true" : "false";
45
+ }
46
+ } catch {
47
+ }
48
+ }
49
+ var OTEL_SEVERITY, Logger, logger;
50
+ var init_logger = __esm({
51
+ "src/logger.ts"() {
52
+ "use strict";
53
+ init_lazy_otel();
54
+ OTEL_SEVERITY = {
55
+ silent: 0,
56
+ error: 17,
57
+ // ERROR
58
+ warn: 13,
59
+ // WARN
60
+ info: 9,
61
+ // INFO
62
+ verbose: 5,
63
+ // DEBUG
64
+ debug: 5
65
+ // DEBUG
66
+ };
67
+ Logger = class {
68
+ level = "info";
69
+ isJsonLike = false;
70
+ isTTY = typeof process !== "undefined" ? !!process.stderr.isTTY : false;
71
+ showTimestamps = true;
72
+ // default: always show timestamps
73
+ sink;
74
+ sinkPassthrough = true;
75
+ sinkErrorMode = "throw";
76
+ sinkErrorHandler;
77
+ otelLogger = null;
78
+ otelLoggerAttempted = false;
79
+ configure(opts = {}) {
80
+ let lvl = "info";
81
+ if (opts.debug || process.env.VISOR_DEBUG === "true") {
82
+ lvl = "debug";
83
+ } else if (opts.verbose || process.env.VISOR_LOG_LEVEL === "verbose") {
84
+ lvl = "verbose";
85
+ } else if (opts.quiet || process.env.VISOR_LOG_LEVEL === "quiet") {
86
+ lvl = "warn";
87
+ } else if (opts.level) {
88
+ lvl = opts.level;
89
+ } else if (process.env.VISOR_LOG_LEVEL) {
90
+ const envLvl = process.env.VISOR_LOG_LEVEL;
91
+ if (["silent", "error", "warn", "info", "verbose", "debug"].includes(envLvl)) {
92
+ lvl = envLvl;
93
+ }
94
+ }
95
+ this.level = lvl;
96
+ const output = opts.outputFormat || process.env.VISOR_OUTPUT_FORMAT || "table";
97
+ this.isJsonLike = output === "json" || output === "sarif";
98
+ }
99
+ setSink(sink, opts = {}) {
100
+ this.sink = sink;
101
+ this.sinkPassthrough = opts.passthrough !== void 0 ? opts.passthrough : true;
102
+ this.sinkErrorMode = opts.errorMode || "throw";
103
+ this.sinkErrorHandler = opts.onError;
104
+ }
105
+ shouldLog(level) {
106
+ const desired = levelToNumber(level);
107
+ const current = levelToNumber(this.level);
108
+ if (desired > current) return false;
109
+ if (this.isJsonLike && desired < levelToNumber("error") && this.level !== "debug" && this.level !== "verbose") {
110
+ return false;
111
+ }
112
+ return true;
113
+ }
114
+ getTraceSuffix(msg) {
115
+ if (!msg) return "";
116
+ if (msg.includes("trace_id=") || msg.includes("trace_id:")) return "";
117
+ try {
118
+ const span = trace.getSpan(context.active()) || trace.getActiveSpan();
119
+ const ctx = span?.spanContext?.();
120
+ if (!ctx?.traceId) return "";
121
+ return ` [trace_id=${ctx.traceId} span_id=${ctx.spanId}]`;
122
+ } catch {
123
+ return "";
124
+ }
125
+ }
126
+ emitOtelLog(msg, level) {
127
+ try {
128
+ if (!this.otelLoggerAttempted) {
129
+ this.otelLoggerAttempted = true;
130
+ try {
131
+ const { logs } = (function(name) {
132
+ return __require(name);
133
+ })("@opentelemetry/api-logs");
134
+ this.otelLogger = logs.getLogger("visor");
135
+ } catch {
136
+ }
137
+ }
138
+ if (!this.otelLogger) return;
139
+ const span = trace.getSpan(context.active()) || trace.getActiveSpan();
140
+ const spanCtx = span?.spanContext?.();
141
+ this.otelLogger.emit({
142
+ severityNumber: OTEL_SEVERITY[level] || 9,
143
+ severityText: level.toUpperCase(),
144
+ body: msg,
145
+ attributes: {
146
+ "visor.logger": true,
147
+ ...spanCtx?.traceId ? { trace_id: spanCtx.traceId, span_id: spanCtx.spanId } : {}
148
+ }
149
+ });
150
+ } catch {
151
+ }
152
+ }
153
+ write(msg, level) {
154
+ const suffix = this.getTraceSuffix(msg);
155
+ const decoratedMsg = suffix ? `${msg}${suffix}` : msg;
156
+ const lvl = level || "info";
157
+ this.emitOtelLog(msg, lvl);
158
+ if (this.sink) {
159
+ try {
160
+ this.sink(decoratedMsg, lvl);
161
+ } catch (error) {
162
+ if (this.sinkErrorMode === "warn") {
163
+ try {
164
+ if (this.sinkErrorHandler) {
165
+ this.sinkErrorHandler(error);
166
+ } else {
167
+ const errMsg = error instanceof Error ? error.message : String(error);
168
+ process.stderr.write(`[logger] sink failed: ${errMsg}
169
+ `);
170
+ }
171
+ } catch {
172
+ }
173
+ }
174
+ if (this.sinkErrorMode === "throw") {
175
+ throw error;
176
+ }
177
+ return;
178
+ }
179
+ if (!this.sinkPassthrough) return;
180
+ }
181
+ try {
182
+ if (this.showTimestamps) {
183
+ const ts = (/* @__PURE__ */ new Date()).toISOString();
184
+ const lvl2 = level ? level : void 0;
185
+ let tsToken = `[${ts}]`;
186
+ let lvlToken = lvl2 ? `[${lvl2}]` : "";
187
+ if (this.isTTY && !this.isJsonLike) {
188
+ const reset = "\x1B[0m";
189
+ const dim = "\x1B[2m";
190
+ const colours = {
191
+ silent: "",
192
+ error: "\x1B[31m",
193
+ // red
194
+ warn: "\x1B[33m",
195
+ // yellow
196
+ info: "\x1B[36m",
197
+ // cyan
198
+ verbose: "\x1B[35m",
199
+ // magenta
200
+ debug: "\x1B[90m"
201
+ // bright black / gray
202
+ };
203
+ tsToken = `${dim}${tsToken}${reset}`;
204
+ if (lvl2) {
205
+ const colour = colours[lvl2] || "";
206
+ if (colour) {
207
+ lvlToken = `${colour}${lvlToken}${reset}`;
208
+ }
209
+ }
210
+ }
211
+ const prefix = lvl2 ? `${tsToken} ${lvlToken}` : tsToken;
212
+ process.stderr.write(`${prefix} ${decoratedMsg}
213
+ `);
214
+ } else {
215
+ process.stderr.write(decoratedMsg + "\n");
216
+ }
217
+ } catch {
218
+ }
219
+ }
220
+ info(msg) {
221
+ if (this.shouldLog("info")) this.write(msg, "info");
222
+ }
223
+ warn(msg) {
224
+ if (this.shouldLog("warn")) this.write(msg, "warn");
225
+ }
226
+ error(msg) {
227
+ if (this.shouldLog("error")) this.write(msg, "error");
228
+ }
229
+ verbose(msg) {
230
+ if (this.shouldLog("verbose")) this.write(msg, "verbose");
231
+ }
232
+ debug(msg) {
233
+ if (this.shouldLog("debug")) this.write(msg, "debug");
234
+ }
235
+ step(msg) {
236
+ if (this.shouldLog("info")) this.write(`\u25B6 ${msg}`, "info");
237
+ }
238
+ success(msg) {
239
+ if (this.shouldLog("info")) this.write(`\u2714 ${msg}`, "info");
240
+ }
241
+ };
242
+ logger = new Logger();
243
+ }
244
+ });
245
+
246
+ export {
247
+ logger,
248
+ logger_exports,
249
+ init_logger
250
+ };
251
+ //# sourceMappingURL=chunk-ZPYODGYA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/logger.ts"],"sourcesContent":["/*\n * Centralized logger for Visor CLI and Action modes.\n * - Respects output format (suppresses info in JSON/SARIF unless debug)\n * - Supports levels: silent < error < warn < info < verbose < debug\n * - Routes logs to stderr to keep stdout clean for machine-readable output\n */\nimport { context as otContext, trace } from './telemetry/lazy-otel';\n\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'verbose' | 'debug';\n\nfunction levelToNumber(level: LogLevel): number {\n switch (level) {\n case 'silent':\n return 0;\n case 'error':\n return 10;\n case 'warn':\n return 20;\n case 'info':\n return 30;\n case 'verbose':\n return 40;\n case 'debug':\n return 50;\n }\n}\n\n// OTel severity mapping (OpenTelemetry SeverityNumber values)\nconst OTEL_SEVERITY: Record<LogLevel, number> = {\n silent: 0,\n error: 17, // ERROR\n warn: 13, // WARN\n info: 9, // INFO\n verbose: 5, // DEBUG\n debug: 5, // DEBUG\n};\n\nclass Logger {\n private level: LogLevel = 'info';\n private isJsonLike: boolean = false;\n private isTTY: boolean = typeof process !== 'undefined' ? !!process.stderr.isTTY : false;\n private showTimestamps: boolean = true; // default: always show timestamps\n private sink?: (msg: string, level: LogLevel) => void;\n private sinkPassthrough: boolean = true;\n private sinkErrorMode: 'throw' | 'warn' | 'silent' = 'throw';\n private sinkErrorHandler?: (error: unknown) => void;\n private otelLogger: any = null;\n private otelLoggerAttempted: boolean = false;\n\n configure(\n opts: {\n outputFormat?: string;\n level?: LogLevel;\n debug?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n } = {}\n ): void {\n // Determine base level\n let lvl: LogLevel = 'info';\n\n if (opts.debug || process.env.VISOR_DEBUG === 'true') {\n lvl = 'debug';\n } else if (opts.verbose || process.env.VISOR_LOG_LEVEL === 'verbose') {\n lvl = 'verbose';\n } else if (opts.quiet || process.env.VISOR_LOG_LEVEL === 'quiet') {\n lvl = 'warn';\n } else if (opts.level) {\n lvl = opts.level;\n } else if (process.env.VISOR_LOG_LEVEL) {\n const envLvl = process.env.VISOR_LOG_LEVEL as LogLevel;\n if (['silent', 'error', 'warn', 'info', 'verbose', 'debug'].includes(envLvl)) {\n lvl = envLvl as LogLevel;\n }\n }\n\n this.level = lvl;\n const output = opts.outputFormat || process.env.VISOR_OUTPUT_FORMAT || 'table';\n // In JSON/SARIF we suppress non-error logs unless explicitly verbose/debug\n this.isJsonLike = output === 'json' || output === 'sarif';\n }\n\n setSink(\n sink?: (msg: string, level: LogLevel) => void,\n opts: {\n passthrough?: boolean;\n errorMode?: 'throw' | 'warn' | 'silent';\n onError?: (error: unknown) => void;\n } = {}\n ): void {\n this.sink = sink;\n this.sinkPassthrough = opts.passthrough !== undefined ? opts.passthrough : true;\n this.sinkErrorMode = opts.errorMode || 'throw';\n this.sinkErrorHandler = opts.onError;\n }\n\n private shouldLog(level: LogLevel): boolean {\n const desired = levelToNumber(level);\n const current = levelToNumber(this.level);\n if (desired > current) return false;\n if (\n this.isJsonLike &&\n desired < levelToNumber('error') &&\n this.level !== 'debug' &&\n this.level !== 'verbose'\n ) {\n // In JSON/SARIF, hide info/warn unless explicitly verbose/debug\n return false;\n }\n return true;\n }\n\n private getTraceSuffix(msg: string): string {\n if (!msg) return '';\n if (msg.includes('trace_id=') || msg.includes('trace_id:')) return '';\n try {\n const span = trace.getSpan(otContext.active()) || trace.getActiveSpan();\n const ctx = span?.spanContext?.();\n if (!ctx?.traceId) return '';\n return ` [trace_id=${ctx.traceId} span_id=${ctx.spanId}]`;\n } catch {\n return '';\n }\n }\n\n private emitOtelLog(msg: string, level: LogLevel): void {\n try {\n if (!this.otelLoggerAttempted) {\n this.otelLoggerAttempted = true;\n try {\n const { logs } = (function (name: string) {\n return require(name);\n })('@opentelemetry/api-logs');\n this.otelLogger = logs.getLogger('visor');\n } catch {\n // @opentelemetry/api-logs not installed\n }\n }\n if (!this.otelLogger) return;\n\n const span = trace.getSpan(otContext.active()) || trace.getActiveSpan();\n const spanCtx = span?.spanContext?.();\n this.otelLogger.emit({\n severityNumber: OTEL_SEVERITY[level] || 9,\n severityText: level.toUpperCase(),\n body: msg,\n attributes: {\n 'visor.logger': true,\n ...(spanCtx?.traceId ? { trace_id: spanCtx.traceId, span_id: spanCtx.spanId } : {}),\n },\n });\n } catch {\n // OTel logs not available; ignore\n }\n }\n\n private write(msg: string, level?: LogLevel): void {\n // Always route to stderr to keep stdout clean for results\n const suffix = this.getTraceSuffix(msg);\n const decoratedMsg = suffix ? `${msg}${suffix}` : msg;\n const lvl = level || 'info';\n\n // Emit to OTel Logs pipeline (non-blocking, best-effort)\n this.emitOtelLog(msg, lvl);\n\n if (this.sink) {\n try {\n this.sink(decoratedMsg, lvl);\n } catch (error) {\n if (this.sinkErrorMode === 'warn') {\n try {\n if (this.sinkErrorHandler) {\n this.sinkErrorHandler(error);\n } else {\n const errMsg = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[logger] sink failed: ${errMsg}\\n`);\n }\n } catch {\n // ignore secondary failures\n }\n }\n if (this.sinkErrorMode === 'throw') {\n throw error;\n }\n return;\n }\n if (!this.sinkPassthrough) return;\n }\n\n try {\n if (this.showTimestamps) {\n const ts = new Date().toISOString();\n const lvl = level ? level : undefined;\n\n let tsToken = `[${ts}]`;\n let lvlToken = lvl ? `[${lvl}]` : '';\n\n // Add simple ANSI colour when running in a TTY and not emitting\n // JSON/SARIF. Colours are intentionally minimal and only applied\n // to the prefix markers, not the full line.\n if (this.isTTY && !this.isJsonLike) {\n const reset = '\\x1b[0m';\n const dim = '\\x1b[2m';\n const colours: Record<LogLevel, string> = {\n silent: '',\n error: '\\x1b[31m', // red\n warn: '\\x1b[33m', // yellow\n info: '\\x1b[36m', // cyan\n verbose: '\\x1b[35m', // magenta\n debug: '\\x1b[90m', // bright black / gray\n };\n\n tsToken = `${dim}${tsToken}${reset}`;\n\n if (lvl) {\n const colour = colours[lvl] || '';\n if (colour) {\n lvlToken = `${colour}${lvlToken}${reset}`;\n }\n }\n }\n\n const prefix = lvl ? `${tsToken} ${lvlToken}` : tsToken;\n process.stderr.write(`${prefix} ${decoratedMsg}\\n`);\n } else {\n process.stderr.write(decoratedMsg + '\\n');\n }\n } catch {\n // Ignore write errors\n }\n }\n\n info(msg: string): void {\n if (this.shouldLog('info')) this.write(msg, 'info');\n }\n\n warn(msg: string): void {\n if (this.shouldLog('warn')) this.write(msg, 'warn');\n }\n\n error(msg: string): void {\n if (this.shouldLog('error')) this.write(msg, 'error');\n }\n\n verbose(msg: string): void {\n if (this.shouldLog('verbose')) this.write(msg, 'verbose');\n }\n\n debug(msg: string): void {\n if (this.shouldLog('debug')) this.write(msg, 'debug');\n }\n\n step(msg: string): void {\n // High-level phase indicator\n if (this.shouldLog('info')) this.write(`▶ ${msg}`, 'info');\n }\n\n success(msg: string): void {\n if (this.shouldLog('info')) this.write(`✔ ${msg}`, 'info');\n }\n}\n\n// Singleton instance\nexport const logger = new Logger();\n\n// Helper to configure from CLI options in a single place\nexport function configureLoggerFromCli(options: {\n output?: string;\n debug?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n}): void {\n logger.configure({\n outputFormat: options.output,\n debug: options.debug,\n verbose: options.verbose,\n quiet: options.quiet,\n });\n\n // Expose output format and debug to process env for modules that need to gate\n // stdout emissions without plumbing the value through every call site.\n try {\n if (options.output) process.env.VISOR_OUTPUT_FORMAT = String(options.output);\n if (typeof options.debug === 'boolean') {\n process.env.VISOR_DEBUG = options.debug ? 'true' : 'false';\n }\n } catch {\n // ignore\n }\n}\n"],"mappings":"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","names":["lvl"]}
@@ -0,0 +1,14 @@
1
+ import {
2
+ CommandExecutor,
3
+ commandExecutor,
4
+ init_command_executor
5
+ } from "./chunk-S5FSRHMY.mjs";
6
+ import "./chunk-ZPYODGYA.mjs";
7
+ import "./chunk-B2OUZAWY.mjs";
8
+ import "./chunk-J7LXIPZS.mjs";
9
+ init_command_executor();
10
+ export {
11
+ CommandExecutor,
12
+ commandExecutor
13
+ };
14
+ //# sourceMappingURL=command-executor-YNJOS77A.mjs.map
@@ -2,15 +2,15 @@ import {
2
2
  ConfigManager,
3
3
  VALID_EVENT_TRIGGERS,
4
4
  init_config
5
- } from "./chunk-4I3TJ7UJ.mjs";
5
+ } from "./chunk-7W5QCO4Y.mjs";
6
6
  import "./chunk-KWTCTEFT.mjs";
7
7
  import "./chunk-LW3INISN.mjs";
8
- import "./chunk-FT3I25QV.mjs";
9
- import "./chunk-UCMJJ3IM.mjs";
8
+ import "./chunk-ZPYODGYA.mjs";
9
+ import "./chunk-B2OUZAWY.mjs";
10
10
  import "./chunk-J7LXIPZS.mjs";
11
11
  init_config();
12
12
  export {
13
13
  ConfigManager,
14
14
  VALID_EVENT_TRIGGERS
15
15
  };
16
- //# sourceMappingURL=config-2STD74CJ.mjs.map
16
+ //# sourceMappingURL=config-PCP6O6Y6.mjs.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  FailureConditionEvaluator,
3
3
  init_failure_condition_evaluator
4
- } from "./chunk-U6K5SK7X.mjs";
5
- import "./chunk-3JFK6KCD.mjs";
6
- import "./chunk-6VVXKXTI.mjs";
4
+ } from "./chunk-V45TITKX.mjs";
5
+ import "./chunk-TFUQ2D5L.mjs";
6
+ import "./chunk-MFXPJUUE.mjs";
7
7
  import "./chunk-34QX63WK.mjs";
8
8
  import "./chunk-25IC7KXZ.mjs";
9
9
  import "./chunk-LW3INISN.mjs";
@@ -15,4 +15,4 @@ init_failure_condition_evaluator();
15
15
  export {
16
16
  FailureConditionEvaluator
17
17
  };
18
- //# sourceMappingURL=failure-condition-evaluator-FFWJRAEQ.mjs.map
18
+ //# sourceMappingURL=failure-condition-evaluator-H3PBFBYT.mjs.map
@@ -0,0 +1,18 @@
1
+ import {
2
+ FailureConditionEvaluator,
3
+ init_failure_condition_evaluator
4
+ } from "./chunk-GA2TYKSR.mjs";
5
+ import "./chunk-XOAEKFKB.mjs";
6
+ import "./chunk-G7GSN3SK.mjs";
7
+ import "./chunk-FWWLD555.mjs";
8
+ import "./chunk-25IC7KXZ.mjs";
9
+ import "./chunk-LW3INISN.mjs";
10
+ import "./chunk-RI4ONH5X.mjs";
11
+ import "./chunk-ZPYODGYA.mjs";
12
+ import "./chunk-B2OUZAWY.mjs";
13
+ import "./chunk-J7LXIPZS.mjs";
14
+ init_failure_condition_evaluator();
15
+ export {
16
+ FailureConditionEvaluator
17
+ };
18
+ //# sourceMappingURL=failure-condition-evaluator-IRFKTYZD.mjs.map